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

前
 
次
 

13 カスタム・アダプタ、イベントBean、およびSpring Beanの構成

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

13.1 カスタム・アダプタ、イベントBean、およびSpring Beanの概要

この項では、次を含めて、アダプタおよびイベントBeanの実装の概要について説明します。

13.1.1 カスタム・アダプタ

アダプタの主な役割の1つには、マーケット・データ・フィードなどのチャネルからのデータをOracle CEPイベントに変換する作業があります。これらのイベントはその後、プロセッサなどのアプリケーションの他のコンポーネントに渡されます。通常、アダプタはOracle CEPアプリケーションへのエントリ・ポイントです。アダプタは中間コンポーネントからのイベントを受信し、外部アプリケーションで読取り可能な形式にデータを変換し、それらのデータを送信するためアプリケーションの出口ポイントになる場合もあります。

『Oracle CEPスタート・ガイド』のFXサンプルの説明には、通貨データ・フィードからデータを読み込み、ネットワークの次のコンポーネントであるプロセッサに特定のイベント・タイプの形式でデータを渡す3つのアダプタが示されています。

着信データの形式およびアダプタ・コードで変換に使用される技術に応じて、さまざまなタイプのアダプタを作成できます。最も一般的なタイプのアダプタは、以下のとおりです。

  • Reuters、Wombat、またはBloombergなどのデータ・ベンダーAPIを使用します。

  • 標準のJMS APIを使用して着信JMSメッセージを変換します。

  • TIBCO Rendezvousなどの他のメッセージング・システムを使用します。

  • 顧客独自のデータ・プロトコルへのソケット接続を使用します。

アダプタは、特定のOracle CEPインタフェースを実装するJavaクラスです。アプリケーション全体を記述するEPNアセンブリ・ファイルでアダプタ・クラスを登録します。

オプションで、アダプタのデフォルトの構成を変更することができます。また、新しい構成要素および属性を追加して構成を拡張することもできます。2つの方法で構成データをアダプタに渡すことができます。デプロイメント後に構成を動的に変更する必要があるかどうかによって方法を選択できます。

アダプタのデプロイ後に構成データを変更しない場合、アダプタをEPNアセンブリ・ファイルで構成できます。

ただし、構成要素を動的に変更する場合は、構成をアダプタ固有の構成ファイルに配置する必要があります。

詳細は、13.1項「カスタム・アダプタ、イベントBean、およびSpring Beanの概要」を参照してください。

13.1.2 カスタム・イベントBean

イベントBeanは、Oracle CEP管理フレームワークによる管理が可能な点を除いて、標準のSpring Beanとほぼ同じです。標準のSpring BeanはSpringフレームワークで管理されます。標準の<bean>タグのかわりにOracle CEP <wlevs:event-bean>ステージを使用して、イベントBeanをEPNアセンブリ・ファイルに登録します。

イベントBeanはステージの一種であり、Oracle CEP監視フレームワークによって監視でき、構成メタデータの注釈を利用します。また、Beanを通過するイベントを記録および再生するよう設定できます。イベントBeanは、Event Server APIインタフェースを実装するのではなく、XML宣言にメソッドを指定することによって、Event Server Beanライフサイクルに参加することもできます。

イベントBeanまたはSpring Beanを使用できます。

  • Oracle CEPサーバー・コンテナの能力を積極的に使用するためにイベントBeanを使用します。

  • Springへのレガシー統合にSpring Beanを使用します。

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

13.1.3 カスタムSpring Bean

Spring BeanはSpringフレームワークによって管理されます。標準の<bean>タグを使用してSpring BeanをEPNアセンブリ・ファイルに登録します。

Spring Beanは、Oracle CEP監視フレームワークによって監視できません。また、構成メタデータの注釈も使用できず通過するイベントを記録および再生するように設定できません。

Spring BeanまたはイベントBeanを使用します。

  • Springへのレガシー統合にSpring Beanを使用します。

  • Oracle CEPサーバー・コンテナの能力を積極的に使用するためにイベントBeanを使用します。

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

13.1.4 イベント・ソースとイベント・シンク

標準のSpring BeanおよびイベントBeanは、イベント・ソース、イベント・シンク、またはその両方に使用できます。イベント・ソースはイベントを生成し、イベント・シンクはイベントを受信します。

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

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

13.1.4.1 イベント・ソースとしてのイベントBean

com.bea.wlevs.ede.api.StreamSourceまたはRelationSource APIを実装して、EPN内のイベントBeanコンポーネントがイベント・ソースであることを指定します。

イベント・ソースであるイベントBeanの実装クラスは、アプリケーションのプライベートとして指定するか、または他のアプリケーションによる再利用が可能な公開されたOSGIサービスとして指定できます。

EPNコンポーネントとしてのBeanをフレームワークで完全に管理できるようにするには、標準のSpring Beanではなく、event-beanとして指定する必要があります。管理タスクにはモニターおよび記録再生が含まれます。

<wlevs:event-bean>タグを使用して、イベントBeanをEPNアセンブリ・ファイルに登録します。例:

<wlevs:event-bean id="recplayEventSink"
                  class="com.bea.wlevs.example.recplayRecplayEventSink">
    <wlevs:listener ref="playbackHttpPublisher"/>
</wlevs:event-bean>

13.1.4.2 イベント・ソースとしてのSpring Bean

com.bea.wlevs.ede.api.StreamSourceまたはRelationSource APIを実装して、EPN内の標準のSpring Beanコンポーネントがイベント・ソースであることを指定します。

Beanは、オプションで、InitializingBeanDisposableBeanのような様々なライフサイクル・インタフェース、およびRunnableBeanのようなアクティブなインタフェースを実装することがあります。Spring BeanがRunnableを実装し、RunnableBeanは実装しない場合、Oracle CEPはそれをスレッドで実行しません。これは、イベントBeanと異なった動作になります。

Spring Beanイベント・ソースでは、@Prepare@Rollback@Activateなどの構成メタデータの注釈を利用できます。

bean要素を使用して、通常の方法でSpring BeanをEPNアセンブリ・ファイルに登録します。その後、このBeanをEPNの他のステージに対するイベント・ソースとして指定できます。

13.1.4.3 イベント・シンクとしてのイベントBean

イベントBeanシンクはcom.bea.wlevs.ede.api.StreamSinkまたはRelationSink APIを実装する必要がある以外はイベント・シンクとしてのイベントBeanの機能はイベント・ソースによく類似しています。

イベント・シンクはアクティブではないため、Runnableインタフェースを実装している場合、Oracle CEPではこれらを個別のスレッドで実行しません。

wlevs:listener要素を使用してEPNアセンブリ・ファイルでイベント・シンクを参照します。

<wlevs:channel id="myStream" >
    <wlevs:listener ref="myEventSink" />
</wlevs:channel>

13.1.4.4 イベント・シンクとしてのSpring Bean

com.bea.wlevs.ede.api.StreamSinkまたはRelationSinkn APIを実装して、EPN内の標準のSpring Beanコンポーネントがイベント・シンクであることを指定します。

Beanは、オプションで、InitializingBeanDisposableBeanのような様々なライフサイクル・インタフェース、およびRunnableBeanのようなアクティブなインタフェースを実装することがあります。Spring BeanがRunnableを実装し、RunnableBeanは実装しない場合、Oracle CEPはそれをスレッドで実行しません。これは、イベントBeanと異なった動作になります。

Spring Beanイベント・ソースでは、@Prepare@Rollback@Activateなどの構成メタデータの注釈を利用できます。

bean要素を使用して、通常の方法でSpring BeanをEPNアセンブリ・ファイルに登録します。その後、このBeanをEPNの他のステージに対するイベント・シンクとして指定できます。

wlevs:listener要素を使用してEPNアセンブリ・ファイルでイベント・シンクを参照します。

<wlevs:channel id="myStream" >
    <wlevs:listener ref="myEventSink" />
</wlevs:channel>

13.1.5 アダプタおよびイベント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>タグを使用してファクトリを登録する必要があります。

詳細は、13.5項「アダプタまたはイベントBeanファクトリの実装」を参照してください。

13.2 アダプタまたはイベントBeanの実装

次の手順は、アダプタを作成するための一般的なステップを示します。

アダプタまたはイベントBeanを実装するには:

  1. アダプタまたはイベントBeanのJavaクラスをプログラミングします。

    アダプタまたはイベントBeanがイベント・ソースの場合、13.3項「アダプタまたはイベントBeanをイベント・ソースとして実装」を参照してください。

    アダプタまたはイベントBeanがイベント・シンクの場合、13.4項「アダプタまたはイベントBeanをイベント・シンクとして実装」を参照してください。

  2. 必要に応じて、ファクトリ・クラスをプログラミングします。この手順は、アダプタまたはイベントBeanが複数のアプリケーションで使用される場合にのみ必要です。

    13.5項「アダプタまたはイベントBeanのファクトリの実装」を参照してください。

  3. アダプタ、イベントBean、およびアダプタ・ファクトリの登録情報を使用して、EPNアセンブリ・ファイルを更新します。

    13.7項「EPNアセンブリ・ファイルの更新」を参照してください。

  4. 必要に応じて、アダプタのデフォルトの構成を変更します。

    13.8項「アダプタまたはイベントBeanの構成」を参照してください。

  5. アダプタの基本構成が不十分な場合は、必要に応じて構成を拡張します。

    13.9項「アダプタまたはイベントBeanの構成の拡張」を参照してください。

上記の手順では、プロセッサ、ストリーム、ビジネス・ロジックPOJOなどのイベント・ネットワークの他のコンポーネントが含まれている同一のアプリケーションJARファイルにアダプタまたはイベントBeanがバンドルされると想定しています。複数のアプリケーションで共有できるようにアダプタまたはイベントBeanを固有のJARファイルにバンドルする必要がある場合は、13.11項「アダプタまたはイベントBeanの固有のバンドルでのアセンブリ」を参照してください。

13.3 アダプタまたはイベントBeanをイベント・ソースとして実装

この節では、着信データを受信し、EPNの次のコンポーネントに送信されるイベントを生成するイベント・ソースとして動作する着信アダプタを作成する方法について説明します。イベントBeanは同様に機能するため、このガイドラインはイベント・ソースとして動作するイベントBeanのプログラミングにも適用されます。

着信アダプタ・クラスは、通常マーケット・データ・フィードなどからの着信データのストリームを読み込み、アプリケーションの残りの部分によって認識されるOracle CEPイベント・タイプに変換し、ネットワークの次のコンポーネントにイベントを送信します。

次の例は、HelloWorldサンプルのアダプタ・クラスを示します。Javaコードの太字部分に対応するコーディングのガイドラインについては、例の後で説明しています。

package com.bea.wlevs.adapter.example.helloworld;

import java.text.DateFormat;
import java.util.Date;

import com.bea.wlevs.ede.api.RunnableBean;
import com.bea.wlevs.ede.api.StreamSender;
import com.bea.wlevs.ede.api.StreamSource;
import com.bea.wlevs.event.example.helloworld.HelloWorldEvent;

public class HelloWorldAdapter implements RunnableBean, StreamSource {

    private static final int SLEEP_MILLIS = 300;

    private DateFormat dateFormat;
    private String message;
    private boolean suspended;

    private StreamSender eventSender;

    public HelloWorldAdapter() {
        super();
        dateFormat = DateFormat.getTimeInstance();
    }

    public void run() {
        suspended = false;
        while (!isSuspended()) { // Generate messages forever...

            generateHelloMessage();

            try {
                synchronized (this) {
                    wait(SLEEP_MILLIS);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public void setMessage(String message) {
        this.message = message;
    }

    private void generateHelloMessage() {
        String message = this.message + dateFormat.format(new Date());
        HelloWorldEvent event = new HelloWorldEvent();
        event.setMessage(message);
    
        eventSender.sendInsertEvent(event);
    }

    public void setEventSender(StreamSender sender) {
        eventSender = sender;
    }

    public synchronized void suspend() {
        suspended = true;
    }
 
    private synchronized boolean isSuspended() {
        return suspended;
    }
}

アダプタJavaクラスのプログラミングでは、次のガイドラインに従います。上記の例でガイドラインのコード例は太字で示されています。

13.4 アダプタまたはイベントBeanをイベント・シンクとして実装

次のコード例は、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());
        }   
    }
 
}

上記の例に示したプログラミングのガイドラインは、次のとおりです。

この項に記載されているOracle CEP APIに関する完全なAPIリファレンス情報は、Oracle CEP Java APIリファレンスを参照してください。

13.5 アダプタまたはイベントBeanのファクトリの実装

アダプタ・ファクトリ・クラスはcom.bea.wlevs.ede.api.AdapterFactoryインタフェースを実装する必要があり、これには1つのメソッドcreateが含まれていますが、ここに特定のアダプタ・クラスを作成するコードを作成します。イベントBeanはFactoryを実装します。

次の例は、HelloWorldのサンプルで使用可能なアダプタ・ファクトリ・クラスです。

package com.bea.adapter.wlevs.example.helloworld;
import com.bea.wlevs.ede.api.Adapter;
import com.bea.wlevs.ede.api.AdapterFactory;
public class HelloWorldAdapterFactory implements Factory {
    public HelloWorldAdapterFactory() {
    }
    public synchronized Adapter create() throws IllegalArgumentException {
        return new HelloWorldAdapter();
    }
}

これらのAPIの詳細は、「Oracle CEP Java API参照」を参照してください。

13.6 リレーショナル・データベースへのアクセス

アダプタ、イベントBeanおよび標準のSpring BeanでJDBC (Java Database Connectivity) API (http://java.sun.com/javase/technologies/database/)を使用して、リレーショナル・データベースに含まれているデータにアクセスできます。Oracle CEPでは、JDBC 3.0がサポートされています。詳細は、http://java.sun.com/products/jdbc/download.html#corespec30を参照してください。

リレーショナル・データベースにアクセスするには:

  1. Oracle CEPでJDBCを構成します。

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

  2. BeanのJavaコードで、DataSourceを使用するか、またはDriverManagerをインスタンス化して、通常どおりJDBC APIの使用を開始できます。例:

    OracleDataSource ods = new OracleDataSource();
    ods.setURL("jdbc:oracle:thin:user/passwd@localhost:1521/XE");
    Connection conn = ods.getConnection();
    

    プログラムに関する追加情報は、http://java.sun.com/j2se/1.5.0/docs/guide/jdbc/getstart/GettingStartedTOC.fm.htmlを参照してください。

13.7 EPNアセンブリ・ファイルの更新

次の項で説明しているように、アダプタ、イベントBean、およびアダプタ・ファクトリをEPNアセンブリ・ファイルに登録する必要があります。

アプリケーションの他のコンポーネントの登録を含む、構成ファイルの完全な説明は、3.3項「EPNアセンブリ・ファイルの作成」を参照してください。

13.7.1 アダプタまたはイベントBeanのファクトリの登録

wlevs:factory要素を使用してEPNアセンブリ・ファイルにファクトリを登録します。

<wlevs:factory provider-name="myprovider" class="my.Implementation"/>

サービスのプロパティを指定する必要がある場合は、osgi:service>要素を使用して、EPNアセンブリ・ファイルにOSGIサービスとしてファクトリを登録する必要があります。OSGIサービス・レジストリのスコープはOracle CEP全体です。このため、指定のサーバーにデプロイされた複数のアプリケーションが同じアダプタ・ファクトリを使用する場合は、アダプタ・ファクトリをOSGIサービスとして登録するのが必ず一度きりになるようにします。

エントリを追加して、サービスをcom.bea.wlevs.ede.api.AdapterFactoryインタフェースの実装として登録します。key属性のtype、およびこのアダプタ・プロバイダを参照する名前を使用して、プロパティを指定します。最後に、ネストされた標準のSpring bean要素を追加して、Springアプリケーション・コンテキストで特定のアダプタ・クラスを登録します。

たとえば、EPNアセンブリ・ファイルの次の部分では、HelloWorldAdapterFactoryをタイプhellomsgsのプロバイダとして登録します。

<osgi:service interface="com.bea.wlevs.ede.api.AdapterFactory">
    <osgi:service-properties>
        <entry key="type" value="hellomsgs"</entry>
    </osgi:service-properties>
    <bean  class="com.bea.adapter.wlevs.example.helloworld.HelloWorldAdapterFactory" />
</osgi:service>

13.7.2 アプリケーションのアダプタおよびイベントBeanコンポーネントの宣言

EPNアセンブリ・ファイルでは、wlevs:adapter要素を使用してアダプタをイベント・プロセッサ・ネットワークのコンポーネントとして宣言します。同様に、イベントBeanの場合はwlevs:event-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:adapter id="helloworldAdapter" provider="hellomsgs"/>

これにより、アダプタはタイプhellomsgsで登録されたファクトリによってインスタンス化されます。

wlevs:adapterwlevs:instance-property子要素を使用して、アダプタBeanの静的プロパティを設定することもできます。静的プロパティはアダプタのデプロイ後に動的に変更されないプロパティです。

たとえば、アダプタ・クラスにsetPortメソッドが含まれている場合は、次のようにポート番号を渡すことができます。

<wlevs:adapter id="myAdapter" provider="myProvider">
    <wlevs:instance-property name="port" value="9001" />
</wlevs:adapter>

13.8 アダプタまたはイベントBeanの構成

この項は、アダプタとイベントBeanの両方に当てはまります。簡略化のためアダプタについてのみ説明します。イベントBeanの構成はevent-bean>要素で囲みます。

アプリケーションの各アダプタはデフォルトの構成があります。

デフォルトのアダプタ構成は通常ほとんどのアプリケーションで十分に機能します。ただし、この構成を変更する場合は、Oracle CEPアプリケーション・バンドルの一部としてデプロイされるXMLファイルを作成する必要があります。後からwlevs.Adminユーティリティを使用するか、または適切なJMX Mbeanを直接操作して、実行時にこの構成を更新できます。

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

アプリケーションに複数のアダプタが含まれている場合は、各アダプタごとに個別のXMLファイルを作成するか、すべてのアダプタの構成が含まれた単一のXMLファイルを作成するか、またはアプリケーションのすべてのコンポーネント(アダプタ、プロセッサ、およびストリーム)が含まれたファイルを作成できます。開発環境に最も適した方法を選択します。

次の手順では、アダプタの構成ファイルを作成する主なステップについて示します。簡略化のため、この手順ではアプリケーションのすべてのコンポーネントを1つのXMLファイルに構成することを想定しています。

アダプタの構成ファイルが記述された完全なXSDスキーマは、B.2項「コンポーネント構成スキーマwlevs_application_config.xsd」を参照してください。

アダプタまたはイベントBeanの構成について

  1. お気に入りのXMLエディタを使用してXMLファイルを作成します。

    このXMLファイルの名前は自分で決定しますが、その拡張は.xmlで終了することが必要です。

    構成ファイルのルート要素はconfigであり、次のステップに示すネームスペース定義を使用します。

  2. アプリケーションの各アダプタは、configadapter子要素を追加します。

    name子要素で各アダプタを一意に識別します。この名前は、アプリケーションのイベント処理ネットワークを定義するEPNアセンブリ・ファイルのwlevs:adapter要素のid属性の値と一致している必要があります。このように指定することで、Oracle CEPでは、このアダプタ構成が適用されるEPNアセンブリ・ファイル内の特定のアダプタ・コンポーネントを認識します。詳細は、3.3項「EPNアセンブリ・ファイルの作成」を参照してください。

    たとえば、アプリケーションに2つのアダプタがある場合、構成ファイルは最初に次のようになります。

    <?xml version="1.0" encoding="UTF-8"?>
    <helloworld:config
      xmlns:helloworld="http://www.bea.com/xml/ns/wlevs/example/helloworld">
      <processor>
       ...
      </processor>
      <adapter>
        <name>firstAdapter</name>
        ...
      </adapter>
      <adapter>
        <name>secondAdapter</name>
        ...
      </adapter>
    </helloworld:config>
    

    この例では、構成ファイルにfirstAdaptersecondAdapterの2つのアダプタが含まれています。このため、EPNアセンブリ・ファイルには同じ識別子を持つアダプタが少なくとも2つ登録されている必要があります。

    <wlevs:adapter id="firstAdapter" ...>
      ...
    </wlevs:adapter>
    <wlevs:adapter id="secondAdapter" ...>
      ...
    </wlevs:adapter>
    

    注意:

    XMLファイルの識別子と名前は大/小文字が区別されるため、EPNアセンブリ・ファイルでコンポーネントの識別子を参照するときは、必ず大/小文字を同一にします。

13.8.1 アダプタ構成ファイルの例

次のXMLファイルの例は、firstAdapterおよびsecondAdapterの2つのアダプタを構成する方法を示します。

<?xml version="1.0" encoding="UTF-8"?>
<sample:config
  xmlns:sample="http://www.bea.com/xml/ns/wlevs/example/sample">
  <adapter>
    <name>firstAdapter</name>
  </adapter>
  <adapter>
    <name>secondAdapter</name>
  </adapter>
</sample:config>

13.9 アダプタまたはイベントBeanの構成の拡張

この節は、アダプタとイベントBeanの両方に当てはまります。簡略化のため、アダプタについてのみ説明します。

13.8項「アダプタまたはイベントBeanの構成」およびB.2項「コンポーネント構成スキーマwlevs_application_config.xsd」で説明しているように、アダプタにはデフォルトの構成データがあります。このデフォルトの構成は、通常は、簡単で基本的なアプリケーションで使用できます。

ただし、XSDスキーマの使用によって、Oracle CEPで提供される組込みのXMLタイプを拡張するアダプタ構成ファイルの新しいXML形式を指定して、この構成を拡張することもできます。XSDスキーマを拡張することで、任意の数の新しい要素をアダプタ構成に追加できます。新しい要素にname属性を指定する必要がある他は制限もほとんどありません。この機能は、XSDスキーマやJava Architecture for XML Binding (JAXB)などの標準の技術に基づいています。詳細は、https://jaxb.dev.java.net/を参照してください。

アダプタまたはイベントBeanの構成を拡張するには:

  1. 拡張されたアダプタ構成を記述する新しいXSDスキーマ・ファイルを作成します。このXSDファイルには、コンポーネントを記述するのにOracle CEPで定義されている組込みのXSDタイプを通常使用する場合でも、アプリケーションの他のコンポーネント(プロセッサやストリーム)の説明も含まれている必要があります。

    詳細は、13.9.1項「XSDスキーマ・ファイルの作成」を参照してください。

  2. アプリケーション・ビルド・プロセスの一部として、SunのGlassFishリファレンス実装のcom.sun.tools.xjc.XJCTask AntタスクなどのJAXBバインディング・コンパイラを使用して、XSDスキーマ・タイプのJava表現を生成します(https://jaxb.dev.java.net/jaxb20-ea/docs/xjcTask.htmlを参照)。ユーザーの利便のためにこのAntタスクはOracle CEP配布に含まれています。

    次のサンプルbuild.xmlファイルは、この方法を示しています。

    <property name="base.dir" value="." />
    <property name="output.dir" value="output" />
    <property name="sharedlib.dir" value="${base.dir}/../../../../../modules" />
    <property name="wlrtlib.dir" value="${base.dir}/../../../../modules"/>
    <path id="classpath">
            <pathelement location="${output.dir}" />
            <fileset dir="${sharedlib.dir}">
                    <include name="*.jar" />
            </fileset>
            <fileset dir="${wlrtlib.dir}">
                   <include name="*.jar"/>
            </fileset>
    </path>
    <taskdef name="xjc" classname="com.sun.tools.xjc.XJCTask">
          <classpath refid="classpath" />
    </taskdef>
    <target name="generate" depends="clean, init">
       <copy file="../../../../xsd/wlevs_base_config.xsd"
             todir="src/main/resources/extension" />
       <copy file="../../../../xsd/wlevs_application_config.xsd"
              todir="src/main/resources/extension" />
       <xjc extension="true" destdir="${generated.dir}">
          <schema dir="src/main/resources/extension" 
                  includes="helloworld.xsd"/>
          <produces dir="${generated.dir}" includes="**/*.java" />
       </xjc>
    </target>
    

    この例では、拡張されたXSDファイルはhelloworld.xsdです。helloworld.xsdはOracle CEP XSDファイルをインポートするため、ビルド・プロセスによってOracle CEP XSDファイル(wlevs_base_config.xsdおよびwlevs_application_config.xsd)がhelloworld.xsdファイルと同じディレクトリにコピーされます。

  3. 生成されたこれらのJavaファイルをクラスにコンパイルします。

  4. コンパイルされたJavaクラス・ファイルをアプリケーション・バンドルにパッケージ化します。

    詳細は、20.2項「Oracle CEPアプリケーションのアセンブル」

  5. 13.3項「アダプタまたはイベントBeanをイベント・ソースとして実装」の説明に従って、アダプタをプログラムします。アダプタ・コード内からは、13.9.3項「アダプタまたはイベントBeanの構成へのプログラムからのアクセス」の説明に従って、通常の方法で拡張された構成にアクセスします。

  6. アプリケーションのコンポーネントを記述する構成XMLファイルを作成する場合は、必ず拡張されたXSDファイルを説明として使用します。また、デフォルトのスキーマではなく、必ずこのスキーマのネームスペースを識別するようにします。例:

    <?xml version="1.0" encoding="UTF-8"?>
    <helloworld:config
      xmlns:helloworld="http://www.bea.com/xml/ns/wlevs/example/helloworld">
      <adapter>
        <name>helloworldAdapter</name>
        <message>HelloWorld - the current time is:</message>
      </adapter>
    </helloworld:config>
    

13.9.1 XSDスキーマ・ファイルの作成

新しいXSDスキーマ・ファイルはwlevs_application_config.xsdXSDスキーマを拡張し(B.2項「コンポーネント構成スキーマwlevs_application_config.xsd」を参照)、アダプタの新しい構成要素などの新しいカスタム情報を追加します。カスタム情報には標準のXSDスキーマ構文を使用します。

13.9.2項「拡張されたXSDスキーマ・ファイルの完全な例」のXSDスキーマを基本テンプレートとして使用し、ニーズに合わせてコンテンツを変更することをお薦めします。新しい構成要素を追加するとともに、他の変更点としては、生成されたJavaコードのパッケージ名の変更やカスタム・アダプタの要素名の変更などがあります。カスタム・アダプタのみ、またはプロセッサなどの他のコンポーネントをスキーマで使用するかどうかを制御できます。

新しいXSDスキーマ・ファイルを作成するには:

  1. 任意のXMLエディタを使用して、特にJAXBを含む必須のネームスペースを使用して基本のXSDファイルを作成します。例:

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema targetNamespace="http://www.bea.com/xml/ns/wlevs/example/helloworld"
            xmlns="http://www.bea.com/xml/ns/wlevs/example/helloworld"
            xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
            xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
            xmlns:wlevs="http://www.bea.com/xml/ns/wlevs/config/application"
            jxb:extensionBindingPrefixes="xjc" jxb:version="1.0"
            elementFormDefault="unqualified" attributeFormDefault="unqualified">
    ...
    </xs:schema>
    
  2. wlevs_application_config.xsd XSDスキーマをインポートします。

    <xs:import 
       namespace="http://www.bea.com/xml/ns/wlevs/config/application"
       schemaLocation="wlevs_application_config.xsd"/>
    

    また、wlevs_application_config.xsdによりwlevs_base_config.xsd XSDファイルがインポートされます。

  3. complexType> XSD要素を使用して、拡張されたアダプタ構成のXMLタイプを記述します。

    新しいタイプは、wlevs_application_config.xsdに定義されたAdapterConfigタイプを拡張する必要があります。AdapterConfigConfigurationObjectを拡張します。次に、必要に応じて、基本のアダプタ構成に新しい要素または属性を追加できます。たとえば、次のタイプHelloWorldAdapterConfigは、基本のアダプタ構成にmessage要素を追加します。

    <xs:complexType name="HelloWorldAdapterConfig">
        <xs:complexContent>
            <xs:extension base="wlevs:AdapterConfig">
                <xs:sequence>
                    <xs:element name="message" type="xs:string"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    
  4. トップレベル要素を定義し、configという名前にする必要があります。

    config要素の定義では、アプリケーションのコンポーネントに対応する子要素のシーケンスを定義します。要素名には任意の名前を付けることができますが、通常は構成するコンポーネント(adapterprocessorchannel)を示している必要があります。

    各要素は、明示的にbase属性値base:ConfigurationObjectxs:extension要素を使用するか、またはそれ自身がConfigurationObjectを拡張するXMLタイプを指定するかによって、ConfigurationObject XMLタイプを拡張する必要があります。ConfigurationObject XMLタイプは、wlevs_base_config.xsdで定義され、nameという単一の属性を定義します。

    アダプタ要素のタイプは、この方法の上記の手順で作成されたカスタム・タイプである必要があります。

    プロセッサまたはストリームに対応するconfigの子要素には、wlevs_application_config.xsdに記述されている次の組込みXMLタイプを使用できます。

    例:

    <xs:element name="config">
      <xs:complexType>
        <xs:choice maxOccurs="unbounded">
          <xs:element name="adapter" type="HelloWorldAdapterConfig"/>
            <xs:element name="processor" type="wlevs:DefaultProcessorConfig"/>
        </xs:choice>
      </xs:complexType>
    </xs:element>
    
  5. 必要に応じてjxb:schemaBindingsjxb:package>子要素を使用して、生成されたJavaコードのパッケージ名を指定します。

    <xs:annotation>
      <xs:appinfo>
         <jxb:schemaBindings>
             <jxb:package name="com.bea.adapter.wlevs.example.helloworld"/>
         </jxb:schemaBindings>
      </xs:appinfo>
    </xs:annotation> 
    

13.9.2 拡張されたXSDスキーマ・ファイルの完全な例

次の拡張されたXSDファイルをテンプレートとして使用します。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://www.bea.com/xml/ns/wlevs/example/helloworld"
        xmlns="http://www.bea.com/xml/ns/wlevs/example/helloworld"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
        xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
        xmlns:wlevs="http://www.bea.com/xml/ns/wlevs/config/application"
        jxb:extensionBindingPrefixes="xjc" jxb:version="1.0"
        elementFormDefault="unqualified" attributeFormDefault="unqualified">
        <xs:annotation>
                <xs:appinfo>
                        <jxb:schemaBindings>
                                <jxb:package name="com.bea.adapter.wlevs.example.helloworld"/>
                        </jxb:schemaBindings>
                </xs:appinfo>
        </xs:annotation>
        <xs:import namespace="http://www.bea.com/xml/ns/wlevs/config/application"
                schemaLocation="wlevs_application_config.xsd"/>
        <xs:element name="config">
                <xs:complexType>
                        <xs:choice maxOccurs="unbounded">
                                <xs:element name="adapter" type="HelloWorldAdapterConfig"/>
                                <xs:element name="processor" type="wlevs:DefaultProcessorConfig"/>
                                <xs:element name="channel" type="wlevs:DefaultStreamConfig"/>
                         </xs:choice>
                </xs:complexType>
        </xs:element>
        <xs:complexType name="HelloWorldAdapterConfig">
                <xs:complexContent>
                        <xs:extension base="wlevs:AdapterConfig">
                                <xs:sequence>
                                        <xs:element name="message" type="xs:string"/>
                                </xs:sequence>
                        </xs:extension>
                </xs:complexContent>
        </xs:complexType>
</xs:schema>

13.9.3 アダプタまたはイベントBeanの構成へのプログラムからのアクセス

この節は、アダプタとイベントBeanの両方に当てはまります。簡略化のため、アダプタについてのみ説明します。

アプリケーションをデプロイする場合、Oracle CEPでは(コンポーネント構成XMLファイルに指定された)各コンポーネントの構成がJava Architecture for XML Binding (JAXB)標準を使用してJavaオブジェクトにマップされます(詳細は、https://jaxb.dev.java.net/を参照)。各コンポーネントの構成データは単一のXML要素に含まれるため、JAXBでもこの構成データを表現する単一のJavaクラスが生成されます。コンポーネントの初期化時、およびコンポーネントの構成が動的に変更されるたびに、Oracle CEPでは実行時にこのJavaクラスのインスタンスがコンポーネント(プロセッサ、チャネル、またはアダプタ)に渡されます。

アダプタの実装では、メタデータ注釈を使用してOracle CEPで実行時に呼び出されるJavaメソッドを指定できます。Oracle CEPでは構成のJavaクラスのインスタンスが指定されたメソッドに渡されるため、これらのメソッドをプログラミングして、アダプタに関する特定の実行時構成情報を取得できます。次の例では、activateAdapterメソッドに@Activate注釈を 付けて、アダプタの構成が最初にアクティブ化されたときに呼び出されるメソッドを指定する方法を示します。

@Activate
public void activateAdapter(HelloWorldAdapterConfig adapterConfig) {
    this.message = adapterConfig.getMessage();
}

デフォルトでは、アダプタ構成のJavaクラスのデータ型はcom.bea.wlevs.configuration.application.DefaultAdapterConfigです。ただし、構成XMLファイルを記述する独自のXSDファイルを作成してアダプタの構成を拡張した場合は、XSDファイルで型を指定します。上記の例では、Java構成オブジェクトのデータ型はcom.bea.wlevs.example.helloworld.HelloWorldAdapterConfigです。

提供されているメタデータ注釈は次のとおりです。

  • com.bea.wlevs.management.Activate: 構成がアクティブ化されたときに呼び出されるメソッドを指定します。

    アダプタ・コードでこの注釈を使用する場合の詳細は、G.2項「com.bea.wlevs.configuration.Activate」を参照してください。

  • com.bea.wlevs.management.Prepare: 構成が準備されたときに呼び出されるメソッドを指定します。

    アダプタ・コードでこの注釈を使用する場合の詳細は、G.3項「com.bea.wlevs.configuration.Prepare」を参照してください。

  • com.bea.wlevs.management.Rollback: 例外が原因でアダプタが停止した場合に呼び出されるメソッドを指定します。

    アダプタ・コードでこの注釈を使用する場合の詳細は、G.4項「com.bea.wlevs.configuration.Rollback」を参照してください。

13.10 アダプタからデータ・フィード・プロバイダへのログイン資格証明の受け渡し

外部データ・フィードにアクセスする場合、アダプタはユーザー認証のためログイン資格証明(ユーザー名とパスワード)をデータ・フィードに渡す必要がある場合があります。

最も簡単で安全性の低い方法は、アダプタのJavaコード内に暗号化されていないログイン資格証明をハード・コード化することです。ただし、この方法ではパスワードを暗号化することができず、アダプタのJavaコードを再コンパイルせずに後からログイン資格証明を変更することもできません。

次の手順では、これらの問題が考慮された異なる方法について説明します。この手順では、データ・フィードにアクセスするユーザー名にjuliet、パスワードにsuperSecretを想定しています。

ログイン資格証明をEPNアセンブリ・ファイルで静的に構成するか、アダプタの構成を拡張して動的に構成するかを指定する必要があります。EPNアセンブリ・ファイルで資格証明を静的に構成する方が簡単ですが、後から資格証明が変更された場合は、EPNアセンブリ・ファイルへの更新が反映されるようにアプリケーションを再起動する必要があります。アダプタの構成を拡張する方法では、アプリケーションを再起動せずに資格証明を動的に変更できますが、構成の拡張には、XSDファイルの作成や、JAXBオブジェクトへのコンパイルなどの追加の手順が必要になります。

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

13.10.1 アダプタからデータ・フィード・プロバイダへの静的ログイン資格証明の受け渡し

この手順では、EPNアセンブリ・ファイルで静的に構成したログイン資格証明を渡す方法について説明します。

アダプタからデータ・フィード・プロバイダへの静的ログイン資格証明の受け渡しについて

  1. コマンド・ウィンドウを開き、『Oracle CEPスタート・ガイド』の開発環境の設定の説明に従って、環境を設定します。

  2. アプリケーションのEPNアセンブリ・ファイルがあるディレクトリに移動します。

  3. 任意のXMLエディタを使用し、EPNアセンブリ・ファイルを編集して、アダプタを宣言しているwlevs:adapter要素を更新します。

    特に、ログイン資格証明のユーザー名とパスワードに対応する2つのインスタンス・プロパティを追加します。ここで、cleartextのパスワード値を指定します。後からこの値は暗号化されます。また、一時password要素を追加し、その値はcleartextパスワードにします。例:

    <wlevs:adapter id="myAdapter" provider="myProvider">
      <wlevs:instance-property name="user" value="juliet"/>
      <wlevs:instance-property name="password" value="superSecret"/>
      <password>superSecret</password>
    </wlevs:adapter>
    
  4. EPNアセンブリ・ファイルを保存します。

  5. EPNアセンブリ・ファイルのpassword要素の値を暗号化するためにencryptMSAConfigコマンドを実行します。

    prompt> ORACLE_CEP_HOME/ocep_11.1/bin/encryptMSAConfig . epn_assembly_file msainternal.dat_file
    

    ORACLE_CEP_HOMEは、d:\oracle_cepなどのOracle CEPのインストール先のメイン・ディレクトリです。2番目の引数はEPNアセンブリ・ファイルが含まれているディレクトリです。この手順では実際にそのディレクトリに移動しているため、例では「.」と示されています。epn_assembly_fileパラメータはEPNアセンブリ・ファイルの名前です。最後に、msainternal.dat_fileパラメータは、ドメインに関連付けられている.msainternal.datファイルの場所です。デフォルトでは、このファイルはDOMAIN_DIR/servernameディレクトリにあります。DOMAIN_DIRは、/oracle_cep/user_projects/domains/mydomainなどのドメイン・ディレクトリで、servernameはサーバー・インスタンスです。

    詳細は、『Oracle CEP管理者ガイド』のencryptMSAConfigコマンドライン・ユーティリティに関する項を参照してください。

    コマンドを実行すると、EPNアセンブリ・ファイルのpassword要素の値が暗号化されます。

  6. EPNアセンブリ・ファイルを編集します。

    password要素の暗号化された値をpasswordインスタンス・プロパティのvalue属性にコピーします。

    password要素をXMLファイルから削除します。

    例:

    <wlevs:adapter id="myAdapter" provider="myProvider">
        <wlevs:instance-property name="user" value="juliet"/>
        <wlevs:instance-property name="password"
            value="{Salted-3DES}B7L6nehu7dgPtJJTnTJWRA=="/>
    </wlevs:adapter>
    
  7. 構成されたログイン資格証明のプロパティにアクセスしてパスワードを復号化するよう、アダプタのJavaコードを更新します。

    13.10.1項「アダプタからデータ・フィード・プロバイダへの静的ログイン資格証明の受け渡し」を参照してください。

  8. アプリケーションのMANIFEST.MFファイルを編集し、Import-Packageヘッダーにcom.bea.core.encryptionパッケージを追加します。20.2.2.1項「MANIFEST.MFファイルの作成」を参照してください。

  9. アプリケーションを通常どおり再アセンブルし、デプロイします。第20章「Oracle CEPアプリケーションのアセンブルとデプロイ」を参照してください。

13.10.2 アダプタからデータ・フィード・プロバイダへの動的ログイン資格証明の受け渡し

この手順では、アダプタの構成を拡張して動的に構成したログイン資格証明を渡す方法について説明します。

アダプタからデータ・フィード・プロバイダへの動的ログイン資格証明の受け渡しについて

  1. String型の2つの新しい要素userおよびpasswordを追加してアダプタの構成を拡張します。

    たとえば、HelloWorldのサンプルのアダプタを拡張した場合、XSDファイルは次のようになります。

    <xs:complexType name="HelloWorldAdapterConfig">
       <xs:complexContent>
         <xs:extension base="wlevs:AdapterConfig">
           <xs:sequence>
             <xs:element name="message" type="xs:string"/>
             <xs:element name="user" type="xs:string"/>
             <xs:element name="password" type="xs:string"/>
           </xs:sequence>
         </xs:extension>
       </xs:complexContent>
    </xs:complexType>
    

    詳細な手順は、13.9項「アダプタまたはイベントBeanの構成の拡張」を参照してください。

  2. コマンド・ウィンドウを開き、『Oracle CEPスタート・ガイド』の開発環境の設定の説明に従って、環境を設定します。

  3. アダプタのコンポーネント構成XMLファイルがあるディレクトリに移動します。

  4. 任意のXMLエディタを使用してこのコンポーネント構成XMLファイルを編集し、<user>および<password>要素を使用して必要なログイン資格証明を追加します。ここでは、クリア・テキストのパスワード値を指定します。これは後から暗号化されます。例:

    <?xml version="1.0" encoding="UTF-8"?>
    <myExample:config
      xmlns:myExample="http://www.bea.com/xml/ns/wlevs/example/myExample">
      <adapter>
        <name>myAdapter</name>
        <user>juliet</user>
        <password>superSecret</password>
      </adapter>
    </myExample:config>
    
  5. アダプタの構成ファイルを保存します。

  6. アダプタ構成ファイルのpassword要素の値を暗号化するためにencryptMSAConfigコマンドを実行します。

    prompt> ORACLE_CEP_HOME/ocep_11.1/bin/encryptMSAConfig . adapter_config_file msainternal.dat_file
    

    ORACLE_CEP_HOMEは、d:\oracle_cepなどのOracle CEPのインストール先のメイン・ディレクトリです。2番目の引数はアダプタの構成ファイルが含まれているディレクトリです。この手順では実際にそのディレクトリに移動しているため、例では「.」と示されています。adapter_config_fileパラメータはアダプタ構成ファイルの名前です。最後に、msainternal.dat_fileパラメータは、ドメインに関連付けられている.msainternal.datファイルの場所です。デフォルトでは、このファイルはDOMAIN_DIR/servernameディレクトリにあります。DOMAIN_DIRは、/oracle_cep/user_projects/domains/mydomainなどのドメイン・ディレクトリで、servernameはサーバー・インスタンスです。

    詳細は、『Oracle CEP管理者ガイド』のencryptMSAConfigコマンドライン・ユーティリティに関する項を参照してください。

    コマンドを実行すると、password要素の値が暗号化されます。

  7. 構成されたログイン資格証明のプロパティにアクセスしてパスワードを復号化するよう、アダプタのJavaコードを更新します。

    13.10.1項「アダプタからデータ・フィード・プロバイダへの静的ログイン資格証明の受け渡し」を参照してください。

  8. アプリケーションのMANIFEST.MFファイルを編集し、Import-Packageヘッダーにcom.bea.core.encryptionパッケージを追加します。20.2.2.1項「MANIFEST.MFファイルの作成」を参照してください。

  9. アプリケーションを通常どおり再アセンブルし、デプロイします。第20章「Oracle CEPアプリケーションのアセンブルとデプロイ」を参照してください。

13.10.3 ログイン資格証明プロパティにアクセスするためのアダプタ・コードの更新

この項では、拡張されたアダプタ構成から動的にユーザーとパスワードの値を取得し、com.bea.core.encryption.EncryptionService APIを使用して暗号化されたパスワードを復号化するようにアダプタのJavaコードを更新する方法について説明します。

次に示すコード・スニペットは、13.3項「アダプタまたはイベントBeanをイベント・ソースとして実装」に示したアダプタのJavaコードのHelloWorldを基に作成されます。

  • 暗号化されたパスワードの複合化に必要な追加のAPIをインポートします。

    import com.bea.core.encryption.EncryptionService;
    import com.bea.core.encryption.EncryptionServiceException;
    import com.bea.wlevs.util.Service;
    
  • @Service注釈を使用してEncryptionServiceへの参照を取得します。

    private EncryptionService encryptionService;
    ...
    @Service
    public void setEncryptionService(EncryptionService encryptionService) {
        this.encryptionService = encryptionService;
    }
    
  • @Prepareコールバック・メソッドで、拡張されたアダプタ構成のuserおよびpasswordプロパティの値を通常どおり取得します(password値のコードのみ示しています)。

    private String password;
    ...
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    ...
    @Prepare
    public void checkConfiguration(HelloWorldAdapterConfig adapterConfig) {
        if (adapterConfig.getMessage() == null
                || adapterConfig.getMessage().length() == 0) {
            throw new RuntimeException("invalid message: " + message);
        }
        this.password= adapterConfig.getPassword();
        ...
    }
    

    拡張されたアダプタ構成へのアクセスに関する情報は、13.9.3項「アダプタまたはイベントBeanの構成へのプログラムからのアクセス」を参照してください。

  • @Prepareコールバック・メソッドでEncryptionService.decryptStringAsCharArrayメソッドを使用して暗号化されたパスワードを複合化します。

    @Prepare
    public void checkConfiguration(HelloWorldAdapterConfig adapterConfig) {
        if (adapterConfig.getMessage() == null
                || adapterConfig.getMessage().length() == 0) {
            throw new RuntimeException("invalid message: " + message);
        }
        this.password= adapterConfig.getPassword();
        try {
            char[] decrypted = encryptionService.decryptStringAsCharArray(password);
            System.out.println("DECRYPTED PASSWORD is "+ new String(decrypted));
        } catch (EncryptionServiceException e) {
            throw new RuntimeException(e);
        }
    }
    

    decryptStringAsCharArrayメソッドのシグネチャは次のとおりです。

    char[] decryptStringAsCharArray(String encryptedString)
                                    throws EncryptionServiceException
    
  • ベンダーAPIを使用してこれらの資格証明をデータ・フィード・プロバイダに渡します。

13.11 固有のバンドルでのアダプタまたはイベントBeanのアセンブリ

この節は、アダプタとイベントBeanの両方に当てはまります。簡略化のため、アダプタについてのみ説明します。

13.2項「アダプタまたはイベントBeanの実装」に示す手順では、プロセッサ、ストリーム、ビジネス・ロジックPOJOなどのイベント・ネットワークの他のコンポーネントが含まれている同一のアプリケーションJARファイルに、アダプタおよびアダプタ・ファクトリがバンドルされることが想定されています。

ただし、アダプタを固有のJARファイルにバンドルし、他のアプリケーション・バンドルでアダプタを参照する必要がある場合もあります。これは、たとえば、2つの異なるアプリケーションが同じデータ・フィード・プロバイダからのデータを読み込み、両方のアプリケーションが同じイベント・タイプを使用する場合に役立ちます。この場合、2つの異なるアプリケーションで実装が重複するよりも、同一のアダプタおよびイベント・タイプの実装を共有するほうが有意義です。

異なるバンドルでアダプタおよびアダプタを使用するアプリケーションを構成する方法には、実際の違いはありません。次のガイドラインに示すように、構成を配置する場所が異なります