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

前
 
次
 

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 アダプタ

受信データ・フィードにインタフェースを提供して、Oracle CEPアプリケーションから理解できるイベント・タイプにデータを変換するコンポーネント。

アダプタは、受信(受信データ)も送信(送信データ)もあります。Oracle CEPには、JMSおよびHTTPパブリッシュ・サブスクライブ・アダプタと、高可用性構成用のアダプタなどのビルトイン・アダプタが含まれます。

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

1.1.1.2 チャネル

イベントがフローする物理経路を表すコンポーネント。

チャネルによって、イベントを送信するコンポーネントとイベントを受信するコンポーネントが接続されます。詳細は、第9章「チャネルの構成」を参照してください。

1.1.1.3 プロセッサ

チャネルから提供されるイベントに対して、ユーザー定義のイベント処理ルールを実行するコンポーネント。

ユーザー定義のルールは次のいずれかを使用して作成されます。


注意:

Oracle CQLは、Oracle CEP 11gリリース1 (11.1.1)のイベント言語処理(EPL)に取って代わるものです。Oracle CEPは、EPLとの下位互換性をサポートします。

1.1.1.4 イベントBean

イベントBeanは、Oracle CEPで管理されるユーザー・コードのPlain Old Java Object (POJO) Beanです。

イベントBeanは、Springフレームワークで管理されるSpring Beanに類似しています。しかし、イベントBeanで、一時停止または再開メソッドの指定などのイベントベース機能がサポートされます。詳細は、第15章「カスタム・イベントBeanの構成」を参照してください。

1.1.1.5 Spring Bean

Spring Beanは、Springフレームワークで管理されるユーザー・コードのPlain Old Java Object (POJO) Beanです。

このコンポーネントはOracle CEPで管理されません。たとえば、このイベントの再生、レコードおよびコンポーネントなどを監視できません。POJOにこの追加機能が必要となる場合、Oracle CEPイベントBeanを作成します。詳細は、16項「カスタムSpring Beanの構成」を参照してください。

1.1.1.6 キャッシュ

キャッシュは、 アプリケーション全体のパフォーマンス向上のみを目的として作成される、イベントの一時的なストレージ領域です。

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

1.1.1.7

表は、リレーショナル・データベース表をイベント・データ・ソースとしてEPNに接続するコンポーネントです。

以下を使用して、Oracle CQL問合せからリレーショナル・データベース表にアクセスできます。

  • 表ソース: 表ソースを使用して、ストリームを「即時」ウィンドウのみ、かつ単一のデータベース表に対してのみ結合できます。


    注意:

    表ソースの変更が、ストリーム・データと適宜調整されないため、表ソースを「即時」ウィンドウを使用してイベント・ストリームにのみ結合でき、かつ単一のデータベース表のみ結合できる場合があります。詳細は、『Oracle Complex Event Processing CQL言語リファレンス』のS[Now]に関する項を参照してください。

    任意の複雑なSQL問合せおよび複数の表を自分のOracle SQL問合せと統合するには、代わりにOracle JDBCデータ・カートリッジの使用を検討してください。


    詳細は、10.3項「Oracle CQLプロセッサ表ソースの構成」を参照してください。

  • Oracle JDBCデータ・カートリッジ: Oracle JDBCデータ・カートリッジを使用して、任意の複雑なSQL問合せおよび複数の表、データソースを自分のOracle CQL問合せと結合する場合があります。


    注意:

    Oracle JDBCデータ・カートリッジを使用して、Oracle CQL文からリレーショナル・データベース表にアクセスすることをお薦めします。

    詳細は、『Oracle Complex Event Processing CQL言語リファレンス』の「Understanding the Oracle JDBC Data Cartridge」を参照してください。

すべてのケースで、Oracle CEPサーバのconfig.xmlファイルにデータソースを定義する必要があります。詳細は、Oracle Complex Event Processing管理者ガイド 』の「リレーショナル・データベースへのアクセスのコンフィグレーション」を参照してください。

Oracle CEPリレーショナル・データベース表イベント・ソースはプル・データ・ソースです。つまり、Oracle CEPでは、定期的にイベント・ソースがポーリングされます。

1.1.1.8 ネストされたステージ

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>

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

1.1.1.9 外部ステージ

同じアプリケーションにソース・ステージおよびターゲット・ステージの両方を定義した場合、ステージを、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アプリケーションを作成する場合、アプリケーションのアセンブリ、デプロイおよび再デプロイのときに外部ステージの依存関係を考慮する必要があります。詳細は、24.2.3項「外部ステージによるアプリケーションのアセンブリ」を参照してください。

1.1.2 Oracle CEPイベント・タイプ

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

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

詳細は、第2章「Oracle CEPイベントの概要」を参照してください。

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

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

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

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

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

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

詳細は、1.1.9.6項「ユーザー・アクション: ストリームおよびリレーション・ソースおよびシンクのメソッド呼び出し」を参照してください。

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.BatchStreamSenderインタフェースを実装する必要があります。BatchStreamSenderインタフェースは、insertダウンストリーム・タイプのイベントのバッチをBatchStreamSinkに送信するためにコンポーネントが呼び出すsendInsertEventsメソッドを持ちます。詳細は、9.1.6項「バッチ処理チャネル」を参照してください。

com.bea.wlevs.ede.api.RelationSource

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

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

チャネルをリレーションとして構成する場合は、チャネル属性primary-keyによってイベント・アイデンティティが決定されます。詳細は、9.1.2.2項「リレーションとしてのチャネル」を参照してください。

sendDeleteEventについては、チャネル用に構成されたのと同じイベント・タイプのインスタンスを送信する必要があります。

sendInsertEventについては、同じ主キーを持つイベントがすでにリレーション内に含まれる場合、一意制約違反例外が発生し、入力イベントが破棄されます。

sendUpdateEventについては、指定の主キーを持つイベントがリレーション内に含まれていない場合、無効な更新タプル例外が発生し、入力イベントが破棄されます。

リレーションとして構成するチャネルでのバッチ処理を有効にする場合は、そのチャネルにイベントを送信するコンポーネントはcom.bea.wlevs.ede.api.BatchRelationSenderインタフェースを実装する必要があります。BatchRelationSenderインタフェースは、insertupdateおよびdelete ダウンストリーム・タイプのイベントのバッチをBatchRelationSinkに送信するためにコンポーネントが呼び出すsendEventsメソッドを持ちます。詳細は、9.1.6項「バッチ処理チャネル」を参照してください。

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

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

com.bea.wlevs.ede.api.StreamSink

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

チャネルでのバッチ処理を有効にする場合は、そのチャネルからイベントを受信するコンポーネントはcom.bea.wlevs.ede.api.BatchStreamSinkインタフェースを実装する必要があります。BatchStreamSinkインタフェースは、insertタイプのイベントのバッチを受信するためのonInsertEventsコールバック・メソッドを持ちます。insertタイプのイベントは、ストリームが追加しかできないためストリームをモデリングするために使用されます。単一イベントの場合は、StreamSinkのコールバック・メソッドが呼び出されます。詳細は、9.1.6項「バッチ処理チャネル」を参照してください。

com.bea.wlevs.ede.api.RelationSink

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

リレーションとして構成するチャネルでのバッチ処理を有効にする場合は、そのチャネルからイベントを受信するコンポーネントはcom.bea.wlevs.ede.api.BatchRelationSinkインタフェースを実装する必要があります。BatchRelationSinkインタフェースは、insertupdateおよびdeleteの各イベント・タイプのイベントのバッチを受信するためのonEventsコールバック・メソッドを持ちます。特定の種類のイベントが存在しない場合は、対応するCollectionが空のCollectionになります。詳細は、9.1.6項「バッチ処理チャネル」を参照してください。

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.5.1 ConfigurationPropertyPlaceholderConfigurerクラスによるコンポーネントおよびサーバー構成へのアクセス

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

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

例1-5 netio要素

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

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

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

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

例1-7 ConfigurationPropertyPlaceholderConfigurerの追加

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

詳細は、Oracle Fusion Middleware Oracle Complex Event Processing Java APIリファレンスcom.bea.wlevs.spring.support.ConfigurationPropertyPlaceholderConfigurerクラスを参照してください。

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

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

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にこのバンドルをデプロイします。

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

1.1.7 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.8 高可用性およびスケーラビリティ

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

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

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

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

1.1.9 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 Complex Event Processing管理者ガイド』のOracle CEPサーバー・ライフサイクルに関する項を参照してください。

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

この情報は、アプリケーションでライフサイクルAPIを使用しやすいように、Oracle CEPがアプリケーションのライフサイクルをどのように管理するかを説明します。

これらのライフサイクルAPI (RunnableBeanおよびSuspendableBeanなど)の詳細に付いては、以下を参照してください。

1.1.9.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およびファクトリで作成されたステージで呼び出されます。

      詳細は、1.4項「Oracle CEPリソース・アクセスの構成」を参照してください。

  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.9.2ユーザー・アクション: アプリケーションの中断

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

参照:

1.1.9.6 ユーザー・アクション: ストリームおよびリレーション・ソースおよびシンクのメソッド呼び出し

ストリーム、リレーション・ソースまたはシンクでは、アプリケーション・ライフサイクルでこれらのフェーズが完了するまでコンポーネントはイベントを受信する準備ができない場合があるので、ライフサイクル・コールバックからメソッドを呼び出すべきではありません。

たとえば、afterConfigurationActiveまたはbeforeResumeなど、ライフサイクル・コールバックからStreamSenderメソッドのsendInsertEventは呼び出しません。

RunnableBeanを実装するBeanの実行メソッドから、ストリーム、リレーション・ソースまたはシンクでメソッドを呼び出すことができます。

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

1.1.10 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メソッドを実装します。

    また、追加ライフサイクル注釈の詳細は、付録I「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のインストールと使用手順の詳細は、第3章「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 Complex Event Processingスタート・ガイド』の開発環境の設定に関する項の説明に従って環境を設定します。

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

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

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

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

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

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

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

    第2章「Oracle CEPのイベント型の作成」を参照してください。

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

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

    参照:

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

    参照:

    • Oracle Complex Event Processing CQL言語リファレンス

    • Oracle Complex Event Processing EPL言語リファレンス


    注意:

    Oracle CQLは、Oracle CEP 11gリリース1 (11.1.1)のイベント言語処理(EPL)に取って代わるものです。Oracle CEPは、EPLとの下位互換性をサポートします。

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

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

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

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

  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 Complex Event Processing管理者ガイド』のOracle CEP用のロギングとデバッグの構成に関する項

    • 24.4項「ログ・メッセージ・カタログの管理」

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1.4.1.1 静的リソース名

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

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

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

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

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

import javax.annotation.Resource;

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

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

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

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

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

import javax.annotation.Resource;

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

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

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

1.4.1.2 動的リソース名

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

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

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

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

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

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

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

import javax.annotation.Resource;

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

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

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

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

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

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

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

import javax.annotations.Resource;

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

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

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

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

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

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

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


注意:

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

詳細は、『Oracle Complex Event Processing管理者ガイド』のOracle CEPサーバーの起動および停止に関する項を参照してください。


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

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

表1-1 リソース名解決

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

コンポーネント

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

マッピング

アプリケーション

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

マッチング

サーバー

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

マッチング

JNDI

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

マッチング


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

1.5 次のステップ

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