プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle Event Processingアプリケーションの開発
12c リリース1 (12.1.3)
E54312-04
目次へ移動
目次

前
前へ
次
次へ

2 アプリケーションおよびリソース構成

Oracle Event ProcessingのEPNには、アセンブリ・ファイルとコンポーネント構成ファイルという2つのタイプの構成ファイルがあります。アセンブリ・ファイルは、EPNダイアグラム・ステージおよび構造を記述するコンテキスト・ファイルです。構成ファイルには、EPNステージのコンポーネント構成および動的パラメータが記述されます。動的パラメータは、Oracle Event Processing Visualizerを使用して実行時に、またはJMX APIを介してプログラムで変更できるパラメータです。

この章の内容は次のとおりです。

2.1 アプリケーション構成

Oracle Event Processingアプリケーション構成の設定は、標準スキーマに基づくXMLファイルに格納されます。Oracle Event Processingをインストールすると、スキーマのXSDファイルはOracle/Middleware/oep/xsdディレクトリにインストールされます。

デフォルトでは、Oracle JDeveloperにより、<Project-Name>.context.xmlという名前のアセンブリ・ファイルが1つ、processor.xmlという名前のデフォルトの構成ファイルが1つ生成されます。1つのアプリケーションには、1つ以上のアセンブリ・ファイルと1つ以上の構成ファイルを指定できます。使用する構成ファイルの数、およびEPNの構築時にこれらに付ける名前を決定します。プロジェクトには、Oracle CQLプロセッサ構成の設定を格納するためにprcessor.xmlという名前の構成ファイルが1つ必要です。

アダプタなどのコンポーネントを作成する場合、processor.xmlファイルは、新しいコンポーネント・ウィザード内にデフォルトの構成ファイルとして表示されます。デフォルト設定を採用すると、コンポーネント構成情報はデフォルトのprocesor.xmlに格納されます。adapter.xmlという名前の1つのファイルにアダプタ構成をすべて格納するには、ウィザードでprocessor.xmladapters.xmlに変更します。

コンポーネント構成ウィザードで、adapters.xmlなどの新しいファイル名を指定するがデフォルトの設定のみを使用する場合、この新しいファイルに格納する構成設定が存在しないため、Oracle JDeveloperではこのファイルは生成されません。カスタム設定を使用してコンポーネントを再作成することも、「ファイル」メニューを使用して空の構成ファイルを新しく作成することもできます。『Oracle Event Processingスタート・ガイド』のコンポーネント構成ファイルの作成に関する項を参照してください。

アセンブリ・ファイルおよび構成ファイルは、プロジェクト内の次の場所に格納されます。

  • アセンブリ・ファイル: <Project-Name>/META-INF/spring/*.xml

  • 構成ファイル: <Project-Name>/META-INF/wlevs/*.xml

構成を変更するには、アプリケーションのアセンブリ・ファイルを編集するか、コンポーネントの構成ファイルを編集します。ファイル内では任意の値を変更できますが、アセンブリ・ファイルIDの値と構成ファイル名の値の整合性を維持するよう注意する必要があります。アセンブリ・ファイル内のIDの値を変更する場合、構成ファイル内の名前の値もこれに一致するよう変更する必要があります(逆も同様)。他の任意の情報は1つのファイルでのみ変更できます。Oracle JDeveloperでは、IDと名前の値のペアを使用してアプリケーション・アセンブリ・ファイルおよびコンポーネント構成ファイル内の情報を同期させています。

次のコンポーネントには、processor.xmlにデフォルト設定される構成ファイルがあります。Oracle CQLパターンはprocessor.xmlファイルに格納する必要がありますが、このリスト内の他のすべてのコンポーネントでは別の名前で構成ファイルを使用できます。

  • すべてのアダプタ

  • チャネル

  • Oracle CQLパターン

  • ローカル・キャッシュ・システム

  • キャッシュ

  • RMIOutbound拡張

Coherenceキャッシュ・システムにはデフォルトのcoherence-cache-ファイルがあります。このファイルの名前は変更できます。

コンポーネント構成ファイルは、Oracle Event Processingアプリケーション・バンドルの一部としてデプロイされます。Oracle Event Processing Visualizer、wlevs.Adminユーティリティを使用するか、または適切なJMX MBeanを操作して、後で実行時にこの構成を更新できます。

2.2 アセンブリ・ファイル構造

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

このスキーマ・ファイルは、Oracle/Middleware/oep/xsdディレクトリにインストールされます。『Oracle Event Processing スキーマ・リファレンス』のEPNアセンブリ・スキーマに関する項を参照してください。

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

<?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-v12_1_3_0.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>

2.2.1 ネストされたEPNアセンブリ・ファイルのステージ

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

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

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

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

例2-1 すべてのステージがネストされた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:channel id="helloworldInputChannel" event-type="HelloWorldEvent" >
            <wlevs:listener>
                <wlevs:processor id="helloworldProcessor">
                    <wlevs:listener>
                        <wlevs:channel id="helloworldOutputChannel" 
                            event-type="HelloWorldEvent">
                            <wlevs:listener>
                                <bean 
                                    class="com.bea.wlevs.example.helloworld.HelloWorldBean"/>
                            </wlevs:listener>
                        </wlevs:channel>
                    </wlevs:listener>
                </wlevs:processor>
            </wlevs:listener>
        </wlevs:channel>
    </wlevs:listener>
</wlevs:adapter>

2.2.2 EPNアセンブリ・ファイル内の外部ステージ

別のOracle Event Processingアプリケーションのステージを参照できます。別のアプリケーションのステージは、外部ステージと見なされます。同じアプリケーションのソースおよびターゲット・ステージを定義する場合、idでこれを実行します。

注:

Oracle CQLプロセッサ・ステージを外部ステージのチャネルに接続することはできません。

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

FOREIGN-APPLICATION-NAME:FOREIGN-STAGE-ID

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

次の例は、アプリケーションapplication2で定義した外部ステージHelloWorldBeanSourceapplication1が参照する方法を示します。

<wlevs:stream id="helloworldInstream" >
    <wlevs:listener ref="helloworldProcessor"/>
    <wlevs:source ref="application2:HelloWorldBeanSource"/>
</wlevs:stream>
<wlevs:event-bean id="HelloWorldBeanSource"
    class="com.bea.wlevs.example.helloworld.HelloWorldBeanSource"
    advertise="true"/> 

次の各ステージは外部ステージにはできません。

  • キャッシュ

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

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

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

Oracle Event Processingをインストールすると、このようなXSDファイルは、ディレクトリOracle/Middleware/oep/xsdに格納されます。

このXSDスキーマでは、次のスキーマがインポートされます。

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

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

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

『Oracle Event Processing スキーマ・リファレンス』のスキーマ・コンポーネント構成に関する項を参照してください。

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

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

2.4 コンポーネントおよびサーバー構成

ConfigurationPropertyPlaceholderConfigurerクラスを使用し、シンボリック・プレースホルダを使用してコンポーネント構成ファイルおよびサーバー構成ファイルの両方で既存の構成ファイル・プロパティを参照します。

そうすると、複数の場所で同じ値をハードコードするのではなく、1つの場所に値を定義して、その1つの定義を参照できます。

これは、Oracle Event Processingアプリケーション用のアセンブリ・ファイル内のファクトリ名などのJava Message Service (JMS)情報をハードコードせずにJMSを構成する場合などに行うことができます。

com.bea.wlevs.spring.support.ConfigurationPropertyPlaceholderConfigurerクラスを使用して、JMSアダプタを作成し、実際のファクトリ名、ユーザー名およびパスワード値が含まれる別のファイルにサーバー接続のファクトリ名、ユーザー名、パスワードおよび場所のプレースホルダを提供します。ConfigurationPropertyPlaceholderConfigurerクラスは、Springフレームワークの上に実装されます。

サーバー構成ファイルは、Oracle Event Processingサーバーの管理者によって使用されます。このファイルは、1つのドメインに固有の構成情報を含み、/Oracle/Middleware/my_oep/user_projects/domains/<domain_name>/<server_name>/config/にあります。

既存の構成ファイル・プロパティの参照を使用するには、次に示すように、プロジェクトのアセンブリ・ファイルにConfigurationPropertyPlaceholderConfigurer Beanを挿入します。

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

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

2.5 リソース・アクセス構成

Oracle Event Processingアプリケーションは、低待機時間、イベントドリブンかつ高性能駆動型のアプリケーションであるため、軽量なコンテナ上で実行し、POJOベースのプログラミング・モデルで開発されています。

POJO (Plain Old Java Object)プログラミングでは、ビジネス・ロジックはPOJO形式で実装され、必要とするサービスが注入されます。これは一般に、依存関係インジェクションと呼ばれます。インジェクトされたサービスは、構成管理などのOracle Event Processingサービスで提供されるものから、Oracle Kodoなどの他のOracle製品で提供されるサービスやサード・パーティ製のサービスまで多岐に渡ります。

Oracle Event Processingおよび標準のJava注釈およびデプロイメントXMLを使用することによって、Oracle Event Processing Springコンテナを構成して、リソース(データ・ソースや永続性マネージャなど)をOracle Event Processingアプリケーション・コンポーネントにインジェクトできます。

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

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

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

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

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

2.5.1 リソース・アクセス注釈

javax.annotation.Resource (@Resource)注釈では、設計時にリソース・アクセス、およびその対応するデプロイメントXMLを構成し、デプロイ時にこの構成をオーバーライドします。

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

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

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

2.5.2.1 静的リソース名

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

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

設計時の構成をデプロイ時にオーバーライドするには、Oracle Event Processingアセンブリ・ファイルXMLを使用します。

次の例では、リソース名StockDsは、Oracle Event Processingサーバー・ファイルのデータ・ソース名と正確に一致します。

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

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

import javax.annotation.Resource;

public class SimpleBean implements EventBean {
...
    @Resource ()
    public void setStockDs (DataSource dataSource){
        this.dataSource = dataSource;
    }
}
< wlevs:event-bean id="simpleBean" class="...SimpleBean"/>
    <wlevs:resource property="dataSource"/>
</wlevs:event-bean>

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

import javax.annotation.Resource;

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

2.5.2.2 動的リソース名

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

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

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

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

設計時の構成をデプロイ時にオーバーライドするには、Oracle Event Processingアセンブリ・ファイルXMLを使用します。

import javax.annotation.Resource;

public class SimpleBean implements EventBean {
...
    @Resource (name="trade-datasource")
    public void setDataSource (DataSource dataSource){
        this.dataSource = dataSource;
    }
}
< wlevs:event-bean id="simpleBean" class="...SimpleBean"/>
    <wlevs:resource property="dataSource" name="trade-datasource"/>
</wlevs:event-bean>

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

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

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

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

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

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

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

import javax.annotations.Resource;

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

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

Oracle Event Processingでは、リソースを動的に参照するためにJNDIの使用がサポートされます。

import javax.naming.InitialContext;

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

JNDI名StockDsは、Oracle Event Processingサーバー・ファイルのデータ・ソース名と正確に一致する必要があります。

注:

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

2.5.5 リソース名解決

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

表2-1 リソース名解決

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

コンポーネント

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

マッピング

アプリケーション

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

照合

サーバー

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

マッチング

JNDI

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

マッチング

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