この項では、Oracle CEPイベントについて説明します。次の項が含まれます。
イベント・タイプは、Oracle CEPアプリケーションで処理されるイベントのプロパティを定義します。アダプタはJavaメッセージ・システム(JMS)または金融マーケット・データ・フィードなどの様々なイベント・ソースからの着信イベントを受信します。プロセッサが処理できるよう、これらのイベントにOracle CEPイベント・タイプを定義する必要があります。このイベント・タイプはアダプタおよびPOJO Javaコード、およびプロセッサと関連付けられるOracle CQLおよびEPLルールで使用されます。
イベントは、各プロパティがイベント・ソースからのデータ項目を表すJavaBeanまたはJavaクラス・インスタンスです。Oracle CEPでは、次のイベント・タイプ実施がサポートされます。
JavaBean: Java Beanクラスに基づくイベント・タイプ。
詳細は、2.3項「タプルとしてOracle CEPイベント・タイプの作成」を参照してください。
タプル: EPNアセンブリ・ファイルで宣言的に作成して、登録するイベント・タイプ。
詳細は、2.3項「タプルとしてOracle CEPイベント・タイプの作成」を参照してください。
Javaクラス: Javaクラスに基づくイベント・タイプ。
詳細については、次を参照してください。
java.util.Map
: java.util.Map
のインスタンスに基づくイベント・タイプ。
詳細は、2.5項「java.util.MapとしてOracle CEPイベント・タイプの作成」を参照してください。
JavaBean(またはJavaクラスおよびファクトリ)アプローチを使用してイベントを定義することをお薦めします。そうすると、アプリケーションの一部として、イベント・タイプをさらに柔軟に処理でき、既存のシステムとの統合を簡略化できます。
かわりに、wlevs:property
タグを使用してEPNアセンブリ・ファイルにイベント・タイプのプロパティを宣言的に指定できます。この場合、Oracle CEPでは、java.util.Map
またはタプルが使用されます。タプルはデフォルトであり、Oracle CQLタプルと同様です。これによって、ユーザーに実質的に最適化実行が提供されます。しかし、ユーザーは、必ずEventTypeRepository
APIを使用してこの値を設定して、取得する必要があります。迅速なプロトタイプの場合、またはアプリケーション開発者がアプリケーション・ロジックの一部としてJavaBeanイベントを処理する必要がない場合、または一部のレガシー・システムに統合するためにこのアプローチが使用されます。
詳細については、次を参照してください。
Oracle CEPでは、イベントは概念的に不変です。一度イベントがインスタンス化されると(作成され初期化されると)、Oracle CEPサーバーで変更されません。また、アプリケーション開発者もそれを変更できません。
Oracle CEPでは、イベントはアプリケーション開発者またはOracle CEPサーバーによってインスタンス化できます。例:
アプリケーション開発者は、インバウンドSpring-bean、イベントBeanまたはアダプタでイベントをインスタンス化できます。
CQLプロセッサでダウンストリーム・コンポーネントにイベントを出力するときに、Oracle CEPサーバーからイベントをインスタンス化できます。
Oracle CEPサーバーは次の手順でJavaBeanイベント・タイプにイベントをインスタンス化します。
Javaクラスのために空の引数パブリック・コンストラクタが起動されます。
各イベント・プロパティのためにJavaBeanの命名規則に従って、パブリックのsetterメソッドが起動されます。
イベントが概念的に不変であっても、この場合は、setterメソッドを使用できる必要があります。Oracle CEPサーバーによって、イベント初期化中にこのsetterメソッドが一度のみ起動されます。
アプリケーション開発者がJavaBeanイベントのみを作成している場合、Javaクラスを不変にすると、パフォーマンスが向上します。まったく不変なBeanは、読取り専用(getterのみが提供される)であり、publicコンストラクタとともに、不変性を満たす引数を持っています。イベントがCQLプロセッサから出力されて場合は不変性は不可能で、イベントが入力としてのみ使用される場合、可能です。
Oracle CEPサーバーは次の手順でJavaクラス・イベント・タイプにイベントをインスタンス化します。
ファクトリのcreateBuilder
メソッドを呼び出して、イベント・タイプと関連付けられたcom.bea.wlevs.ede.api.EventBuilder.Factory
のインスタンスが取得されます。
createEvent
メソッドを呼び出して、イベントがインスタンス化されます。
イベントが概念的に不変であっても、この場合は、setterメソッドを使用できる必要があることにもう一度注意してください。ファクトリでイベントが初期化されているとき、Oracle CEPサーバーによって、このsetterメソッドが一度のみ起動されます。
通常、Oracle CEPイベントはシリアライズ可能である必要はありません。
ただし、Oracle Coherenceでイベントをキャッシュする場合は、イベントをシリアライズ可能にする必要があります。
イベント・タイプを作成する場合、次のデータ型制限に注意してください。
詳細については、次を参照してください。
『Oracle Complex Event Processing CQL言語リファレンス』のデータ型に関する項
『Oracle Complex Event Processing EPL言語リファレンス』のEPL言語の概要に関する項
JavaBeanまたはJavaクラスとしてイベント・タイプを定義する場合、いずれかのJavaタイプをそのプロパティに使用できます。
Oracle Javaデータ・カートリッジを使用して、JavaBeanまたはJavaクラス・イベント・タイプを別のイベント・タイプと結合することもできます。例2-1は、アドレス
プロパティをJavaクラス・イベント・タイプAddress
として定義するタプル・イベント・タイプStudent
を表しています。
例2-1 イベント・タイプ・リポジトリ
<event-type-repository> <event-type name="Student"> <property name="name" type="char"/> <property name="address" type="Address"/> </event-type> <event-type name="Address"> <class-name>test.Address</class-name> </event-type> <event-type-repository>
詳細については、以下を参照してください。
『Oracle Complex Event Processing CQL言語リファレンス』のOracle Javaデータ・カートリッジに関する項
イベント・タイプのプロパティを、java.util.Map
としてEPNアセンブリ・ファイルで宣言的に指定する場合、いずれかのJavaタイプをそのプロパティに使用できます。ただし、次のいずれかとしてイベント・タイプを指定します。
Class.forName()
と同じルールに準拠し、アプリケーションのクラス・ローダーで使用できる必要がするJavaクラスの完全修飾名。
Javaプリミティブ(たとえば、int
またはfloat
)。
イベント・タイプ名に文字[]
を追加して配列を指定できます。
例2-2には、これらのタイプの使用方法を示します。
例2-2 java.util.Mapイベント・タイプ・プロパティ用のJavaデータ型の指定
<wlevs:event-type-repository> <wlevs:event-type type-name="AnotherEvent"> <wlevs:property> <entry key="name" value="java.lang.String"/> <entry key="employeeId" value="java.lang.Integer[]"/> <entry key="salary" value="float"/> <entry key="projectIds" value="short[]"/> </wlevs:property> </wlevs:event-type> </wlevs:event-type-repository>
詳細は、2.5.1項「java.util.MapとしてOracle CEPイベント・タイプを作成する方法」を参照してください。
EPNアセンブリ・ファイルにタプルとしてイベント・タイプのプロパティを宣言的に指定する場合は、任意のCQLプリミティブ型またはJava型を使用できます。
例2-3には、様々なタイプの使用方法を示します。
例2-3 タプル・イベント・タイプ・プロパティ用のcom.bea.welvs.ede.api.Typeデータ型の指定
<wlevs:event-type-repository> <wlevs:event-type type-name="SimpleEvent"> <wlevs:properties> <wlevs:property name="id" type="char" length="1000" /> <wlevs:property name="msg" type="char" /> <wlevs:property name="count" type="double" /> <wlevs:property name="time_stamp" type="timestamp" /> </wlevs:properties> </wlevs:event-type> ... </wlevs:event-type-repository>
詳細は、2.3項「タプルとしてOracle CEPイベント・タイプの作成」を参照してください。
リレーショナル・データベース表で使用するイベント・タイプ(JavaBean、Javaクラス、java.util.Map
またはタプルのいずれか)のプロパティを指定する場合、次の追加JDBCタイプの制限に従う必要があります。
詳細については、次を参照してください。
csvgen
アダプタで使用するイベント・タイプ(JavaBean、Javaクラス、java.util.Map
またはタプルのいずれか)のプロパティを指定する場合、表2-1で説明されるデータ型のみを使用できます。
表2-1 csvgenアダプタ・タイプ
タイプ | 用途 |
---|---|
|
単一または複数の文字値。 オプションで、例2-3でプロパティ名 |
|
|
|
|
|
|
詳細については、次を参照してください。
イベント・タイプは、Oracle CEPアプリケーションで処理されるイベントのプロパティを定義します。アダプタはJMSや金融マーケット・データ・フィードなどの様々なイベント・ソースからの着信イベントを受信します。プロセッサが処理を開始できるよう、これらのイベントをイベント・タイプで定義する必要があります。このイベント・タイプが、アダプタおよびPOJO Javaコードとともにプロセッサと関連付けられるOracle CQLおよびEPLルールに使用されます。
この項では次について説明します:
詳細は、2.1項「Oracle CEPイベント・タイプ」を参照してください。
JavaBeanとしてOracle CEPイベント・タイプを作成して、登録できます。これは優先アプローチです。
標準のJavaBeansプログラミング・ガイドラインに準拠します。追加詳細は、http://java.sun.com/docs/books/tutorial/javabeans/
のJavaBeansチュートリアルを参照してください。
可能な場合は、パフォーマンスを向上するには、イベント・タイプJavaBeansを不変にすることをお薦めします。詳細は、2.1.1項「イベント・タイプのインスタンス化および不変性」を参照してください。
イベントを設計する場合、設計を2.1.3.1項「JavaBeanまたはJavaクラスとして指定されたイベント・タイプ」で説明されたイベント・データ型に制限する必要があります。
このトピックでは、次の内容について説明します。
この手順では、Oracle CEP IDE for Eclipseイベント・タイプ・リポジトリ・エディタを使用して、Oracle CEPイベント・タイプをJavaBeanとして作成して登録する方法を説明します。Oracle CEP IDE for Eclipseの詳細は、例3-0「Oracle CEP IDE for Eclipseの概要」を参照してください。
または、JavaBeanとしてイベント・タイプを手動で作成して登録することもできます(2.2.2項「JavaBeanとしてOracle CEPイベント・タイプを手動で作成する方法」を参照)。
イベント・タイプ・リポジトリ・エディタを使用してJavaBeanとしてOracle CEPイベント・タイプを作成するには、次の手順を実行します。
イベント・タイプを表すためにJavaBeanクラスを作成します。
標準のJavaBeansプログラミング・ガイドラインに準拠します。追加詳細は、http://java.sun.com/docs/books/tutorial/javabeans/
のJavaBeansチュートリアルを参照してください。
可能な場合は、パフォーマンスを向上するには、イベント・タイプJavaBeansを不変にすることをお薦めします。詳細は、2.1.1項「イベント・タイプのインスタンス化および不変性」を参照してください。
イベントを設計する場合、設計を2.1.3.1項「JavaBeanまたはJavaクラスとして指定されたイベント・タイプ」で説明されたイベント・データ型に制限する必要があります。
例2-5では、com.bea.wlevs.example.algotrading.event.MarketEvent
クラスで実施されたMarketEvent
を表します。
例2-4 MarketEventクラス
package com.bea.wlevs.example.algotrading.event; import java.util.Date; public final class MarketEvent { private final Long timestamp; private final String symbol; private final Double price; private final Long volume; private final Long latencyTimestamp; public MarketEvent(final Long timestamp, final String symbol, final Double price, final Long volume, final Long latencyTimestamp) { this.timestamp = timestamp; this.symbol = symbol; this.price = price; this.volume = volume; this.latencyTimestamp = latencyTimestamp; } public Double getPrice() { return price; } public String getSymbol() { return symbol; } public Long getTimestamp() { return timestamp; } public Long getLatencyTimestamp() { return latencyTimestamp; } public Long getVolume() { return volume; } }
イベント・タイプを表すJavaBeanをコンパイルします。
Oracle CEP IDE for EclipseのEPNを開きます。
図2-1に表示されているように、EPNエディタが開きます。
詳細は、 6.1項「EPNエディタを開く」を参照してください。
「イベント・タイプ」タブをクリックします。
図2-2に示すような「イベント・タイプ」タブが表示されます。
「イベント・タイプの追加」(緑のプラス記号)をクリックします。
図2-3に示すように、デフォルト名newEvent
を持つ新しいイベントが「イベント・タイプの定義」リストに追加されます。
「イベント・タイプの定義」リストで、newEventを選択します。
このイベントのプロパティは、図2-3に示すように、「イベント・タイプの詳細」領域に表示されます。
このイベントの名前を「タイプ名」フィールドに入力します。
「Java Beanで定義されたプロパティ」をクリックします。
JavaBeanクラスの完全修飾クラス名を「Class クラス」フィールドに入力します。
たとえば、com.bea.wlevs.example.algotrading.event.MarketEvent
です。
Eclipseツールバーの「保存」ボタンをクリックします(またはCTRL-S
を押します)。
これで、イベントがイベント・タイプ・リポジトリに表示されます。
イベント・タイプ・リポジトリ・エディタを使用して、次のことができます。
EPNアセンブリ・ファイルの対応するイベント・タイプ定義を表示するには、「イベント・タイプの定義」領域のイベント・タイプをダブルクリックします。
イベントを削除するには、「イベント・タイプの定義」領域でイベント・タイプを選択し、「イベント・タイプの削除」 (赤いx)をクリックします。
イベント・タイプを使用します。
アプリケーションのビジネス・ロジックPOJOおよびアダプタのJavaコードの標準のJavaBeansとしてイベント・タイプを参照します。
public void onEvent(List newEvents)
throws RejectEventException {
for (Object event : newEvents) {
MarketEvent marketEvent = (MarketEvent) event;
System.out.println("Price: " + marketEvent.getPrice());
}
}
EPLルールおよびOracle CQLからイベント・タイプにアクセスします。
次のOracle CQLルールでは、SELECT
文でMarketEvent
を参照するかを表します。
<query id="helloworldRule"> <![CDATA[ select MarketEvent.price from marketEventChannel [Now] ]]> </query>
この手順では、JavaBeanとしてOracle CEPイベント・タイプを手動で作成して登録する方法について説明しています。
または、Oracle CEP IDE for Eclipseイベント・タイプ・リポジトリ・エディタを使用して、JavaBeanとしてイベント・タイプを作成して登録することもできます(2.2.1項「イベント・タイプ・リポジトリ・エディタを使用して、JavaBeanとしてOracle CEPイベント・タイプを作成する方法」を参照)。
Java BeanとしてOracle CEPイベント・タイプを手動で作成するには:
イベント・タイプを表すためにJavaBeanクラスを作成します。
標準のJavaBeansプログラミング・ガイドラインに準拠します。追加詳細は、http://java.sun.com/docs/books/tutorial/javabeans/
のJavaBeansチュートリアルを参照してください。
可能な場合は、パフォーマンスを向上するには、イベント・タイプJavaBeansを不変にすることをお薦めします。詳細は、2.1.1項「イベント・タイプのインスタンス化および不変性」を参照してください。
イベントを設計する場合、設計を2.1.3.1項「JavaBeanまたはJavaクラスとして指定されたイベント・タイプ」で説明されたイベント・データ型に制限する必要があります。
例2-5では、com.bea.wlevs.example.algotrading.event.MarketEvent
クラスで実施されたMarketEvent
を表します。
例2-5 MarketEventクラス
package com.bea.wlevs.example.algotrading.event; import java.util.Date; public final class MarketEvent { private final Long timestamp; private final String symbol; private final Double price; private final Long volume; private final Long latencyTimestamp; public MarketEvent(final Long timestamp, final String symbol, final Double price, final Long volume, final Long latencyTimestamp) { this.timestamp = timestamp; this.symbol = symbol; this.price = price; this.volume = volume; this.latencyTimestamp = latencyTimestamp; } public Double getPrice() { return price; } public String getSymbol() { return symbol; } public Long getTimestamp() { return timestamp; } public Long getLatencyTimestamp() { return latencyTimestamp; } public Long getVolume() { return volume; } }
イベント・タイプを表すJavaBeanをコンパイルします。
Oracle CEPイベント・タイプ・リポジトリにJavaBeanイベント・タイプを登録します。
宣言的に登録するには、例2-6に示すように、wlevs:event-type-repository
要素wlevs:event-type
子要素を使用して、EPNアセンブリ・ファイルを編集します。
プログラムとして登録するには、例2-7に示すように、EventTypeRepository
クラスを使用します。
例2-7 プログラムとしてイベントの登録
EventTypeRepository rep = getEventTypeRepository(); rep.registerEventType( "MarketEvent", com.bea.wlevs.example.algotrading.event.MarketEvent.getClass() );
詳細は、2.7項「イベント・タイプ・リポジトリにアクセス」を参照してください。
イベント・タイプを使用します。
アプリケーションのビジネス・ロジックPOJOおよびアダプタのJavaコードの標準のJavaBeansとしてイベント・タイプを参照します。
public void onEvent(List newEvents)
throws RejectEventException {
for (Object event : newEvents) {
MarketEvent marketEvent = (MarketEvent) event;
System.out.println("Price: " + marketEvent.getPrice());
}
}
EPLルールおよびOracle CQLからイベント・タイプにアクセスします。
次のOracle CQLルールでは、SELECT
文でMarketEvent
を参照するかを表します。
<query id="helloworldRule"> <![CDATA[ select MarketEvent.price from marketEventChannel [Now] ]]> </query>
タプルとしてOracle CEPイベント・タイプを作成して、登録できます。
イベントを設計する場合、設計を2.1.3.3項「タプルとして指定されたイベント・タイプ」で説明されたイベント・データ型に制限する必要があります。
このトピックでは、次の内容について説明します。
この手順では、Oracle CEP IDE for Eclipseイベント・タイプ・リポジトリ・エディタを使用して、Oracle CEPイベント・タイプをタプルとして作成して登録する方法を説明します。Oracle CEP IDE for Eclipseの詳細は、例3-0「Oracle CEP IDE for Eclipseの概要」を参照してください。
または、タプルとしてイベント・タイプを手動で作成して登録することもできます(2.3.2項「タプルとしてOracle CEPイベント・タイプを手動で作成する方法」を参照)。
イベント・タイプ・リポジトリ・エディタを使用してタプルとしてOracle CEPイベント・タイプを作成するには、次の手順を実行します。
イベント・タイプに必要なプロパティを決定します。
イベントを設計する場合、設計を2.1.3.3項「タプルとして指定されたイベント・タイプ」で説明されたイベント・データ型に制限する必要があります。
Oracle CEP IDE for EclipseのEPNを開きます。
図2-4に表示されているように、EPNエディタが開きます。
詳細は、 6.1項「EPNエディタを開く」を参照してください。
「イベント・タイプ」タブをクリックします。
図2-5に示すような「イベント・タイプ」タブが表示されます。
「イベント・タイプの追加」(緑のプラス記号)をクリックします。
図2-6に示すように、デフォルト名newEvent
を持つ新しいイベントが「イベント・タイプの定義」リストに追加されます。
「イベント・タイプの定義」リストで、newEventを選択します。
このイベントのプロパティは、図2-6に示すように、「イベント・タイプの詳細」領域に表示されます。
このイベントの名前を「タイプ名」フィールドに入力します。
「宣言で定義されたプロパティ」をクリックします。
1つ以上のイベント・プロパティを追加します。
「イベント・プロパティの追加」(緑のプラス記号)をクリックします。
新しい行が「イベント・タイプの詳細」表に追加されます。
この行の「名前」列をクリックしてプロパティ名を入力します。
この行の「タイプ」列をクリックして、プルダウン・メニューからデータ型を選択します。
イベントを設計する場合、設計を2.1.3.3項「タプルとして指定されたイベント・タイプ」で説明されたイベント・データ型に制限する必要があります。
char
データ型プロパティについてのみ、この行の「'char'の長さ」列をクリックして、このchar
プロパティの最大長の値を入力します。
オプションで、char
値の最大長を指定するために、length
属性を使用できます。デフォルトの長さは256文字です。最大長はjava.lang.Integer.MAX_VALUE
です。256文字を超える必要がある場合、適当な長さを指定する必要があります。
Eclipseツールバーの「保存」ボタンをクリックします(またはCTRL-S
を押します)。
これで、イベントがイベント・タイプ・リポジトリに表示されます。
イベント・タイプ・リポジトリ・エディタを使用して、次のことができます。
EPNアセンブリ・ファイルの対応するイベント・タイプ定義を表示するには、「イベント・タイプの定義」領域のイベント・タイプをダブルクリックします。
イベントを削除するには、「イベント・タイプの定義」領域でイベント・タイプを選択し、「イベント・タイプの削除」 (赤いx)をクリックします。
イベント・タイプを使用します。
アプリケーションのビジネス・ロジックPOJOおよびアダプタのJavaコードのEventTypeRepository
イントロスペクション・インタフェースEventType
を使用して、イベント・タイプを参照します。
@Service public void setEventTypeRepository(EventTypeRepository etr) { etr_ = etr; } ... // handle events public void onInsertEvent(Object event) throws EventRejectedException { // get the event type for the current event instance EventType eventType = etr_.getEventType(event); // get the event type name String eventTypeName = eventType.getTypeName(); // get the event property names String[] propNames = eventType.getPropertyNames(); // test if property is present if(eventType.isProperty("fromRate")) { // get property value Object propValue = eventType.getProperty("fromRate").getValue(event); } ... }
詳細は、2.7項「イベント・タイプ・リポジトリにアクセス」を参照してください。
EPLルールおよびOracle CQLからイベント・タイプにアクセスします。
次のOracle CQLルールでは、SELECT
文でCrossRateEvent
をどのように参照するかを表しています。
<query id="FindCrossRatesRule"><![CDATA[ select ((a.price * b.price) + 0.05) as internalPrice, a.fromRate as crossRate1, b.toRate as crossRate2 from FxQuoteStream [range 1] as a, FxQuoteStream [range 1] as b where NOT (a.price IS NULL) and NOT (b.price IS NULL) and a.toRate = b.fromRate ]]></query>
この手順では、EPNアセンブリ・ファイルにタプルとしてOracle CEPイベント・タイプを宣言的に作成して登録する方法について説明しています。Oracle CEPイベント・タイプをJavaBean(2.2.2項「JavaBeanとしてOracle CEPイベント・タイプを手動で作成する方法」を参照)として作成することをお薦めします。
有効なイベント・タイプ・データ型の詳細は、2.1.3.3項「タプルとして指定されたイベント・タイプ」を参照してください。
タプルとしてOracle CEPイベント・タイプを作成するには:
イベント・タイプに必要なプロパティを決定します。
イベントを設計する場合、設計を2.1.3.3項「タプルとして指定されたイベント・タイプ」で説明されたイベント・データ型に制限する必要があります。
Oracle CEPイベント・タイプ・リポジトリにイベント・タイプを宣言的に登録します。
宣言的に登録するには、例2-8に示すように、wlevs:event-type-repository
要素wlevs:event-type
子要素を使用して、EPNアセンブリ・ファイルを編集します。
例2-8 EPNアセンブリ・ファイルevent-type-repository
<wlevs:event-type-repository> <wlevs:event-type type-name="CrossRateEvent"> <wlevs:properties> <wlevs:property name="price" type="double"/> <wlevs:property name="fromRate" type="char"/> <wlevs:property name="toRate" type="char"/> </wlevs:properties> </wlevs:event-type> </wlevs:event-type-repository>
ランタイム時に、Oracle CEPでは、CrossRateEvent
のBeanインスタンスが生成されます。CrossRateEvent
には、price
、fromRate
およびtoRate
の3つのプロパティがあります。
type
属性の有効な値の詳細は、2.1.3.3項「タプルとして指定されたイベント・タイプ」を参照してください。
イベント・タイプを使用します。
アプリケーションのビジネス・ロジックPOJOおよびアダプタのJavaコードのEventTypeRepository
イントロスペクション・インタフェースEventType
を使用して、イベント・タイプを参照します。
@Service public void setEventTypeRepository(EventTypeRepository etr) { etr_ = etr; } ... // handle events public void onInsertEvent(Object event) throws EventRejectedException { // get the event type for the current event instance EventType eventType = etr_.getEventType(event); // get the event type name String eventTypeName = eventType.getTypeName(); // get the event property names String[] propNames = eventType.getPropertyNames(); // test if property is present if(eventType.isProperty("fromRate")) { // get property value Object propValue = eventType.getProperty("fromRate").getValue(event); } ... }
詳細は、2.7項「イベント・タイプ・リポジトリにアクセス」を参照してください。
EPLルールおよびOracle CQLからイベント・タイプにアクセスします。
次のOracle CQLルールでは、SELECT
文でCrossRateEvent
をどのように参照するかを表しています。
<query id="FindCrossRatesRule"><![CDATA[ select ((a.price * b.price) + 0.05) as internalPrice, a.fromRate as crossRate1, b.toRate as crossRate2 from FxQuoteStream [range 1] as a, FxQuoteStream [range 1] as b where NOT (a.price IS NULL) and NOT (b.price IS NULL) and a.toRate = b.fromRate ]]></query>
JavaクラスとしてOracle CEPイベント・タイプを作成して、登録できます。
このトピックでは、次の内容について説明します。
この手順では、JavaBeansプログラミング・ガイドラインに準拠しないJavaクラスとしてOracle CEPイベント・タイプ作成して登録する方法について説明しています。
有効なイベント・タイプ・データ型の詳細は、2.1.3.1項「JavaBeanまたはJavaクラスとして指定されたイベント・タイプ」を参照してください。
JavaクラスとしてOracle CEPイベント・タイプを手動で作成するには:
イベント・タイプを表すためにJavaクラスを作成します。
可能な場合は、パフォーマンスを向上するために、イベント・タイプJavaクラスを不変にすることをお薦めします。詳細は、2.1.1項「イベント・タイプのインスタンス化および不変性」を参照してください。
例2-5では、com.bea.wlevs.example.fx.OutputBean
のForeignExchangeEvent
内部クラスで実装されたForeignExchangeEvent
を表します。
例2-9 ForeignExchangeEventクラス: JavaBean標準に準拠しない
package com.bea.wlevs.example.fx.OutputBean.ForeignExchangeEvent; static public class ForeignExchangeEvent { private String symbol; private Double price; private String fromRate; private String toRate; private Long clientTimestamp; private Long adapterTimestamp; public ForeignExchangeEvent() { } public ForeignExchangeEvent(String symbol, Double price, String fromRate, String toRate) { this.symbol = symbol; this.price = price; this.fromRate = fromRate; this.toRate = toRate; if (clientTimestamp == null) this.clientTimestamp = new Long(0); if (adapterTimestamp == null) this.adapterTimestamp = new Long(0); } public String getSymbol() { return symbol; } public Double getPrice() { return price; } public String getFromRate() { return fromRate; } public String getToRate() { return toRate; } public Long getClientTimestamp() { return clientTimestamp; } public Long getAdapterTimestamp() { return adapterTimestamp; } }
例2-10に示すようにイベント・タイプ・ビルダーを表すためにJavaクラスを作成します。
例2-10 ForeignExchangeBuilderFactory
package com.bea.wlevs.example.fx; import java.util.HashMap; import java.util.Map; import com.bea.wlevs.ede.api.EventBuilder; import com.bea.wlevs.example.fx.OutputBean.ForeignExchangeEvent; public class ForeignExchangeBuilderFactory implements EventBuilder.Factory { public EventBuilder createBuilder() { return new ForeignExchangeBuilder(); } static class ForeignExchangeBuilder implements EventBuilder { private Map<String,Object> values = new HashMap<String,Object>(10); public Object createEvent() { return new ForeignExchangeEvent( (String) values.get("symbol"), (Double) values.get("price"), (String) values.get("fromRate"), (String) values.get("toRate")); } public void put(String property, Object value) throws IllegalStateException { values.put(property, value); } } }
Oracle CEPでは、イベント・ビルダー・ファクトリが使用され、JavaBean指定に準拠しないイベント・インスタンスが作成されます。イベント・タイプ・ビルダー・ファクトリの使用に関する追加情報は、2.6項「イベント・タイプ・ビルダー・ファクトリの使用」を参照してください。
イベント・タイプおよびイベント・ビルダー・ファクトリを表すJavaクラスをコンパイルします。
Oracle CEPイベント・タイプ・リポジトリにイベント・タイプおよびイベント・ビルダー・ファクトリを登録します。
宣言的に登録するには、例2-6に示すように、wlevs:event-type-repository
要素wlevs:event-type
子要素を使用して、EPNアセンブリ・ファイルを編集します。
JavaBeanクラスを示すには、wlevs:class
要素を使用し、イベント・タイプとしてカスタム・イベント・ビルダー・ファクトリを指定するには、<wlevs:property name="builderFactory">
要素を使用します。
例2-11 EPNアセンブリ・ファイルevent-type-repository
<wlevs:event-type-repository> <wlevs:event-type type-name="ForeignExchangeEvent"> <wlevs:class> com.bea.wlevs.example.fx.OutputBean.ForeignExchangeEvent </wlevs:class> <wlevs:property name="builderFactory"> <bean id="builderFactory" class="com.bea.wlevs.example.fx.ForeignExchangeBuilderFactory"/> </wlevs:property> </wlevs:event-type> </wlevs:event-type-repository>
プログラムとして登録するには、例2-7に示すように、EventTypeRepository
クラスを使用します。
例2-12 プログラムとしてイベントの登録
EventTypeRepository rep = getEventTypeRepository(); ForeignExchangeBuilderFactory factory = new ForeignExchangeBuilderFactory(); rep.registerEventType( "ForeignExchangeEvent", com.bea.wlevs.example.fx.OutputBean.ForeignExchangeEvent.getClass(), factory.createBuilder() );
詳細は、2.7項「イベント・タイプ・リポジトリにアクセス」を参照してください。
イベント・タイプを使用します。
アプリケーションのビジネス・ロジックPOJOおよびアダプタのJavaコードの標準のJavaBeansとしてイベント・タイプを参照します。
public void onEvent(List newEvents)
throws RejectEventException {
for (Object event : newEvents) {
ForeignExchangeEvent fxEvent = (ForeignExchangeEvent) event;
System.out.println("Price: " + fxEvent.getPrice());
}
}
EPLルールおよびOracle CQLからイベント・タイプにアクセスします。
次のOracle CQLルールでは、SELECT
文でMarketEvent
を参照するかを表します。
<query id="helloworldRule"> <![CDATA[ select ForeignExchangeEvent.price from marketEventChannel [Now] ]]> </query>
java.util.Map
としてOracle CEPイベント・タイプを作成して、登録できます。
このトピックでは、次の内容について説明します。
この手順では、java.util.Map
としてOracle CEPイベント・タイプを作成して登録する方法について説明しています。Oracle CEPイベント・タイプをJavaBean(2.2.2項「JavaBeanとしてOracle CEPイベント・タイプを手動で作成する方法」を参照)として作成することをお薦めします。
有効なイベント・タイプ・データ型の詳細は、2.1.3.2項「java.util.Mapとして指定されたイベント・タイプ」を参照してください。
java.util.MapとしてOracle CEPイベント・タイプを作成するには:
イベント・タイプに必要なプロパティを決定します。
Oracle CEPイベント・タイプ・リポジトリにイベント・タイプを登録します。
宣言的に登録するには、例2-13に示すように、wlevs:event-type-repository
要素wlevs:event-type
子要素を使用して、EPNアセンブリ・ファイルを編集します。
例2-13 EPNアセンブリ・ファイルevent-type-repository
<wlevs:event-type-repository> <wlevs:event-type type-name="AnotherEvent"> <wlevs:properties type="map"> <wlevs:property name="name" value="java.lang.String"/> <wlevs:property name="age" value="java.lang.Integer"/> <wlevs:property name="address" value="java.lang.String"/> </wlevs:properties > </wlevs:event-type> </wlevs:event-type-repository>
ランタイム時に、Oracle CEPでは、AnotherEvent
のBeanインスタンスが生成されます。AnotherEvent
には、name
、age
およびaddress
の3つのプロパティがあります。
プログラムとして登録するには、例2-14に示すように、EventTypeRepository
クラスを使用します。
例2-14 プログラムとしてイベントの登録
EventTypeRepository rep = getEventTypeRepository(); java.util.Map map = new Map({name, java.lang.String}, {age, java.lang.Integer}, {address, java.lang.String}); rep.registerEventType("AnotherEvent", map);
詳細は、2.7項「イベント・タイプ・リポジトリにアクセス」を参照してください。
イベント・タイプを使用します。
アプリケーションのビジネス・ロジックPOJOおよびアダプタのJavaコードの標準のJavaBeansとしてイベント・タイプを参照します。
public void onEvent(List newEvents)
throws RejectEventException {
for (Object event : newEvents) {
java.util.Map anEvent = (java.util.Map) event;
System.out.println("Age: " + anEvent.getAge());
}
}
EPLルールおよびOracle CQLからイベント・タイプにアクセスします。
次のOracle CQLルールでは、SELECT
文でMarketEvent
を参照するかを表します。
<query id="helloworldRule"> <![CDATA[ select AnotherEvent.age from eventChannel [Now] ]]> </query>
wlevs:event-type
要素を使用してイベント・タイプをリポジトリに登録すると、Oracle CEPではイベント・タイプ・クラスの情報を使用してイベントのインスタンスが作成されます。
ただし、イベント・タイプ・インスタンスの作成をより詳細に制御する必要がある場合があります。これは、イベント・プロパティに必要なgetterおよびsetterメソッドがイベントを表現するPOJOで公開されていない場合に必要です。たとえば、イベント・タイプにfirstname
プロパティが含まれている一方で、イベント・タイプで実行されるEPLルールではそのプロパティがfname
と呼ばれるとします。さらに、(たとえば、他のバンドルからの共有イベント・クラスを使用しているなどの理由から)、相互の互換性を実現するためにイベント・タイプ・クラスを変更することも、EPLルールを変更することもできないと想定します。この場合は、イベント・タイプ・ビルダー・ファクトリを使用して、プロパティ名をfirstname
のかわりに{fname
にするよう、イベント・タイプ・インスタンスの作成方法を変更できます。
イベント・タイプ・ビルダー・ファクトリをプログラミングする場合は、com.bea.wlevs.ede.api.EventBuilder
インタフェースのEventBuilder.Factory
内部インタフェースを実装する必要があります。createBuilder
およびcreateEvent
などの実装する必要のあるメソッドの詳細は、Oracle Fusion Middleware Oracle Complex Event Processing Java APIリファレンスを参照してください。
次の例は、FXサンプルからのイベント・タイプ・ビルダー・ファクトリ・クラスの例です。
package com.bea.wlevs.example.fx; import java.util.HashMap; import java.util.Map; import com.bea.wlevs.ede.api.EventBuilder; import com.bea.wlevs.example.fx.OutputBean.ForeignExchangeEvent; public class ForeignExchangeBuilderFactory implements EventBuilder.Factory { public EventBuilder createBuilder() { return new ForeignExchangeBuilder(); } static class ForeignExchangeBuilder implements EventBuilder { private Map<String,Object> values = new HashMap<String,Object>(10); public Object createEvent() { return new ForeignExchangeEvent( (String) values.get("symbol"), (Double) values.get("price"), (String) values.get("fromRate"), (String) values.get("toRate")); } public void put(String property, Object value) throws IllegalStateException { values.put(property, value); } } }
EPNアセンブリ・ファイルでイベント・タイプを登録する場合は、wlevs:event-type
要素の<wlevs:property name="builderFactory">
子要素を使用してファクトリ・クラスの名前を指定します。name
属性のハードコード化されたbuilderFactory
の値によって、このイベントのインスタンスを作成する際はデフォルト・ファクトリではなく指定されたファクトリ・クラスを使用する必要があることがOracle CEPに対してアラートされます。たとえば、FXサンプルでは、ビルダー・ファクトリは太字で示されたとおりに登録されています。
<wlevs:event-type-repository> <wlevs:event-type type-name="ForeignExchangeEvent"> <wlevs:class>com.bea.wlevs.example.fx.OutputBean$ForeignExchangeEvent</wlevs:class> <wlevs:property name="builderFactory"> <bean id="builderFactory" class="com.bea.wlevs.example.fx.ForeignExchangeBuilderFactory"/> </wlevs:property> </wlevs:event-type> </wlevs:event-type-repository>
EventTypeRepository
は、単一のOSGiサービスです。これは単一であるため、これを識別するためにインタフェース名のみを指定する必要があります。次のいずれかの方法でOSGiからサービスを取得できます。
詳細は、Oracle Fusion Middleware Oracle Complex Event Processing Java APIリファレンスを参照してください。
例2-15に示すように、EPNアセンブリ・ファイルのosgi:reference
を指定してEventTypeRepository
にアクセスできます。
例2-15 EPN EventTypeRepositoryのOSGi参照によるEPNアセンブリ・ファイル
<osgi:reference id="etr" interface="com.bea.wlevs.ede.api.EventTypeRepository" /> <bean id="outputBean" class="com.acme.MyBean" > <property name="eventTypeRepository" ref="etr" /> </bean>
その後、MyBean
クラスでは、例2-16に示すように、Springにより初期化されたeventTypeRepository
プロパティを使用して、EventTypeRepository
にアクセスできます。
例2-16 MyBean実施でのEventTypeRepositoryへのアクセス
package com.acme; import com.bea.wlevs.ede.api.EventTypeRepository; import com.bea.wlevs.ede.api.EventType; public class MyBean { private EventTypeRepository eventTypeRepository; public void setEventTypeRepository(EventTypeRepository eventTypeRepository) { this.eventTypeRepository = eventTypeRepository; } public void onInsertEvent(Object event) throws EventRejectedException { // get the event type for the current event instance EventType eventType = eventTypeRepository.getEventType(event); ... } }
例2-17に示すように、Javaソースのプロパティを初期化するために、Spring-DM @ServiceReference
注釈を使用してEventTypeRepository
にアクセスできます。
例2-17に示すように、Javaソースのプロパティを初期化するために、Oracle CEP @Service
注釈を使用して、EventTypeRepository
にアクセスできます。
例2-18 @Service注釈を使用するJavaソース・ファイル
import com.bea.wlevs.util.Service; import com.bea.wlevs.ede.api.EventTypeRepository; ... @Service setEventTypeRepository(EventTypeRepository etr) { ... }
詳細は、I.5項「com.bea.wlevs.util.Service」を参照してください。
それぞれのOracle CEPアプリケーションは、固有のJavaクラス・ローダーを取得し、そのクラス・ローダーを使用してアプリケーションのクラスをロードします。このため、デフォルトでは、あるアプリケーションから別のアプリケーションのクラスにアクセスすることはできません。ただし、イベント・タイプ・リポジトリはシングルトン・サービスであるため、あるバンドルでリポジトリを構成し、イベント・タイプ・クラスを明示的にエクスポートすることによって、(同一のOracle CEPサーバーにデプロイされた)別のバンドル内のアプリケーションでそれらの共有されたイベント・タイプを使用できるようになります。
この場合、イベント・タイプ名のスコープはOracle CEPサーバー・インスタンス全体になります。このため、他のバンドルからの共有イベント・タイプと同名のイベント・タイプを作成しようとすると例外が送出されますが、これらのイベント・タイプのクラスは異なります。
イベント・タイプ・クラスを共有するには、共有するイベント・タイプ・リポジトリが含まれているバンドルのMANIFEST.MF
ファイルのExport-Package
ヘッダーにパッケージ名を追加します。
共有イベント・タイプを使用するアプリケーションが含まれているすべてのバンドルよりも前に、イベント・タイプ・リポジトリが含まれているバンドルを必ずデプロイするようにします。そうしないと、デプロイメント例外が送出されます。
詳細については、次を参照してください。
『Oracle Complex Event Processing CQL言語リファレンス』のOracle Javaデータ・カートリッジに関する項