Oracle® Fusion Middleware Oracle Stream Analyticsによるイベント処理用アプリケーションの開発 12c (12.2.1.2.0) E82664-01 |
|
前へ |
次へ |
イベント・タイプは、イベントに含まれるデータを定義するデータ構造です。生のイベント・データがOracle Stream Analyticsアプリケーションに到着すると、アプリケーションはそのデータを特定のイベント・タイプのイベントにバインドします。イベント・タイプは、データ・セットおよび対応するデータ型の観点からアプリケーションで定義します。
この章の内容は次のとおりです。
イベントは、発生するか発生している事象に関連する構造化されたデータです。たとえば、サーバーのクラスタの変更にアプリケーションが対応している場合、イベントにより、サーバーを監視するデバイスで収集されるスナップショット・データが取得されます。
または、株式市場の取引に関連する傾向およびパターンがアプリケーションによって監視されている場合、イベントには、株式の取引に対応するイベント・データが含まれます。
イベント・データは、様々な形式でアプリケーションに到達します。イベント・タイプを作成してアプリケーション内のデータを表すことによって、データを操作するためのアプリケーション・ロジックを予測可能な方法で作成できます。
イベント・データは、イベント処理ネットワーク(EPN)を介してやり取りされます。イベント・タイプを設計する場合は、コード内でイベント・データにどのようにアクセスし、そのデータをどのように処理および操作するかについて考慮してください。
イベント・タイプは、その構造をJavaBean
クラス、タプルまたはjava.util.Map
クラスから取得します。イベント・タイプの構築には、JavaBean
クラスを使用することをお薦めします。JavaBeanはアプリケーション内における柔軟性がより高いため、既存のシステムと簡単に統合できます。
JavaBeanイベント・タイプには柔軟性があります。たとえば、JavaBeanイベント・タイプをタプルまたはjava.util.Map
イベント・タイプのプロパティに割り当てます。次のコードは、address
プロパティをJavaBeanイベント・タイプAddress
として定義するイベント・タイプStudent
を示します。
<wlevs:event-type-repository> <wlevs:event-type type-name="Student"> <wlevs:properties> <wlevs:property name="name" type="char"/> <wlevs:property name="address" type="classpackage.Address"/> </wlevs:properties> </wlevs:event-type> </wlevs:event-type-repository>
JavaBeanを使用すると、イベント・タイプ・ビルダー・クラスを実装して、イベント・タイプのインスタンス化を厳密に制御することもできます。イベント・タイプ・ビルダー・クラスの詳細は、イベント・タイプ・ビルダー・クラスでのイベント・タイプのインスタンス化の制御を参照してください。
表3-1では、JavaBeanクラス、タプルおよびjava.util.Map
クラスを比較しています。
表3-1 イベント・タイプのデータ型
データ型 | 説明 | 利点および制限 |
---|---|---|
JavaBean |
JavaBean規則で書き込まれるJavaクラス。書き込むロジックで使用される以外に、タイプのアクセッサ(getおよびset)メソッドはOracle Stream AnalyticsサーバーおよびOracle CQLプロセッサによって使用され、イベント・プロパティ値を取得および設定します。 |
利点: 最大の柔軟性およびイベントを処理するアプリケーション・ロジックの使いやすさを提供するため、このタイプはベスト・プラクティスです。アクセッサ・メソッドを介して、直接プロパティ値にアクセスします。JavaBeanクラスを使用すると、Oracle Stream Analyticsアプリケーションと他のシステムを統合する場合に役立つ可能性が高くなります。タイプのインスタンス化方法を制御する場合、イベント・タイプ・ビルダー・クラスを実装できます。 制限: 構成ファイルでイベント・タイプを単純に宣言するのではなく、JavaBeanクラスを書き込む必要があります。Oracle CQLビューを使用してこれを回避できますが、Oracle CQLはGROUP BY、PARTITION BYおよびORDER BYのJavaBeanプロパティをサポートしません。 |
Tuple |
EPNアセンブリ・ファイルで宣言的に作成して、登録する構造。 詳細は、タプル・イベント・タイプの作成および登録を参照してください。 |
利点: イベント・タイプを作成するJavaプログラミングは必要ありません。EPNアセンブリ・ファイルで宣言して、イベント・タイプを作成します。迅速なプロトタイピングに役立ちます。 制限: Javaアプリケーション・ロジックのこのタイプのインスタンスの使用では、イベント・タイプ・リポジトリにプログラムからアクセスしてインスタンスのプロパティ値を取得する必要があります。また、タプルを使用すると、Oracle Stream Analyticsと他のシステムを統合する場合に役立つ可能性は低くなります。 |
|
詳細は、マップ・イベント・タイプの作成および登録を参照してください。 |
利点: タイプを作成するJavaプログラミングは必要ありません。EPNアセンブリ・ファイルで宣言して、イベント・タイプを作成します。迅速なプロトタイピングに役立ちます。 制限: 他のタイプと同じように実行しません。 |
イベント・タイプの設計時には、CSVアダプタおよびデータベース表に関する次の制約に注意してください。
CSVアダプタの制約
CSVアダプタとともに使用するイベント・タイプのプロパティを宣言的に指定する場合、表3-2に示すデータ型のみ使用できます。
表3-2 CSVアダプタのデータ型
データ型 | 使用方法 |
---|---|
|
単一または複数の文字値。 オプションで、 |
|
|
|
|
|
|
|
|
詳細は、次を参照してください。
データベース表の制約
イベント・データのソースとしてリレーショナル・データベース表を使用して、実行時に表からイベント・タイプ・インスタンスにデータをバインドします。イベント・データ・ソースがデータベース表の場合、次の表で表されるガイドラインに従う必要があります。
イベント・タイプでデータベース表からデータを受信する場合、タイプに構成されたプロパティごとにデータベースの特定の列からデータを受信します。イベント・タイプを構成する場合、表3-3に示されているように、プロパティの子要素に特定の意味および値制約を持つ属性があることに注意してください。
表3-3 EPNアセンブリ・ファイルevent-type要素プロパティ属性
属性 | 説明 |
---|---|
|
SQL CREATE TABLE文で指定されている、アクセスする表の列の名前。すべての列を指定する必要はありません。 |
|
列のSQLデータ型に対応している表3-4内のOracle Stream Analytics Javaタイプ。 |
|
SQL CREATE TABLE文で指定されている列サイズ。 |
リレーショナル・データベース表とともに使用するイベント・タイプのプロパティを指定する場合、表3-4に示す追加JDBCタイプの制限に従う必要があります。
ストリームをDerbyデータベースに結合する場合に、結合条件で2つのタイムスタンプ値(1つの値はストリーム属性、他方の値はDerbyデータソース属性から)が比較されるとき、Derbyデータベースが述語評価を実行します。ただし、Derbyデータベースはyyyy-MM-dd-HH.mm.ss[.nnnnnn]
形式のみをサポートしています。Derbyデータベースが評価を正しく実行するには、ストリームのタイムスタンプ値でDerbyデータベースの形式を使用している必要があります。
表3-4 SQL列タイプおよびOracle Stream Analyticsタイプの対応するもの
SQLタイプ | Oracle Stream Analytics Javaタイプ | com.bea.wlevs.ede.api.型 | 説明 |
---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
詳細は、表ソースの構成を参照してください。
Oracle Stream Analyticsはイベント・タイプ・リポジトリでイベント・タイプを管理します。Oracle Stream Analyticsサーバーは、実行時にアセンブリ・ファイルにアクセスし、アプリケーションの管理に必要な情報を取得します。
次の例は、リポジトリ内のイベント・タイプ・エントリを示します。
<wlevs:event-type-repository> <wlevs:event-type type-name="TradeEvent"> <wlevs:class>tradereport.TradeEvent</wlevs:class> </wlevs:event-type> </wlevs:event-type-repository>
イベント・タイプを定義および編集するには、Oracle JDeveloperの「イベント」タブを使用し、アセンブリ・ファイルを直接処理するか、アプリケーション・コードからAPIをコールします。「イベント」タブは、Oracle JDeveloperプロジェクトのEPN図を開くと表示されます。
詳細は、イベント・タイプ・リポジトリへのアクセスを参照してください。
イベント・タイプを作成する場合、<wlevs:properties>
および<wlevs:property>
要素を<wlevs:event-type>
要素に追加し、イベント・タイプのプロパティを定義します。
プロパティには、ティッカ名、ティッカ・シンボルおよび引け値などの情報の種類を定義するname
およびtype
属性や、String
および
Double
などの対応するデータ型があります。<wlevs:event-type
要素の詳細は、『Oracle Stream Analyticsスキーマ・リファレンス』のwlevs:event-typeに関する項を参照してください。
アセンブリ・ファイル
次のアセンブリ・ファイル・エントリは、1つのイベント・タイプおよび<wlevs:class>
要素によって定義される1つのプロパティを持つ簡単なイベント・タイプを示します。このイベント・タイプのプロパティは、JavaBeanクラス内に定義されます。
<wlevs:event-type-repository> <wlevs:event-type type-name="TradeEvent"> <wlevs:class>tradereport.TradeEvent</wlevs:class> </wlevs:event-type> </wlevs:event-type-repository>
次のアセンブリ・ファイル・エントリは、3つの<wlevs:property>
要素が含まれる<wlevs:properties>
要素によって定義されるプロパティを持つメッセージ数イベント・タイプを示します。
<wlevs:event-type-repository> <wlevs:event-type id="messagecounts" type-name="SimpleEvent"> <wlevs:properties> <wlevs:property name="msg" type="char" /> <wlevs:property name="count" type="long" /> <wlevs:property name="time_stamp" type="timestamp" /> </wlevs:properties> </wlevs:event-type> ... </wlevs:event-type-repository>
イベント・タイプは、日数-秒数および年数-月数間隔プロパティとローカル・タイム・ゾーンを使用するタイムスタンプ・プロパティもサポートしています。
次のアセンブリ・ファイル・エントリは、間隔プロパティを示します。
<wlevs:event-type-repository> <wlevs:event-type type-name="IntervalDataTypeEvent"> <wlevs:properties> <wlevs:property name="Comment" type="char" length="256" /> <wlevs:property name="intervalProp" type="interval day(1) to second(2)"/> <wlevs:property name="intervalymProp" type="interval year(2) to month"/> <wlevs:property name="intervaldhProp" type="interval day to hour"/> <wlevs:property name="intervaldmProp" type="interval day to minute"/> <wlevs:property name="intervalhsProp" type="interval hour(1) to second(2)"/> <wlevs:property name="intervalhmProp" type="interval hour to minute"/> <wlevs:property name="intervalmsProp" type="interval minute(2) to second(2)"/> <wlevs:property name="intervaldProp" type="interval day(1)"/> <wlevs:property name="intervalyProp" type="interval year(2)"/> <wlevs:property name="intervalmProp" type="interval month"/> </wlevs:properties> </wlevs:event-type> </wlevs:event-type-repository>
日数-秒数の組合せ:
INTERVAL DAY[(day_precision)] TO SECOND[(fractional_seconds_precision)]
day_precision
は、DAY
日時フィールドの桁数です。0から9までの値を使用できます。デフォルトは2です。
fractional_seconds_precision
は、SECOND
日時フィールドの小数部の桁数です。0から9までの値を使用できます。デフォルト値は6です。
年数-月数の組合せ:
INTERVAL YEAR [(year_precision)] TO MONTH
year_precision
は、YEAR
日時フィールドの桁数です。year_precision
のデフォルト値は2です。
次のアセンブリ・ファイル・エントリは、ローカル・タイム・ゾーンを使用するタイムスタンプ・プロパティを示します。
<wlevs:event-type-repository> <wlevs:event-type type-name="IntervalDataTypeEvent"> <wlevs:properties> <wlevs:property name="Comment" type="char" length="256" /> <wlevs:property name="timestamptzProp" type="timestamp with time zone"/> <wlevs:property name="timestampltzProp" type="timestamp with local time zone"/> </wlevs:properties> </wlevs:event-type> </wlevs:event-type-repository>
タイム・ゾーンを使用:
TIMESTAMP [(fractional_seconds_precision)] WITH TIME ZONE
fractional_seconds_precision
は、SECOND
日時フィールドの小数部に格納される桁数をオプションで指定します。このデータ型の列を作成する場合、値は0から9までの範囲内の数に設定できます。デフォルト値は6です。
ローカル・タイム・ゾーンを使用:
TIMESTAMP [(fractional_seconds_precision)] WITH LOCAL TIME ZONE
fractional_seconds_precision
は、SECOND
日時フィールドの小数部に格納される桁数をオプションで指定します。このデータ型の列を作成する場合、値は0から9までの範囲内の数に設定できます。デフォルト値は6です。
最初に、イベント・タイプが保持するイベント・データを識別してから、イベント・タイプに必要なプロパティを決定します。この項では、次のステップについて説明します。JavaBeanをイベント・ソースまたはイベント・シンクにする方法の詳細は、イベントBeanを参照してください。
プロパティには次のJavaタイプを使用できます。
Javaクラスの完全修飾名。この名前は、Class.forName()
ルールに準拠し、アプリケーションのクラス・ローダーで使用できる必要があります。
int
またはfloat
などのJavaプリミティブ。
プリミティブまたはクラス名に大カッコ([])
を追加した配列。たとえば、short[]
またはjava.lang.Integer[]
など。
ステップ1と2は、JavaBeanイベント・タイプの宣言的作成でのステップ1と2と同じです。その後、ステップ3として、次の手順を実行します。
JavaBeanイベント・タイプをプログラムで登録するには、次のようにEventTypeRepository
クラスを使用します。
EventTypeRepository rep = getEventTypeRepository(); rep.registerEventType("MarketEvent", com.bea.wlevs.example.algotrading.event.MarketEvent.getClass() );
詳細は、イベント・タイプ・リポジトリへのアクセスを参照してください。
JavBeanイベント・タイプを作成すると、アプリケーションのJavaコードでこれを参照できます。次のコードは、onInsertEvent
メソッドの実装でMarketEvent
イベント・タイプを参照しています。onInsertEvent
メソッドは、イベントを受信するイベント・シンク・クラスのメソッドです。イベント・シンクの詳細は、イベント・シンクのインタフェースを参照してください。
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クラスであるaddress
プロパティを持つJavaBeanです。次の問合せは、addressプロパティの基礎となるAddress
オブジェクトの値にアクセスする方法を示します。この問合せでは、郵便番号が97で始まる生徒の住所を選択します。
<query id="studentAddresses"> FOR StudentType SELECT student.address FROM StudentType as student WHERE student.address.postalCode LIKE '^97' </query>
onInsertEvent実装でのEventRejectedExceptionの動作
削除しない例外についてはonInsertEvent
実装でEventRejectedException
を明示的にスローする必要があります。EventProcessingException
を発生させると、CQLプロセッサを介してエラーのソースにまでこの例外が伝播されます。例外が複数存在する場合、EventRejectedExceptionによって例外をダウンストリーム・リスナーからチェーンできます。EventRejectedException
はCQLプロセッサによってソフト例外に変換されます。詳細は、フォルト処理を参照してください。
最初に、イベント・タイプが保持するイベント・データを識別してから、イベント・タイプに必要なプロパティを決定します。イベントを設計する場合、プロパティを設計制約に示されているデータ型に制限する必要があります。
タプルベースのイベント・タイプの場合、Javaコードでは、EventTypeRepository
APIを使用してプロパティ値を常に設定および取得する必要があります。
注:
EPNが複数のストリームで構成されている場合、同じタイムスタンプのタプルがEPNによって処理される順序は保証されません。
データ型
アプリケーション・アセンブリ・ファイルにタプル・イベント・タイプのプロパティを宣言的に指定する場合、プロパティ・タイプで任意のネイティブOracle CQLデータ型を使用できます。
次のXMLは、アプリケーション・アセンブリ・ファイルで様々な型を使用する方法を示します。
<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>
手順
wlevs:event-type-repository
要素およびwlevs:event-type
子要素を使用してOracle Stream Analyticsイベント・タイプ・リポジトリでイベント・タイプを宣言的に登録します。
アセンブリ・ファイルでのタプル・イベント・タイプの作成
次のXML節では、price
、fromRate
およびtoRate
プロパティを使用してCrossRateEvent
タプル・イベント・タイプを作成しています。
<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 Stream Analyticsスキーマ・リファレンス』のwlevs:event-type-repositoryに関する項を参照してください。
Javaコードでタプル・イベント・タイプを使用する前に、イベント・タイプ・リポジトリを作成する必要があります。イベント・タイプ・リポジトリを使用して、プロパティ名および値を取得してこれらをコード内で処理できるようにします。イベント・タイプ・リポジトリを作成するには、com.bea.wlevs.ede.api.EventTypeRepository
クラスを組み込みます。
次のコードは、イベント・シンク・クラスの一部です。このコードにより、setEventTypeRespository
メソッドを呼び出してイベント・タイプ・リポジトリが作成されます。これにより、Oracle Stream Analyticsサーバーによってevent
パラメータを使用してonInsertEvent
メソッドが呼び出されます。onInsertEvent
メソッドは、event
に関する情報をイベント・タイプ・リポジトリから取得します。
EventTypeRepository
オブジェクトの作成の詳細は、イベント・タイプ・リポジトリへのアクセスを参照してください。
@Service // Create an event type repository 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
を参照する方法を示します。FxQuoteStream
は、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>
最初に、イベント・タイプが保持するイベント・データを識別してから、イベント・タイプに必要なプロパティを決定します。構成XMLをアプリケーション・アセンブリ・ファイルに追加して、java.util.map
イベント・タイプを作成します。
ハッシュ・マップに基づくイベント・タイプは、マップ・ベースのイベント・タイプと呼ばれます。
データ型
プロパティには次のJavaタイプを使用できます。
Javaクラスの完全修飾名。この名前は、Class.forName()
ルールに準拠し、アプリケーションのクラス・ローダーで使用できる必要があります。
int
またはfloat
などのJavaプリミティブ。
プリミティブまたはクラス名に大カッコ([])
を追加した配列。たとえば、short[]
またはjava.lang.Integer[]
など。
次のXMLコードは、イベント・リポジトリ内のイベント・プロパティ宣言の例を示します。
<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>
java.util.Mapイベント・タイプの作成および登録方法:
最初に、イベント・タイプが保持するイベント・データを識別してから、イベント・タイプに必要なプロパティを決定します。
宣言的に登録するには、次のように、wlevs:event-type-repository
要素のwlevs:event-type
子要素を使用して、EPNアセンブリ・ファイルを編集します。
<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>
実行時に、AnotherEvent
クラスのBeanインスタンスがOracle Stream Analyticsで生成されます。AnotherEvent
クラスには、name
、age
およびaddress
の3つのプロパティがあります。
プログラムで登録するには、次のように、EventTypeRepository
クラスを使用します。
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);
使用方法
public void onInsertEvent(Object event)
throws EventRejectedException {
java.util.Map anEvent = (java.util.Map) event;
System.out.println("Age: " + anEvent.get("age"));
}
次のOracle CQLルールでは、SELECT
文でMarketEvent
を参照するかを表します。
<query id="helloworldRule"> <![CDATA[ select age from eventChannel [now] > </query>
Oracle Stream Analyticsイベント・タイプ・リポジトリでは、アプリケーションに定義されたイベント・タイプを追跡します。Oracle JDeveloperでイベント・タイプを作成する場合、このイベント・タイプをOracle Stream Analyticsアプリケーションで使用できます。
場合によっては、リポジトリに明示的にアクセスするコードを書き込む必要がある場合があります。たとえば、イベント・タイプをタプルとして作成する場合、タイプのインスタンスにアクセスするJavaロジックでは、リポジトリAPIを使用してタイプ定義を最初に取得し、このAPIを使用してインスタンス・プロパティ値にアクセスする必要があります。
EventTypeRepository
は、単一のOSGiサービスです。これは単一であるため、これを識別するためにインタフェース名のみを指定する必要があります。次のいずれかの方法でOSGiからサービスを取得できます。
詳細は、Oracle Stream Analytics Java APIリファレンスを参照してください。
EPNアセンブリ・ファイルのosgi:reference
を指定して、EventTypeRepository
にアクセスできます。
<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
クラスでは、Springにより初期化されたeventTypeRepository
プロパティを使用して、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.
} }
Javaソースのプロパティを初期化するために、Spring-DM @ServiceReference
注釈を使用してEventTypeRepository
にアクセスできます。
import org.springframework.osgi.extensions.annotation.ServiceReference; import com.bea.wlevs.ede.api.EventTypeRepository; ... @ServiceReference setEventTypeRepository(EventTypeRepository etr) { ... }
それぞれのOracle Stream Analyticsアプリケーションは、固有のJavaクラス・ローダーを取得し、そのクラス・ローダーを使用してアプリケーションのクラスをロードします。このため、デフォルトでは、あるアプリケーションから別のアプリケーションのクラスにアクセスすることはできません。
ただし、イベント・タイプ・リポジトリはシングルトン・サービスであるため、あるバンドルでリポジトリを構成し、イベント・タイプ・クラスを明示的にエクスポートすることによって、(同一のOracle Stream Analyticsサーバーにデプロイされた)別のバンドル内のアプリケーションでそれらの共有されたイベント・タイプを使用できるようになります。
この場合、イベント・タイプ名は、Oracle Stream Analyticsサーバー・インスタンス全体に範囲が設定されます。このため、他のバンドルからの共有イベント・タイプと同名のイベント・タイプを作成しようとすると例外が送出されますが、これらのイベント・タイプのクラスは異なります。
イベント・タイプ・クラスを共有するには、共有するイベント・タイプ・リポジトリが含まれているバンドルのMANIFEST.MF
ファイルのExport-Package
ヘッダーにパッケージ名を追加します。
共有イベント・タイプを使用するアプリケーションが含まれているすべてのバンドルよりも前に、イベント・タイプ・リポジトリが含まれているバンドルを必ずデプロイするようにします。そうしないと、デプロイメント例外が送出されます。
詳細は、次を参照してください。
Oracle Stream Analytics Java APIリファレンス
イベント・タイプ・ビルダーを作成して、イベント・タイプ・インスタンスの作成方法をより詳細に制御できます。たとえば、イベント・タイプ・ビルダーを使用して、構成されたイベントのプロパティがJavaBeanとして実装したクラスなどのイベント・タイプ・クラスのプロパティに正しくバインドされていることを確認できます。
CQLコードで仮定されるイベント・プロパティ名がクラスで宣言されているプロパティの名前と異なる場合などで、イベント・タイプ・ビルダーが必要になります。
たとえば、イベント・タイプにfirstname
プロパティが含まれている一方で、イベント・タイプで実行されるCQLルールではそのプロパティがfname
と呼ばれるとします。さらに、(たとえば、他のバンドルからの共有イベント・クラスを使用しているなどの理由から)、相互の互換性を実現するためにイベント・タイプ・クラスを変更することも、CQLルールを変更することもできないと想定します。この場合は、イベント・タイプ・ビルダー・ファクトリを使用して、プロパティ名をfirstname
のかわりにfname
にするよう、イベント・タイプ・インスタンスの作成方法を変更できます。
実行時、イベント・タイプ・ビルダー・クラスはOracle Event Processingサーバーからプロパティ値を受信し、それらの値を使用して作成したイベント・タイプ・クラスのインスタンスを作成します。次に、イベント・タイプ・ビルダーはインスタンスをサーバーに戻します。このように、サーバーで構成されたプロパティをイベント・タイプ・プロパティにマップする方法を決定できない場合、ビルダー・クラスは実質的に中間のインスタンス化しているイベント・タイプです。
イベント・タイプ・ビルダーの作成および使用には、次の項に示されているように、ビルダーを使用するためのビルダー・クラスの実装およびJavaBeanイベント・タイプの構成が含まれます。
イベント・タイプ・ビルダー・ファクトリをプログラミングする場合は、com.bea.wlevs.ede.api.EventBuilder
インタフェースのEventBuilder.Factory
内部インタフェースを実装する必要があります。createBuilder
およびcreateEvent
などの実装する必要のあるメソッドの詳細は、Oracle Stream Analytics 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 Stream Analyticsに対してアラートされます。たとえば、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>