この章では、Oracle Event Processingイベント処理ネットワーク用にOracle Continuous Query Language (Oracle CQL)プロセッサを構成する方法について説明します。これには、プロセッサのデータ・ソースの構成およびパフォーマンスの最適化に関する情報も含まれます。
この章の内容は次のとおりです。
Oracle Event Processingアプリケーションには、1つ以上のイベント・プロセッサ、もしくはプロセッサが含まれています。各プロセッサは1つまたは複数のアダプタからのイベントを入力として受け取ります。これらのアダプタでは、ソースから連続的なデータ・ストリームを送信するデータ・フィードにリスニングします。金融データ・フィードやOracle Event Processingロード・ジェネレータなど、任意のソースを使用できます。
Oracle CQLプロセッサの主な機能は、その関連付けられたOracle CQL (Oracle Continuous Query Language)ルールであり、これらのルールは、プロセッサにリスニング・コンポーネントに渡すイベントのサブセットを持ちます。リスニングするコンポーネントには、他のプロセッサまたは通常はイベント処理ネットワークの最後を定義し、クライアント・アプリケーションへのパブリッシュなどイベントでなんらかの処理を実行するビジネス・オブジェクトPOJOを指定できます。Oracle CQLの詳細は、『Oracle Fusion Middleware Oracle Event Processing CQL言語リファレンス』を参照してください。
アプリケーションの各Oracle CQLプロセッサに対して、コンポーネント構成ファイルでprocessor要素を作成する必要があります。このprocessor要素では、プロセッサのOracle CQLルールの初期セット、および任意のプロセッサ構成を指定します。
Oracle CQLプロセッサEPNアセンブリ・ファイルで、任意の追加Oracle CQLプロセッサの機能を構成できます。
コンポーネント構成ファイルprocessor要素のname要素は、EPNアセンブリ・ファイルprocessor要素のid属性と一致している必要があります。たとえば、例17-1に示すEPNアセンブリ・ファイルprocessor要素の場合、例17-2に示す対応するコンポーネント構成ファイルprocessor要素が指定されます。
例17-1 EPNアセンブリ・ファイルOracle CQLプロセッサID: proc
<wlevs:processor id="proc">
<wlevs:table-source ref="Stock" />
</wlevs:processor>
例17-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 Event Processingアプリケーション構成ファイル(デフォルトでは、META-INF/wlevs/config.xml)。
個別の構成ファイル。
アプリケーションに1つ以上のプロセッサが含まれている場合は、デフォルトconfig.xmlファイルでプロセッサごとにprocessor要素を作成できます。また、プロセッサごとにMETA-INF/wlevsに個別のXMLファイルを作成するか、またはすべてのプロセッサの構成のみでなく、アプリケーション内のすべてのコンポーネント(アダプタ、プロセッサ、およびチャネル)が含まれる単一のXMLファイルをMETA-INF/wlevsに作成できます。開発環境に最も適した方法を選択します。
デフォルトでは、Oracle Event Processing IDE for Eclipseは、1つのコンポーネント構成ファイルおよび1つのEPNアセンブリ・ファイルを作成します。Oracle Event Processing IDE for Eclipseを使用してOracle CQLプロセッサを作成する場合、デフォルトでプロセッサ要素がデフォルト・コンポーネント構成ファイルのMETA-INF/wlevs/config.xmlファイルに追加されます。Oracle Event Processing IDE for Eclipseを使用して、Oracle CQLプロセッサの作成時に新しい構成ファイルを作成するか、または既存の構成ファイルを使用するかを選択できます。
コンポーネント構成ファイルは、Oracle Event Processingアプリケーション・バンドルの一部としてデプロイされます。Oracle Event Processing Visualizer、wlevs.Adminユーティリティを使用するか、または適切なJMX Mbeanを直接操作して、後で実行時にこの構成を更新できます。
詳細は、次を参照してください:
『Oracle Fusion Middleware Oracle Event Processing Visualizerユーザーズ・ガイド』
『Oracle Fusion Middleware Oracle Event Processing管理者ガイド』のwlevs.Adminコマンドライン・リファレンスに関する項
『Oracle Fusion Middleware Oracle Event Processing管理者ガイド』のOracle Event ProcessingのJMXの構成に関する項
Oracle CQLプロセッサ構成の詳細は、次の項を参照してください。
1つ以上の問合せを使用してOracle CQLプロセッサを構成する場合、デフォルトではすべての問合せの結果がダウンストリーム・チャネルに出力されます。
どの問合せの結果をダウンストリーム・チャネルに出力するかは、チャネルselector要素を使用してこのチャネルに結果を出力する問合せ名のリストをスペースで区切って指定することで制御できます。
アップストリーム・プロセッサに問合せを作成する前に、selectorでchannel要素を構成することもできます。この場合、selector内の名前と一致する問合せ名を指定する必要があります。
詳細は、10.1.5項「ダウンストリーム・チャネルに対する問合せ出力の制御: selector」を参照してください。
プロセッサを手動で構成するか、またはOracle Event Processing IDE for Eclipseを使用して構成できます。
プロセッサ・コンポーネント構成ファイルを記述する完全なXSDスキーマは、B.2項「コンポーネント構成スキーマwlevs_application_config.xsd」を参照してください。
Oracle CQLプロセッサ・コンポーネント構成ファイルおよびアセンブリ・ファイルの完全な例は、17.7項「Oracle CQLプロセッサ構成ファイルの例」を参照してください。
この節では、次のトピックについて説明します。
プロセッサを作成および編集する最も効率的かつ間違いの少ない方法は、Oracle Event Processing IDE for Eclipseを使用することです。オプションで、プロセッサは手動で作成および編集できます(17.2.2項「Oracle CQLプロセッサ・コンポーネント構成ファイルの手動による作成方法」を参照してください)。
Oracle Event Processing IDE for Eclipseを使用してOracle CQLプロセッサを構成するには:
Oracle Event Processing IDE for Eclipseを使用してプロセッサを作成します。
7.4.1.3項「プロセッサ・ノードの作成方法」を参照してください。
EPNエディタを使用してOracle CQLプロセッサを作成する場合、Oracle Event Processing IDE for Eclipseでは、デフォルト・コンポーネント構成ファイルまたは新しいコンポーネント構成ファイルの選択が求められます。詳細は、第7章「Oracle Event Processing IDE for Eclipseおよびイベント処理ネットワーク」を参照してください。
「プロセッサ」ノードを右クリックし、「構成のソースに移動」を選択します。
Oracle Event Processing IDE for Eclipseは、適切なコンポーネント構成ファイルを開きます。デフォルト・プロセッサ・コンポーネント構成は、例17-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 Fusion Middleware Oracle Event Processing CQL言語リファレンス』のOracle CQL問合せ、ビュー、および結合の概要に関する項を参照してください。
「ファイル」>「保存」を選択します。
オプションで、アセンブリ・ファイルで追加のOracle CQLプロセッサの機能を構成します。
プロセッサ構成を作成、および編集する最も効率的かつ間違いの少ない方法は、Oracle Event Processing IDE for Eclipseを使用することではありますが(17.2.1項「Oracle Event Processing IDE for Eclipseを使用したOracle CQLプロセッサの構成方法」を参照)、プロセッサ構成ファイルを手動で作成および維持することもできます。
この項には、プロセッサ構成ファイルを手動で作成する主な手順が記述されています。簡略化のため、この手順ではすべてのプロセッサを1つの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 Fusion Middleware Oracle Event Processing CQL言語リファレンス』のOracle CQL問合せ、ビュー、および結合の概要に関する項を参照してください。
アプリケーションの各プロセッサに対して、前の手順で設計したOracle CQLルールおよび他の任意の機能を含むプロセッサ構成XMLファイルを作成します。
このXMLファイルの名前は自分で決定しますが、その拡張は.xmlで終了することが必要です。
プロセッサ構成ファイルのルート要素はconfigで、ネームスペース定義は次の手順に示します。
アプリケーションの各プロセッサに対して、configのprocessor子要素を追加します。
各プロセッサをname子要素で一意に識別します。この名前は、アプリケーションのイベント処理ネットワークを定義するEPNアセンブリ・ファイルのwlevs:processor要素のid属性の値と同じである必要があります。これによって、Oracle Event Processingは、このプロセッサ構成はEPNアセンブリ・ファイルのどのプロセッサ・コンポーネントに適用されるかを理解します。詳細は、5.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要素に追加します。
rules要素を使用して、このプロセッサが実行するOracle CQL文を含むように作成する子要素をグループ化します。子要素には、次のものが含まれます。
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
WHERE price > 10000
]]></query>
</rules>
</processor>
</n1:config>]]></query>
ファイルを保存して閉じます。
オプションで、アセンブリ・ファイルで追加のOracle CQLプロセッサの機能を構成します。
以下を使用して、Oracle CQL問合せからリレーショナル・データベース表にアクセスできます。
表ソース: 表ソースを使用して、ストリームを「即時」ウィンドウのみ、かつ単一のデータベース表に対してのみ結合できます。
|
注意: 表ソースの変更が、ストリーム・データと適宜調整されないため、表ソースを「即時」ウィンドウを使用してイベント・ストリームにのみ結合でき、かつ単一のデータベース表のみ結合できる場合があります。詳細は、『Oracle Fusion Middleware Oracle Event Processing CQL言語リファレンス』のS[now]に関する項を参照してください。
任意の複雑なSQL問合せおよび複数の表を自分のOracle SQL問合せと統合するには、かわりにOracle JDBCデータ・カートリッジの使用を検討してください。 |
詳細は、17.3項「Oracle CQLプロセッサ表ソースの構成」を参照してください。
Oracle JDBCデータ・カートリッジ: Oracle JDBCデータ・カートリッジを使用して、任意の複雑なSQL問合せおよび複数の表、データソースを自分のOracle CQL問合せと結合する場合があります。
|
注意: Oracle JDBCデータ・カートリッジを使用して、Oracle CQL文からリレーショナル・データベース表にアクセスすることをお薦めします。 |
詳細は、『Oracle Fusion Middleware Oracle Event Processing CQL言語リファレンス』のOracle JDBCデータ・カートリッジに関する項を参照してください。
いずれの場合でも、データソースはOracle Event Processingサーバーconfig.xmlファイルで定義する必要があります。詳細は、『Oracle Fusion Middleware Oracle Event Processing管理者ガイド』のリレーショナル・データベースへのアクセスの構成に関する項を参照してください。
Oracle Event Processingのリレーション・データベース表イベント・ソースはプル・データ・ソースです。つまり、Oracle Event Processingはイベント・ソースを定期的にポーリングします。
この項では、例17-4に示されるSQL文を使用して、アクセスする表を作成することを想定します。
構成した後に、イベント・ストリームであるようにStock表にアクセスするOracle CQL問合せを定義できます。次の例では、問合せは1つのイベント・ストリームExchangeStreamをStock表と結合します。
例17-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 Fusion Middleware Oracle Event Processing CQL言語リファレンス』のOracle JDBCデータ・カートリッジに関する項を参照してください。 |
リレーショナル・データベース表にアクセスするようにOracle CQLプロセッサを構成する最も効率的かつ間違いの少ない方法は、Oracle Event Processing IDE for Eclipseを使用することです。
Oracle Event Processing IDE for Eclipseを使用してOracle CQLプロセッサ表ソースを構成するには:
使用する表が含まれるデータベースのデータ・ソースを作成します。
例17-6は、データ・ソースStockDSを使用したOracle Event Processingサーバーのconfig.xmlファイルの例を示します。
例17-6 データ・ソースStockDSを使用したOracle Event Processingサーバーの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 Fusion Middleware Oracle Event Processing管理者ガイド』のリレーショナル・データベースへのアクセスの構成に関する項を参照してください。
Oracle Event Processing IDE for Eclipseを使用して表ノードを作成します。
7.4.1.1項「基本ノードの作成方法」を参照してください。
Oracle Event Processing IDE for Eclipseを使用してOracle CQLプロセッサを作成します。
7.4.1.3項「プロセッサ・ノードの作成方法」を参照してください。
表ノードをOracle CQLプロセッサ・ノードに接続します。
7.4.2.1項「ノードの接続方法」を参照してください。
EPNエディタは、ソース表を参照するターゲット・プロセッサ・ノードにwlevs:table-source要素を追加します。
EPNの表ノードを右クリックし、「アセンブリのソースに移動」を選択します。
Oracle Event Processing IDE for Eclipseは、この表ノードのEPNアセンブリ・ファイルを開きます。
例17-7に示すようにtable要素を編集し、表17-1に示すようにtable要素属性を構成します。
表17-1 EPNアセンブリ・ファイル表要素属性
| 属性 | 説明 |
|---|---|
|
|
表ソースの名前。この表ソースの以降の参照ではこの名前を使用します。 |
|
|
ステップ |
|
|
ステップ |
EPN内の表に接続しているOracle CQLプロセッサノードを右クリックし、「アセンブリのソースに移動」を選択します。
Oracle Event Processing IDE for EclipseはこのOracle CQLプロセッサに対するEPNアセンブリ・ファイルを開きます。
Oracle CQLプロセッサ要素のtable-source子要素を、例17-8に示されているように編集します。
ref属性をステップ6で指定したtable要素のidに設定します。
例17-9に示されているように、EPNアセンブリ・ファイルを編集し、表に対してevent-type-repository要素を新しいevent-type子要素で更新します。
9.2.3.2項「データベース表ソースとともに使用するイベント・タイプの制約」の説明に従ってプロパティ属性にアクセスして構成する表の各列のproperty子要素を作成します。
例17-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>
イベント・タイプの作成の詳細は、次の項を参照してください。
EPN内の表に接続しているOracle CQLプロセッサノードを右クリックし、「構成のソースに移動」を選択します。
Oracle Event Processing IDE for EclipseはこのOracle CQLプロセッサに対するコンポーネント構成ファイルを開きます。
例17-10に示されているように、コンポーネント構成ファイルを編集して、表のevent-typeを使用するOracle CQL問合せを追加します。
例17-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 Fusion Middleware Oracle Event Processing CQL言語リファレンス』のS[Now]に関する項を参照してください。 |
Oracle Event ProcessingキャッシュにアクセスするようにOracle CQLプロセッサを構成できます。
詳細は、次を参照してください:
パフォーマンス向上のため、CQL問合せを、デフォルトで行われているシリアル実行ではなく、パラレル実行できるようにすることが可能です。CQLコードがこれをサポートしている場合、CQLプロセッサで複数のスレッドが使用可能なときは、着信イベントをパラレルに実行するように問合せを構成できます。
問合せ出力イベントの相対的な順序が問合せのダウンストリーム・クライアントにとって重要ではない場合のみ、パラレル問合せ実行を有効にします。たとえば、トランザクション・シーケンスが無関係な、特定の会社に関係する証券取引のセットを顧客に伝えるなど、問合せの主な目的がイベントのフィルタ処理である場合、イベントの順序付けは重要ではないと考えられます。
デフォルト(パラレル実行を有効にしない)では、問合せはチャネルからイベントをシリアルに処理します。システム・タイムスタンプを使用するチャネルを経由してルーティングされるイベントの場合、イベント順序は、イベントが受信される順序です。アプリケーションがタイムスタンプを付けるチャネルを経由する場合、イベント順序は、イベントに含まれるタイムスタンプの値によって決定された順序です。全体順序の制約を緩和すると、構成された問合せは、可能な場合はイベントをパラレルに処理しながら、その問合せのイベント順序を考慮しないようにできます。
パラレル問合せ実行のサポートの指定が主に単純な構成タスクである場合は、機能を最大限に活用できるように、次の手順に必ず従ってください。
パラレル実行をサポートするように、ordering-constraint属性を使用します。
プロセッサに呼び出すスレッドが、パフォーマンスの目標を達成するのに十分であることを確認します。パラレル問合せ実行の最大量は、CQLプロセッサで使用できるスレッドの数によって制約されます。たとえば、プロセッサのアダプタ・アップストリームが必要なスレッドの数をサポートし、アダプタとプロセッサの間にチャネルがある場合、パススルーとして機能するように、max-threadsの数を0にしてチャネルを構成してください。
パススルーを行わない場合、必ずmax-threadsの値を1より大きくして、問合せのアップストリーム・チャネルを構成してください。(max-threadsの値の設定を有用にするには、max-size属性を0より大きい値に設定する必要もあります。)詳細は、第10章「チャネルを使用したEPNステージの接続」を参照してください。
max-threads属性値の設定に関連するその他のガイドラインに従います。たとえば、max-threadsの値の設定を有用にするには、max-size属性を0より大きい値に設定する必要もあります。
必要に応じて、同期化されたブロックの使用などによって、問合せ結果を受け取るBeanがスレッドを認識していることを確認します。たとえば、Beanのコードによって、複数のスレッドで実行された問合せから受け取った結果のリストを作成する場合に、これを行う必要がある可能性があります。
ordering-constraint属性の使用イベントがシリアルに処理されることを保証する、デフォルトの順序付けの制約を緩和することで、パラレル問合せ実行を有効にします。これを行うには、queryまたはview要素でordering-constraint属性を設定します。
例17-11では、可能であれば常に、問合せをパラレルに実行するように、ordering-constraint属性をUNORDEREDに設定します。
例17-11 パラレル実行を許可するように構成された問合せ
<query id="myquery" ordering-constraint="UNORDERED">
SELECT symbol FROM S WHERE price > 10
</query>
ordering-constraint属性は、次の3つの値をサポートします。
ORDEREDは、出力イベントの順序は(入力イベントの順序で暗示されるように)重要であることを意味します。CQLエンジンはイベントをシリアルに処理します。これはデフォルトの動作です。
UNORDEREDは、出力イベントの順序は出力イベントのコンシューマにとって重要ではないことを意味します。これにより、CQLプロセッサはイベントを複数のスレッドでパラレルに処理できるようになります。可能な場合、問合せは複数のスレッドでパラレルに実行して、イベントを処理します。
PARTITION_ORDEREDは、異なるパーティション間の出力イベントの順序が出力イベントのコンシューマにとって重要ではない場合に、パーティション内の出力イベントの順序が(入力イベントの順序で暗示されるように)保持されるよう指定していることを意味します。このような緩和により、CQLエンジンは、パーティション間のイベントを複数のスレッドでパラレルに(可能な場合)処理できるようになります。
指定したパーティションに従っているイベントをシリアルに処理するが、パーティション間の順序は無視し、異なるパーティションに属するイベントをパラレルに処理するよう指定する場合に、Use the PARTITION_ORDEREDの値を使用します。PARTITION_ORDEREDの値を使用する場合、partition-expression属性を追加して、パーティション化用のどの式をパーティション間の順序付けの制約を緩和するための基準とするかも指定する必要があります。
例17-12では、GROUP BY句はsymbolの値に基づいて出力をパーティション化します。partition-expression属性は、特定のsymbolの値に対応するイベントの指定されたサブセット内のイベントをシリアルに処理するよう指定します。一方、パーティション間では順序を無視できます。
一般的に、多くのスレッドを使用可能にして、可能な場合はパラレルで実行できるようにordering-constraint属性を設定することによって、問合せのパフォーマンスが向上すると考えられます。多くのパフォーマンス・チューニング技術と同様、これらの設定で少しずつ試行錯誤を重ねて、より良い結果となる組合せを見つける必要があります。
しかし、問合せでパーティション化を使用し、ordering-constraint属性をPARTITION_ORDEREDに設定した場合でも、期待するスケーリングの量にならない可能性があります。たとえば、4つのスレッドで実行しても2つのスレッドで実行する場合に比べてパフォーマンスがあまり向上しない場合を考えます。このような場合、パーティションを含む問合せの操作でCQLエンジンの特性を最大限に活用するために、partition-order-capacityの値を使用できます。
partition-order-capacityの値は、PARTITION_ORDEREDの問合せを処理する際に指定したプロセッサ・インスタンス内で許可されている並列の最大量を指定します。使用可能なスレッドが異なるパーティションに属するイベントを処理している場合、値は問合せ内で同時に実行できるスレッドの最大数を設定します。
他のパフォーマンス・チューニングの側面と同様、partition-order-capacityを最大限に活用するために、少し実験を行うことがあります。partition-order-capacityを調整する場合、最初に行うこととして適切なのは、CQLプロセッサ・インスタンスでアクティブにするスレッドの最大数にそれを設定することです。場合によっては(たとえば、データが高速である、CQLプロセッサからダウンストリームを処理することが困難など)、partition-order-capacityの値を使用可能なスレッド数より大きく設定しても、有用なことがあります。ただし、パフォーマンス・テストが指定したアプリケーションおよび負荷にとって有用であることを確認する場合、これのみを行う必要があります。
partition-order-capacityの値は4つの場所のうち1つから設定され、2つはユーザーが明示的に設定しない場合のフォールバックとなります。次に、優先順位を示します。
チャネル構成に設定されたpartition-order-capacity要素。プロセッサの入力チャネルでこれを指定した場合、そのプロセッサのPARTITION_ORDERED問合せに対して有効になります。詳細は、付録D「スキーマ参照: コンポーネント構成wlevs_application_config.xsd」のD.72項「partition-order-capacity」を参照してください。
サーバー構成に設定されたpartition-order-capacityプロパティ。チャネルに値が設定されない場合、サーバー上で実行中のすべてのPARTITION_ORDERED問合せに対してこの値が使用されます。詳細は、付録F「スキーマ参照: サーバー構成wlevs_server_config.xsd」のF.29項「partition-order-capacity」を参照してください。
チャネル構成に設定されたmax-threadsの値。プロセッサの入力チャネルでこれを指定した場合、そのプロセッサのPARTITION_ORDERED問合せに対して有効になります。
partition-order-capacityの値とmax-threadsの値のいずれも指定しない場合、またはmax-threadsの値を0に設定した(つまりパススルー・チャネルである)場合に、システムのデフォルト値(現在は4に設定)が使用されます。
partition-order-capacityを使用する場合は、次の点に留意してください。
partition-order-capacityの値は、ordering-constraint属性をPARTITION_ORDEREDに設定している場合のみ有用になります。
partition-order-capacityを増やすと、通常、並列度およびスケーリングが増加します。たとえば、プロファイリングにロック競合のボトルネックが発生した場合、partition-order-capacityを増やして競合が減少しているかどうかを確認することが有用である可能性があります。
パーティション化をCQLプロセッサで行う特定の方法により、partition-order-capacityを使用可能なスレッド数より大きく設定しても、場合によっては有用なことがあります。
非常に高い値を指定すると、使用するメモリーでリソース・コストがかかります。
このパラメータの調整は、アプリケーションおよび入力率の詳細に大きく依存します。実験によって調整することは、最適な値を決定するのに必要な場合があります。
可能であれば常にCQLプロセッサによって使用できるように、サポートを指定するパフォーマンス強化機能として、パラレル問合せ実行を検討してください。すべての問合せをパラレルで実行できるわけではありません。これには、特定のCQL言語機能を使用した問合せが含まれています。
たとえば、問合せで集計のフォーム(値の範囲から最大値を検索するなど)を使用する場合、CQLプロセッサは問合せを完全にはパラレルで実行できない可能性があります(これには、順序付けの制約を考慮して正しい結果を保証する必要があります)。一部の問合せのセマンティクスがそれ自体でも順序付け処理への問合せを制限しています。パラレル実行のサポートを指定しているかどうかに関係なく、このような問合せはシリアルで実行されます。
また、IStream、RStreamおよびDStream演算子は、処理のためにそのオペランドの状態を維持し、問合せを実行するために、CQLプロセッサがスレッドを同期化する必要があるようにします。
CQLプロセッサは、常に問合せのセマンティク目的に配慮していることに注意してください。ordering-constraint属性によってこの目的を変更する場合、この属性は目的を元のままに残す値に強制変換されます。
partitioning-expression属性を使用している場合、この属性は単一の式のみをサポートしていることに留意してください。値への複数のプロパティ名の入力はサポートされていません。
固有のフォルト処理メカニズムを持たないコードで発生するフォルトを処理するコードを書き込むことができます。これには、Oracle CQLコードおよびマルチスレッドEPNチャネルが含まれます。デフォルトでは、try/catch構造を使用するJavaと同様に、CQL言語には発生するエラーを処理するメカニズムがありません。CQLで発生するフォルトを処理するには、フォルト・ハンドラを書き込み、ハンドラをOracle CQLプロセッサなどのフォルトを処理するEPNステージに接続します。
フォルト・ハンドラとマルチスレッド・チャネル(つまり、max-threads設定が0より大きいチャネル)を関連付けることもできます。これにより、チャネルのダウンストリームであるステージからチャネルにスローされる例外が発生した場合のフォルト処理が提供されます。max-threads設定が0であるチャネルはアップストリーム・ステージに例外をすでに再スローしているパススルー・チャネルであることに注意してください。チャネルのフォルト・ハンドラに固有の追加情報は、10.1.8項「チャネルのフォルトの処理」を参照してください。
フォルト・ハンドラは、com.bea.wlevs.ede.api.FaultHandlerインタフェースを実装するJavaクラスです。OSGiサービスとしてフォルト・ハンドラを登録してステージに関連付けることによって、クラスをEPNステージに接続します。OSGiの詳細は、付録A「SpringおよびOSGiの追加情報」を参照してください。
カスタム・フォルト・ハンドラを使用しない場合、次のデフォルトのフォルト処理動作を取得します。
例外がOracle CQLで発生する場合、CQLエンジンは例外を捕捉し、問合せプロセッサを停止します。
例外がプロセッサのダウンストリームであるステージで発生する場合、そのステージはリスナーとして削除されます。
例外がログに記録され(CQLServerカテゴリの下)、例外の原因の一部であるイベントが破棄されます。
アップストリーム・ステージは障害が通知されません。
書き込むカスタム・フォルト・ハンドラを使用する場合、次の操作を実行できます。
ステージのフォルトをハンドラに例外としてスローするよう、フォルト・ハンドラとOracle CQLプロセッサまたはマルチスレッド・チャネルを関連付けます。そのため、例外を処理または再スローできます。
コードで例外を処理するか、次のアップストリームのステージに再スローする場合、問合せ処理を続行できます。
フォルトを処理する場合にイベント・データの損失を防ぎます。たとえば、データ・ソースへの接続を構成した場合、そこでイベント・データを保存できます。
フォルトが発生した場合にフォルトおよびイベント情報をログに記録します。
他のOracle CQLプロセッサおよびチャネルに到達する場合に例外がスローされるアップストリームを処理するよう、EPNで必要な場合に複数のフォルト・ハンドラを使用します。
つまり、フォルト・ハンドラをOracle CQLプロセッサおよびマルチスレッド・チャネルを含むフォルトに対応する固有のメカニズムがないステージに関連付けることを検討します。固有の例外処理モデルを持つJavaで書き込むカスタム・アダプタなどの他のステージは、フォルト・ハンドラの利点がありません。
CQLプロセッサのアップストリームのステージへのフォルトの再スローを含む実行するアクションを決定するためにフォルト処理コードでフォルトを検証する場合、問合せを続行できます。
たとえば、CQLプロセッサのアップストリーム・ステージは、JMSトランザクションをロールバックして(セッションがトランザクションである場合)イベントを再送信できるオプションがあるJMSサブスクライバ・アダプタである可能性があります。イベントがすでに再送信され、問題を解決できないことがわかった場合、トランザクションをコミットすることもできます。
カスタム・フォルト・ハンドラを使用している場合でも、問合せが停止して再起動したかのように、問合せ状態がフォルトの後にリセットされます。ただし、問合せが停止し、すべての後続のイベントが削除される場合、デフォルトの動作と比較してください。
com.bea.wlevs.ede.api.FaultHandlerインタフェースを実装して、フォルト・ハンドラ・クラスを作成します。クラスを書き込んだ後、OSGiサービスとして登録してフォルトを処理するステージと関連付けました。詳細は、17.6.2項「フォルト・ハンドラの登録」を参照してください。
インタフェースのメソッドhandleFaultの実装は、ハンドラを関連付けるEPNステージの例外を受信します。例外自体は、com.bea.wlevs.ede.api.EventProcessingExceptionのインスタンスまたはJVMエラーが発生した場合のjava.lang.Errorのインスタンスです。
メソッドは、コードで再スローする場合に例外が通過するアップストリーム・ステージの名前catchersを含む文字配列も受信します。配列に複数の捕捉コードがある場合、再スローされた例外がすべてを通過します。一時的な問合せの実行中に例外が発生する場合と例外がチャネルのフォルト・ハンドラにスローされる場合の捕捉コードの配列が空になる2つの場合があります。これらの場合、フォルト・ハンドラはバックグラウンド・スレッドのコンテキストで実行され、アップストリーム・ステージとのリンクはありません。
フォルト・ハンドラから再スローされる例外は、捕捉されるか、または捕捉できないステージ(関連付けられたフォルト・ハンドラがないプロセッサまたはマルチスレッド・チャネルなど)に到達するまで、アップストリームEPNステージを戻ります。例外を再スローする場合、捕捉コード・リストのチャネルは例外を捕捉するために関連付けられたフォルト・ハンドラを持つ必要があるので注意してください。
EventProcessingExceptionインスタンスは、CQLExecutionException、ArithmeticExecutionExceptionおよびその他(必ずOracle Fusion Middleware Oracle Event Processing Java APIリファレンスを参照してください)を含むクラスを拡張する例外タイプのいずれかである可能性もあります。EventProcessingExceptionインスタンスは、コードでフォルトの生成に含まれたイベントの挿入、削除および更新を取得できるメソッドを提供します。
メソッドの実装は、次のいずれかを実行する必要があります。
Javaのtry/catch文のようにフォルトを使用します。実装でフォルトを再スローしない場合、イベント処理は後続のイベントを続行します。ただし、問合せを再起動したかのように、問合せ処理は状態をリセットして続行します。処理状態が失われ、フォルトを発生させたイベントの後のイベントから処理を新たに開始します。
アップストリーム・ステージ(またはフォルト・ハンドラ)で受信するよう、フォルトを再スローします。フォルトを使用する場合のように、問合せ状態が後続のイベントでリセットされますが、問合せはイベントの処理を続行します。フォルトを受信するアップストリーム・ステージには、CQLプロセッサのMBeanインタフェースを使用して、問題のある問合せを明示的に停止するオプションが常にあります。
例17-13「フォルト・ハンドラ・クラス」では、コードでフォルトを処理する上位レベルの説明を示します。
例17-13 フォルト・ハンドラ・クラス
package com.example.faulthandler;
import com.bea.wlevs.ede.api.FaultHandler;
public class SimpleFaultHandler implements FaultHandler
{
private String suppress;
// Called by the server to pass in fault information.
@Override
public void handleFault(Throwable fault, String[] catchers) throws Throwable
{
// Log the fault.
return;
}
}
フォルト処理クラスを書き込んだ後、OSGiサービスとして登録して、EPNステージに関連付けることができます。これを実行する最も単純な方法は、EPNアセンブリ・ファイルで宣言的にハンドラを登録することです。
|
注意: 固有のOSGi動作のため、構成からランタイム・フォルト・ハンドラ登録が非同期的に発生します。つまり、ハンドラがフォルトを受信する前に少しのウォームアップ時間が必要になる場合があります。ネットワークに届く最初のイベントに対してハンドラの準備が整っていることを確認するには、アプリケーションでイベントの受信を開始する前に待機期間の追加を検討します。 |
例17-14「EPNステージにフォルト・ハンドラを登録するコード」では、EPNアセンブリ・ファイルの引用は、idがexampleProcessorであるOracle CQLプロセッサのフォルト・ハンドラとしてSimpleFaultHandlerクラスを登録するservice要素スタンザを示します。
例17-14 EPNステージにフォルト・ハンドラを登録するコード
<osgi:service interface="com.bea.wlevs.ede.api.FaultHandler">
<osgi:service-properties>
<entry key="application.identity" value="myapp"/>
<entry key="stage.identity" value="exampleProcessor"/>
</osgi:service-properties>
<bean class="com.example.faulthandler.SimpleFaultHandler"/>
</osgi:service>
<!-- A processor with a user-defined function. -->
<wlevs:processor id="exampleProcessor" >
...
</wlevs:processor>
OSGiサービスを登録するスキーマの詳細は、http://static.springsource.org/osgi/docs/1.1.x/reference/html/appendix-schema.htmlを参照してください。OSGiの詳細は、http://en.wikipedia.org/wiki/OSGiを参照してください。
この項では、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"><![CDATA[
select mod(price)
from filteredStream[partition by srcId, cusip rows 1]
]]></view>
<query id="q1"><![CDATA[
SELECT *
FROM lastEvents
WHERE price > 10000
]]></query>
</rules>
</processor>
</n1:config>
この例では、name要素はprocプロセッサにOracle CQLルールが構成されていることを指定します。これは、これらのOracle CQLルールを実際のprocプロセッサ・インスタンスとリンクするために、アプリケーションを定義するEPNアセンブリ・ファイルに、procのid属性値を持つ対応するwlevs:processor要素が含まれている必要があることを意味します。(17.7.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_6.xsd">
<wlevs:event-type-repository>
<wlevs:event-type type-name="ExchangeEvent">
<wlevs:properties>
<wlevs:property name="symbol" type="char[]" 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="char[]" length="16" />
<wlevs:property name="price" type="java.lang.Double" />
<wlevs:property name="exchange" type="char[]" length="16" />
</wlevs:properties>
</wlevs:event-type>
<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>
<!-- 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>