![]() ![]() ![]() ![]() |
アダプタの主な役割の 1 つには、マーケット データ フィードなどのストリームからのデータを Oracle Complex Event Processing (略称 Oracle CEP) イベントに変換する作業があります。これらのイベントはその後、プロセッサなどのアプリケーションの他のコンポーネントに渡されます。通常アダプタは Oracle CEP アプリケーションへのエントリ ポイントです。アダプタは中間コンポーネントからのイベントを受信し、外部アプリケーションで読み取り可能な形式にデータを変換し、それらのデータを送信するため、アプリケーションの出口ポイントになる場合もあります。
FX サンプルの説明では、通貨データ フィードからデータを読み込み、ネットワークの次のコンポーネントであるプロセッサに特定のイベント タイプの形式でデータを渡す 3 つのアダプタが示されています。
着信データの形式およびアダプタ コードで変換に使用される技術に応じて、さまざまなタイプのアダプタを作成できます。最も一般的なタイプのアダプタは、以下のとおりです。
アダプタは、特定の Oracle CEP インタフェースを実装する Java クラスです。アプリケーション全体を記述する EPN アセンブリ ファイルでアダプタ クラスを登録します。
必要に応じてアダプタのデフォルトのコンフィグレーションを変更できます。または、コンフィグレーションを拡張して、コンフィグレーションの新しい要素および属性を追加することもできます。アダプタにコンフィグレーション データを渡すには 2 つの方法があります。デプロイメントの後にコンフィグレーションを動的に変更する必要があるかどうかに応じて、選択する方法が決まります。アダプタのデプロイ後にコンフィグレーション データを変更しないのであれば、EPN アセンブリ ファイルでアダプタをコンフィグレーションできます。ただし、コンフィグレーション要素を動的に変更できるようにする必要がある場合は、このコンフィグレーションをアダプタ固有のコンフィグレーション ファイルに配置します。これらの方法については後述します。
イベント Bean は、Oracle CEP 管理フレームワークによる管理が可能な点を除いて、標準の Spring Bean とほぼ同じです。標準の Spring Bean は Spring フレームワークで管理されます。標準の <bean>
タグの代わりに Oracle CEP <wlevs:event-bean>
タグを使用して、イベント Bean を EPN アセンブリ ファイルに登録します。
イベント Bean はある種のステージであり、Event Server モニタリング フレームワークによってモニタでき、コンフィグレーション メタデータのアノテーションを利用します。また、通過するイベントを記録および再生するよう設定できます。イベント Bean は、Event Server API インタフェースを実装するのではなく、XML 宣言にメソッドを指定することによって、Event Server Bean ライフサイクルに参加することもできます。
開発者は Spring-bean または event-bean のいずれを使用するかを選択できます。前者は Spring に対するレガシー統合のために使用されます。後者は Event Server コンテナの機能を積極的に利用するために使用されます。
標準の Spring Bean およびイベント Bean は、イベント ソース、イベント シンク、またはその両方に使用できます。イベント ソースはイベントを生成し、イベント シンクはイベントを受信します。
com.bea.wlevs.ede.api EventSource
API を実装することによって、EPN の標準の Spring Bean コンポーネントがイベント ソースであることを指定します。Bean では必要に応じて、InitializingBean
や DisposableBean
などのさまざまなライフサイクル インタフェース、および RunnableBean
などのアクティブ インタフェースを実装することもできます。Spring-bean が RunnableBean
ではなく Runnable
を実装した場合、Oracle CEP ではこれをスレッドで実行しません。これはイベント Bean の動作とは異なります。
Spring Bean イベント ソースでは、@Prepare
、@Rollback
、@Activate
などのコンフィグレーション メタデータのアノテーションを利用できます。
<bean>
を使用する通常の方法で Spring Bean を EPN アセンブリ ファイルに登録します。その後、この Bean を EPN の他のステージに対するイベント ソースとして指定できます。
イベント ソースであるイベント 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>
Spring Bean およびイベント Bean のイベント シンクとしての機能はイベント ソースの機能とほぼ同じですが、以下の点が異なります。
イベント シンクはアクティブではないため、Runnable
インタフェースを実装している場合、Oracle CEP ではこれらを個別のスレッドで実行しません。
<wlevs:listener>
タグを使用して EPN アセンブリ ファイルでイベント シンクを参照します。
<wlevs:stream id="myStream" >
<wlevs:listener ref="myEventSink" />
</wlevs:stream>
アダプタまたはイベント Bean が単一の Oracle CEP アプリケーションによってのみ使用される場合は、ファクトリを作成する必要はありません。ただし、同一のアダプタまたはイベント Bean が複数のアプリケーションで使用される場合は、ファクトリもプログラミングする必要があります。この場合、それぞれのアプリケーションで固有のアダプタ インスタンスが取得されます。
アダプタまたはイベント Bean のファクトリは com.bea.wlevs.ede.api.Factory
インタフェースを実装する必要があります。このインタフェースには、アダプタまたはイベント Bean のインスタンスを作成するために実装する 1 つのメソッド create()
が含まれています。
<wlevs:factory>
タグを使用して EPN アセンブリ ファイルにファクトリを登録します。
<wlevs:factory provider-name="myprovider" class="my.Implementation"/>
サービスのプロパティを指定する必要がある場合は、<osgi:service>
タグを使用してファクトリを登録する必要があります。
以下の手順は、アダプタを作成するための一般的な手順を示します。
アダプタまたはイベント Bean がイベント ソースである場合は、「イベント ソースとしてのアダプタおよびイベント Bean クラスのプログラミング : ガイドライン」を参照してください。イベント シンクである場合は、「イベント シンクのプログラミング : ガイドライン」を参照してください。
「省略可能なファクトリ クラスのプログラミング」を参照してください。
「EPN アセンブリ ファイルの更新」を参照してください。
「アダプタまたはイベント Bean のコンフィグレーション」を参照してください。
「アダプタまたはイベント Bean のコンフィグレーションの拡張」を参照してください。
上記の手順では、プロセッサ、ストリーム、ビジネス ロジック POJO などのイベント ネットワークの他のコンポーネントが含まれている同一のアプリケーション JAR ファイルにアダプタまたはイベント Bean がバンドルされると想定します。複数のアプリケーションで共有できるようにアダプタまたはイベント Bean を固有の JAR ファイルにバンドルする必要がある場合は、「固有のバンドルでのアダプタまたはイベント Bean の作成」を参照してください。
この節では、着信データを受信し、EPN の次のコンポーネントに送信されるイベントを生成するイベント ソースとして動作する着信アダプタを作成する方法について説明します。イベント Bean は同様に機能するため、このガイドラインはイベント ソースとして動作するイベント Bean のプログラミングにも適用されます。
着信アダプタ クラスは、通常マーケット データ フィードなどからの着信データのストリームを読み込み、アプリケーションの残りの部分によって認識される Oracle CEP イベント タイプに変換し、ネットワークの次のコンポーネントにイベントを送信します。
次の例は、HelloWorld サンプルのアダプタ クラスを示します。Java コードの太字部分に対応するコーディングのガイドラインについては、例の後で説明しています。
package com.bea.wlevs.adapter.example.helloworld;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import com.bea.wlevs.ede.api.EventSender;
import com.bea.wlevs.ede.api.EventSource;
import com.bea.wlevs.ede.api.RunnableBean;
import com.bea.wlevs.event.example.helloworld.HelloWorldEvent;
public class HelloWorldAdapter implements RunnableBean, EventSource {
private static final int SLEEP_MILLIS = 300;
private DateFormat dateFormat;
private String message;
private EventSender eventSender;
private boolean stopped;
public HelloWorldAdapter() {
super();
dateFormat = DateFormat.getTimeInstance();
}
public void run() {
stopped = false;
while (!isStopped()) { // メッセージを永久に生成します...
generateHelloMessage();
try {
synchronized (this) {
wait(SLEEP_MILLIS);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void setMessage(String message) {
this.message = message;
}
@SuppressWarnings({ "unchecked" })
private void generateHelloMessage() {
List eventCollection = new ArrayList();
String message = this.message + dateFormat.format(new Date());
HelloWorldEvent event = new HelloWorldEvent();
}
event.setMessage(message);
eventCollection.add(event);
eventSender.sendEvent(eventCollection, null);
public void setEventSender(EventSender sender) {
eventSender = sender;
}
public synchronized void suspend() {
stopped = true;
}
private synchronized boolean isStopped() {
return stopped;
}
}
アダプタ Java クラスのプログラミングでは、以下のガイドラインに従います。上記の例でガイドラインのコード例は太字で示されています。
import com.bea.wlevs.ede.api.EventSender;
import com.bea.wlevs.ede.api.EventSource;
import com.bea.wlevs.ede.api.RunnableBean;
アダプタはイベント ソースであるため、EventSource
インタフェースを実装する必要があります。アダプタをスレッドで実行する必要がある場合は RunnableBean
も実装します。EventSender
インタフェースは、イベント タイプをアプリケーション ネットワークの次のコンポーネントに送信します。これらの API の完全な詳細については、Javadoc を参照してください。
import com.bea.wlevs.event.example.helloworld.HelloWorldEvent
import
com.bea.wlevs.event.example.helloworld.HelloWorldEvent
クラスはアプリケーションで使用されるイベント タイプを表現する JavaBean です。
EventSource
および RunnableBean
インタフェースを実装する必要があります。public class HelloWorldAdapter implements RunnableBean, EventSource {
EventSource
インタフェースではイベントの送信に使用される EventSender
が提供されます。
RunnableBean
インタフェースが実装されるため、アダプタでは run()
メソッドを実装する必要があります。 public void run() {
...
ここに、マーケット フィードなどからの着信データを読み込み、Oracle CEP イベント タイプに変換し、ネットワークの次のコンポーネントにイベントを送信するコードを配置する必要があります。着信データの読み込み方法の詳細については、データ フィード プロバイダのマニュアルを参照してください。サードパーティ JAR ファイルにパッケージ化されているベンダ API に確実にアクセスするための情報については、「アプリケーションからのサードパーティ JAR ファイルへのアクセス」を参照してください。
HelloWorld のサンプルでは、generateHelloMessage()
プライベート メソッドを使用してアダプタ自身が着信データを生成します。これは単に説明目的のためであり、実世界のシナリオではありません。generateHelloMessage()
メソッドには他の一般的なイベント タイプのプログラミング タスクも含まれています。
HelloWorldEvent event = new HelloWorldEvent();
event.setMessage(message);
eventCollection.add(event);
eventSender.sendEvent(eventCollection, null);
HelloWorldEvent
は HelloWorld のサンプルで使用されるイベント タイプです。イベント タイプは JavaBean で実装され、<wlevs:event-type-repository>
タグを使用して EPN アセンブリ ファイルに登録されます。詳細については、「イベント タイプの作成」を参照してください。setMessage()
メソッドではイベントのプロパティが設定されます。通常のアダプタの実装では、このような方法で着信データの特定のプロパティがイベント タイプのプロパティに変換されます。最後に、EventSender.sendEvent()
メソッドにより、この新しいイベントがネットワークの次のコンポーネントに送信されます。
EventSource
が実装されるため、イベントの送信に使用される EventSender
を受け取る setEventSender()
メソッドを実装する必要があります。
public void setEventSender(EventSender sender) { ...
SuspendableBean
が実装される場合は、たとえばアプリケーションがアンデプロイされた場合などにアダプタを停止する suspend()
メソッドを実装する必要があります。public synchronized void suspend() throws Exception { ...
次のコード例は、HelloWorld アプリケーションでイベント シンクとして動作する Spring Bean です。太字部分のコードについては、例の後で説明しています。
package com.bea.wlevs.example.helloworld;
import java.util.List;
import com.bea.wlevs.ede.api.EventRejectedException;
import com.bea.wlevs.ede.api.EventSink;import com.bea.wlevs.event.example.helloworld.HelloWorldEvent;
public class HelloWorldBean implements EventSink {
@SuppressWarnings({ "unchecked" })public void onEvent(List newEvents)
throws EventRejectedException {
for (Object event : newEvents) {if (event instanceof HelloWorldEvent) {
}
HelloWorldEvent helloWorldEvent = (HelloWorldEvent) event;
System.out.println("Message: " + helloWorldEvent.getMessage());
}
}
}
上記の例に示したプログラミングのガイドラインは、以下のとおりです。
HelloWorldEvent
です。import com.bea.wlevs.event.example.helloworld.HelloWorldEvent;
com.bea.wlevs.ede.api.EventSink
インタフェースを実装する必要があります。public class HelloWorldBean implements EventSink {...
EventSink
インタフェースには、実装する必要がある 1 つのメソッド onEvent(java.util.List)
が含まれています。これは、イベントを受信するコールバック メソッドです。メソッドのパラメータは、イベントを送信したコンポーネントから受信された実際のイベントが含まれている List
です。public void onEvent(List newEvents)
HelloWorldEvent
です。コードでは、受信したイベントが実際に HelloWorldEvent
であることがまず確認されます。if (event instanceof HelloWorldEvent) {
HelloWorldEvent helloWorldEvent = (HelloWorldEvent) event;
このイベント タイプは、EPN アセンブリ ファイルで以下のようにコンフィグレーションされた JavaBean です。
<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>
EPN アセンブリ ファイルの作成手順に関する情報については、「EPN アセンブリ ファイルの作成」を参照してください。リファレンス情報については、「Oracle CEP Spring タグ リファレンス」を参照してください。
getXXX()
メソッドを使用して個々のプロパティにアクセスします。この例では、HelloWorldEvent
には message
というプロパティがあります。System.out.println("Message: " + helloWorldEvent.getMessage());
この節に記載されている Oracle CEP API に関する完全な API リファレンス情報については、Javadoc を参照してください。
アダプタ ファクトリ クラスは 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 の完全な詳細については、Javadoc を参照してください。
アダプタ、イベント Bean、および標準の Spring Bean では Java Database Connectivity (JDBC) API を使用して、リレーショナル データベースに含まれているデータにアクセスできます。Oracle CEP では JDBC 3.0 がサポートされています。
コンポーネントで JDBC を使用するには、以下の手順を実行します。
詳細については、「リレーショナル データベースへのアクセスのコンフィグレーション」を参照してください。
DataSource
を使用するか、または DriverManager
をインスタンス化して、通常どおり JDBC API の使用を開始できます。例を示します。OracleDataSource ods = new OracleDataSource();
ods.setURL("jdbc:oracle:thin:user/passwd@localhost:1521/XE");
Connection conn =
ods.getConnection();
追加のプログラミング情報については、「Getting Started with the JDBC API」を参照してください。
以下の節で説明しているとおり、アダプタ、イベント Bean、およびアダプタ ファクトリを EPN アセンブリ ファイルに登録する必要があります。
アプリケーションへの他のコンポーネントの登録を含む、コンフィグレーション ファイルの完全な説明については、「EPN アセンブリ ファイルの作成」を参照してください。
<wlevs:factory>
タグを使用して EPN アセンブリ ファイルにファクトリを登録します。
<wlevs:factory provider-name="myprovider" class="my.Implementation"/>
サービスのプロパティを指定する必要がある場合は、<osgi:service>
タグを使用して、EPN アセンブリ ファイルに OSGI サービスとしてファクトリを登録する必要があります。OSGI サービス レジストリのスコープは Oracle CEP 全体です。このため、指定のサーバにデプロイされた複数のアプリケーションが同じアダプタ ファクトリを使用する場合は、アダプタ ファクトリを OSGI サービスとして登録するのが必ず 1 度きりになるようにします。
エントリを追加して、サービスを 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>
<prop key="type">hellomsgs</prop>
</osgi:service-properties>
<bean class="com.bea.adapter.wlevs.example.helloworld.HelloWorldAdapterFactory" />
</osgi:service>
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:adapter>
の <wlevs:instance-property>
子タグを使用して、アダプタ Bean の静的プロパティを設定することもできます。静的プロパティはアダプタのデプロイ後に動的に変更されないプロパティです。
たとえば、アダプタ クラスに setPort()
メソッドが含まれている場合は、以下のようにポート番号を渡すことができます。
<wlevs:adapter id="myAdapter" provider="myProvider">
<wlevs:instance-property name="port" value="9001" />
</wlevs:adapter>
この節は、アダプタとイベント Bean の両方に当てはまります。簡略化のため、アダプタについてのみ説明します。イベント Bean のコンフィグレーションは <event-bean>
要素で囲みます。
アプリケーションの各アダプタにはデフォルトのコンフィグレーションがあります。特に、以下のものが含まれています。
デフォルトのアダプタ コンフィグレーションは通常ほとんどのアプリケーションで十分に機能します。ただし、このコンフィグレーションを変更する場合は、Oracle CEP アプリケーション バンドルの一部としてデプロイされる XML ファイルを作成する必要があります。後から wlevs.Admin ユーティリティを使用するか、または適切な JMX Mbean を直接操作して、実行時にこのコンフィグレーションを更新できます。
アプリケーションに複数のアダプタが含まれている場合は、各アダプタごとに個別の XML ファイルを作成するか、すべてのアダプタのコンフィグレーションが含まれた単一の XML ファイルを作成するか、またはアプリケーションのすべてのコンポーネント (アダプタ、プロセッサ、およびストリーム) が含まれたファイルを作成できます。開発環境に最も適した方法を選択します。
以下の手順では、アダプタのコンフィグレーション ファイルを作成する主な手順について示します。簡略化のため、この手順ではアプリケーションのすべてのコンポーネントを 1 つの XML ファイルにコンフィグレーションすることを想定しています。
アダプタ コンフィグレーション ファイルを記述する完全な XSD スキーマについては、コンポーネント コンフィグレーション ファイルの XSD スキーマ リファレンスを参照してください。
.xml
拡張子を使用するのであれば任意の名前を付けてかまいません。
コンフィグレーション ファイルのルート要素は <config>
であり、次の手順に示すネームスペース定義を使用します。
<config>
の <adapter>
子要素を追加します。<name>
子要素を使用して各アダプタをユニークに識別します。この名前は、アプリケーションのイベント処理ネットワークを定義する EPN アセンブリ ファイルの <wlevs:adapter>
タグの id
属性の値と一致している必要があります。このように指定することで、Oracle CEP では、このアダプタ コンフィグレーションが適用される EPN アセンブリ ファイル内の特定のアダプタ コンポーネントを認識します。詳細については、「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>
この例では、コンフィグレーション ファイルに firstAdapter
と secondAdapter
という 2 つのアダプタが含まれています。このため、EPN アセンブリ ファイルには同じ識別子を持つアダプタが少なくとも 2 つ登録されている必要があります。
<wlevs:adapterid="firstAdapter" ...
>
...
</wlevs:adapter>
<wlevs:adapterid="secondAdapter"
...>
...
</wlevs:adapter>
警告 : | XML ファイル内の識別子および名前は大文字と小文字が区別されるため、EPN アセンブリ ファイルでコンポーネントの識別子を参照する場合は、必ず同一の大文字と小文字を指定するようにします。 |
<adapter>
要素の monitoring
ブール属性を使用してアダプタのモニタを有効または無効にします。デフォルトでは、モニタは有効です。モニタが有効な場合、アダプタでは実行時統計が収集され、その情報が Mbean に転送されます。<adaptermonitoring="true"
>
<name>firstAdapter</name>
</adapter>
モニタを実際に有効にするには、コンポーネントの管理容易性も有効にしておく必要があります。そうしないと、monitoring
属性を true
に設定しても効果はありません。管理容易性を有効にするには、次の例の太字部分のように、EPN アセンブリ ファイルに登録された対応するアダプタ コンポーネントの manageable
属性を true
に設定します。
<wlevs:adapter id="firstAdapter" provider="hellomsgs" manageable="true"
>
次の 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 monitoring="true">
<name>secondAdapter</name>
</adapter>
</sample:config>
この節は、アダプタとイベント Bean の両方に当てはまります。簡略化のため、アダプタについてのみ説明します。
「アダプタまたはイベント Bean の作成 : 一般的な手順」に示す手順では、プロセッサ、ストリーム、ビジネス ロジック POJO などのイベント ネットワークの他のコンポーネントが含まれている同一のアプリケーション JAR ファイルに、アダプタおよびアダプタ ファクトリがバンドルされることが想定されています。
ただし、アダプタを固有の JAR ファイルにバンドルし、他のアプリケーション バンドルでアダプタを参照する必要がある場合もあります。これは、たとえば、2 つの異なるアプリケーションが同じデータ フィード プロバイダからのデータを読み込み、両方のアプリケーションが同じイベント タイプを使用する場合に役立ちます。この場合、2 つの異なるアプリケーションで実装が重複するよりも、同一のアダプタおよびイベント タイプの実装を共有するほうが有意義です。
アダプタおよびアダプタを使用する異なるバンドル内のアプリケーションをコンフィグレーションする方法には、実際の違いはありません。以下のガイドラインに示すように、コンフィグレーションを配置する場所が異なります。
GlobalAdapter
であると想定します。 GlobalAdapter
バンドルの EPN アセンブリ ファイルで、以下のことを行います。<wlevs:adapter>
タグを使用してアダプタ コンポーネントを宣言しないでください。このタグは、アダプタを実際に使用するアプリケーション バンドルの EPN アセンブリ ファイルで使用します。GlobalAdapter
バンドルに含める場合は、GlobalAdapter
バンドルの MANIFEST.MF
ファイルで JavaBean クラスをエクスポートします。「MANIFEST.MF ファイルの作成」の説明に従って、Export-Package
ヘッダを使用します。GlobalAdapter
バンドルをアセンブルおよびデプロイします。GlobalAdapter
バンドルの) EPN アセンブリ ファイルに OSGI 登録が含まれていますが、OSGI として登録されたアダプタ ファクトリの指定には引き続き provider
属性を使用します。GlobalAdapter
バンドルでイベント タイプをエクスポートした場合は、使用する側のアプリケーションに明示的にインポートする必要があります。これを行うには、「MANIFEST.MF ファイルの作成」の説明に従って、アプリケーション バンドルの MANIFEST.MF ファイルの Import-Package
ヘッダにパッケージを追加します。
この節は、アダプタとイベント Bean の両方に当てはまります。簡略化のため、アダプタについてのみ説明します。
「アダプタまたはイベント Bean のコンフィグレーション」および「コンポーネント コンフィグレーション ファイルの XSD スキーマ リファレンス」で説明しているとおり、アダプタにはデフォルトのコンフィグレーション データがあります。このデフォルトのコンフィグレーションは通常、単純で基本的なアプリケーションでは十分に機能的です。
ただし、XSD スキーマの使用によって、Oracle CEP で提供される組み込みの XML タイプを拡張するアダプタ コンフィグレーション ファイルの新しい XML 形式を指定して、このコンフィグレーションを拡張することもできます。XSD スキーマを拡張することで、任意の数の新しい要素をアダプタ コンフィグレーションに追加できます。新しい要素に name
属性を指定する必要があるほかは制限もほとんどありません。この機能は、XSD スキーマや Java Architecture for XML Binding (JAXB) などの標準の技術に基づいています。
以下の手順は、アダプタのコンフィグレーションを拡張する方法を示します。
詳細については、「XSD スキーマ ファイルの作成」を参照してください。
com.sun.tools.xjc.XJCTask
Ant タスクなどの JAXB バインディング コンパイラを使用して、XSD スキーマ タイプの Java 表現を生成します。ユーザの利便を図るために、この 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
ファイルと同じディレクトリにコピーされます。
詳細については、「Oracle CEP アプリケーションのアセンブル : 主な手順」を参照してください。
<?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>
新しい XSD スキーマ ファイルは wlevs_application_config.xsd
XSD スキーマを拡張し、アダプタの新しいコンフィグレーション要素などの新しいカスタム情報を追加します。カスタム情報には標準の XSD スキーマ構文を使用します。
「拡張された XSD スキーマ ファイルの完全な例」の XSD スキーマを基本テンプレートとして使用し、ニーズに合わせてコンテンツを変更することをお勧めします。新しいコンフィグレーション要素を追加するほか、他の変更点としては、生成された Java コードのパッケージ名の変更やカスタム アダプタの要素名の変更などがあります。カスタム アダプタのみ、またはプロセッサなどの他のコンポーネントをスキーマで使用するかどうかを制御できます。
拡張されたアダプタ コンフィグレーションを記述する 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:schema>
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 ファイルがインポートされます。
<complexType>
XSD 要素を使用して、拡張されたアダプタ コンフィグレーションの XML タイプを記述します。
新しいタイプは、wlevs_application_config.xsd
に定義された AdapterConfig
タイプを拡張する必要があります。AdapterConfig
は ConfigurationObject
を拡張します。次に、必要に応じて、基本のアダプタ コンフィグレーションに新しい要素または属性を追加できます。たとえば、次のタイプ 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>
<config>
という名前にする必要があります。
config
要素の定義では、アプリケーションのコンポーネントに対応する子要素のシーケンスを定義します。要素名には任意の名前を付けることができますが、通常はコンフィグレーションするコンポーネント (adapter
、processor
、stream
) を示している必要があります。
各要素は、明示的に <xs:extension base="base:ConfigurationObject"/>
XSD タグを使用するか、またはそれ自身が ConfigurationObject
を拡張する XML タイプを指定するかによって、ConfigurationObject
XML タイプを拡張する必要があります。ConfigurationObject
XML タイプは、wlevs_base_config.xsd
で定義され、name
という 1 つの属性を定義します。
アダプタ要素のタイプは、この方法の上記の手順で作成されたカスタム タイプである必要があります。
プロセッサまたはストリームに対応する <config>
の子要素には、wlevs_application_config.xsd
に記述されている以下の組み込み XML タイプを使用できます。
DefaultProcessorConfig
—デフォルトのプロセッサ コンフィグレーションの説明については、「複合イベント プロセッサ コンフィグレーション ファイルの概要」を参照してください。DefaultStreamConfig
—デフォルトのストリーム コンフィグレーションの説明については、「ストリーム コンフィグレーション ファイルの概要」を参照してください。<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>
<jxb:schemaBindings>
の <jxb:package>
子要素を使用して、生成された Java コードのパッケージ名を指定します。<xs:annotation>
<xs:appinfo>
<jxb:schemaBindings>
<jxb:package name="com.bea.adapter.wlevs.example.helloworld"/>
</jxb:schemaBindings>
</xs:appinfo>
</xs:annotation>
以下の拡張された 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="stream" 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>
この節は、アダプタとイベント Bean の両方に当てはまります。簡略化のため、アダプタについてのみ説明します。
アプリケーションをデプロイする場合、Oracle CEP では (コンポーネント コンフィグレーション XML ファイルに指定された) 各コンポーネントのコンフィグレーションが Java Architecture for XML Binding (JAXB) 標準を使用して Java オブジェクトにマップされます。各コンポーネントのコンフィグレーション データは単一の 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
—コンフィグレーションがアクティブ化された場合に呼び出されるメソッドを指定します。
アダプタのコードでこのアノテーションを使用する場合のその他の詳細については、「Activate」を参照してください。
com.bea.wlevs.management.Prepare
—コンフィグレーションが準備された場合に呼び出されるメソッドを指定します。
アダプタのコードでこのアノテーションを使用する場合のその他の詳細については、「Prepare」を参照してください。
com.bea.wlevs.management.Rollback
—例外が原因でアダプタが停止した場合に呼び出されるメソッドを指定します。
アダプタのコードでこのアノテーションを使用する場合のその他の詳細については、「ellRollback」を参照してください。
外部データ フィードにアクセスする場合、アダプタはユーザ認証のためログイン資格 (ユーザ名とパスワード) をデータ フィードに渡す必要がある場合があります。
最も簡単で安全性の低い方法は、アダプタの Java コード内に暗号化されていないログイン資格をハードコード化することです。ただし、この方法ではパスワードを暗号化することができず、アダプタの Java コードを再コンパイルせずに後からログイン資格を変更することもできません。
以下の手順では、これらの問題が考慮された異なる方法について説明します。この手順では、データ フィードにアクセスするユーザ名に juliet
、パスワードに superSecret
を想定しています。
EPN アセンブリ ファイルで資格を静的にコンフィグレーションする方が簡単ですが、後から資格が変更された場合は、EPN アセンブリ ファイルに加えられた更新が反映されるようにアプリケーションを再起動する必要があります。アダプタのコンフィグレーションを拡張するとアプリケーションを再起動せずに資格を動的に変更できますが、コンフィグレーションの拡張には、XSD ファイルの作成や、JAXB オブジェクトへのコンパイルなどの追加の手順が含まれます。
<wlevs:adapter>
タグを更新します。特に、ログイン資格のユーザ名とパスワードに対応する 2 つのインスタンス プロパティを追加します。ここでは、クリアテキストのパスワード値を指定します。これは後から暗号化されます。クリアテキストのパスワードを値とする一時的な <password>
要素を追加します。例を示します。<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>
<password>
要素の値を暗号化するために、次の encryptMSAConfig
コマンドを実行します。prompt>ORACLE_CEP_HOME
/ocep_10.3/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
はサーバ インスタンスです。
encryptMSAConfig
コマンドには、encryptMSAConfig.cmd
(Windows) および encryptMSAConfig.sh
(UNIX) の 2 種類があります。
コマンドを実行すると、EPN アセンブリ ファイルの <password>
要素の値が暗号化されます。
<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>
<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:sequence>
<xs:element name="password" type="xs:string"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
詳細な手順については、「アダプタまたはイベント Bean のコンフィグレーションの拡張」を参照してください。
<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>
</adapter>
<password>superSecret</password>
</myExample:config>
<password>
要素の値を暗号化するために、次の encryptMSAConfig
コマンドを実行します。prompt>ORACLE_CEP_HOME
/ocep_10.3/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
はサーバ インスタンスです。
encryptMSAConfig
コマンドには、encryptMSAConfig.cmd
(Windows) および encryptMSAConfig.sh
(UNIX) の 2 種類があります。
「ログイン資格プロパティにアクセスするためのアダプタ コードの更新」を参照してください。
MANIFEST.MF
ファイルを編集し、Import-Package
ヘッダに com.bea.core.encryption
パッケージを追加します。「MANIFEST.MF ファイルの作成」を参照してください。
この節では、拡張されたアダプタのコンフィグレーションからユーザおよびパスワードの値を動的に取得し、com.bea.core.encryption.EncryptionService
API を使用して暗号化されたパスワードを復号化するよう、アダプタの Java コードを更新する方法を説明します。以下のコード例は、「イベント ソースとしてのアダプタおよびイベント Bean クラスのプログラミング : ガイドライン」に示されている HelloWorld アダプタの Java コードに基づいています。
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();
...
}
拡張されたアダプタ コンフィグレーションへのアクセスに関する情報については、「アダプタまたはイベント 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
![]() ![]() ![]() |