この節では、次の項目について説明します。
|
注意: Oracle CQLは、Oracle CEP 11gリリース1 (11.1.1)でEvent Processing Language (EPL)に取って代わります。Oracle CEPは、EPLとの下位互換性をサポートします。詳細は、第11章「EPLプロセッサの構成」を参照してください。 |
Oracle CEPアプリケーションには、1つ以上の複雑なイベント・プロセッサ、もしくはプロセッサが含まれています。各プロセッサは1つまたは複数のアダプタからのイベントを入力として受け取ります。これらのアダプタでは、ソースから連続的なデータ・ストリームを送信するデータ・フィードにリスニングします。金融データ・フィードからOracle CEPロード・ジェネレータまで、任意のソースを使用できます。
Oracle CQLプロセッサの主な機能は、その関連付けられたOracle CQL (Oracle Continuous Query Language)ルールであり、これらのルールは、プロセッサにリスニング・コンポーネントに渡すイベントのサブセットを持ちます。リスニング・コンポーネントとして、他のプロセッサまたは通常イベント処理ネットワークの終了を定義し、クライアント・アプリケーションへのパブリッシュなどイベントに対してなんらかの処理を実行するビジネス・オブジェクトPOJOを指定できます。Oracle CQLの詳細は、『Oracle Complex Event Processing CQL言語リファレンス』を参照してください。
アプリケーションの各Oracle CQLプロセッサに対して、コンポーネント構成ファイルでprocessor要素を作成する必要があります。このprocessor要素では、プロセッサのOracle CQLルールの初期セット、および任意のプロセッサ構成を指定します。
Oracle CQLプロセッサEPNアセンブリ・ファイルで、任意の追加Oracle CQLプロセッサの機能を構成できます。
コンポーネント構成ファイルprocessor要素のname要素は、EPNアセンブリ・ファイルprocessor要素のid属性と一致している必要があります。たとえば、例10-1に示すEPNアセンブリ・ファイルprocessor要素の場合、例10-2に示す対応するコンポーネント構成ファイルprocessor要素が指定されます。
例10-1 EPNアセンブリ・ファイルOracle CQLプロセッサID: proc
<wlevs:processor id="proc">
<wlevs:table-source ref="Stock" />
</wlevs:processor>
例10-2 コンポーネント構成ファイルOracle CQLプロセッサ名: proc
<processor>
<name>proc</name>
<rules>
<query id="q1"><![CDATA[
SELECT ExchangeStream.symbol, ExchangeStream.price, Stock.exchange
FROM ExchangeStream [Now], Stock
WHERE ExchangeStream.symbol = Stock.symbol
]]></query>
</rules>
</procesor>
processor要素は、次のいずれかの任意のコンポーネント構成ファイルに作成できます。
デフォルトのOracle CEPアプリケーションの構成ファイル(デフォルトでは、META-INF/wlevs/config.xml)。
個別の構成ファイル。
アプリケーションに1つ以上のプロセッサが含まれている場合は、デフォルトconfig.xmlファイルでプロセッサごとにprocessor要素を作成できます。また、プロセッサごとにMETA-INF/wlevsに個別のXMLファイルを作成するか、またはすべてのプロセッサの構成のみでなく、アプリケーション内のすべてのコンポーネント(アダプタ、プロセッサ、およびチャネル)が含まれる単一のXMLファイルをMETA-INF/wlevsに作成できます。開発環境に最も適した方法を選択します。
デフォルトでは、Oracle CEP IDE for Eclipseは、1つのコンポーネント構成ファイル、および1つのEPNアセンブリ・ファイルを作成します。Oracle CEP IDE for Eclipseを使用してOracle CQLプロセッサを作成する場合、デフォルトでプロセッサ要素がデフォルト・コンポーネント構成ファイルのMETA-INF/wlevs/config.xmlファイルに追加されます。Oracle CEP IDE for Eclipseを使用して、Oracle CQLプロセッサの作成時に新しい構成ファイルを作成するか、または既存の構成ファイルを使用するかを選択できます。
コンポーネント構成ファイルは、Oracle CEPアプリケーション・バンドルの一部としてデプロイされます。Oracle CEP Visualizer、wlevs.Adminユーティリティを使用するか、または適切なJMX Mbeanを直接操作して、後で実行時にこの構成を更新できます。
詳細は、次を参照してください:
Oracle Complex Event Processing Visualizerユーザーズ・ガイド
『Oracle Complex Event Processing管理者ガイド』のwlevs.Adminコマンドライン・リファレンスに関する項
『Oracle Complex Event Processing管理者ガイド』のOracle CEP用のJMX構成に関する項
Oracle CQLプロセッサ構成の詳細は、次の項を参照してください。
1つ以上の問合せを使用してOracle CQLプロセッサを構成する場合、デフォルトではすべての問合せの結果がダウンストリーム・チャネルに出力されます。
どの問合せの結果をダウンストリーム・チャネルに出力するかは、チャネルselector要素を使用してこのチャネルに結果を出力する問合せ名のリストをスペースで区切って指定することで制御できます。
アップストリーム・プロセッサに問合せを作成する前に、selectorでchannel要素を構成することもできます。この場合、selector内の名前と一致する問合せ名を指定する必要があります。
詳細は、9.1.5項「ダウンストリーム・チャネルに対する問合せ出力の制御: selector」を参照してください。
プロセッサは手動で構成するか、またはOracle CEP IDE for Eclipseを使用して構成できます。
プロセッサ・コンポーネント構成ファイルを記述する完全なXSDスキーマは、B.2項「コンポーネント構成スキーマwlevs_application_config.xsd」を参照してください。
Oracle CQLプロセッサ・コンポーネント構成ファイルおよびアセンブリ・ファイルの完全な例は、10.5項「Oracle CQLプロセッサ構成ファイルの例」を参照してください。
この節では、次のトピックについて説明します。
プロセッサを作成および編集する最も効率的かつ間違いの少ない方法は、Oracle CEP IDE for Eclipseを使用することです。オプションで、プロセッサは手動で作成および編集できます(10.2.2項「Oracle CQLプロセッサ・コンポーネント構成ファイルの手動による作成方法」を参照してください)。
Oracle CEP IDE for Eclipseを使用してOracle CQLプロセッサを構成するには:
Oracle CEP IDE for Eclipseを使用してプロセッサを作成します。
6.4.1.3項「プロセッサ・ノードの作成方法」を参照してください。
EPNエディタを使用してOracle CQLプロセッサを作成する場合、Oracle CEP IDE for Eclipseでは、デフォルト・コンポーネント構成ファイルまたは新しいコンポーネント構成ファイルの選択が求められます。詳細は、第6章「Oracle CEP IDE for Eclipseおよびイベント処理ネットワーク」を参照してください。
「プロセッサ」ノードを右クリックし、「構成のソースに移動」を選択します。
Oracle CEP IDE for Eclipseは、適切なコンポーネント構成ファイルを開きます。デフォルト・プロセッサ・コンポーネント構成は、例10-3に示されています。
デフォルト・プロセッサ・コンポーネント構成には、name要素およびrules要素が含まれます。
rules要素を使用して、このプロセッサが実行するOracle CQL文を含むように作成する子要素をグループ化します。子要素には、次のものが含まれます。
rule: ユーザー定義ウィンドウを登録または作成するOracle CQL文を含みます。rule要素id属性はウィンドウの名前と一致する必要があります。
view: Oracle CQL view文(副問合せ同等のOracle CQL)を含みます。view要素のid属性はビューの名前を定義します。
query: Oracle CQL select文を含みます。query要素のid属性は問合せの名前を定義します。
デフォルト・プロセッサ・コンポーネント構成には、id Queryのダミーquery要素が含まれます。
ダミーquery要素を、このプロセッサが実行するOracle CQL文を含むよう作成するrule、view、およびquery要素と置き換えます。
詳細は、『Oracle Complex Event Processing CQL言語リファレンス』のOracle CQL問合せ、ビュー、および結合の概要に関する項を参照してください。
「ファイル」>「保存」を選択します。
オプションで、アセンブリ・ファイルで追加のOracle CQLプロセッサの機能を構成します。
プロセッサ構成を作成、および編集する最も効率的かつ間違いの少ない方法は、Oracle CEP IDE for Eclipseを使用することではありますが(10.2.1項「Oracle CEP IDE for Eclipseを使用したOracle CQLプロセッサの構成方法」を参照)、プロセッサ構成ファイルを手動で作成および維持することもできます。
この項には、プロセッサ構成ファイルを手動で作成する主な手順が記述されています。プロセッサごとに個別のXMLファイルを作成できますが、簡単にするために、この手順ではすべてのプロセッサを単一のXMLファイルで構成することが想定されています。
Oracle CQLプロセッサ・コンポーネント構成ファイルを手動で作成するには:
プロセッサが実行するOracle CQLルールのセットを設計します。これらのルールは、すべての受信イベントを選択する簡単なものから、次に示すように、時間、プロパティ値などを基にセットを制限するものまであります。
SELECT * FROM TradeStream [Now] WHERE price > 10000
Oracle CQLは、多くの点で、リレーショナル・データベース表の問合せに使用するStructure Query Language (SQL)と類似しますが、構文は多くの点で異なります。もう1つの大きな違いとしては、Oracle CQL問合せでは時間というディメンションも考慮し、プロセッサは静的なSQL問合せよりOracle CQLを継続的に実行します。
詳細は、『Oracle Complex Event Processing CQL言語リファレンス』のOracle CQL問合せ、ビュー、および結合の概要に関する項を参照してください。
アプリケーションの各プロセッサに対して、前の手順で設計したOracle CQLルールおよび他の任意の機能を含むプロセッサ構成XMLファイルを作成します。
このXMLファイルの名前は自分で決定しますが、その拡張は.xmlで終了することが必要です。
プロセッサ構成ファイルのルート要素はconfigで、ネームスペース定義は次の手順に示します。
アプリケーションの各プロセッサに対して、configのprocessor子要素を追加します。
各プロセッサをname子要素で一意に識別します。この名前は、アプリケーションのイベント処理ネットワークを定義するEPNアセンブリ・ファイルのwlevs:processor要素のid属性の値と同じである必要があります。これによって、Oracle CEPは、このプロセッサ構成はEPNアセンブリ・ファイルのどのプロセッサ・コンポーネントに適用されるかを理解します。詳細は、4.3項「EPNアセンブリ・ファイルの作成」を参照してください。
たとえば、アプリケーションに2つのプロセッサがある場合、構成ファイルは最初に以下のようになります。
<?xml version="1.0" encoding="UTF-8"?> <n1:config xmlns:n1="http://www.bea.com/ns/wlevs/config/application"> <processor> <name>firstProcessor</name> ... </processor> <processor> <name>secondProcessor</name> ... </processor> </n1:config>
この例では、構成ファイルには、firstProcessorおよびsecondProcessorという2つのプロセッサが含まれています。これは、EPNアセンブリ・ファイルには、同じ識別子を持つ少なくとも2つのプロセッサ登録が含まれる必要があることを意味します。
<wlevs:processor id="firstProcessor" ...> ... </wlevs:processor> <wlevs:processor id="secondProcessor" ...> ... </wlevs:processor>
|
注意: XMLファイルの識別子と名前は大/小文字が区別されるため、EPNアセンブリ・ファイルでコンポーネントの識別子を参照するときは、必ず大/小文字を同一にします。 |
rules子要素を各processor要素に追加します。
このプロセッサを実行するOracle CQL文を含むよう、作成する子要素をグループ化するには、rules要素を使用します。それには以下のものが含まれます。
rule: ユーザー定義ウィンドウを登録または作成するOracle CQL文を含みます。rule要素id属性はウィンドウの名前と一致する必要があります。
view: Oracle CQL view文(副問合せのようなOracle CQL)を含みます。view要素id属性はビューの名前を定義します。
query: Oracle CQL select文を含みます。query要素のid属性は問合せの名前を定義します。
viewおよびquery要素の必要なid属性を使用して、各ルールを一意に識別します。XML CDATAタイプを使用して、実際のOracle CQLルールを入力します。例:
<?xml version="1.0" encoding="UTF-8"?>
<n1:config
xsi:schemaLocation="http://www.bea.com/ns/wlevs/config/application wlevs_application_config.xsd"
xmlns:n1="http://www.bea.com/ns/wlevs/config/application"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<processor>
<name>proc</name>
<rules>
<view id="lastEvents" schema="cusip bid srcId bidQty"><![CDATA[
select mod(price)
from filteredStream[partition by srcId, cusip rows 1]
]]></view>
<query id="q1"><![CDATA[
SELECT *
FROM lastEvents [Now]
WHERE price > 10000
]]></query>
</rules>
</processor>
</n1:config>]]></query>
ファイルを保存して閉じます。
オプションで、アセンブリ・ファイルで追加のOracle CQLプロセッサの機能を構成します。
表の各行がタプルとして表現されるイベント・ストリームとしてリレーショナル・データベース内の表にアクセスするよう、Oracle CQLプロセッサを構成できます。
この項では、例10-4に示されるSQL文を使用して、アクセスする表を作成することを想定します。
構成した後に、イベント・ストリームであるようにStock表にアクセスするOracle CQL問合せを定義できます。次の例では、問合せは1つのイベント・ストリームExchangeStreamをStock表と結合します。
例10-5 リレーショナル・データベース表StockのOracle CQL問合せ
SELECT ExchangeStream.symbol, ExchangeStream.price, Stock.exchange FROM ExchangeStream [Now], Stock WHERE ExchangeStream.symbol = Stock.symbol
|
注意: 表ソースの変更が、ストリーム・データと適宜調整されないため、表ソースを「即時」ウィンドウを使用してイベント・ストリームにのみ結合でき、かつ単一のデータベース表のみ結合できる場合があります。
任意の複雑なSQL問合せおよび複数の表を自分のOracle SQL問合せと統合するには、代わりにOracle JDBCデータ・カートリッジの使用を検討してください。 詳細は、『Oracle Complex Event Processing CQL言語リファレンス』の「Understanding the Oracle JDBC Data Cartridge」を参照してください。 |
リレーショナル・データベース表にアクセスするようにOracle CQLプロセッサを構成する最も効率的かつ間違いの少ない方法は、Oracle CEP IDE for Eclipseを使用することです。
Oracle CEP IDE for Eclipseを使用してOracle CQLプロセッサ表ソースを構成するには:
使用する表が含まれるデータベースのデータ・ソースを作成します。
例10-6では、データ・ソースStockDSのOracle CEPサーバーconfig.xmlファイルの例を示します。
例10-6 データ・ソースStockDSがあるOracle CEP Server config.xmlファイル
<?xml version="1.0" encoding="UTF-8"?>
<n1:config xsi:schemaLocation="http://www.bea.com/ns/wlevs/config/server wlevs_server_config.xsd"
xmlns:n1="http://www.bea.com/ns/wlevs/config/server"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<domain>
<name>ocep_domain</name>
</domain>
...
<data-source>
<name>StockDs</name>
<connection-pool-params>
<initial-capacity>1</initial-capacity>
<max-capacity>10</max-capacity>
</connection-pool-params>
<driver-params>
<url>jdbc:derby:</url>
<driver-name>org.apache.derby.jdbc.EmbeddedDriver</driver-name>
<properties>
<element>
<name>databaseName</name>
<value>db</value>
</element>
<element>
<name>create</name>
<value>true</value>
</element>
</properties>
</driver-params>
<data-source-params>
<jndi-names>
<element>StockDs</element>
</jndi-names>
<global-transactions-protocol>None</global-transactions-protocol>
</data-source-params>
</data-source>
...
</n1:config>
詳細は、『Oracle Complex Event Processing管理者ガイド』のリレーショナル・データベースへのアクセスの構成に関する項を参照してください。
表ノードを作成するには、Oracle CEP IDE for Eclipseを使用します。
6.4.1.1項「基本ノードの作成方法」を参照してください。
Oracle CQLプロセッサを作成するには、Oracle CEP IDE for Eclipseを使用します。
6.4.1.3項「プロセッサ・ノードの作成方法」を参照してください。
表ノードをOracle CQLプロセッサ・ノードに接続します。
6.4.2.1項「ノードの接続方法」を参照してください。
EPNエディタは、ソース表を参照するターゲット・プロセッサ・ノードにwlevs:table-source要素を追加します。
EPNのテーブルノードを右クリックし、「アセンブリのソースに移動」を選択します。
Oracle CEP IDE for Eclipseはこの表ノードに対するEPNアセンブリ・ファイルを開きます。
EPN内の表に接続しているOracle CQLプロセッサノードを右クリックし、「アセンブリのソースに移動」を選択します。
Oracle CEP IDE for EclipseはこのOracle CQLプロセッサに対するEPNアセンブリ・ファイルを開きます。
Oracle CQLプロセッサ要素のtable-source子要素を、例10-8に示されているように編集します。
ref属性をステップ6で指定したtable要素のidに設定します。
例10-9に示されているように、EPNアセンブリ・ファイルを編集し、表に対してevent-type-repository要素を新しいevent-type子要素で更新します。
アクセスする表の各列にproperty子要素を作成し、表10-2に示されているようにプロパティ属性を構成します。
例10-9 表のEPNアセンブリ・ファイルevent-type要素
<wlevs:event-type-repository>
...
<wlevs:event-type type-name="StockEvent">
<wlevs:properties>
<wlevs:property name="symbol" type="char[]" length="16" />
<wlevs:property name="exchange" type="char[]" length="16" />
</wlevs:properties>
</wlevs:event-type>
...
</wlevs:event-type-repository>
表10-2 EPNアセンブリ・ファイルevent-type要素プロパティ属性
| 属性 | 説明 |
|---|---|
|
|
SQL CREATE TABLE文で指定されている、アクセスする表の列の名前。すべての列を指定する必要はありません。 |
|
|
列のSQLデータ型に対応している表10-3内のOracle CEP Javaタイプ。 例10-4では、 |
|
|
SQL CREATE TABLE文で指定されている列サイズ。 例10-4では、 |
表10-3 SQL列タイプおよびOracle CEPタイプの対応するもの
| SQLタイプ | Oracle CEP Javaタイプ | com.bea.wlevs.ede.api.Type | 説明 |
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Oracle CQLでの |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Footnote 1 Oracle SQL。
Footnote 2 Oracle以外のSQL。
イベント・タイプの作成の詳細は、次の項を参照してください。
EPN内の表に接続しているOracle CQLプロセッサノードを右クリックし、「構成のソースに移動」を選択します。
Oracle CEP IDE for EclipseはこのOracle CQLプロセッサに対するコンポーネント構成ファイルを開きます。
例10-10に示されているように、コンポーネント構成ファイルを編集して、表のevent-typeを使用するOracle CQL問合せを追加します。
例10-10 表イベント・タイプStockEventを使用するOracle CQL問合せ
<processor>
<name>proc</name>
<rules>
<query id="q1"><![CDATA[
SELECT ExchangeStream.symbol, ExchangeStream.price, Stock.exchange
FROM ExchangeStream [Now], Stock
WHERE ExchangeStream.symbol = Stock.symbol
]]></query>
</rules>
</processor>
|
注意: 表ソースの変更が、ストリーム・データと適宜調整されないため、「即時」ウィンドウのみを使用できる場合があります。詳細は、『Oracle Complex Event Processing CQL言語リファレンス』のS[Now]に関する項を参照してください。 |
この項では、Oracle CQLプロセッサ構成ファイルの例を記載します。次のものが含まれます。
次の例では、Oracle CQLプロセッサのコンポーネント構成ファイルを示します。
<?xml version="1.0" encoding="UTF-8"?>
<n1:config
xsi:schemaLocation="http://www.bea.com/ns/wlevs/config/application wlevs_application_config.xsd"
xmlns:n1="http://www.bea.com/ns/wlevs/config/application"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<processor>
<name>proc</name>
<rules>
<view id="lastEvents" schema="cusip bid srcId bidQty ask askQty seq"><![CDATA[
select mod(price)
from filteredStream[partition by srcId, cusip rows 1]
]]></view>
<query id="q1"><![CDATA[
SELECT *
FROM lastEvents [Now]
WHERE price > 10000
]]></query>
</rules>
</processor>
</n1:config>
この例では、name要素はprocプロセッサにOracle CQLルールが構成されていることを指定します。これは、これらのOracle CQLルールを実際のprocプロセッサ・インスタンスとリンクするために、アプリケーションを定義するEPNアセンブリ・ファイルに、procのid属性値を持つ対応するwlevs:processor要素が含まれている必要があることを意味します。(10.5.2項「Oracle CQL Processor EPNアセンブリ・ファイル」を参照)。
このOracle CQLプロセッサ・コンポーネント構成ファイルは、Oracle CQL view文(副問合せ同等のOracle CQL)を指定するための表示の要素も定義します。ビュー選択の結果はダウンストリーム・チャネルに出力されません。
最後に、このOracle CQLプロセッサ・コンポーネント構成ファイルはquery要素を定義し、Oracle CQL問合せ文を指定します。問合せ文は、ビューから選択します。デフォルトでは、問合せの結果はダウンストリーム・チャネルに出力されます。selector要素を使用して、チャネル構成でこの動作を制御できます。詳細は、次の項を参照してください。
次の例では、Oracle CQLプロセッサのEPNアセンブリ・ファイルを示します。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:osgi="http://www.springframework.org/schema/osgi"
xmlns:wlevs="http://www.bea.com/ns/wlevs/spring"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/osgi
http://www.springframework.org/schema/osgi/spring-osgi.xsd
http://www.bea.com/ns/wlevs/spring
http://www.bea.com/ns/wlevs/spring/spring-wlevs-v11_1_1_3.xsd">
<wlevs:event-type-repository>
<wlevs:event-type type-name="ExchangeEvent">
<wlevs:properties>
<wlevs:property name="symbol" type="[C" length="16" />
<wlevs:property name="price" type="java.lang.Double" />
</wlevs:properties>
</wlevs:event-type>
<wlevs:event-type type-name="StockExchangeEvent">
<wlevs:properties>
<wlevs:property name="symbol" type="[C" length="16" />
<wlevs:property name="price" type="java.lang.Double" />
<wlevs:property name="exchange" type="[C" length="16" />
</wlevs:properties>
</wlevs:event-type>
<wlevs:event-type type-name="StockEvent">
<wlevs:properties>
<wlevs:property name="symbol" type="[C" length="16" />
<wlevs:property name="exchange" type="[C" length="16" />
</wlevs:properties>
</wlevs:event-type>
</wlevs:event-type-repository>
<!-- Assemble EPN (event processing network) -->
<wlevs:adapter id="adapter" class="com.bea.wlevs.example.db.ExchangeAdapter" >
<wlevs:listener ref="ExchangeStream"/>
</wlevs:adapter>
<wlevs:channel id="ExchangeStream" event-type="ExchangeEvent" >
<wlevs:listener ref="proc"/>
</wlevs:channel>
<wlevs:table id="Stock" event-type="StockEvent" data-source="StockDs" />
<wlevs:processor id="proc" advertise="true" >
<wlevs:table-source ref="Stock" />
</wlevs:processor>
<wlevs:channel id="OutputStream" advertise="true" event-type="StockExchangeEvent" >
<wlevs:listener ref="bean"/>
<wlevs:source ref="proc"/>
</wlevs:channel>
<osgi:reference id="ds" interface="com.bea.core.datasource.DataSourceService" cardinality="0..1" />
<!-- Create business object -->
<bean id="bean" class="com.bea.wlevs.example.db.OutputBean">
<property name="dataSourceService" ref="ds"/>
</bean>
</beans>