この章では、イベント・タイプの実装および構成方法とイベント・タイプ・リポジトリのアクセス方法を含むイベント処理ネットワークを介してイベント・データを移動する必要があるOracle Event Processingイベント・タイプの定義方法について説明します。
定義するイベント・タイプを介して、コードでイベント・データにアクセスします。この章の説明に従って、書き込むJavaBeanクラスなどのいくつかのデータ型のいずれかに基づくイベント・タイプを定義します。イベント・タイプ・リポジトリの一部として構成して、イベント・タイプをアプリケーションに追加します。イベント・タイプは構成XMLを介してリポジトリに通常追加されますが、プログラムとしてリポジトリにアクセスするコードを書き込むこともできます。
この章の内容は次のとおりです。
イベント・タイプは、Oracle Event Processingアプリケーションのイベント・データを表す方法です。イベントは、特定の時間に発生した事象に関連する構造化データです。たとえば、サーバー室の環境の変更に対応するようアプリケーションを設計している場合、イベント・データには、環境を監視するデバイスで収集されるスナップショット情報が含まれる可能性があります。または、アプリケーションで株式市場の取引に関連するトレンドおよびパターンに注目する場合、イベント・データは、取引された株、取引量、株価などを含む取引に対応する値である可能性があります。
アプリケーションへのイベント・データは、様々な形式で到着する可能性があります。イベント・タイプを作成してアプリケーション内のデータを表すことによって、アプリケーションのロジックの予測可能な方法を作成してデータを使用します。イベント・タイプはイベント・データの移動手段であるため、それらの定義はOracle Event Processingアプリケーションの作成に不可欠な部分です。
実際のイベント・タイプの作成および使用は、8.3項「イベント・データを移動するイベント・タイプの作成」を参照してください。
作成するイベント・タイプのインスタンスは、アプリケーションのイベント処理ネットワーク(EPN)を介してイベント・データを移動します。イベント・タイプの設計および実装の適切な決定を行うため、どのようにコードでイベントを使用するかに留意してください。
イベント・タイプ・インスタンスは、Oracle Event Processingサーバーまたは独自のアプリケーション・ロジックによって使用されます。通常、Oracle Event Processingサーバーは、タイプのインスタンスを作成し、データをバインドします。ただし、イベント・タイプ・インスタンスの作成方法をより詳細に制御するには、イベント・タイプ・ビルダーを作成できます。詳細は、9.3.1.5項「イベント・タイプ・ビルダー・クラスでのイベント・タイプのインスタンス化の制御」を参照してください。
イベント・タイプ・インスタンスを使用する主な場所を次に示します。
着信イベント・データが外部ソースから到着する場合、イベント・タイプ・インスタンスにバインドされます。
Oracle CQLプロセッサが問合せを実行し、結果を出力する場合、イベント・タイプのインスタンスは、EPNのダウンストリームのステージに結果イベント・データを移動するために作成されます。
イベントを処理するJavaコードなどのアプリケーションのJavaロジックでは、新しいイベント・タイプ・インスタンスを作成して、EPNのダウンストリームのステージに送信できます。イベントを作成するJavaコードはイベント・ソースと呼ばれます。イベント・ソースの実装の詳細は、16.2.2項「イベント・ソースの実装」を参照してください。
上位レベルで、イベント・タイプを作成するプロセスでは、イベント・タイプで移動してOracle Event Processingでサポートされるデータ型のいずれかとしてタイプを実装する必要があるイベント・データを識別します。
手順の概要は次のとおりです。
イベント・タイプを設計します。基本的に、アプリケーションに関連するイベント・データのセットを識別し、データをイベント・タイプで表す方法を選択します。詳細は、9.2項「イベント・タイプの設計」を参照してください。
イベント・タイプを作成します。データをタイプで表す方法を認識すると、次の3つの方法のいずれかでタイプを作成できます: JavaBeanクラスとして実装、タプルとして構成、java.util.Mapとして構成。タイプのインスタンス化方法をより詳細に制御するには、イベント・タイプ・ビルダーを実装することもできます。詳細は、9.3項「イベント・タイプの作成」を参照してください。
イベント・タイプを設計する場合、rawイベント・データをOracle Event Processingでサポートする実装オプションにマップします。
イベントの設計には、次のタスクが含まれます。
イベント・タイプが表すイベント・データの構造を識別します。これは、サーバー室のモニターなどの外部ソースからのrawイベント・データの構造である可能性があります。コードでタイプのインスタンスを送信するダウンストリーム・ステージまたはコンポーネントで必要なデータ構造である可能性もあります。詳細は、9.2.1項「イベント・データの構造の識別」を参照してください。
作成するイベント・タイプの基本になるデータ型を選択します。イベント・タイプは、Oracle Event Processingでサポートされる次の3つのデータ型のいずれかに基づいています: JavaBeanクラス、タプルまたはjava.util.Mapインスタンス。詳細は、9.2.2項「イベント・タイプのデータ型の選択」を参照してください。
イベント・タイプの計画された使用に留意し、それらの使用による潜在的な制約に注意してください。詳細は、9.2.3項「イベント・タイプの設計の制約」を参照してください。
最後に、アプリケーションのEPN XMLファイルのイベント・タイプを構成する場合にタイプを混合して使用できることに注意してください。詳細は、9.2.4項「イベント・タイプ・データ型の使用の混在」を参照してください。
イベント処理ネットワークを定義する早期タスク(通常は簡単なタスク)では、イベント・データの構造を明確にし、データをEPN内で処理する形式を定義します。作成するイベント・タイプには、アプリケーションで参照するイベント・データの各部分のプロパティが含まれます。これらの各プロパティには、固有のデータ型があります。
イベント・タイプを作成する前に、イベント・データのサンプルを使用して、タイプのプロパティおよびデータ型を定義します。たとえば、株式取引のイベント・データの非常に単純なセットを考慮します。カンマ区切り値の行として表され、取引イベント・データは次のようになります。
ORCL,14.1,6000
次の表は、イベント・データを個別の値に分割する方法を示し、それぞれにイベント・タイプ・プロパティを定義しています。
| サンプル・データ値 | ロール | データのタイプ | イベント・タイプ プロパティ名 |
|---|---|---|---|
| ORCL | 銘柄記号 | character | symbol |
| 14.1 | 株価 | number | price |
| 6000 | 取引される株式数 | number | volume |
イベント・タイプの作成方法にかかわらず、プロパティおよびデータ型の意味がある必要があります。ただし、プロパティ・データ型の指定方法は、イベント・タイプをベースとするデータ型によって異なります。たとえば、イベント・タイプとしてJavaBeanクラスを実装する場合、表で指定された3つの値のデータ型は次のようになります。
| イベント・タイプ プロパティ名 |
Javaデータ型 |
|---|---|
| symbol | String |
| price | Double |
| volume | Integer |
タプルまたはjava.util.Mapとしてイベント・タイプを作成した場合、データ型が異なることがあります。詳細は、9.2.2項「イベント・タイプのデータ型の選択」を参照してください。
作成するイベント・タイプはOracle Event Processingでサポートされる次の3つのデータ型のいずれかに基づいています: JavaBeanクラス、タプルまたはjava.util.Map。
各データ型に固有の利点および制限がありますが、ベスト・プラクティスはJavaBeanクラスとしてイベント・タイプを作成し、アクセッサ・メソッドとしてイベント・タイプ・プロパティを実装することです。JavaBeanを使用すると、アプリケーション・ロジックの一部としてイベント・タイプがさらに柔軟に処理され、既存のシステムとの統合が簡略化されます。イベント・タイプをJavaBeanクラスとして実装した場合、イベント・タイプ・ビルダー・クラスを実装して、イベント・タイプのインスタンス化を(必要に応じて)厳密に制御することもできます。
タプルまたはjava.util.Mapとしてイベント・タイプを作成する場合、EPNアセンブリ・ファイルでイベントを定義してプロパティを宣言的に指定してこれを行います。java.util.Mapの使用を明示的に宣言しないかぎり、Oracle Event Processingはデフォルトとしてタプル型を使用します。
サポートされている各データ型の利点および制限は、表9-1「イベント・タイプのデータ型」を参照してください。
表9-1 イベント・タイプのデータ型
| データ型 | 説明 | 利点および制限 |
|---|---|---|
|
JavaBean |
JavaBean規則で書き込まれるJavaクラス。書き込むロジックで使用される以外に、タイプのアクセッサ("get"および"set")メソッドはOracle Event ProcessingサーバーおよびCQLプロセッサによって使用され、イベント・プロパティ値を取得および設定します。 詳細は、9.3.1項「JavaBeanとしてのOracle Event Processingイベント・タイプの作成」を参照してください。 |
利点: 最大の柔軟性およびイベントを処理するアプリケーション・ロジックの使いやすさを提供するため、このタイプはベスト・プラクティスです。アクセッサ・メソッドを介して、直接プロパティ値にアクセスします。JavaBeanクラスは、Oracle Event Processingアプリケーションと他のシステムを統合する場合により役立つ可能性があります。タイプのインスタンス化方法を制御する場合、イベント・タイプ・ビルダー・クラスを実装できます。 制限: 構成ファイルでイベント・タイプを単純に宣言するのではなく、JavaBeanクラスを書き込む必要があります。Oracle CQLビューを使用してこれを回避できますが、Oracle CQLはGROUP BY、PARTITION BYおよびORDER BYのJavaBeanプロパティをサポートしません。 |
|
タプル |
EPNアセンブリ・ファイルで宣言的に作成して、登録する構造。 詳細は、9.3.2項「タプルとしてのOracle Event Processingイベント・タイプの作成」を参照してください。 |
利点: イベント・タイプを作成するJavaプログラミングは必要ありません。EPNアセンブリ・ファイルで宣言して、イベント・タイプを作成します。迅速なプロトタイピングに役立ちます。 制限: Javaアプリケーション・ロジックのこのタイプのインスタンスの使用では、イベント・タイプ・リポジトリにプログラムからアクセスしてインスタンスのプロパティ値を取得する必要があります。Oracle Event Processingと他のシステムを統合すると、タプルは有用にならない可能性もあります。 |
|
|
詳細は、9.3.3項「java.util.MapとしてのOracle Event Processingイベント・タイプの作成」を参照してください。 |
利点: タイプを作成するJavaプログラミングは必要ありません。EPNアセンブリ・ファイルで宣言して、イベント・タイプを作成します。迅速なプロトタイピングに役立ちます。 制限: 他のタイプと同じように実行しません。 |
Oracle CQLが様々なデータ型を処理およびサポートする方法の詳細は、次を参照してください。
『Oracle Fusion Middleware Oracle Event Processing CQL言語リファレンス』のデータ型に関する項
イベント・タイプの使用方法に応じて、特定の制約に留意する必要がある場合があります。たとえば、イベント・タイプを構成する場合のプロパティのデータ型または特定の属性の値の設定方法を制限する必要がある場合があります。
次の項は、イベント・タイプ設計の制約範囲を示します。
csvgenアダプタとともに使用するイベント・タイプのプロパティを宣言的に指定する場合、表9-2に示すデータ型のみ使用することがあります。
表9-2 csvgenアダプタ・タイプ
| タイプ | 使用方法 |
|---|---|
|
|
単一または複数の文字値。 オプションで、 |
|
|
|
|
|
|
|
|
|
|
|
|
詳細は、次を参照してください:
イベント・データのソースとしてリレーショナル・データベース表を使用して、実行時に表からイベント・タイプ・インスタンスにデータをバインドします。イベント・データ・ソースがデータベース表の場合、次の表で表されるガイドラインに従う必要があります。
イベント・タイプでデータベース表からデータを受信する場合、タイプに構成されたプロパティごとにデータベースの特定の列からデータを受信します。イベント・タイプを構成する場合、表9-3「EPNアセンブリ・ファイルevent-type要素プロパティ属性」に示されているように、プロパティの子要素に特定の意味および値制約を持つ属性があることに注意してください。
表9-3 EPNアセンブリ・ファイルevent-type要素プロパティ属性
| 属性 | 説明 |
|---|---|
|
|
SQL CREATE TABLE文で指定されている、アクセスする表の列の名前。すべての列を指定する必要はありません。 |
|
|
列のSQLデータ型に対応している表9-4内のOracle Event Processing Javaタイプ。 |
|
|
SQL CREATE TABLE文で指定されている列サイズ。 |
リレーショナル・データベース表とともに使用するイベント・タイプのプロパティを指定する場合、表9-4「SQL列タイプおよびOracle Event Processingタイプの対応するもの」に示す追加JDBCタイプの制限に従う必要があります。
表9-4 SQL列タイプおよびOracle Event Processing Typeタイプの対応するもの
| SQLタイプ | Oracle Event Processing Javaタイプ | com.bea.wlevs.ede.api.Type | 説明 |
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Oracle CQLでの |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Footnote 1 Oracle SQL。
Footnote 2 Oracle以外のSQL。
詳細は、次を参照してください:
EPNアセンブリ・ファイルでイベント・タイプを定義する場合、別のイベント・タイプのプロパティ・データ型としてJavaBeanベースのイベント・タイプを使用できます。
例9-1は、アドレスプロパティをJavaBeanイベント・タイプAddressとして定義するタプル・イベント・タイプStudentを表しています。
イベント・タイプは、Oracle Event Processingアプリケーション内のイベント・データへのアクセスを提供するイベント・プロパティを定義します。このイベント・タイプが、アダプタおよびJavaコードとともにOracle CQLルールに使用されます。
イベント・タイプを作成する場合、作成するタイプのベースとして3つのサポートされているデータ型のいずれかを選択します。ベスト・プラクティスは、少しのJavaコードを書き込んでプロパティのイベント・データを処理してJavaBeanクラスとしてタイプを作成できることです。タプルまたはjava.util.Mapとしてタイプを宣言的に作成することもできます。
タイプを作成する前に、設計上の考慮事項について9.2項「イベント・タイプの設計」を参照できます。
この項では次について説明します:
JavaBeanとしてイベント・タイプを作成すると、アプリケーション・ロジックでタイプのインスタンスを使用する場合に最大レベルの柔軟性が提供されます。そのため、JavaBeanクラスの使用はイベント・タイプを作成するベスト・プラクティスです。
|
注意: Oracle CQLでは、GROUP BY、PARTITION BYおよびORDER BYにある式をサポートしていません。その結果、これらはJavaプロパティをサポートしておらず、失敗します。これらの機能が必要な場合、回避策としてOracle CQLビューを使用します。 |
JavaBeanイベント・タイプを使用する柔軟性の一部として、タイプをインスタンス化する2つの異なる方法があります: サーバーまたは提供するイベント・タイプ・ビルダー・クラスの使用。インスタンス・ファクトリとしてイベント・タイプ・ビルダー・クラスを提供することによって、自身でインスタンスを作成し、イベント・データ値がJavaBeanプロパティにバインドされる方法を含む作成方法を制御できます。詳細は、9.3.1.5項「イベント・タイプ・ビルダー・クラスでのイベント・タイプのインスタンス化の制御」を参照してください。
JavaBeanクラスとしてイベント・タイプを作成する場合、次のガイドラインを使用してOracle Event Processingシステムとの最適な統合を保証します。
Oracle Event Processingサーバーがクラスをインスタンス化できる空の引数のパブリック・コンストラクタを作成します。
イベント・プロパティごとに、JavaBean規則に従うパブリック・アクセッサ(getおよびsetメソッド)を実装します。これらはサーバーによって使用され、イベント・プロパティ値にアクセスします。JavaBeanとしてイベント・タイプを定義する場合、いずれかのJavaタイプをそのプロパティに使用できます。
JavaBean規則を理解していない場合、追加詳細はhttp://docs.oracle.com/javase/tutorial/javabeans/のJavaBeansチュートリアルを参照してください。
hashCodeおよびequalsメソッドを実装します。これにより、複合キーがイベント・タイプ・インスタンスのハッシュ・コードから作成されるハッシュ索引を使用する可能性があるOracle Event Processingサーバーで使用するクラスが最適化されます。
Eclipse IDEを使用している場合、アクセッサを追加した後にクラスの「ソース」コンテキスト・メニューを介してhashCodeおよびequalsメソッドを簡単に実装できます。
Oracle Coherenceでイベントをキャッシュする場合、クラスをシリアライズ可能にします。
このトピックでは、次の内容について説明します。
9.3.1.1項「イベント・タイプ・リポジトリ・エディタを使用して、JavaBeanとしてOracle Event Processingイベント・タイプを作成する方法」
9.3.1.2項「JavaBeanとしてOracle Event Processingイベント・タイプを手動で作成する方法」
この手順では、Oracle Event Processing IDE for Eclipseイベント・タイプのリポジトリ・エディタを使用してJavaBeanとしてOracle Event Processingイベント・タイプを作成して登録する方法について説明しています。Oracle Event Processing IDE for Eclipseの詳細は、例4-0「Oracle Event Processing IDE for Eclipseの概要」を参照してください。
または、JavaBeanとしてイベント・タイプを手動で作成して登録することもできます(9.3.1.2項「JavaBeanとしてOracle Event Processingイベント・タイプを手動で作成する方法」を参照)。
イベント・タイプ・リポジトリ・エディタを使用してJava BeanとしてOracle Event Processingイベント・タイプを作成するには、次の手順を実行します。
イベント・タイプを表すためにJavaBeanクラスを作成します。
9.3.1項「JavaBeanとしてのOracle Event Processingイベント・タイプの作成」に記載されているガイドラインに必ず従ってください。
例9-2では、com.bea.wlevs.example.algotrading.event.MarketEventクラスで実施されたMarketEventを表します。
例9-2 MarketEventクラス
package com.bea.wlevs.example.algotrading.event;
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() {}
public Double getPrice() {
return this.price;
}
public void setPrice(Double price) {
this.price = price;
}
public String getSymbol() {
return this.symbol;
}
public void setSymbol(String symbol) {
this.symbol = symbol;
}
public Long getTimestamp() {
return this.timestamp;
}
public void setTimestamp(Long timestamp) {
this.timestamp = timestamp;
}
public Long getLatencyTimestamp() {
return this.latencyTimestamp;
}
public void setLatencyTimestamp(Long latencyTimestamp) {
this.latencyTimestamp = latencyTimestamp;
}
public Long getVolume() {
return this.volume;
}
public void setVolume(Long volume) {
this.volume = volume;
}
// Implementation for hashCode and equals methods.
}
イベント・タイプを表すJavaBeanをコンパイルします。
IDEで、EPNエディタのEPNを開きます。
詳細は、 7.1項「EPNエディタを開く」を参照してください。
「イベント・タイプ」タブをクリックします。
「イベント・タイプの追加」(緑のプラス記号)をクリックします。
図9-1に示すように、デフォルト名newEventを持つ新しいイベントが「イベント・タイプの定義」リストに追加されます。
「イベント・タイプの定義」リストで、newEventを選択します。
このイベントのプロパティは、図9-1に示すように、「イベント・タイプの詳細」領域に表示されます。
このイベントの名前を「タイプ名」フィールドに入力します。
「Java Beanで定義されたプロパティ」をクリックします。
JavaBeanクラスの完全修飾クラス名を「Class クラス」フィールドに入力します。
たとえば、com.bea.wlevs.example.algotrading.event.MarketEventです。
ツールバーの「保存」ボタンをクリックします(またはCTRL-Sを押します)。
これで、イベントがイベント・タイプ・リポジトリに表示されます。
イベント・タイプ・リポジトリ・エディタを使用して、次のことができます。
EPNアセンブリ・ファイルの対応するイベント・タイプ定義を表示するには、「イベント・タイプの定義」領域のイベント・タイプをダブルクリックします。
イベントを削除するには、「イベント・タイプの定義」領域でイベント・タイプを選択し、「イベント・タイプの削除」 (赤いx)をクリックします。
この手順では、JavaBeanとしてOracle Event Processingイベント・タイプを手動で作成して登録する方法について説明しています。
または、Oracle Event Processing IDE for Eclipseイベント・タイプ・リポジトリ・エディタを使用して、JavaBeanとしてイベント・タイプを作成および登録できます(9.3.1.1項「イベント・タイプ・リポジトリ・エディタを使用して、JavaBeanとしてOracle Event Processingイベント・タイプを作成する方法」を参照)。
Java BeanとしてOracle Event Processingイベント・タイプを手動で作成するには:
イベント・タイプを表すためにJavaBeanクラスを作成します。
標準のJavaBeanプログラミング・ガイドラインに準拠します。追加詳細は、http://java.sun.com/docs/books/tutorial/javabeans/のJavaBeansチュートリアルを参照してください。
イベントを設計する場合、設計を9.2.4項「イベント・タイプ・データ型の使用の混在」で説明されたイベント・データ型に制限する必要があります。
例9-3では、com.bea.wlevs.example.algotrading.event.MarketEventクラスで実施されたMarketEventを表します。
例9-3 MarketEventクラス
package com.bea.wlevs.example.algotrading.event;
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() {}
public Double getPrice() {
return this.price;
}
public void setPrice(Double price) {
this.price = price;
}
public String getSymbol() {
return this.symbol;
}
public void setSymbol(String symbol) {
this.symbol = symbol;
}
public Long getTimestamp() {
return this.timestamp;
}
public void setTimestamp(Long timestamp) {
this.timestamp = timestamp;
}
public Long getLatencyTimestamp() {
return this.latencyTimestamp;
}
public void setLatencyTimestamp(Long latencyTimestamp) {
this.latencyTimestamp = latencyTimestamp;
}
public Long getVolume() {
return this.volume;
}
public void setVolume(Long volume) {
this.volume = volume;
}
// Implementation for hashCode and equals methods.
}
イベント・タイプを表すJavaBeanをコンパイルします。
Oracle Event Processingイベント・タイプ・リポジトリにJavaBeanイベント・タイプを登録します。
宣言的に登録するには、例9-4に示すように、wlevs:event-type-repository要素wlevs:event-type子要素を使用して、EPNアセンブリ・ファイルを編集します。
プログラムとして登録するには、例9-5に示すように、EventTypeRepositoryクラスを使用します。
例9-5 プログラムとしてイベントの登録
EventTypeRepository rep = getEventTypeRepository();
rep.registerEventType(
"MarketEvent",
com.bea.wlevs.example.algotrading.event.MarketEvent.getClass()
);
詳細は、9.4項「イベント・タイプ・リポジトリにアクセス」を参照してください。
アプリケーションのビジネス・ロジックおよびアダプタのJavaコードの標準のJavaBeansとしてイベント・タイプを参照します。
次のコードは、イベント・シンク・クラスからonEventメソッドを実装します。イベント・シンクの詳細は、16.2.1項「イベント・シンクの実装」を参照してください。
public void onInsertEvent(Object event)
throws EventRejectedException {
if (event instanceof MarketEvent){
MarketEvent marketEvent = (MarketEvent) event;
System.out.println("Price: " + marketEvent.getPrice());
}
}
次のOracle CQLルールでは、SELECT文でMarketEventを参照するかを表します。イベント・タイプがMarketEventであるmarketEventChannelと呼ばれるアップストリーム・チャネルを前提とします。
<query id="helloworldRule">
<![CDATA[ SELECT MarketEvent.price FROM marketEventChannel [NOW] ]]>
</query>
また、プロパティ・データ型をJavaBeanとして実装すると、Oracle CQLコードでは、標準のJavaBeanスタイル・プロパティ・アクセスを使用してそれらのプロパティ内の値を取得できます。
たとえば、次の構成スニペットの抜粋では、JavaBeanクラスとして実装されるStudentTypeイベント・タイプを宣言しています。school.Studentクラスは、それ自体が Address JavaBeanクラスであるアドレス・プロパティを持つJavaBeanです。次の問合せは、アドレス・プロパティの基礎となるAddressオブジェクトの値にアクセスする方法を示します。この問合せでは、郵便番号が"97"で始まる生徒のアドレスを選択します。
<query id="studentAddresses">
SELECT
student.address
FROM
StudentType as student
WHERE
student.address.postalCode LIKE '^97'
</query>
イベント・タイプ・ビルダーを作成して、イベント・タイプ・インスタンスの作成方法をより詳細に制御できます。たとえば、イベント・タイプ・ビルダーを使用して、構成されたイベントのプロパティがJavaBeanとして実装したクラスなどのイベント・タイプ・クラスのプロパティに正しくバインドされていることを確認できます。CQLコードで仮定されるイベント・プロパティ名がクラスで宣言されているプロパティの名前と異なる場合などで、イベント・タイプ・ビルダーが必要になります。
たとえば、イベント・タイプにfirstnameプロパティが含まれている一方で、イベント・タイプで実行されるCQLルールではそのプロパティがfnameと呼ばれるとします。さらに、(たとえば、他のバンドルからの共有イベント・クラスを使用しているなどの理由から)、相互の互換性を実現するためにイベント・タイプ・クラスを変更することも、CQLルールを変更することもできないと想定します。この場合は、イベント・タイプ・ビルダー・ファクトリを使用して、プロパティ名をfirstnameのかわりにfnameにするよう、イベント・タイプ・インスタンスの作成方法を変更できます。
実行時、イベント・タイプ・ビルダー・クラスはOracle Event Processingサーバーからプロパティ値を受信し、それらの値を使用して作成したイベント・タイプ・クラスのインスタンスを作成します。次に、イベント・タイプ・ビルダーはインスタンスをサーバーに戻します。このように、サーバーで構成されたプロパティをイベント・タイプ・プロパティにマップする方法を決定できない場合、ビルダー・クラスは実質的に中間のインスタンス化しているイベント・タイプです。
イベント・タイプ・ビルダーの作成および使用には、次の項に示されているように、ビルダーを使用するためのビルダー・クラスの実装およびJavaBeanイベント・タイプの構成が含まれます。
イベント・タイプ・ビルダー・ファクトリをプログラミングする場合は、com.bea.wlevs.ede.api.EventBuilderインタフェースのEventBuilder.Factory内部インタフェースを実装する必要があります。createBuilderおよびcreateEventなどの実装する必要のあるメソッドの詳細は、Oracle Fusion Middleware Oracle 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 {
// Called by the server to get an instance of this builder.
public EventBuilder createBuilder() {
return new ForeignExchangeBuilder();
}
// Inner interface implementation that is the builder.
static class ForeignExchangeBuilder implements EventBuilder {
// A Map instance to hold properties until the event type is instantiated.
private Map<String,Object> values = new HashMap<String,Object>(10);
// Called by the server to put an event type property. Values from the map
// will be used to instantiate the event type.
public void put(String property, Object value) throws IllegalStateException {
values.put(property, value);
}
// Called by the server to create the event type instance once property
// values have been received.
public Object createEvent() {
return new ForeignExchangeEvent(
(String) values.get("symbol"),
(Double) values.get("price"),
(String) values.get("fromRate"),
(String) values.get("toRate"));
}
}
}
EPNアセンブリ・ファイルでイベント・タイプを登録する場合は、wlevs:event-type要素の<wlevs:property name="builderFactory">子要素を使用してイベント・タイプ・ビルダー・クラスの名前を指定します。name属性のハードコード化されたbuilderFactoryの値によって、このイベントのインスタンスを作成する際はデフォルト・ファクトリではなく指定されたファクトリ・クラスを使用する必要があることがOracle Event Processingに対してアラートされます。たとえば、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>
タイプの構成XMLをEPN XMLファイルに追加して、タプルとしてOracle Event Processingイベント・タイプを簡単に作成できます。したがって、タプルはイベント・タイプを作成する最も簡単な方法であるため、迅速なプロトタイピングに役立ちます。ただし、タプルおよびjava.util.Mapデータ型は、JavaBeanクラスとしてイベント・タイプを作成するより柔軟性が低くなります。
タプルベースのイベント・タイプの場合、タイプのインスタンスを使用したJavaコードでは、EventTypeRepository APIを使用してプロパティ値を常に設定および取得する必要があります。
イベントを設計する場合、タイプのプロパティの設計を9.3.2.1項「タプルベースのイベント・タイプのプロパティのタイプ」に示されているデータ型に制限する必要があります。
開始する前に、9.2項「イベント・タイプの設計」のイベント・タイプの設計上の推奨事項を参照してください。
このトピックでは、次の内容について説明します。
EPNアセンブリ・ファイルにタプルとしてイベント・タイプのプロパティを宣言的に指定する場合は、com.bea.wlevs.ede.api.Typeで指定されたタイプを使用できます。
サポートされているプロパティ・タイプの詳細は、C.23項「wlevs:property」を参照してください。
例9-6には、様々なタイプの使用方法を示します。
例9-6 タプル・イベント・タイプ・プロパティ用の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>
詳細は、9.3.2項「タプルとしてのOracle Event Processingイベント・タイプの作成」を参照してください。
この手順は、Oracle Event Processing IDE for Eclipseイベント・タイプ・リポジトリ・エディタを使用してタプルとしてOracle Event Processingイベント・タイプを作成して登録する方法を説明します。Oracle Event Processing IDE for Eclipseの詳細は、第4章「Oracle Event Processing IDE for Eclipseの概要」を参照してください。
かわりに、タプルとしてイベント・タイプを手動で作成して登録することもできます(9.3.2.3項「タプルとしてOracle Event Processingイベント・タイプを手動で作成する方法」を参照)。
イベント・タイプ・リポジトリ・エディタを使用してタプルとしてOracle Event Processingイベント・タイプを作成するには、次の手順を実行します。
イベント・タイプに必要なプロパティを決定します。
イベントを設計する場合、設計を9.3.2.1項「タプルベースのイベント・タイプのプロパティのタイプ」で説明されたイベント・データ型に制限する必要があります。
IDEで、EPNエディタのEPNを開きます。
詳細は、 7.1項「EPNエディタを開く」を参照してください。
「イベント・タイプ」タブをクリックします。
「イベント・タイプの追加」(緑のプラス記号)をクリックします。
図9-2に示すように、デフォルト名newEventを持つ新しいイベントが「イベント・タイプの定義」リストに追加されます。
「イベント・タイプの定義」リストで、newEventを選択します。
このイベントのプロパティは、図9-2に示すように、「イベント・タイプの詳細」領域に表示されます。
このイベントの名前を「タイプ名」フィールドに入力します。
「宣言で定義されたプロパティ」をクリックします。
1つ以上のイベント・プロパティを追加します。
「イベント・プロパティの追加」(緑のプラス記号)をクリックします。
新しい行が「イベント・タイプの詳細」表に追加されます。
この行の「名前」列をクリックしてプロパティ名を入力します。
この行の「タイプ」列をクリックして、プルダウン・メニューからデータ型を選択します。
イベントを設計する場合、設計を9.3.2.1項「タプルベースのイベント・タイプのプロパティのタイプ」で説明されたイベント・データ型に制限する必要があります。
charデータ型プロパティについてのみ、この行の「'char'の長さ」列をクリックして、このcharプロパティの最大長の値を入力します。
オプションで、char値の最大長を指定するために、length属性を使用できます。デフォルトの長さは256文字です。最大長はjava.lang.Integer.MAX_VALUEです。256文字を超える必要がある場合、適当な長さを指定する必要があります。
ツールバーの「保存」ボタンをクリックします(またはCTRL-Sを押します)。
これで、イベントがイベント・タイプ・リポジトリに表示されます。
イベント・タイプ・リポジトリ・エディタを使用して、次のことができます。
EPNアセンブリ・ファイルの対応するイベント・タイプ定義を表示するには、「イベント・タイプの定義」領域のイベント・タイプをダブルクリックします。
イベントを削除するには、「イベント・タイプの定義」領域でイベント・タイプを選択し、「イベント・タイプの削除」 (赤いx)をクリックします。
この手順では、EPNアセンブリ・ファイルにタプルとしてOracle Event Processingイベント・タイプを宣言的に作成して登録する方法について説明しています。
ただし、イベント・タイプを作成するベスト・プラクティスはJavaBeanクラスとして作成することなので注意してください。詳細は、9.3.1項「JavaBeanとしてのOracle Event Processingイベント・タイプの作成」を参照してください。
有効なデータ型の詳細は、9.3.2.1項「タプルベースのイベント・タイプのプロパティのタイプ」を参照してください。
タプルとしてOracle Event Processingイベント・タイプを作成するには:
イベント・タイプに必要なプロパティを決定します。
イベントを設計する場合、設計を9.3.2.1項「タプルベースのイベント・タイプのプロパティのタイプ」で説明されたデータ型に制限する必要があります。
Oracle Event Processingイベント・タイプ・リポジトリにイベント・タイプを宣言的に登録します。
宣言的に登録するには、例9-7に示すように、wlevs:event-type-repository要素wlevs:event-type子要素を使用して、EPNアセンブリ・ファイルを編集します。
例9-7 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 Event Processingでは、CrossRateEventのBeanインスタンスが生成されます。CrossRateEventには、price、fromRateおよびtoRateの3つのプロパティがあります。
type属性の有効な値の詳細は、9.3.2.1項「タプルベースのイベント・タイプのプロパティのタイプ」を参照してください。
構成XMLの詳細なリファレンスは、C.13項「wlevs:event-type」、C.22項「wlevs:properties」およびC.23項「wlevs:property」を参照してください。
Javaコードのタプルベースのイベント・タイプを使用する場合、値を取得する前にcom.bea.wlevs.ede.api.EventTypeRepositoryインスタンスを使用してタイプのプロパティの名前を取得する必要があります。(EventTypeRepositoryインスタンスの取得の詳細は、9.4項「イベント・タイプ・リポジトリのアクセス」を参照してください)。
次の例では、イベント・シンクとして機能するクラスのリポジトリを使用します。
@Service
public void setEventTypeRepository(EventTypeRepository etr) {
etr_ = etr;
}
...
// Called by the server to pass in the event type instance.
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();
// See if property you're looking for 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.
}
次の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.util.MapとしてOracle Event Processingイベント・タイプを作成して、登録できます。
タイプの構成XMLをEPN XMLファイルに追加して、java.util.MapとしてOracle Event Processingイベント・タイプを簡単に作成できます。したがって、これはイベント・タイプを作成する簡単な方法です。ただし、タプルおよびjava.util.Mapデータ型は、JavaBeanクラスとしてイベント・タイプを作成するより柔軟性が低くなります。
マップとしてイベント・タイプを作成および使用すると、タプル型およびJavaBeanクラスのプロセスの混在のようになります。タプルベースのイベント・タイプと同様に、EPN XMLファイルで構成して、宣言的にマップベース・タイプを作成します。JavaBeanベースのイベント・タイプと同様に、com.bea.wlevs.ede.api.EventTypeRepository APIを使用してインスタンス・プロパティ値にアクセスする必要はありません。
このトピックでは、次の内容について説明します。
イベント・タイプのプロパティを、java.util.MapとしてEPNアセンブリ・ファイルで宣言的に指定する場合、いずれかのJavaタイプをそのプロパティに使用できます。ただし、次のいずれかとしてイベント・プロパティのタイプを指定します。
Class.forName()と同じルールに準拠し、アプリケーションのクラス・ローダーで使用できる必要がするJavaクラスの完全修飾名。
Javaプリミティブ(たとえば、intまたはfloat)。
イベント・タイプ名に文字[]を追加して配列を指定できます。
例9-8には、これらのタイプの使用方法を示します。
例9-8 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>
詳細は、9.3.3.2項「java.util.MapとしてOracle Event Processingイベント・タイプを作成する方法」を参照してください。
この手順では、java.util.MapとしてOracle Event Processingイベント・タイプを作成して登録する方法について説明しています。Oracle Event Processingイベント・タイプをJavaBean(9.3.1.2項「JavaBeanとしてOracle Event Processingイベント・タイプを手動で作成する方法」を参照)として作成することをお薦めします。
有効なイベント・タイプ・データ型の詳細は、9.3.3.1項「java.util.Mapベースのイベント・タイプのプロパティのタイプ」を参照してください。
java.util.MapとしてOracle Event Processingイベント・タイプを作成するには:
イベント・タイプに必要なプロパティを決定します。
Oracle Event Processingイベント・タイプ・リポジトリにイベント・タイプを登録します。
宣言的に登録するには、例9-9に示すように、wlevs:event-type-repository要素wlevs:event-type子要素を使用して、EPNアセンブリ・ファイルを編集します。
例9-9 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 Event Processingでは、AnotherEventのBeanインスタンスが生成されます。AnotherEventには、name、ageおよびaddressの3つのプロパティがあります。
プログラムとして登録するには、例9-10に示すように、EventTypeRepositoryクラスを使用します。
例9-10 プログラムとしてイベントの登録
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);
詳細は、9.4項「イベント・タイプ・リポジトリにアクセス」を参照してください。
Oracle Event Processingイベント・タイプ・リポジトリは、アプリケーションに定義されたイベント・タイプを追跡します。イベント・タイプを作成する場合、アプリケーションで使用可能にするには、イベント・タイプ・リポジトリで構成します。場合によっては、リポジトリに明示的にアクセスするコードを書き込む必要がある場合があります。
たとえば、イベント・タイプをタプルとして作成する場合、タイプのインスタンスにアクセスするJavaロジックでは、リポジトリAPIを使用してタイプ定義を最初に取得し、このAPIを使用してインスタンス・プロパティ値にアクセスする必要があります。
EventTypeRepositoryは、単一のOSGiサービスです。これは単一であるため、これを識別するためにインタフェース名のみを指定する必要があります。次のいずれかの方法でOSGiからサービスを取得できます。
詳細は、Oracle Fusion Middleware Oracle Event Processing Java APIリファレンスを参照してください。
例9-11に示すように、EPNアセンブリ・ファイルのosgi:referenceを指定してEventTypeRepositoryにアクセスできます。
例9-11 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クラスでは、例9-12に示すように、Springにより初期化されたeventTypeRepositoryプロパティを使用して、EventTypeRepositoryにアクセスできます。
例9-12 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.
}
}
例9-13に示すように、Javaソースのプロパティを初期化するために、Spring-DM @ServiceReference注釈を使用してEventTypeRepositoryにアクセスできます。
例9-14に示すように、Javaソースのプロパティを初期化するために、Oracle Event Processing @Service注釈を使用して、EventTypeRepositoryにアクセスできます。
例9-14 @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 Event Processingアプリケーションは、固有のJavaクラス・ローダーを取得し、そのクラス・ローダーを使用してアプリケーションのクラスをロードします。このため、デフォルトでは、あるアプリケーションから別のアプリケーションのクラスにアクセスすることはできません。ただし、イベント・タイプ・リポジトリはシングルトン・サービスであるため、あるバンドルでリポジトリを構成し、イベント・タイプ・クラスを明示的にエクスポートすることによって、(同一のOracle Event Processingサーバーにデプロイされた)別のバンドル内のアプリケーションでそれらの共有されたイベント・タイプを使用できるようになります。
この場合、イベント・タイプ名のスコープはOracle Event Processingサーバー・インスタンス全体になります。このため、他のバンドルからの共有イベント・タイプと同名のイベント・タイプを作成しようとすると例外が送出されますが、これらのイベント・タイプのクラスは異なります。
イベント・タイプ・クラスを共有するには、共有するイベント・タイプ・リポジトリが含まれているバンドルのMANIFEST.MFファイルのExport-Packageヘッダーにパッケージ名を追加します。
共有イベント・タイプを使用するアプリケーションが含まれているすべてのバンドルよりも前に、イベント・タイプ・リポジトリが含まれているバンドルを必ずデプロイするようにします。そうしないと、デプロイメント例外が送出されます。
詳細は、次を参照してください:
『Oracle Fusion Middleware Oracle Event Processing CQL言語リファレンス』のOracle Java Data Cartridgeに関する項