この章では、カスタム・イベントBeanのコーディングおよび登録方法について説明します。次の項が含まれます。
イベントBeanはOracle CEP管理フレームワークによって管理されるPOJO (Plain Old Java Object)です。イベントBeanは標準のbean
要素ではなく、Oracle CEP wlevs:event-bean
ステージを使用してEPNアセンブリ・ファイルに登録します。
イベントBeanはステージの一種であり、Oracle CEP監視フレームワークによって監視でき、構成メタデータの注釈を利用します。また、Beanを通過するイベントを記録および再生するよう設定できます。イベントBeanは、Oracle CEPサーバーAPIインタフェースを実装するのではなく、XML宣言にメソッドを指定することによって、Oracle CEPサーバーBeanライフサイクルに参加することもできます。
POJO (Plain Old Java Object)をOracle CEPアプリケーションに追加する手順:
Oracle CEPサーバー・コンテナの能力を積極的に使用するためにイベントBeanを使用します。
Springへのレガシー統合にSpring Beanを使用します。
詳細は、第16章「カスタムSpring Beanの構成」を参照してください。
イベントBeanはイベント・ソースまたはイベント・シンク、あるいはその両方に使用できます。イベント・ソースはイベントを生成し、イベント・シンクはイベントを受信します。
com.bea.wlevs.ede.api.StreamSource
またはRelationSource
APIを実装して、EPN内のイベントBeanコンポーネントがイベント・ソースであることを指定します。
イベント・ソースであるイベントBeanの実装クラスは、アプリケーションのプライベートとして指定するか、または他のアプリケーションによる再利用が可能な公開されたOSGIサービスとして指定できます。
EPNコンポーネントとしてのカスタム・イベントBeanをフレームワークで完全に管理できるようにするには、標準のSpring Beanではなく、イベントBeanとして指定する必要があります。管理タスクにはモニターおよび記録再生が含まれます。
wlevs:event-bean
要素を使用してイベントBeanをEPNアセンブリ・ファイルに登録します。例:
<wlevs:event-bean id="myEventBeanSource" class="com.acme.MySourceEventBean"> </wlevs:event-bean>
この例では、JavaクラスMySourceEventBean.java
によってcom.bea.wlevs.ede.api.StreamSource
またはRelationSource
APIが実装されます。
詳細は、15.2.1項「カスタム・イベントBeanをイベント・ソースとして実装」を参照してください。
カスタム・イベントBeanのイベント・シンクとしての機能は、カスタム・イベントBeanシンクでcom.bea.wlevs.ede.api.StreamSink
またはRelationSink
APIを実装する必要がある以外は、イベント・ソースによく類似しています。
イベント・シンクはアクティブではないため、Runnable
インタフェースを実装している場合、Oracle CEPではこれらを個別のスレッドで実行しません。
wlevs:listener
要素を使用してEPNアセンブリ・ファイルでイベント・シンクを参照します。
<wlevs:event-bean id="myEventBeanSink" class="com.acme.MySinkEventBean"> </wlevs:event-bean> ...<wlevs:channel id="myStream" >
<wlevs:listener ref="myEventBeanSink" />
</wlevs:channel>
この例では、JavaクラスMySinkEventBean.java
によってcom.bea.wlevs.ede.api.StreamSink
またはRelationSink
APIが実装されます。
詳細は、15.2.2項「カスタム・イベントBeanをイベント・シンクとして実装」を参照してください。
イベントBeanが単一のOracle CEPアプリケーションによってのみ使用される場合は、ファクトリを作成する必要はありません。ただし、同一のイベントBeanが複数のアプリケーションで使用される場合は、ファクトリもプログラミングする必要があります。この場合、それぞれのアプリケーションで固有のアダプタ・インスタンスが取得されます。
イベントBeanのファクトリはcom.bea.wlevs.ede.api.Factory
インタフェースを実装する必要があります。このインタフェースには、アダプタまたはイベントBeanのインスタンスを作成するために実装する単一のメソッドcreate
が含まれています。
wlevs:factory
要素を使用してEPNアセンブリ・ファイルにファクトリを登録します。
<wlevs:factory provider-name="myprovider" class="my.Implementation"/>
サービスのプロパティを指定する必要がある場合は、<osgi:service>
を使用してファクトリを登録する必要があります。
以下の手順では、カスタム・イベントBeanを作成する通常のステップについて説明します。
カスタム・イベントBeanを実装する手順:
注意: 次の手順では、カスタム・イベントBeanはプロセッサ、ストリームおよびビジネス・ロジックPOJOなど、EPNの他のコンポーネントを組み込んだ同一アプリケーションJARファイルにバンドルされたとみなされます。カスタム・イベントBeanを固有のJARファイルにバンドルし、複数のアプリケーション間で共有できるようにするには、24.2.4.2項「固有のバンドルでのカスタム・イベントBeanのアセンブル方法」を参照してください。 |
カスタム・イベントBean Javaクラスをプログラミングします。
カスタム・イベントBeanがイベント・ソースの場合、15.2.1項「カスタム・イベントBeanをイベント・ソースとして実装」を参照してください。
カスタム・イベントBeanがイベント・シンクの場合、15.2.2項「カスタム・イベントBeanをイベント・シンクとして実装」を参照してください。
カスタム・イベントBeanがイベント・ソースとイベント・シンクの両方である場合は、両方の項を参照してください。
オプションで、ファクトリ・クラスをプログラミングします。
これは、多数のアプリケーションでカスタム・イベントBeanを使用する場合のみ必要です。
カスタム・イベントBeanの基本構成が不十分な場合は、必要に応じてその構成を拡張します。
第19章「コンポーネント構成の拡張」を参照してください。
カスタム・イベントBeanを構成します。
詳細については、次を参照してください。
次の例は、イベント・ソースとしてのカスタム・イベントBeanクラスを示します。Javaコードの太字部分に対応するコーディングのガイドラインについては、例の後で説明しています。
package com.acme; import com.bea.wlevs.ede.api.StreamSender; import com.bea.wlevs.ede.api.StreamSource; import com.bea.wlevs.ede.api.RunnableBean; public class EventBeanSource implements RunnableBean, StreamSource { public void setEventSender (StreamSender streamSender) { ... } public void run() { ... } public synchronized void suspend() throws Exception { ... } }
カスタム・イベントBean Javaクラスのプログラミングでは、次のガイドラインに従います。上記の例でガイドラインのコード・スニペットは太字で示されています。
Oracle CEP APIのインタフェースおよびクラスをインポートします。
import com.bea.wlevs.ede.api.StreamSender; import com.bea.wlevs.ede.api.StreamSource; import com.bea.wlevs.ede.api.RunnableBean;
カスタム・イベントBeanはイベント・ソースであるため、StreamSource
インタフェースを実装する必要があります。カスタム・イベントBeanをスレッドで実行する必要がある場合は、RunnableBean
も実装します。StreamSender
インタフェースは、イベント・タイプをアプリケーション・ネットワークの次のコンポーネントに送信します。これらのAPIの完全な詳細は、Oracle Complex Event ProcessingのOracle Fusion Middleware Java APIリファレンスを参照してください。
カスタム・イベントBeanクラスはイベント・ソースであり、固有のスレッドで実行されるため、StreamSource
およびRunnableBean
インタフェースを実装する必要があります。
public class HelloWorldAdapter implements RunnableBean, StreamSource {
StreamSource
インタフェースではイベントの送信に使用されるStreamSender
が提供されます。
RunnableBean
インタフェースが実装されるため、カスタム・イベントBeanではrun
メソッドを実装する必要があります。
public void run() {...
ここに、マーケット・フィードなどからの着信データを読み込み、Oracle CEPイベント・タイプに変換し、ネットワークの次のコンポーネントにイベントを送信するコードを配置する必要があります。着信データの読込み方法の詳細については、データ・フィード・プロバイダのドキュメントを参照してください。サード・パーティJARファイルにパッケージ化されているベンダーAPIに確実にアクセスできるための情報は、24.2.2.2項「サード・パーティJARファイルへのアクセス」を参照してください。
カスタム・イベントBeanではStreamSource
が実装されるため、イベントの送信に使用されるStreamSender
を渡すsetEventSender
メソッドを実装する必要があります。
public void setEventSender(StreamSender sender) { ...
通常のケースと同様、カスタム・イベントBeanでSuspendableBean
が実装される場合は、たとえばアプリケーションがアンデプロイされた場合などにカスタム・イベントBeanを停止するsuspend
メソッドを実装する必要があります。
public synchronized void suspend() throws Exception { ...
次のコード例は、HelloWorldアプリケーションでイベント・シンクとして動作するSpring Beanです。太字部分のコードについては、例の後で説明しています。
package com.bea.wlevs.example.helloworld; import com.bea.wlevs.ede.api.StreamSink; import com.bea.wlevs.event.example.helloworld.HelloWorldEvent; public class HelloWorldBean implements StreamSink { public void onInsertEvent(Object event) { if (event instanceof HelloWorldEvent) { HelloWorldEvent helloWorldEvent = (HelloWorldEvent) event; System.out.println("Message: " + helloWorldEvent.getMessage()); } } }
上記の例に示したプログラミングのガイドラインは、次のとおりです。
Beanではアプリケーションのイベント・タイプをインポートする必要があります。HelloWorldの場合はHelloWorldEvent
です。
import com.bea.wlevs.event.example.helloworld.HelloWorldEvent;
Beanはcom.bea.wlevs.ede.api.StreamSink
インタフェースを実装する必要があります。
public class HelloWorldBean implements StreamSink {...
StreamSink
インタフェースは、実装する必要のあるonInsertEvent (java.lang.Object)
という単一のメソッドがあります。このメソッドは、イベントを受信するためのコールバック・メソッドです。メソッドパラメータはオブジェクト
であり、イベントを送信したコンポーネントからBeanが受信した実際のイベントを表現します。
public void onInsertEvent(Object event)
イベントのデータ型は、アプリケーションのEPNアセンブリ・ファイルに登録されたイベント・タイプによって決定されます。この例のイベント・タイプはHelloWorldEvent
です。コードでは、受信したイベントが実際にHelloWorldEvent
であることがまず確認されます。
if (event instanceof HelloWorldEvent) { HelloWorldEvent helloWorldEvent = (HelloWorldEvent) event;
このイベント・タイプは、EPNアセンブリ・ファイルで以下のように構成されたJavaBeanです。
<wlevs:event-type-repository> <wlevs:event-type type-name="HelloWorldEvent"> <wlevs:class> com.bea.wlevs.event.example.helloworld.HelloWorldEvent </wlevs:class> </wlevs:event-type> </wlevs:event-type-repository>
EPNアセンブリ・ファイルの作成手順に関する情報は、4.3項「EPNアセンブリ・ファイルの作成」を参照してください。参照情報は、付録C「スキーマ参照: EPNアセンブリspring-wlevs-v11_1_1_3.xsd」を参照してください。
イベントは該当するJavaBeanのインスタンスであるため、標準のgetXXX
メソッドを使用して個々のプロパティにアクセスします。この例では、HelloWorldEvent
にはmessage
のプロパティがあり、getMessage
を使用してこのプロパティにアクセスします。
System.out.println("Message: " + helloWorldEvent.getMessage());
この項で説明しているOracle CEP APIの完全なAPIリファレンス情報については、Oracle Fusion Middleware Oracle Complex Event Processing Java APIリファレンスを参照してください。
アダプタ・ファクトリ・クラスはcom.bea.wlevs.ede.api.EventBeanFactory
インタフェースを実装する必要があり、これには1つのメソッドcreate
が含まれていますが、ここに特定のアダプタ・クラスを作成するコードを作成します。イベントBeanはFactory
を実装します。
次の例は、HelloWorldのサンプルで使用可能なアダプタ・ファクトリ・クラスです。
package com.acem; import com.bea.wlevs.ede.api.EventBean; import com.bea.wlevs.ede.api.EventBeanFactory; public class MyEventBeanFactory implements Factory { public MyEventBeanFactory() { } public synchronized EventBean create() throws IllegalArgumentException { return new MyEventBeanFactory(); } }
これらのAPIの詳細は、Oracle Fusion Middleware Oracle Complex Event Processing Java APIリファレンスを参照してください。
次の項で説明しているとおり、カスタム・イベントBean、およびイベントBeanファクトリ(使用している場合)をEPNアセンブリ・ファイルに登録する必要があります。
アプリケーションの他のコンポーネントの登録を含む、構成ファイルの完全な説明は、4.3項「EPNアセンブリ・ファイルの作成」を参照してください。
wlevs:factory
要素を使用してEPNアセンブリ・ファイルにファクトリを登録します。
<wlevs:factory provider-name="myprovider" class="my.Implementation"/>
サービスのプロパティを指定する必要がある場合は、osgi:service>
要素を使用して、EPNアセンブリ・ファイルにOSGIサービスとしてファクトリを登録する必要があります。OSGIサービス・レジストリのスコープはOracle CEP全体です。このため、指定のサーバーにデプロイされた複数のアプリケーションが同じアダプタ・ファクトリを使用する場合は、アダプタ・ファクトリをOSGIサービスとして登録するのが必ず一度きりになるようにします。
エントリを追加して、サービスを com.bea.wlevs.ede.api.EventBeanFactory
インタフェースの実装として登録します。key
属性のtype
、およびこのアダプタ・プロバイダを参照する名前を使用して、プロパティを指定します。最後に、ネストされた標準のSpring bean
要素を追加して、Springアプリケーション・コンテキストで特定のアダプタ・クラスを登録します。
たとえば、EPNアセンブリ・ファイルの次の部分では、MyEventBeanFactory
をタイプhellomsgs
のプロバイダとして登録します。
<osgi:service interface="com.bea.wlevs.ede.api.EventBeanFactory"> <osgi:service-properties> <entry key="type" value="myprovider"</entry> </osgi:service-properties> <bean class="com.acme.MyEventBeanFactory" /> </osgi:service>
ファクトリをtype
で参照する方法については、15.3.2項「アプリケーションのカスタム・イベントBeanコンポーネントの宣言」を参照してください。
EPNアセンブリ・ファイルでは、wlevs:event-bean
要素を使用してカスタム・イベントBeanをイベント・プロセッサ・ネットワークのコンポーネントとして宣言します。例:
<wlevs:event-bean id="recplayEventSink" class="com.bea.wlevs.example.recplayRecplayEventSink"> <wlevs:listener ref="playbackHttpPublisher"/> </wlevs:event-bean>
オプションのファクトリをOSGIサービスとして登録した場合は、provider
属性を使用して、osgi:service
エントリでtype
として指定した名前を参照します。例:
<wlevs:event-bean id="myEventBean" provider="myprovider"/>
これにより、アダプタはタイプmyprovider
で登録されたファクトリによってインスタンス化されます。
wlevs:adapter
のwlevs:instance-property
子要素を使用して、アダプタBeanの静的プロパティを設定することもできます。静的プロパティはアダプタのデプロイ後に動的に変更されないプロパティです。
たとえば、アダプタ・クラスにsetPort
メソッドが含まれている場合は、次のようにポート番号を渡すことができます。
<wlevs:event-bean id="myEventBean" provider="myProvider"> <wlevs:instance-property name="port" value="9001" /> </wlevs:event-bean>
アプリケーション内の各カスタム・イベントBeanにはデフォルトの構成があり、必要に応じて拡張コンポーネント構成もあります。
アプリケーションに複数のカスタム・イベントBeanが含まれている場合は、各カスタム・イベントBeanごとに個別のXMLファイルを作成するか、すべてのカスタム・イベントBeanの構成を含む単一のXMLファイルを作成するか、またはアプリケーションのすべてのコンポーネント(アダプタ、プロセッサ、およびストリーム)を含むファイルを作成できます。開発環境に最も適した方法を選択します。
次の手順では、カスタム・イベントBean構成ファイルを作成する主なステップについて示します。簡略化のため、この手順ではアプリケーションのすべてのコンポーネントを1つのXMLファイルに構成することを想定しています。
詳細については、次を参照してください。
次の手順では、カスタム・イベントBeanを手動で構成する方法について説明します。
カスタム・イベントBean構成ファイルを構成する手順:
お気に入りのXMLエディタを使用してXMLファイルを作成します。
このXMLファイルの名前は自分で決定しますが、その拡張は.xml
で終了することが必要です。
構成ファイルのルート要素はconfig
であり、次のステップに示すネームスペース定義を使用します。
アプリケーションの各イベントBeanには、config
のevent-bean
子要素を追加します。
各カスタム・イベントBeanをname
子要素で一意に識別します。この名前は、アプリケーションのイベント処理ネットワークを定義するEPNアセンブリ・ファイルのwlevs:event-bean
要素のid
属性の値と同じである必要があります。これによって、Oracle CEPは、このアダプタ構成が、EPNアセンブリ・ファイルのどのカスタム・イベントBeanコンポーネントに適用されるかを把握します。詳細は、4.3項「EPNアセンブリ・ファイルの作成」を参照してください。
たとえば、アプリケーションに2つのカスタム・イベントBeanがある場合、構成ファイルは最初に次のようになります。
<?xml version="1.0" encoding="UTF-8"?> <helloworld:config xmlns:helloworld="http://www.bea.com/xml/ns/wlevs/example/helloworld"> <processor> ... </processor> <event-bean> <name>firstEventBean</name> ... </event-bean> <event-bean> <name>firstEventBean</name> ... </event-bean> </helloworld:config>
この例では、構成ファイルにfirstEventBean
とsecondEventBean
の2つのカスタム・イベントBeanが含まれています。このため、EPNアセンブリ・ファイルには同じ識別子を持つカスタム・イベントBeanが少なくとも2つ登録されている必要があります。
<wlevs:event-bean id="firstEventBean" ...> ... </wlevs:event-bean> <wlevs:event-bean id="secondEventBean" ...> ... </wlevs:event-bean>
注意: XMLファイルの識別子と名前は大/小文字が区別されるため、EPNアセンブリ・ファイルでコンポーネントの識別子を参照するときは、必ず大/小文字を同一にします。 |
次のサンプルXMLファイルでは、firstEventBean
およびsecondEventBean
の2つのカスタム・イベントBeanを構成する方法を示します。
<?xml version="1.0" encoding="UTF-8"?> <sample:config xmlns:sample="http://www.bea.com/xml/ns/wlevs/example/sample"> <event-bean> <name>firstEventBean</name> ... </event-bean> <event-bean> <name>firstEventBean</name> ... </event-bean> </sample:config>