| Oracle® Fusion Middleware Oracle Complex Event Processing開発者ガイド 11gリリース1 (11.1.1.6.2) for Eclipse B61654-04 |
|
![]() 前 |
![]() 次 |
この章では、イベント・タイプの開発、Oracle Complex Event Processing (Oracle CEP)イベント処理ネットワークの不可欠な部分について説明します。イベント・タイプは、JavaBean、タプル、JavaクラスおよびJava Mapインスタンスとして開発できます。
イベント・タイプは、Oracle CEPアプリケーションで処理されるイベントのプロパティを定義します。アダプタはJavaメッセージ・システム(JMS)または金融マーケット・データ・フィードなどの様々なイベント・ソースからの着信イベントを受信します。プロセッサが処理できるよう、これらのイベントにOracle CEPイベント・タイプを定義する必要があります。このイベント・タイプはアダプタおよびPOJO Javaコード、およびプロセッサと関連付けられるOracle CQLおよびEPLルールで使用されます。
イベントは、各プロパティがイベント・ソースからのデータ項目を表すJavaBeanまたはJavaクラス・インスタンスです。Oracle CEPでは、次のイベント・タイプ実施がサポートされます。
JavaBean: Java Beanクラスに基づくイベント・タイプ。
詳細は、2.2項「JavaBeanとして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 Fusion Middleware Oracle Complex Event Processing CQL言語リファレンス』のデータ型に関する項
『Oracle Fusion Middleware 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 Fusion Middleware 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:properties type="map">
<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:properties>
</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クラスとして指定されたイベント・タイプ」で説明されたイベント・データ型に制限する必要があります。
このトピックでは、次の内容について説明します。
Javaクラスとして作成されたイベント・タイプが存在する場合、Oracle CQLコードでは、標準のJavaBeanスタイル・プロパティ・アクセスを使用するか通常のJavaクラスとしてプロパティ値を取得できます。
次の構成スニペットの抜粋では、JavaBeanクラスであるStudentTypeイベント・タイプを宣言しています。
<event-type-repository>
<event-type name="StudentType">
<class-name>school.Student</class-name>
</event-type>
</event-type-repository>
school.Studentクラスは、それ自体が Address JavaBeanクラスであるアドレス・プロパティを持つJavaBeanです。次の問合せは、アドレス・プロパティの基礎となるAddressオブジェクトの値にアクセスする方法を示します。この問合せでは、郵便番号が"97"で始まる生徒のアドレスを選択します。
<query id="studentAddresses">
SELECT
student.address
FROM
StudentType as student
WHERE
student.address.postalCode LIKE '^97'
</query>
この手順では、Oracle CEP IDE for Eclipseイベント・タイプ・リポジトリ・エディタを使用して、Oracle CEPイベント・タイプをJavaBeanとして作成して登録する方法を説明します。Oracle CEP IDE for Eclipseの詳細は、例3-0「Oracle CEP IDE for Eclipseの概要」を参照してください。
または、JavaBeanとしてイベント・タイプを手動で作成して登録することもできます(2.2.3項「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-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.2項「イベント・タイプ・リポジトリ・エディタを使用して、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);
}
// Throw com.bea.wlevs.ede.api.EventRejectedException to have an
// exception propagated up to senders. Other errors will be
// logged and dropped.
}
詳細は、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.3項「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);
}
// Throw com.bea.wlevs.ede.api.EventRejectedException to have an
// exception propagated up to senders. Other errors will be
// logged and dropped.
}
詳細は、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.3項「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);
// Throw com.bea.wlevs.ede.api.EventRejectedException to have an
// exception propagated up to senders. Other errors will be
// logged and dropped.
}
}
例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 Fusion Middleware Oracle Complex Event Processing CQL言語リファレンス』のOracle Javaデータ・カートリッジに関する項