2 アプリケーションおよびリソース構成
Oracle Stream AnalyticsのEPNには、アセンブリ・ファイルとコンポーネント構成ファイルという2つのタイプの構成ファイルがあります。アセンブリ・ファイルは、EPNダイアグラム・ステージおよび構造を記述するコンテキスト・ファイルです。構成ファイルには、EPNステージのコンポーネント構成および動的パラメータが記述されます。動的パラメータは、Oracle Stream Analytics Visualizerを使用して実行時に、またはJMX APIを介してプログラムで変更できるパラメータです。
この章の内容は次のとおりです。
2.1 アプリケーション構成
Oracle Stream Analyticsアプリケーション構成の設定は、標準スキーマに基づくXMLファイルに格納されます。Oracle Stream Analyticsをインストールすると、スキーマの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.xml
をadapters.xml
に変更します。
コンポーネント構成ウィザードで、adapters.xml
などの新しいファイル名を指定するがデフォルトの設定のみを使用する場合、この新しいファイルに格納する構成設定が存在しないため、Oracle JDeveloperではこのファイルは生成されません。カスタム設定を使用してコンポーネントを再作成することも、「ファイル」メニューを使用して空の構成ファイルを新しく作成することもできます。
アセンブリ・ファイルおよび構成ファイルは、プロジェクト内の次の場所に格納されます。
-
アセンブリ・ファイル:
<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 Stream Analyticsアプリケーション・バンドルの一部としてデプロイされます。Oracle Stream Analytics Visualizer、wlevs.Admin
ユーティリティを使用するか、または適切なJMX Mbeanを操作して、後で実行時にこの構成を更新できます。
2.2 アセンブリ・ファイル構造
spring-wlevs-v12_1_3_0.xsd
スキーマ・ファイルでは、EPNアセンブリ・ファイルの構造について説明しています。
このスキーマ・ファイルは、Oracle/Middleware
/osa/xsd
ディレクトリにインストールされます。
EPNアセンブリ・ファイルには、サブ要素のシーケンスが含まれるbeans
という最上位ルート要素があります。個々のサブ要素には、Oracle Stream Analyticsコンポーネントの構成データが含まれています。
<?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の親ステージ内に子ステージを定義した場合、子ステージはネストと言われます。親ステージのみが子ステージをリスナーとして指定できます。
次の例は、HelloWorldBean
がhelloworldOutputChannel
内にネストされている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 Stream Analyticsアプリケーション内にあるステージを参照できます。別のアプリケーションのステージは、外部ステージと見なされます。同じアプリケーションのソースおよびターゲット・ステージを定義する場合、id
でこれを実行します。
注意:
Oracle CQLプロセッサ・ステージを外部ステージのチャネルに接続することはできません。
別のアプリケーションで定義したステージを参照するには、次の構文を使用します。
FOREIGN-APPLICATION-NAME
:FOREIGN-STAGE-ID
ここでは、FOREIGN-APPLICATION-NAME
は、外部ステージを定義したアプリケーションの名前であり、FOREIGN-STAGE-ID
は、外部ステージのid
属性です。
次の例は、アプリケーションapplication2
で定義した外部ステージHelloWorldBeanSource
をapplication1
が参照する方法を示します。
<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 Stream Analyticsアプリケーションを作成する場合、アプリケーションのアセンブリ、デプロイおよび再デプロイのときに外部ステージの依存関係を考慮する必要があります。詳細は、外部ステージの参照を参照してください。
2.3 コンポーネント構成ファイル構造
wlevs_application_config.xsd
スキーマ・ファイルでは、コンポーネント構成ファイルの構造について説明しています。
Oracle Stream Analyticsをインストールすると、このようなXSDファイルは、ディレクトリOracle/Middleware/oep/xsd
に格納されます。
このXSDスキーマでは、次のスキーマがインポートされます。
-
wlevs_base_config.xsd
: アプリケーション構成ファイルとサーバー構成ファイルの間で共有される共通要素を定義します。 -
wlevs_eventstore_config.xsd
: イベント・ストア固有の要素を定義します。 -
wlevs_diagnostic_config.xsd
: 診断要素を定義します。
アプリケーション構成ファイルの構造は次のとおりです。config
という最上位ルート要素に、サブ要素のシーケンスが含まれています。個々のサブ要素には、Oracle Stream Analyticsコンポーネント(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 Stream Analyticsアプリケーション用のアセンブリ・ファイル内のファクトリ名などのJava Message Service (JMS)情報をハードコードせずにJMSを構成する場合などに行うことができます。
com.bea.wlevs.spring.support.ConfigurationPropertyPlaceholderConfigurer
クラスを使用して、JMSアダプタを作成し、実際のファクトリ名、ユーザー名およびパスワード値が含まれる別のファイルにサーバー接続のファクトリ名、ユーザー名、パスワードおよび場所のプレースホルダを提供します。ConfigurationPropertyPlaceholderConfigurer
クラスは、Springフレームワークの上に実装されます。
サーバー構成ファイルは、Oracle Stream Analyticsサーバーの管理者によって使用されます。このファイルは、1つのドメインに固有の構成情報を含み、/Oracle/Middleware/my_oep/user_projects/domains/<domain_name>/<server_name>/config/
にあります。
既存の構成ファイル・プロパティの参照を使用するには、次に示すように、プロジェクトのアセンブリ・ファイルにConfigurationPropertyPlaceholderConfigurer
Beanを挿入します。
<bean class="com.bea.wlevs.spring.support.ConfigurationPropertyPlaceholderConfigurer"/>
詳細は、Oracle Stream Analytics Java APIリファレンスのcom.bea.wlevs.spring.support.ConfigurationPropertyPlaceholderConfigurer
クラスを参照してください。
2.5 リソース・アクセス構成
Oracle Stream Analyticsアプリケーションは、低待機時間、イベントドリブンかつ高性能駆動型のアプリケーションであるため、軽量なコンテナ上で実行し、POJOベースのプログラミング・モデルで開発されています。
POJO (Plain Old Java Object)プログラミングでは、ビジネス・ロジックはPOJO形式で実装され、必要とするサービスが注入されます。これは一般に、依存関係インジェクションと呼ばれます。インジェクトされたサービスは、構成管理などのOracle Stream Analyticsサービスで提供されるものから、Oracle Kodoなどの他のOracle製品で提供されるサービスやサードパーティ製のサービスまで多岐に渡ります。
Oracle Stream Analytics、標準のJava注釈およびデプロイメントXMLを使用して、リソース(データ・ソースや永続性マネージャなど)をOracle Stream Analyticsアプリケーション・コンポーネントにインジェクトするように、Oracle Stream Analytics Springコンテナを構成できます。
一般的に、コンポーネント初期化中に、Springコンテナでリソースがインジェクトされます。しかし、これによって、ランタイム時にリソースがインジェクトおよび再インジェクトされます。また、ランタイム時に、JNDIルックアップがサポートされます。
Oracle Stream Analyticsでは、次のタイプのリソース・アクセスがサポートされます。
次の項では、例2-2に示す例のリソースを考慮します。これは、Oracle Stream Analyticsサーバー・ファイルに指定する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 Stream AnalyticsアセンブリXMLファイルに使用されるリソース名は、定義されたリソース名と完全一致する必要があります。リソース名は静的であるため、再コンパイルしないと変更できません。
設計時に静的リソース名を使用して静的リソース・インジェクションを構成するには、次の例に示すように、標準のjavax.annotation.Resource
注釈を使用します。
設計時の構成をデプロイ時にオーバーライドするには、Oracle Stream Analyticsアセンブリ・ファイルXMLを使用します。
次の例では、リソース名StockDs
は、Oracle Stream Analyticsサーバー・ファイルのデータ・ソース名と正確に一致します。
< 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 Stream Analyticsアセンブリ・ファイル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 Stream Analyticsでは、リソースを動的に参照するために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 Stream Analyticsサーバー・ファイルのデータ・ソース名と正確に一致する必要があります。
注意:
JNDIを使用するには、Oracle Stream Analyticsサーバーの起動時にセキュリティを無効にする必要があります。この理由から、JNDIの使用はお薦めしません。
2.5.5 リソース名解決
Oracle Stream Analyticsサーバーでは、表2-1にリストされたネーミング・スコープを調べて、リソース名が解決されます。
表2-1 リソース名解決
ネーミング・スコープ | 目次 | 解決動作 |
---|---|---|
コンポーネント |
コンポーネントのカスタム構成のプロパティ名 |
マッピング |
アプリケーション |
アプリケーション構成ファイルの構成要素名 |
マッチング |
サーバー |
サーバー構成ファイルの構成要素名 |
マッチング |
JNDI |
サーバーのJNDIレジストリに登録された名前 |
マッチング |
各ネーミング・スコープには一意の名前のセットが含まれます。名前解決動作は、ネーミング・スコープ固有の動作です。一部のネーミング・スコープでは、簡単な一致によって名前を解決します。他のスコープでは、新しい名前を参照するために使用する名前をマップすることで名前を解決します。一度名前がマップされると、参照は現在のスコープで再帰的に続行します。