ヘッダーをスキップ
Oracle® Complex Event Processing開発者ガイド
11g リリース1 (11.1.1) for Eclipse
B61654-01
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

1 Oracle CEPアプリケーションの作成の概要

この節では、次の項目について説明します。

1.1 Oracle CEPプログラミング・モデルの概要

アプリケーションは、低待機時間、イベントドリブンかつ高性能駆動型のアプリケーションであるため、軽量なコンテナ上で実行し、POJOベースのプログラミング・モデルを使用して開発されています。POJO (Plain Old Java Object)プログラミングでは、ビジネス・ロジックはPOJO形式で実装され、必要とするサービスが注入されます。これは一般に、依存関係インジェクションと呼ばれます。インジェクトされたサービスは、構成管理などのOracle CEPサービスで提供されるものから、Oracle Kodoなどの他のOracle製品で提供されるサービスやサード・パーティ製のサービスまで多岐に渡ります。

Oracle CEPでは、イベント駆動型アプリケーションをアセンブルするために共に使用する一連のコア・サービスやコンポーネントが定義されます。一般的なサービスには、アダプタ、ストリーム、およびプロセッサがあります。また、アプリケーションの一部となる独自のビジネス・ロジックPOJOとSpring Beanを作成したり、イベントのモニターや、イベントの記録または再生など、Oracle CEPフレームワークへの完全なアクセス権を持つ、Spring Beanと同様の特殊化されたイベントBeanを作成できます。この他にも、Oracle CEPにはキャッシュ、クラスタリング、構成、モニター、ロギングなどの他のインフラストラクチャ・サービスがあります。

すべてのサービスは基になるOracle microServices Architecture (mSA)テクノロジ上にデプロイされています。Oracle mSAは、OSGi Allianceで定義されたOSGiサービス・プラットフォームに基づいています。(詳細は、http://www.osgi.org/を参照してください。)

次の節では、Oracle CEPプログラミング・モデルとアプリケーションの作成についてさらに詳しく説明しています。

1.1.1 Oracle CEPイベント処理ネットワークのコンポーネント

Oracle CEPイベント処理ネットワーク(EPN)では、Oracle CEPアプリケーションのOracle CEPコンポーネントの相互接続を表します。

Oracle CEPアプリケーションおよびイベント処理ネットワーク(EPN)は、次の基本コンポーネントで構成されています。

EPNの各コンポーネントは、ステージと呼ばれます。また、Oracle CEP IDE for Eclipse内では、EPNの各コンポーネントは、ノードと呼ばれます。

詳細は、次を参照してください:

1.1.1.1 ネストされたステージ

EPNの親ステージ内に子ステージを定義した場合、子ステージはネストと言われます。親ステージのみが子ステージをリスナーとして指定できます。

例1-1は、HelloWorldBeanhelloworldOutputChannel内にネストされているEPNアセンブリ・ソースです。親helloworldOutputChannelのみが、ネストされたBeanをリスナーとして指定できます。

例1-1 ネストされたBeanによるEPNアセンブリ・ファイル

<wlevs:adapter id="helloworldAdapter" class="com.bea.wlevs.adapter.example.helloworld.HelloWorldAdapter" >
    <wlevs:instance-property name="message" value="HelloWorld - the current time is:"/>
</wlevs:adapter>

<wlevs:channel id="helloworldInputChannel" event-type="HelloWorldEvent" >
    <wlevs:listener ref="helloworldProcessor"/>
    <wlevs:source ref="helloworldAdapter"/>
</wlevs:channel>

<wlevs:processor id="helloworldProcessor" />

<wlevs:channel id="helloworldOutput" event-type="HelloWorldEvent" advertise="true">
    <wlevs:listener>
        <bean class="com.bea.wlevs.example.helloworld.HelloWorldBean"/>
    </wlevs:listener>
    <wlevs:source ref="helloworldProcessor"/>
</wlevs:channel>

かわりに、例1-2に示すように、すべてにノードがネストされるようにこのEPNを定義できます。helloworldAdapterは最も外側の親ステージであり、EPNの他のステージにアクセスできる単一ステージです。

例1-2 ネストされたすべてのノードによるEPNアセンブリ・ファイル

<wlevs:adapter id="helloworldAdapter" class="com.bea.wlevs.adapter.example.helloworld.HelloWorldAdapter" >
    <wlevs:instance-property name="message" value="HelloWorld - the current time is:"/>
    <wlevs:listener>
        <wlevs: id="helloworldInput" event-type="HelloWorldEvent" >
            <wlevs:listener>
                <wlevs:processor id="helloworldProcessor">
                    <wlevs:listener>
                        <wlevs: id="helloworldOutput" event-type="HelloWorldEvent">
                            <wlevs:listener>
                                <bean class="com.bea.wlevs.example.helloworld.HelloWorldBean"/>
                            </wlevs:listener>
                        </wlevs:>
                    </wlevs:listener>
                </wlevs:processor>
            </wlevs:listener>
        </wlevs:>
    </wlevs:listener>
</wlevs:adapter>

詳細は、5.2.9項「ネストされたステージ」を参照してください。

1.1.1.2 外部ステージ

同じアプリケーションにソース・ステージおよびターゲット・ステージの両方を定義した場合、ステージを、id属性で簡単に参照します。

別のアプリケーションで定義したステージを参照するには、次の構文を使用します。

FOREIGN-APPLICATION-NAME:FOREIGN-STAGE-ID

ここでは、FOREIGN-APPLICATION-NAMEは、外部ステージを定義したアプリケーションの名前であり、FOREIGN-STAGE-IDは、外部ステージのid属性です。

例1-3では、アプリケーションapplication2で定義した外部ステージHelloWorldBeanSourceapplication1が参照する方法について説明しています。

例1-3 アプリケーション2の外部ステージを参照するアプリケーション1

<wlevs:stream id="helloworldInstream" >
    <wlevs:listener ref="helloworldProcessor"/>
    <wlevs:source ref="application2:HelloWorldBeanSource"/>
</wlevs:stream>

例1-4 アプリケーション2の外部ステージ

<wlevs:event-bean id="HelloWorldBeanSource"
class="com.bea.wlevs.example.helloworld.HelloWorldBeanSource"
advertise="true"/> 

外部ステージを伴うOracle CEPアプリケーションを作成する場合、アプリケーションのアセンブリ、デプロイおよび再デプロイのときに外部ステージの依存関係を考慮する必要があります。詳細は、20.2.3項「外部ステージによるアプリケーションのアセンブリ」を参照してください。

1.1.2 Oracle CEPイベント・タイプ

イベント・タイプは、Oracle CEPアプリケーションで処理されるイベントのプロパティを定義します。アダプタはJavaメッセージ・システム(JMS)または金融マーケット・データ・フィードなどの様々なイベント・ソースからの着信イベントを受信します。プロセッサが処理できるよう、これらのイベントにOracle CEPイベント・タイプを定義する必要があります。このイベント・タイプはアダプタおよびPOJO Javaコード、およびプロセッサと関連付けられるOracle CQLおよびEPLルールで使用されます。

イベントは、各プロパティがイベント・ソースからのデータ項目を表すJavaBeanまたはJavaクラス・インスタンスです。Oracle CEPでは、次のイベント・タイプ実施がサポートされます。

JavaBean(またはJavaクラスおよびファクトリ)アプローチを使用してイベントを定義することをお薦めします。そうすると、アプリケーションの一部として、イベント・タイプをさらに柔軟に処理でき、既存のシステムとの統合を簡略化できます。

かわりに、wlevs:propertyタグを使用してEPNアセンブリ・ファイルにイベント・タイプのプロパティを宣言的に指定できます。この場合、Oracle CEPでは、java.util.Mapまたはタプルが使用されます。タプルはデフォルトであり、Oracle CQLタプルと同様です。これによって、ユーザーに実質的に最適化実行が提供されます。しかし、ユーザーは、必ずEventTypeRepository APIを使用してこの値を設定して、取得する必要があります。迅速なプロトタイプの場合、またはアプリケーション開発者がアプリケーション・ロジックの一部としてJavaBeanイベントを処理する必要がない場合、または一部のレガシー・システムに統合するためにこのアプローチが使用されます。

詳細は、次を参照してください:

1.1.2.1 イベント・タイプのインスタンス化および不変性

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メソッドが一度のみ起動されます。

1.1.2.2 イベント・タイプ・データ型

イベント・タイプを作成する場合、次のデータ型制限に注意してください。

詳細は、次を参照してください:

  • 『Oracle CEP CQL言語リファレンス』のDatatypesに関する項

  • 『Oracle CEP EPL言語リファレンス』のEPL言語の概要に関する項

1.1.2.2.1 JavaBeanまたはJavaクラスとして指定されたイベント・タイプ

JavaBeanまたはJavaクラスとしてイベント・タイプを定義する場合、いずれかのJavaタイプをそのプロパティに使用できます。

Oracle Javaデータ・カートリッジを使用して、JavaBeanまたはJavaクラス・イベント・タイプを別のイベント・タイプと結合することもできます。例1-5は、アドレスプロパティをJavaクラス・イベント・タイプAddressとして定義するタプル・イベント・タイプStudentを表しています。

例1-5 イベント・タイプ・リポジトリ

<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>

詳細については、以下を参照:

1.1.2.2.2 java.util.Mapとして指定されたイベント・タイプ

イベント・タイプのプロパティを、java.util.MapとしてEPNアセンブリ・ファイルで宣言的に指定する場合、いずれかのJavaタイプをそのプロパティに使用できます。ただし、次のいずれかとしてイベント・タイプを指定します。

  • Class.forName()と同じルールに準拠し、アプリケーションのクラス・ローダーで使用できる必要がするJavaクラスの完全修飾名。

  • Javaプリミティブ(たとえば、intまたはfloat)。

イベント・タイプ名に文字[]を追加して配列を指定できます。

例1-6に、これらのタイプの使用方法を示します。

例1-6 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>

詳細は、1.4.4項「java.util.MapとしてOracle CEPイベント・タイプを作成する方法」を参照してください。

1.1.2.2.3 タプルとして指定されたイベント・タイプ

イベント・タイプのプロパティを、タプルとしてEPNアセンブリ・ファイルで宣言的に指定する場合、com.bea.wlevs.ede.api.Typeクラスで指定したタイプのみを使用できます。表1-1では、このクラスで定義する各タイプの使用方法を説明しています。

表1-1 com.bea.wlevs.ede.api.Typeの使用方法

タイプ 使用方法

bigint

java.math.BigIntegerで指定される範囲内の数値

boolean

java.lang.Booleanで指定されるBoolean値

byte

java.lang.Byteで指定されるバイト値

char

単一または複数の文字値。charおよびjava.lang.String値の両方に使用します。

オプションで、例1-7でプロパティ名idで指定しているように、char値の最大長を指定するには、length属性を使用できます。デフォルトの長さは256文字です。最大長はjava.lang.Integer.MAX_VALUEです。256文字を超える必要がある場合、適当な長さを指定する必要があります。

double

java.lang.Doubleで指定される範囲内の数値

float

java.lang.Floatで指定される範囲内の数値

int

java.lang.Integerで指定される範囲内の数値

interval

Oracle CQL INTERVALデータ型で指定される間隔値

詳細は、『Oracle CEP CQL言語リファレンス』の間隔リテラルに関する項を参照してください。

object

java.lang.Objectとして表現できる不透明データ型

timestamp

java.util.Dateで指定されるフォーマットのタイムスタンプString

例:

"Sat, 12 Aug 1995 13:30:00 GMT+0430"

xmltype

Oracle CQL XMLTYPEデータ型で指定されるXML値

『Oracle CEP CQL言語リファレンス』のSQL/XML (SQLX)に関する項を参照してください。


例1-7には、これらのタイプの使用方法を示します。

例1-7 タプル・イベント・タイプ・プロパティ用の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>

詳細は、1.4.2項「タプルとしてOracle CEPイベント・タイプの作成」を参照してください。

1.1.2.2.4 データベース表ソースとともに使用するイベント・タイプ

リレーショナル・データベース表で使用するイベント・タイプ(JavaBean、Javaクラス、java.util.Mapまたはタプルのいずれか)のプロパティを指定する場合、次の追加JDBCタイプの制限に従う必要があります。

詳細は、次を参照してください:

1.1.2.2.5 csvgenアダプタとともに使用するイベント・タイプ

csvgenアダプタで使用するイベント・タイプ(JavaBean、Javaクラス、java.util.Mapまたはタプルのいずれか)のプロパティを指定する場合、表1-2で説明されるデータ型のみを使用できます。

表1-2 csvgenアダプタ・タイプ

タイプ 使用方法

char

単一または複数の文字値。char値およびjava.lang.String値の両方に使用します。

オプションで、例1-7でプロパティ名idで指定しているように、char値の最大長を指定するには、length属性を使用できます。デフォルトの長さは256文字です。256文字を超える必要がある場合、適当な長さを指定する必要があります。

int

java.lang.Integerで指定される範囲内の数値

long

java.lang.Longで指定される範囲内の数値。

double

java.lang.Doubleで指定される範囲内の数値


詳細は、次を参照してください:

1.1.3 EPN内のイベントの送信: ストリーム、リレーション・ソースおよびシンク

EPNのすべてのコンポーネントでは、イベントが作成または消費されます。一部のコンポーネントでは両方できます。たとえば、EPNの途中のイベントBeanは、アダプタなどのアップストリーム・コンポーネントからイベントを受信します。その後、プロセッサなどのダウンストリーム・コンポーネントへイベントを送信します。

コンポーネントは、アップストリーム・コンポーネントから受信するイベント上で動作して、ダウンストリーム・コンポーネントへイベントをパスし、新しいイベントを作成して、これをアップストリームまたはダウンストリーム・チャネルに挿入されます。

一般的に、すべての事前定義済コンポーネント(JMS、HTTPパブリッシュ・サブスクライブ・アダプタ、チャネルおよびプロセッサなど)は、ストリーム、リレーション・ソースおよびシンクとして操作するために必要とするインタフェースを実行します。そのままで使用するか、またはEPNアセンブリ・ファイルを使用して動作を構成できます。

カスタム・アダプタ、イベントBeanおよびSpring Beanの場合、ストリーム、リレーション・ソースおよびシンクとしてこのコンポーネントを使用するには、適切なインタフェースを実装する必要があります。

この項では次について説明します:

1.1.3.1 ストリームおよび関係

ストリームまたはリレーションとしてのOracle CEPモデル・イベント・フロー

  • stream Sは、要素(s,T)のバッグ・マルチ・セットです。ここでは、sは、Sのスキーマにあり、Tはタイム・ドメインにあります。ストリーム要素は、タイムスタンプのタプル挿入のシークエンスとして表すタプル・タイムスタンプ・ペアです。つまり、ストリームは、タイムスタンプされたタプルのシークエンスです。同じタイムスタンプがある複数のタプルがある場合があります。入力ストリームのタプルはタイムスタンプが増加する順番でシステムに到達する必要があります。

    チャネルをストリームとして指定するには、EPNアセンブリ要素wlevs: 属性is-relationfalse(デフォルト)に設定します。

  • リレーションは順序なしであり、タプルの時間依存性のバッグです。つまり、瞬間のリレーションです。毎タイム・インスタントで、リレーションはバウンドされたセットです。またこれは、リレーションの変更状態をキャプチャするために、挿入、削除および更新を含むタイムスタンプされたタプルのシーケンスとしても表されます。

    チャネルをリレーションとして指定するには、EPNアセンブリ要素wlevs:channel属性is-relationtrueに設定します。

詳細は、次を参照してください:

1.1.3.2 ストリームおよび関係のソース

イベントを生成するすべてのコンポーネントでは、次のインタフェースのいずれかを実施する必要があります。

  • com.bea.wlevs.ede.api.StreamSource

    StreamSourceインタフェースには、イベント・ソース・コンポーネントがcom.bea.wlevs.ede.api.StreamSenderインスタンスにインジェクトされるランタイムに、setEventSenderという1つのメソッドがあります。

    その結果、StreamSenderインスタンスには、コンポーネントによって、EPN内の次のコンポーネントにイベントを送信するために起動されるsendInsertEventメソッドがあります。また、StreamSenderインスタンスでは、sendHeartbeatメソッドが提供されます。sendHeartBeatメソッドは、アプリケーション・タイムスタンプされたチャネルのみに適用されます。

  • com.bea.wlevs.ede.api.RelationSource

    RelationSourceインタフェースには、イベント・ソース・コンポーネントがcom.bea.wlevs.ede.api.RelationSenderインスタンスにインジェクトされたランタイムに、setEventSenderという1つのメソッドがあります。

    その結果、RelationSenderインスタンスには、コンポーネントによって、EPN内の次のコンポーネントにイベントを送信するために起動されるsendUpdateEventおよびsendDeleteEventメソッドがあります。

1.1.3.3 ストリームおよび関係のシンク

イベントを消費するすべてのコンポーネントでは、次のインタフェースのいずれかを実施する必要があります。

  • com.bea.wlevs.ede.api.StreamSink

    StreamSinkインタフェースには、コンポーネントによって、EPN内の前のコンポーネントからイベントのリストを送信するために実施されるonInsertEventという単一のコールバック・メソッドがあります。

  • com.bea.wlevs.ede.api.RelationSink

    RelationSinkインタフェースでは、Oracle CQLリレーション・シンクをモデル化するために、StreamSinkが拡張されます。また、RelationSinkインタフェースでは、onDeleteEventおよびonUpdateEventメソッドも提供されます。

1.1.3.4 EPN内のイベントの送信例

次の例は、図1-1に示すHelloWorld例に基づいています。次の事項を示すために、変更されます。

図1-1 HelloWorld例イベント処理ネットワーク

図1-1の説明が続きます
「図1-1 HelloWorld例イベント処理ネットワーク」の説明

詳細は、次を参照してください:

タプル・イベントとしてのHelloWorldEventの作成

まず、EPNアセンブリ・ファイルにタプル・イベントを作成します。

<wlevs:event-type-repository>
    <wlevs:event-type type-name="HelloWorldEvent">
        <wlevs:properties>
            <wlevs:property name="message" type="char" length="1000"/>
        </wlevs:properties>
    </wlevs:event-type>
</wlevs:event-type-repository>

StreamSourceとしてのHelloWorldAdapterからのイベントの送信

@Service注釈でsetEventTypeRepositoryを追加して、ランタイム時にEventTypeRepositoryインスタンスをインジェクトするためにHelloWorldAdapterを変更します。

@Service
public void setEventTypeRepository(EventTypeRepository etr) {
    etr_ = etr;
}

HelloWorldEventをインスタンス化するためにEventTypeRepositoryインスタンスを使用するには、HelloWorldAdaptergenerateHelloMessageを変更します。その後、イベントのプロパティを構成して、ランタイムのときOracle CEPサーバーによってインジェクトされたStreamSenderインスタンスを使用して、helloWorldInputChannelにイベントを送信します。

private void generateHelloMessage() {
    String message = this.message + dateFormat.format(new Date());

    EventType type = etr_.getEventType("HelloWorldEvent");
    EventProperty messageProp = type.getProperty("message");
    Object event = type.createEvent();

    messageProp.setValue(event, message);

    eventSender.sendInsertEvent(event);
}

StreamSinkとしてのHelloWorldBeanでのイベントの受信

@Service注釈を使用して、ランタイム時にEventTypeRepositoryインスタンスをインジェクトするためにHelloWorldBeanを変更します。

@Service
public void setEventTypeRepository(EventTypeRepository etr) {
    etr_ = etr;
}

イベントのプロパティと受信された挿入イベントのタイプを取得するために、EventTypeRepositoryインスタンスを使用するには、HelloWorldBeanonInsertEventメソッドを変更します。

public void onInsertEvent(Object event) {
    EventType eventType = etr_.getEventType(event);
    String prop = (String)eventType.getPropertyValue(event, "message");

    System.out.println("Tuple Message: " + prop);
}

StreamSourceとしてのHelloWorldBeanからのイベントの送信

HelloWorldBeanが他のコンポーネントに接続されていて、HelloWorldBeanからこのダウンストリーム・コンポーネントにイベントを送信する場合を想定してください。

まず、StreamSourceインタフェースを実装するためにHelloWorldBeanクラスを変更して、必要となるsetEventSenderメソッドを追加します。

public class HelloWorldBean implements StreamSource, StreamSink {
 
    private StreamSender streamSender_;

    public void setEventSender(StreamSender sender) {
        streamSender_ = sender;
    }
...
}

@Service注釈でsetEventTypeRepositoryを追加して、ランタイム時にEventTypeRepositoryインスタンスをインジェクトするためにHelloWorldBeanを変更します。

@Service
public void setEventTypeRepository(EventTypeRepository etr) {
    etr_ = etr;
}

HelloWorldEventをインスタンス化するためにEventTypeRepositoryインスタンスを使用するには、HelloWorldBeanを変更します。その後、イベントのプロパティを構成して、ランタイム時にOracle CEPサーバーによってインジェクトされたStreamSenderインスタンスを使用して、ダウンストリーム・コンポーネントにイベントを送信します。

private void generateHelloMessage() {
    String message = this.message + dateFormat.format(new Date());

    EventType type = etr_.getEventType("HelloWorldEvent");
    EventProperty messageProp = type.getProperty("message");
    Object event = type.createEvent();

    messageProp.setValue(event, message);

    eventSender.sendInsertEvent(event);
}

1.1.4 EPNアセンブリ・ファイル

サーバーにデプロイする前に、Oracle CEPアプリケーションおよびイベント処理ネットワーク(EPN)アセンブリ・ファイルをアセンブリします。このEPNアセンブリ・ファイルは、SpringフレームワークXML構成ファイルの拡張です。

spring-wlevs-v11_1_1_3.xsdスキーマ・ファイルでは、EPNアセンブリ・ファイルの構造について説明しています。

EPNアセンブリ・ファイルの構造は次のとおりです。beansという最上位ルート要素に、サブ要素のシーケンスが含まれています。個々のサブ要素には、Oracle CEPコンポーネントの構成データが含まれています。例:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:osgi="http://www.springframework.org/schema/osgi"
       xmlns:wlevs="http://www.bea.com/ns/wlevs/spring"
       xsi:schemaLocation="
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/osgi
            http://www.springframework.org/schema/osgi/spring-osgi.xsd
            http://www.bea.com/ns/wlevs/spring
            http://www.bea.com/ns/wlevs/spring/spring-wlevs-v11_1_1_3.xsd">

    <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>

    <wlevs:adapter id="helloworldAdapter" 
                   class="com.bea.wlevs.adapter.example.helloworld.HelloWorldAdapter" >
        <wlevs:instance-property name="message" value="HelloWorld - the current time is:"/>
    </wlevs:adapter>

    <wlevs:channel id="helloworldInputChannel" event-type="HelloWorldEvent" >
        <wlevs:listener ref="helloworldProcessor"/>
        <wlevs:source ref="helloworldAdapter"/>
    </wlevs:channel>

    <wlevs:processor id="helloworldProcessor" />

    <wlevs:channel id="helloworldOutputChannel" 
                   event-type="HelloWorldEvent" advertise="true">
        <wlevs:listener>
            <bean class="com.bea.wlevs.example.helloworld.HelloWorldBean"/>
        </wlevs:listener>
        <wlevs:source ref="helloworldProcessor"/>
    </wlevs:channel>

</beans>

一部のOracle CEP機能では、いくつかの構成をEPNアセンブリ・ファイルに指定し、いくつかの構成をコンポーネント構成ファイルに指定します。

詳細は、次を参照してください:

1.1.5 コンポーネント構成ファイル

イベント処理ネットワークの各コンポーネント(アダプタ、プロセッサ、チャネル、またはイベントBean)には構成ファイルを関連付けることができますが、構成ファイルが必須なのはプロセッサのみです。イベント処理ネットワークのステージであるかどうかにかかわらず、キャッシング・システムも構成ファイルを使用します。Oracle CEPのコンポーネント構成ファイルは、標準のXMLスキーマを使用して定義された構造を持つXMLドキュメントです。アプリケーションのすべてのコンポーネントの構成を含む単一のファイルを作成するか、または各コンポーネントごとに個別のファイルを作成できます。これらのうち、管理しやすい方を選択します。

wlevs_application_config.xsdスキーマ・ファイルでは、コンポーネント構成ファイルの構造について説明しています。このXSDスキーマでは、次のスキーマがインポートされます。

  • wlevs_base_config.xsd: アプリケーション構成ファイルとサーバー構成ファイルの間で共有される共通要素を定義します。

  • wlevs_eventstore_config.xsd: イベント・ストア固有の要素を定義します。

  • wlevs_diagnostic_config.xsd: 診断要素を定義します。

アプリケーション構成ファイルの構造は次のとおりです。configという最上位ルート要素に、サブ要素のシーケンスが含まれています。個々のサブ要素には、Oracle CEPコンポーネント(プロセッサ、チャネルまたはアダプタ)の構成データが含まれています。例:

<?xml version="1.0" encoding="UTF-8"?><n1:config xmlns:n1="http://www.bea.com/ns/wlevs/config/application"           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">    <processor>        <name>helloworldProcessor</name>        <rules>            <query id="helloworldRule">                <![CDATA[ select * from helloworldInputChannel [Now] ]]>            </query>        </rules>    </processor>
    <channel>
        <name>helloworldInputChannel</name>
        <max-size>10000</max-size>
        <max-threads>2</max-threads>
    </channel>
    <channel>
        <name>helloworldOutputChannel</name>
        <max-size>10000</max-size>
        <max-threads>2</max-threads>
    </channel>
</n1:config>

詳細は、次を参照してください:

1.1.6 ConfigurationPropertyPlaceholderConfigurerクラスによるコンポーネントおよびサーバー構成へのアクセス

ConfigurationPropertyPlaceholderConfigurerクラスを使用すると、シンボリック・プレースホルダでコンポーネント構成ファイルおよびサーバー構成ファイルの両方で既存の構成ファイル・プロパティを参照できます。そうすると、複数の場所で同じ値をハードコードするのではなく、1つの場所に値を定義して、その1つの定義を参照できます。

たとえば、例1-8に示すように要素が指定されたら、例1-9に示すように、netio要素port値を参照できます。

例1-8 netio要素

<netio>
    <name>MyNetIO</name>
    <port>9003</port>
</netio>

例1-9 netio要素ポート値へのアクセス

<property name="myprop" value="${MyNetIO.port}"/>

この機能を使用するには、例1-10に示すように、アプリケーション・バンドルのアプリケーション・コンテキスト構成ファイルにConfigurationPropertyPlaceholderConfigurer Beanを挿入します。

例1-10 ConfigurationPropertyPlaceholderConfigurerの追加

 <bean class="com.bea.wlevs.spring.support.ConfigurationPropertyPlaceholderConfigurer"/>

詳細は、『Oracle CEP Java APIリファレンス』com.bea.wlevs.spring.support.ConfigurationPropertyPlaceholderConfigurerクラスに関する項を参照してください。

プロパティ・ファイルのアクセスの詳細は、3.7.3項「Oracle CEPプロジェクトにプロパティ・ファイルを追加する方法」を参照してください。

1.1.7 高可用性とスケーラビリティ

Oracle CEPアプリケーションを設計する場合、設計プロセスの初期段階に高可用性およびスケーラビリティを考慮するのがベスト・プラクティスです。

Oracle CEPでは、アプリケーションに、サーバーの障害からリカバリするために必要なサービス品質を宣言的に構成できる様々な高可用性オプションが提供されます。

Oracle CEPでは、増加したイベント率を格納するためにアプリケーションをスケールできる様々な機能も提供されます。

詳細は、次を参照してください:

1.1.8 EPNの拡張

Oracle CEPで提供されるコンポーネントに加えて、カスタム・アダプタ、イベントBeanおよびSpring Beanを作成してEPNを拡張できます。

また、Oracle Javaデータ・カートリッジおよびOracle空間データ・カートリッジでEPNを拡張して、Oracle CQL問合せにJavaおよびOracle空間操作を組み込めます。

WebサービスとしてOracle CEPアプリケーションを公開して、Oracle CEPアプリケーションでWebサービスを消費できます。

詳細は、第4部「Oracle CEPイベント処理ネットワークの拡張」を参照してください。

1.1.9 コンポーネントを連動させる方法

Oracle CEPアプリケーションは、共にアセンブルされてイベント処理ネットワーク(EPN)を形成するサービスで構成されています。

サーバーでは、Springが普及しており簡素であることから、Springフレームワークをアセンブリ・メカニズムとして使用しています。Oracle CEPではSpringフレームワークが拡張され、アプリケーションのアセンブル・プロセスがさらに簡素化されました。この手法によって、Oracle CEPアプリケーションは、既存のSpring Bean、および依存関係インジェクションメカニズムに基づいた他の軽量なプログラミング・フレームワークと簡単に統合できます。

依存関係インジェクションの一般的な手法では、XML構成ファイルを使用してアプリケーションの依存関係とアセンブリが宣言的に指定されます。サーバーにデプロイする前に、Oracle CEPアプリケーションをEPNアセンブリ・ファイルにアセンブリします。このEPNアセンブリ・ファイルは、SpringフレームワークXML構成ファイルの拡張です。

アプリケーションのアセンブリが完了したら、Oracle CEPにデプロイできるようパッケージ化する必要があります。この処理は簡単です。アプリケーションのデプロイメント単位はプレーンJARファイルであり、少なくとも次のアーティファクトが含まれている必要があります。

  • ビジネス・ロジックPOJOのコンパイル済みアプリケーションJavaコード。

  • コンポーネント構成ファイル。各プロセッサには構成ファイルが必須ですが、アダプタとストリームに関しては、デフォルトの十分な構成があり、これらのコンポーネントをモニターしない場合は、構成ファイルは必要ではありません。

  • EPNアセンブリ・ファイル。

  • いくつかの追加のOSGiエントリを含むMANIFEST.MFファイル。

JARファイルへのアーティファクトのアセンブルが完了したら、着信データの受信を直ちに開始できるようOracle CEPにこのバンドルをデプロイします。

詳細は、第20章「Oracle CEPアプリケーションのアセンブルおよびデプロイ」を参照してください。

1.1.10 Oracle CEPアプリケーション・ライフサイクル

図1-2では、Oracle CEPアプリケーション・ライフサイクルの状態図を示します。この図では、状態名(STARTINGINITIALIZINGRUNNINGSUSPENDINGSUSPENDEDおよびFAILED)がApplicationRuntimeMBeanメソッドgetState戻り値に対応します。この状態は、Oracle CEP固有の状態であり、OSGiバンドル状態ではありません。

図1-2 Oracle CEPアプリケーション・ライフサイクルの状態図

図1-2の説明が続きます
「図1-2 Oracle CEPアプリケーション・ライフサイクルの状態図」の説明


注意:

Oracle CEPサーバー・ライフサイクルの詳細は、『Oracle CEP管理者ガイド』のOracle CEPサーバー・ライフサイクルに関する項を参照してください。

この項では、Oracle CEPサーバーにデプロイされたアプリケーションのライフサイクルと、com.bea.wlevs.ede.apiAPIコールバックのシーケンスについて説明します。ライフサイクルの説明は、ユーザーが実行するアクションに分類されます。このアクションは、次のとおりです。

この情報で、Oracle CEPのアプリケーション・ライフサイクルを管理する方法が説明されます。これによって、アプリケーションのライフサイクルAPIをより良く使用できます。このAPI(RunnableBeanおよびSuspendableBeanなど)の説明は、次を参照してください。

1.1.10.1ユーザー・アクション: アプリケーションのインストールまたはすでにデプロイされているアプリケーションとともにサーバーの起動

Oracle CEPでは、次のアクションが実行されます。

  1. Oracle CEPでアプリケーションがOSGIバンドルとしてインストールされます。OSGIでインポートおよびエクスポートが解決され、サービスがパブリッシュされます。

  2. Oracle CEPでBeanが作成されます(標準のSpring BeanおよびEPNアセンブリ・ファイルでOracle CEPタグに相当するBeanの両方)。各Beanに対し、Oracle CEPでは次の処理が行われます。

    • Spring Beanのプロパティが設定されます。<wlevs:instance-property>値はアダプタおよびイベントBeanで設定されます。

    • @Serviceまたは@ServiceReference注釈で指定されたサービスに適切な依存関係がインジェクションされます。

    • 静的な構成プロパティに適切な依存関係が注入されます。

    • InitializingBean.afterPropertiesSetメソッドが呼び出されます。

    • 構成コールバック(@Prepare@Activate)がSpring Beanおよびファクトリで作成されたステージで呼び出されます。

  3. アプリケーションの現在の状態はINITIALIZINGです。

  4. Oracle CEPでMBeansが登録されます。

  5. Oracle CEPでは、すべてのActivatableBeansActivatableBean.afterConfigurationActiveメソッドが呼び出されます。

  6. Oracle CEPでは、すべてのResumableBeansResumableBean.beforeResumeメソッドが呼び出されます。

  7. RunnableBeanを実装する各Beanについて、Oracle CEPでスレッドでの実行が開始されます。

  8. アプリケーションの現在の状態はRUNNINGです。

1.1.10.2ユーザー・アクション: アプリケーションの中断

Oracle CEPでは、次のアクションが実行されます。

  1. Oracle CEPでは、すべてのSuspendableBeansSuspendableBean.suspendメソッドが呼び出されます。

  2. アプリケーションの現在の状態はSUSPENDEDです。

1.1.10.3ユーザー・アクション: アプリケーションの再開

Oracle CEPでは、次のアクションが実行されます。

  1. Oracle CEPでは、すべてのResumableBeansResumableBean.beforeResumeメソッドが呼び出されます

  2. RunnableBeanを実装する各Beanについて、Oracle CEPでスレッドでの実行が開始されます。

  3. アプリケーションの現在の状態はRUNNINGです。

1.1.10.4ユーザー・アクション: アプリケーションのアンインストール

Oracle CEPでは、次のアクションが実行されます。

  1. Oracle CEPでは、すべてのSuspendableBeansSuspendableBean.suspendメソッドが呼び出されます。

  2. Oracle CEPでMBeansが登録解除されます。

  3. Oracle CEPでは、すべてのDisposableBeansDisposableBean.disposeメソッドが呼び出されます。

  4. Oracle CEPでアプリケーション・バンドルがOSGIからアンインストールされます。

1.1.10.5ユーザー・アクション: アプリケーションの更新

これは、最初にアプリケーションをアンインストールしてから再びインストールするのと同等です。

参照:

1.1.11 Oracle CEP API

Oracle CEPには、アダプタまたはイベントBeanの実装に使用されるさまざまなJava APIが用意されています。

この項では、アダプタおよびイベントBeanで最も一般的に使用されるcom.bea.wlevs.ede.apiパッケージ内のAPIについて説明しています。

  • アダプタ: アダプタではこのインタフェースを実装する必要があります。

  • AdapterFactory: アダプタ・ファクトリではこのインタフェースを実装する必要があります。

  • コンポーネント・ライフサイクル・インタフェース—プログラミングするコンポーネントのライフサイクルを制御する必要がある場合は、コンポーネントで次の1つまたは複数のインタフェースを実装する必要があります。

    • ActivatableBean: すべての動的な構成が設定され、イベント処理ネットワークがアクティブ化された後でコードを実行する場合に使用します。afterConfigurationActiveメソッドを実装します。

    • DisposableBean: アプリケーションがアンデプロイされたときにリソースを解放する場合に使用します。コンポーネントのコードにdestroyメソッドを実装します。

    • InitializingBean: Oracle CEPでコンポーネントのすべてのプロパティが設定された後でカスタムを初期化する必要がある場合に使用します。afterPropertiesSetメソッドを実装します。

    • ResumableBean: コンポーネントの作業が再開される前に、リソースの取得や構成などのタスクを実行する場合に使用します。

    • RunnableBean: コンポーネントをスレッドで実行する場合に使用します。

      Springフレームワークでも同様のBeanライフサイクル・インタフェースが実装されますが、同等のSpringインタフェースを使用してもファクトリによって作成されたBeanを操作することはできず、一方でOracle CEPインタフェースではこの操作が可能です。

    • SuspendableBean: イベント処理ネットワークが中断されたときにリソースを中断したり、イベントの処理を停止したりする場合に使用します。suspendメソッドを実装します。

    また、追加ライフサイクル注釈の詳細は、付録G「Oracle CEPメタデータ注釈リファレンス」を参照してください。

  • EventBuilder: プロパティに必要なsetterおよびgetterメソッドがJava表現によって公開されないイベントを作成するために使用します。必要なすべてのgetterおよびsetterメソッドがJavaBeanで表現されるイベント・タイプでは、EventBuilderを作成する必要はありません。

  • EventBuilder.Factory: EventBuildersを作成するファクトリ。

  • StreamSink: Oracle CEPストリームとしてイベントを受信するコンポーネントでは、このインタフェースを実行する必要があります。Oracle CEPストリームには、次の特性があります。

    • 追加のみ。つまり、イベントはいつもストリームの終わりに追加されます。

    • バインドなし。一般的に、これを処理する前にウィンドウを定義する必要があります。

    • イベントには、非減少のタイムスタンプがあります。

    インタフェースには、プログラマによって受信済のイベントを処理するコードが入れられるコールバック・メソッドonInsertEventがあります。

  • StreamSource: アダプタなど、Oracle CEPストリームをモデル化するイベントを送信するコンポーネントではこのインタフェースを実装する必要があります。インタフェースには、イベントを実際にネットワーク内の次のコンポーネントに送信するStreamSenderを設定するためのsetEventSenderメソッドが含まれています。

  • RelationSink: Oracle CEPリレーションをモデル化するイベントを受信するコンポーネントではこのインタフェースを実行する必要があります。Oracle CEPリレーションには、次の特性があります。

    • コンテントを挿入、削除または更新できるイベントをサポートします。

    • いつも、インスタント・タイムと呼ばれます。

    • イベントには、非減少のタイムスタンプがあります。

    インタフェースには、プログラマによってイベントの削除および挿入を処理するコードが入れられるコールバック・メソッドonDeleteEventおよびonInsertEventがあります。

  • RelationSource: アダプタなど、Oracle CEPリレーションをモデル化するイベントを送信するコンポーネントではこのインタフェースを実装する必要があります。インタフェースには、イベントを実際にネットワーク内の次のコンポーネントに送信するRelationSenderを設定するためのsetEventSenderメソッドが含まれています。

詳細は、次を参照してください:

1.2 Oracle CEP IDE for Eclipse

Oracle CEPアプリケーションを開発するプログラマ向けに特化したIDEが用意されています。Oracle CEP IDE for Eclipseは、Oracle CEPアプリケーションの開発、デプロイ、およびデバッグ用に設計された、Eclipse IDEのプラグインのセットです。

Oracle CEP IDE for Eclipseの主な機能は次のとおりです。

Oracle CEP IDEの使用は必須または前提条件ではありませんが、使用を検討されることをお勧めします。

IDEのインストールと使用手順の詳細は、第2章「Oracle CEP IDE for Eclipseの概要」を参照してください。

1.3 Oracle CEPアプリケーションの作成

Oracle CEPアプリケーションを作成するための、開始から終了までのお薦めの手順を次に示します。各種コンポーネントのプログラミングおよび構成は必ずしもこの順序で行う必要はありませんが、次の手順ではお薦めの通常の論理的な流れを示しています。

この手順ではIDEの使用を想定していますが、これは必須ではなく、任意の環境を選択できます。Oracle CEP開発者向けの環境は、1.2項「Oracle CEP IDE for Eclipse」を参照してください。

Oracle CEPアプリケーションを作成するには、次の手順を事項します。

  1. 『Oracle CEPスタート・ガイド』の開発環境の設定に関する項の説明に従って環境を設定します。

  2. Oracle CEP IDE for Eclipseを使用して、Oracle CEPプロジェクトを作成します。

    詳細は、第3章「Oracle CEP IDE for Eclipseプロジェクト」を参照してください。

  3. イベント処理ネットワーク(EPN)を設計します。

    Oracle CEP IDE for EclipseおよびEPNエディタを使用して、EPNアセンブリ・ファイルを作成してアプリケーションを構成するコンポーネントの完全なリストおよびそれらが互いに接続する方法を追加し、アプリケーションで使用されるイベント・タイプを登録します。

    この手順では、特に構成しコード化する必要があるコンポーネントを決定するアプリケーションの設計、およびすべてのコンポーネント(EPNアセンブリ・ファイル)を指定する実XMLファイルおよびコンポーネント構成(コンポーネント構成ファイル)を指定するXMLファイルの作成の両方が組み合されています。アプリケーションを実行するたびにこのアプリケーションを更新します。しかし、アプリケーションへのハイレベルな視点を持つためにこの手順で起動することをお薦めします。

    詳細は、次を参照してください:

  4. アプリケーションで使用されるイベント・タイプを設計します。独自のJavaBeanを作成する場合は、Javaファイルのプログラミングを行います。

    詳細は、1.4項「Oracle CEPのイベント型の作成」を参照してください。

  5. イベント処理ネットワークの着信、中間、発信コンポーネントとして動作するアダプタまたはイベントBeanをプログラミングし、必要に応じて構成します。独自のアダプタまたはイベントBeanを作成するか、またはOracle CEPで提供されるアダプタを使用できます。詳細は、以下を参照してください。

  6. コンポーネント構成XMLファイルを作成して、プロセッサを構成します。この手順の最も重要な部分は、各プロセッサに関連付けられている初期ルールの設計および宣言です。

    参照:

  7. アップストリーム・チャネルからイベントを選択して、ダウンストリーム・チャネルにイベントを出力するためにプロセッサによって使用されるルールを設計します。

    参照:

    • 『Oracle CEP CQL言語リファレンス』

    • 『Oracle CEP EPL言語リファレンス』


    注意:

    Oracle CQLによって、Oracle CEP 11g リリース1 (11.1.1)内のイベント処理言語(EPL)が置き換えられます。Oracle CEPでは、EPLへの下位互換性がサポートされます。

  8. 必要に応じて、構成XMLファイルを作成して、アダプタ、プロセッサ、およびビジネス・ロジックPOJOの間を流れるデータを処理するチャネルを構成します。

    第8章「チャネルの構成」を参照してください。

  9. イベントをキャッシュにパブリッシュしたり、キャッシュのイベントを使用したりすることで、イベントの可用性を高め、アプリケーションのパフォーマンスを向上するために、キャッシング・システムを必要に応じて構成します。

    第11章「キャッシュの構成」を参照してください。

  10. オプションで、アプリケーションからOracle CEPサーバー・ログにログ・メッセージを書き込むために、Oracle CEPサーバー・ログ・サブシステムを使用します。

    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    ...
    Log LOG=LogFactory.getLog("LogName");
    ...
    LOG.debug("Some debug information");
    ...
    

    Oracle CEP Visualizerを使用すると、アプリケーションをデプロイして、アプリケーションにログ・レベルを構成して、Oracle CEPサーバー・コンソールを表示できます。

    詳細は、次を参照してください:

    • 『Oracle CEP管理者ガイド』のOracle CEPのためにロギングおよびデバッグの構成に関する項

    • 『Oracle CEP Visualizerユーザーズ・ガイド』のコンポーネント・ロギングの構成方法に関する項

    • 『Oracle CEP Visualizerユーザーズ・ガイド』のコンソール出力の表示方法に関する項

パッケージやデプロイなど、アプリケーションのプログラミングが完了した後に実行する必要のある手順については、1.6項「次のステップ」を参照してください。

1.4 Oracle CEPイベント・タイプの作成

イベント・タイプは、Oracle CEPアプリケーションで処理されるイベントのプロパティを定義します。アダプタはJMSや金融マーケット・データ・フィードなどの様々なイベント・ソースからの着信イベントを受信します。プロセッサが処理を開始できるよう、これらのイベントをイベント・タイプで定義する必要があります。このイベント・タイプが、アダプタおよびPOJO Javaコードとともにプロセッサと関連付けられるOracle CQLおよびEPLルールに使用されます。

この項では次について説明します:

詳細は、1.1.2項「Oracle CEPイベント型」を参照してください。

1.4.1 JavaBeanとしてOracle CEPイベント・タイプの作成

JavaBeanとしてOracle CEPイベント・タイプを作成して、登録できます。これは優先アプローチです。

標準のJavaBeansプログラミング・ガイドラインに準拠します。追加詳細は、http://java.sun.com/docs/books/tutorial/javabeans/のJavaBeansチュートリアルを参照してください。

可能な場合は、パフォーマンスを向上するには、イベント・タイプJavaBeansを不変にすることをお薦めします。詳細は、1.1.2.1項「イベント・タイプのインスタンス化および不変性」を参照してください。

イベントを設計する場合、設計を1.1.2.2.1項「JavaBeanまたはJavaクラスとして指定されたイベント・タイプ」で説明されたイベント・データ型に制限する必要があります。

このトピックでは、次の内容について説明します。

1.4.1.1 JavaBeanとしてOracle CEPイベント・タイプを手動で作成する方法

この手順では、JavaBeanとしてOracle CEPイベント・タイプを手動で作成して登録する方法について説明しています。

Java BeanとしてOracle CEPイベント・タイプを手動で作成するには:

  1. イベント・タイプを表すためにJavaBeanクラスを作成します。

    標準のJavaBeansプログラミング・ガイドラインに準拠します。追加詳細は、http://java.sun.com/docs/books/tutorial/javabeans/のJavaBeansチュートリアルを参照してください。

    可能な場合は、パフォーマンスを向上するには、イベント・タイプJavaBeansを不変にすることをお薦めします。詳細は、1.1.2.1項「イベント・タイプのインスタンス化および不変性」を参照してください。

    イベントを設計する場合、設計を1.1.2.2.1項「JavaBeanまたはJavaクラスとして指定されたイベント・タイプ」で説明されたイベント・データ型に制限する必要があります。

    例1-11では、com.bea.wlevs.example.algotrading.event.MarketEventクラスで実施されたMarketEventを表します。

    例1-11 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;
        }
     
    }
    
  2. イベント・タイプを表すJavaBeanをコンパイルします。

  3. Oracle CEPイベント・タイプ・リポジトリにJavaBeanイベント・タイプを登録します。

    1. 宣言的に登録するには、例1-12に示すように、wlevs:event-type-repository要素wlevs:event-type子要素を使用して、EPNアセンブリ・ファイルを編集します。

      例1-12 EPNアセンブリ・ファイルevent-type-repository

      <wlevs:event-type-repository>
          <wlevs:event-type type-name="MarketEvent">
            <wlevs:class>
                com.bea.wlevs.example.algotrading.event.MarketEvent
            </wlevs:class>
          </wlevs:event-type>
      </wlevs:event-type-repository>
      
    2. プログラムとして登録するには、例1-13に示すように、EventTypeRepositoryクラスを使用します。

      例1-13 プログラムとしてイベントの登録

      EventTypeRepository rep = getEventTypeRepository();
      rep.registerEventType(
          "MarketEvent", 
          com.bea.wlevs.example.algotrading.event.MarketEvent.getClass()
      );
      

      詳細は、1.4.6項「イベント・タイプ・リポジトリにアクセス」を参照してください。

  4. イベント・タイプを使用します。

    • アプリケーションのビジネス・ロジック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>
      

1.4.2 タプルとしてOracle CEPイベント・タイプの作成

タプルとしてOracle CEPイベント・タイプを作成して、登録できます。

イベントを設計する場合、設計を1.1.2.2.3項「タプルとして指定されたイベント・タイプ」で説明されたイベント・データ型に制限する必要があります。

このトピックでは、次の内容について説明します。

1.4.2.1 タプルとしてOracle CEPイベント・タイプを手動で作成する方法

この手順では、EPNアセンブリ・ファイルにタプルとしてOracle CEPイベント・タイプを宣言的に作成して登録する方法について説明しています。Oracle CEPイベント・タイプをJavaBean(1.4.1.1項「JavaBeanとしてOracle CEPイベント・タイプを手動で作成する方法」を参照)として作成することをお薦めします。

有効なイベント・タイプ・データ型の詳細は、1.1.2.2.3項「タプルとして指定されたイベント・タイプ」を参照してください。

タプルとしてOracle CEPイベント・タイプを作成するには:

  1. イベント・タイプに必要なプロパティを決定します。

    イベントを設計する場合、設計を1.1.2.2.3項「タプルとして指定されたイベント・タイプ」で説明されたイベント・データ型に制限する必要があります。

  2. Oracle CEPイベント・タイプ・リポジトリにイベント・タイプを宣言的に登録します。

    宣言的に登録するには、例1-14に示すように、wlevs:event-type-repository要素wlevs:event-type子要素を使用して、EPNアセンブリ・ファイルを編集します。

    例1-14 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には、pricefromRateおよびtoRateの3つのプロパティがあります。

    type属性の有効な値の詳細は、1.1.2.2.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);
          }
          ...
      }
      

      詳細は、1.4.6項「イベント・タイプ・リポジトリにアクセス」を参照してください。

    • 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>
      

1.4.3 JavaクラスとしてOracle CEPイベント・タイプを作成する方法

この手順では、JavaBeansプログラミング・ガイドラインに準拠しないJavaクラスとしてOracle CEPイベント・タイプ作成して登録する方法について説明しています。

有効なイベント・タイプ・データ型の詳細は、1.1.2.2.1項「JavaBeanまたはJavaクラスとして指定されたイベント・タイプ」を参照してください。

JavaクラスとしてOracle CEPイベント・タイプを作成するには:

  1. イベント・タイプを表すためにJavaクラスを作成します。

    可能な場合は、パフォーマンスを向上するために、イベント・タイプJavaクラスを不変にすることをお薦めします。詳細は、1.1.2.1項「イベント・タイプのインスタンス化および不変性」を参照してください。

    例1-11では、com.bea.wlevs.example.fx.OutputBeanForeignExchangeEvent内部クラスで実装されたForeignExchangeEventを表します。

    例1-15 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. 例1-16に示すようにイベント・タイプ・ビルダーを表すためにJavaクラスを作成します。

    例1-16 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指定に準拠しないイベント・インスタンスが作成されます。イベント・タイプ・ビルダー・ファクトリの使用に関する追加情報は、1.4.5項「イベント・タイプ・ビルダー・ファクトリの使用」を参照してください。

  3. イベント・タイプおよびイベント・ビルダー・ファクトリを表すJavaクラスをコンパイルします。

  4. Oracle CEPイベント・タイプ・リポジトリにイベント・タイプおよびイベント・ビルダー・ファクトリを登録します。

    1. 宣言的に登録するには、例1-12に示すように、wlevs:event-type-repository要素wlevs:event-type子要素を使用して、EPNアセンブリ・ファイルを編集します。

      JavaBeanクラスを示すには、<wlevs:class>タグを使用し、イベント・タイプとしてカスタム・イベント・ビルダー・ファクトリを指定するには、<wlevs:property name="builderFactory">タグを使用します。

      例1-17 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. プログラムとして登録するには、例1-13に示すように、EventTypeRepositoryクラスを使用します。

      例1-18 プログラムとしてイベントの登録

      EventTypeRepository rep = getEventTypeRepository();
      ForeignExchangeBuilderFactory factory = new ForeignExchangeBuilderFactory();
      rep.registerEventType(
          "ForeignExchangeEvent", 
          com.bea.wlevs.example.fx.OutputBean.ForeignExchangeEvent.getClass(),
          factory.createBuilder()
      );
      

      詳細は、1.4.6項「イベント・タイプ・リポジトリにアクセス」を参照してください。

  5. イベント・タイプを使用します。

    • アプリケーションのビジネス・ロジック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>
      

1.4.4 java.util.MapとしてOracle CEPイベント・タイプを作成する方法

この手順では、java.util.MapとしてOracle CEPイベント・タイプを作成して登録する方法について説明しています。Oracle CEPイベント・タイプをJavaBean(1.4.1.1項「JavaBeanとしてOracle CEPイベント・タイプを手動で作成する方法」を参照)として作成することをお薦めします。

有効なイベント・タイプ・データ型の詳細は、1.1.2.2.2項「java.util.Mapとして指定されたイベント・タイプ」を参照してください。

java.util.MapとしてOracle CEPイベント・タイプを作成するには:

  1. イベント・タイプに必要なプロパティを決定します。

  2. Oracle CEPイベント・タイプ・リポジトリにイベント・タイプを登録します。

    1. 宣言的に登録するには、例1-19に示すように、wlevs:event-type-repository要素wlevs:event-type子要素を使用して、EPNアセンブリ・ファイルを編集します。

      例1-19 EPNアセンブリ・ファイルevent-type-repository

      <wlevs:event-type-repository>
          <wlevs:event-type type-name="AnotherEvent">
                <wlevs:property>
                   <entry key="name" value="java.lang.String"/>
                   <entry key="age" value="java.lang.Integer"/>
                   <entry key="address" value="java.lang.String"/>
                </wlevs:property>
          </wlevs:event-type>
      </wlevs:event-type-repository>
      

      ランタイム時に、Oracle CEPでは、AnotherEventのBeanインスタンスが生成されます。AnotherEventには、nameageおよびaddressの3つのプロパティがあります。

    2. プログラムとして登録するには、例1-20に示すように、EventTypeRepositoryクラスを使用します。

      例1-20 プログラムとしてイベントの登録

      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
      );
      

      詳細は、1.4.6項「イベント・タイプ・リポジトリにアクセス」を参照してください。

  3. イベント・タイプを使用します。

    • アプリケーションのビジネス・ロジック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>
      

1.4.5 イベント・タイプ・ビルダー・ファクトリの使用

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 CEP 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>

1.4.6 イベント・タイプ・リポジトリへのアクセス

EventTypeRepositoryは、単一のOSGiサービスです。これは単一であるため、これを識別するためにインタフェース名のみを指定する必要があります。次のいずれかの方法でOSGiからサービスを取得できます。

詳細は、『Oracle CEP Java APIリファレンス』を参照してください。

1.4.6.1 EPNアセンブリ・ファイルの使用

例1-21に示すように、EPNアセンブリ・ファイルのosgi:referenceを指定してEventTypeRepositoryにアクセスできます。

例1-21 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クラスでは、例1-22に示すように、Springにより初期化されたeventTypeRepositoryプロパティを使用して、EventTypeRepositoryにアクセスできます。

例1-22 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);
        ...
    }
}

1.4.6.2 Spring-DM @ServiceReference注釈の使用

例1-23に示すように、Javaソースのプロパティを初期化するために、Spring-DM @ServiceReference注釈を使用してEventTypeRepositoryにアクセスできます。

例1-23 @ServiceReference注釈を使用するJavaソース・ファイル

import org.springframework.osgi.extensions.annotation.ServiceReference;
import com.bea.wlevs.ede.api.EventTypeRepository;
...
@ServiceReference
setEventTypeRepository(EventTypeRepository etr) {
    ...
}

1.4.6.3 Oracle CEP @Service注釈の使用

例1-23に示すように、Javaソースのプロパティを初期化するために、Oracle CEP @Service注釈を使用して、EventTypeRepositoryにアクセスできます。

例1-24 @Service注釈を使用するJavaソース・ファイル

import com.bea.wlevs.util.Service;
import com.bea.wlevs.ede.api.EventTypeRepository;
...
@Service
setEventTypeRepository(EventTypeRepository etr) {
    ...
} 

詳細は、G.5項「com.bea.wlevs.util.Service」を参照してください。

1.4.7 アプリケーション・バンドル間でのイベント・タイプの共有

それぞれのOracle CEPアプリケーションは、固有のJavaクラス・ローダーを取得し、そのクラス・ローダーを使用してアプリケーションのクラスをロードします。このため、デフォルトでは、あるアプリケーションから別のアプリケーションのクラスにアクセスすることはできません。ただし、イベント・タイプ・リポジトリはシングルトン・サービスであるため、あるバンドルでリポジトリを構成し、イベント・タイプ・クラスを明示的にエクスポートすることによって、(同一のOracle CEPサーバーにデプロイされた)別のバンドル内のアプリケーションでそれらの共有されたイベント・タイプを使用できるようになります。

この場合、イベント・タイプ名のスコープはOracle CEPサーバー・インスタンス全体になります。このため、他のバンドルからの共有イベント・タイプと同名のイベント・タイプを作成しようとすると例外が送出されますが、これらのイベント・タイプのクラスは異なります。

イベント・タイプ・クラスを共有するには、共有するイベント・タイプ・リポジトリが含まれているバンドルのMANIFEST.MFファイルのExport-Packageヘッダーにパッケージ名を追加します。

共有イベント・タイプを使用するアプリケーションが含まれているすべてのバンドルよりもに、イベント・タイプ・リポジトリが含まれているバンドルを必ずデプロイするようにします。そうしないと、デプロイメント例外が送出されます。

詳細は、次を参照してください:

1.5 Oracle CEPリソース・アクセスの構成

Oracle CEP、標準Java注釈およびデプロイメントXMLを使用して、Oracle CEPアプリケーション・コンポーネントにリソース(データ・ソース、永続管理者など)をインジェクトするために、Oracle CEP Springコンテナを構成できます。

一般的に、コンポーネント初期化中に、Springコンテナでリソースがインジェクトされます。しかし、これによって、ランタイム時にリソースがインジェクトおよび再インジェクトされます。また、ランタイム時に、JNDIルックアップがサポートされます。

Oracle CEPでは、次のタイプのリソース・アクセスがサポートされます。

リソース名解決の詳細は、1.5.4項「リソース名解決について」を参照してください。

すべてのOracle CEP注釈の詳細は、付録G「Oracle CEPメタデータ注釈リファレンス」を参照してください。

次の項では、例1-25に示す例のリソースを考慮します。これは、Oracle CEPサーバーconfig.xmlファイルに指定するStockDSと呼ばれるデータ・ソース・リソースです。

例1-25 サンプル・リソース: データ・リソースStockDS

<config ...>
    <data-source>
        <name>StockDs</name>
        ...
        <driver-params>
            <url>jdbc:derby:</url>
            ...
        <driver-params>
    </data-source>
...
</config>

1.5.1 静的リソース・インジェクション

静的リソース・インジェクションは、コンポーネント・ライフサイクルの初期化フェーズ中にリソースのインジェクションを参照します。一度インジェクトされると、コンポーネントがアクティブまたは実行中の間、リソースは固定または静的になります。

次を使用して、静的リソース・インジェクションを構成できます。

1.5.1.1 静的リソース名

静的リソース名を使用して静的リソース・インジェクションを構成する場合、@Resource注釈またはOracle CEPアセンブリXMLファイルに使用されるリソース名は、定義されたリソース名と完全一致する必要があります。リソース名は静的であるため、再コンパイルしないと変更できません。

設計のときに静的リソース名を使用して静的リソース・インジェクションを構成するには、例1-26に示すように、標準のjavax.annotation.Resource注釈を使用します。

設計タイムの構成をデプロイ・タイムにオーバーライドするには、例1-27に示すように、Oracle CEPアセンブリ・ファイルXMLを使用します。

例1-26および例1-27では、例1-25に示すように、リソース名StockDsは、Oracle CEPサーバーconfig.xmlファイルのデータ・ソース名と正確に一致する必要があります。

例1-26 静的リソース名を使用する静的リソース・インジェクション: 注釈

import javax.annotation.Resource;

public class SimpleBean implements EventBean {
...
    @Resource (name="StockDs")
    public void setDataSource (DataSource dataSource){
        this.dataSource = dataSource;
    }
}

例1-27 静的リソース名を使用する静的リソース・インジェクション: XML

< wlevs:event-bean id="simpleBean" class="...SimpleBean"/>
    <wlevs:resource property="dataSource" name="StockDs"/>
</wlevs:event-bean>

EventBeanセット・メソッド名がリソース名と一致する場合、例1-28に示すように、@Resource注釈name属性は必要ではありません。また、この場合、例1-29に示すように、wlevs:resource要素name属性は必要ではありません。

例1-28 静的リソース名を使用する静的リソース・インジェクション: 注釈

import javax.annotation.Resource;

public class SimpleBean implements EventBean {
...
    @Resource ()
    public void setStockDs (DataSource dataSource){
        this.dataSource = dataSource;
    }
}

例1-29 静的リソース名を使用する静的リソース・インジェクション: XML

< wlevs:event-bean id="simpleBean" class="...SimpleBean"/>
    <wlevs:resource property="dataSource"/>
</wlevs:event-bean>

1.5.1.2 動的リソース名

動的リソース名は、アプリケーションの動的または外部構成の一部として指定されます。動的リソース名を使用することによって、デプロイヤまたは管理者は、アプリケーション開発者がアプリケーション・コードまたはSpringアプリケーション・コンテキストを変更する必要なくリソース名を変更できます。

アダプタまたはPOJOなどのコンポーネントに動的リソース名を追加するには、例1-30に示すように、まず、リソース名を含むコンポーネントのためにカスタム構成を指定する必要があります。

例1-30 カスタム・コンポーネント構成

<simple-bean>
    <name>SimpleBean</name>
    <trade-datasource>StockDs</trade-datasource>
</simple-bean>

設計のときに動的リソース名を使用して静的リソース・インジェクションを構成するには、例1-31に示すように、標準のjavax.annotation.Resource注釈を使用します。

設計タイムの構成をデプロイ・タイムにオーバーライドするには、例1-32に示すように、Oracle CEPアセンブリ・ファイルXMLを使用します。

例1-31 動的リソース名を使用する静的リソース・インジェクション: 注釈

import javax.annotation.Resource;

public class SimpleBean implements EventBean {...    @Resource (name="trade-datasource")    public void setDataSource (DataSource dataSource){        this.dataSource = dataSource;    }}

例1-32 動的リソース名を使用する静的リソース・インジェクション: XML

< wlevs:event-bean id="simpleBean" class="...SimpleBean"/>    <wlevs:resource property="dataSource" name="trade-datasource"/></wlevs:event-bean>

1.5.2 動的リソース・インジェクション

動的リソース・インジェクションは、Springコンテナ・メソッド・インジェクションを使用して変更した動的構成に対して、コンポーネントがアクティブである間、動的リソースのインジェクションを参照します。

設計のときに動的リソース・インジェクションを構成するには、例1-33に示すように、標準のjavax.annotation.Resource注釈を使用します。

例1-33 動的リソース・インジェクション: 注釈

import javax.annotations.Resource;

public class SimpleBean implements EventBean {
...
    @Resource ("trade-datasource")
    public abstract DataSource getDataSource ();
    ...
    }

リソース名trade-datasourceが参照するリソースの新しいインスタンスを取得する必要がある場合は、ランタイム時にコンポーネントによって、getDataSourceメソッドが呼び出されます。

一般的に、動的構成の変更が処理されている場合、@Prepareまたは@Activateメソッド中に、コンポーネントによって、getDataSourceメソッドが呼び出されます。詳細は、次を参照してください。

他の方法では、データ・ソースを使用する前に必ずgetDataSourceが呼び出されます。つまり、アプリケーション・コードでは参照をコンポーネントのフィールドとしてデータ・ソースに格納されません。

1.5.3 JNDIによる動的リソース参照

Oracle CEPでは、例1-34に示すように、リソースを動的に参照するためにJNDIの使用がサポートされます。

例1-34 JNDIによる動的リソース参照

import javax.naming.InitialContext;

public class SimpleBean implements EventBean {...    public abstract void getDataSource () throws Exception {        InitialContext initialContext= new InitialContext ();        return initialContext.lookup ("StockDs”);    }}

例1-34では、例1-25に示すように、JNDI名StockDsは、Oracle CEPサーバーconfig.xmlファイルのデータ・ソース名と正確に一致する必要があります。


注意:

JNDIを使用するために、Oracle CEPサーバーを起動するときにセキュリティを無効にする必要があります。この理由から、JNDIの使用はお薦めしません。

詳細は、『Oracle CEP管理者ガイド』のOracle CEPのセキュリティの構成に関する項を参照してください。


1.5.4 リソース名解決について

Oracle CEPサーバーでは、表1-3にリストされたネーミング・スコープを調べて、リソース名が解決されます。

表1-3 リソース名解決

ネーミング・スコープ 目次 解決動作

コンポーネント

コンポーネントのカスタム構成のプロパティ名

マッピング

アプリケーション

アプリケーション構成ファイルの構成要素名

マッチング

サーバー

サーバー構成ファイルの構成要素名

マッチング

JNDI

サーバーのJNDIレジストリに登録された名前

マッチング


各ネーミング・スコープには一意の名前のセットが含まれます。名前解決動作は、ネーミング・スコープ固有の動作です。一部のネーミング・スコープでは、簡単な一致によって名前を解決します。他のスコープでは、新しい名前を参照するために使用する名前をマップすることで名前を解決します。一度名前がマップされると、参照は現在のスコープで再帰的に続行します。

1.6 次のステップ

アプリケーションのすべてのコンポーネントのプログラミングと、各コンポーネントの構成XMLファイルの作成が完了した後は、次の手順を実行します。