アプリケーション開発ガイド

     前  次    新しいウィンドウで目次を開く     
ここから内容の開始

HTTP パブリッシュ/サブスクライブ アダプタの使用と作成

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

 


Oracle CEP での HTTP パブリッシュ/サブスクライブ機能の概要

HTTP パブリッシュ/サブクライブ サーバ (簡略化のため、このマニュアルでは pub-sub サーバとも呼ばれます) は、ブラウザ ベースのクライアントなどの Web クライアントが、すべて HTTP 上での非同期メッセージを使用して、チャネルをサブスクライブし、利用可能なメッセージを受信し、これらのチャネルにメッセージをパブリッシュするためのメカニズムです。チャネルは JMS トピックと同じです。HTTP パブリッシュ/サブスクライブ サーバのその他の概要については、「パブリッシュ/サブスクライブ サーバの使用」を参照してください。

Oracle CEP の各インスタンスには、アプリケーションに HTTP パブリッシュ/サブスクライブ機能を実装するためにプログラマが使用できる pub-sub サーバが含まれています。pub-sub サーバは、Jetty や JDBC データ ソースなどの他のサーバ サービスと共に config.xml ファイルでコンフィグレーションされます。pub-sub サーバは cometd プロジェクトで提案されている Bayeux プロトコルに基づいています。Bayeux プロトコルには、クライアントとサーバが HTTP を介して非同期メッセージで通信するための規約が定義されています。

Oracle CEP では、プログラマは 3 つの組み込み HTTP パブリッシュ/サブクライブ アダプタ (pub-sub アダプタ) を使用して HTTP パブリッシュ/サブクライブ機能にアクセスします。このうち 2 つはローカルおよびリモートのパブリッシュ用であり、1 つはチャネルへのサブスクライブ用です。Oracle CEP では、組み込みの pub-sub アダプタの機能が不十分な場合にチャネルへのパブリッシュおよびサブスクライブのための独自のカスタム pub-sub アダプタを作成するプログラマ向けの pub-sub API も提供されます。たとえば、サブスクライブしたチャネルからの着信メッセージをフィルタ処理する場合や、ローカル チャネルを動的に作成または破棄する場合があります。組み込みの pub-sub アダプタではこれらの機能が提供されないため、このような場合にプログラマは独自のカスタム pub-sub アダプタを実装する必要があります。

3 つの組み込み pub-sub アダプタは他の任意のアダプタと同じように動作します。これらは、イベント処理ネットワークのステージであり、EPN アセンブリ ファイルで定義され、標準のコンポーネント コンフィグレーション ファイルでコンフィグレーションされます。通常のコンフィグレーション オプションには、チャネルの指定、ローカルまたはリモートの pub-sub サーバの指定、およびユーザ認証などが含まれます。

以下の節では、これらの pub-sub アダプタのその他の概念情報について説明しています。

pub-sub サーバは Bayeux プロトコルを理解するすべてのクライアントと通信することができます。プログラマは、以下のフレームワークのいずれかを使用して Web クライアントを開発します。

JSON メッセージとイベント タイプの間の変換

Oracle CEP では着信 JSON メッセージからイベント タイプへの変換、および発信の場合はその逆の変換を自動的に実行できます。ただし、JSON メッセージ (サブスクライブでの HTTP pub-sub アダプタ経由の着信、またはパブリッシュでの HTTP pub-sub アダプタ経由の発信) からイベント タイプへの変換方法、または逆方向の変換方法をカスタマイズする場合は、独自のコンバータ Bean を作成する必要があります。詳細については、「HTTP Pub-Sub メッセージとイベント タイプの間のカスタム コンバータの作成」を参照してください。

独自のコンバータ クラスを指定せずに、メッセージとイベント タイプの間の変換処理が Oracle CEP によって実行されるようにする場合は、以下のことが当てはまります。

ローカル パブリッシュ用の組み込み Pub-Sub アダプタの概要

次の図に、ローカル パブリッシュ用の組み込み pub-sub アダプタが単純なイベント処理ネットワーク内に配置されるしくみを示します。任意のアダプタおよびプロセッサは必須ではなく、これらは単に pub-sub アダプタの他にアプリケーションで使用可能なコンポーネントの例として示されています。

図 5-1 ローカル パブリッシュ用の組み込み Pub-Sub アダプタ

ローカル パブリッシュ用の組み込み Pub-Sub アダプタ

上記の図では、以下のことが行われます。

リモート パブリッシュ用の組み込み Pub-Sub アダプタの概要

次の図に、リモート パブリッシュ用の組み込み pub-sub アダプタが単純なイベント処理ネットワーク内に配置されるしくみを示します。

図 5-2 リモート パブリッシュ用の組み込み Pub-Sub アダプタ

リモート パブリッシュ用の組み込み Pub-Sub アダプタ

上記の図では、以下のことが行われます。

サブスクライブ用の組み込み Pub-Sub アダプタの概要

次の図に、サブスクライブ用の組み込み pub-sub アダプタが単純なイベント処理ネットワーク内に配置されるしくみを示します。任意のプロセッサおよびビジネス POJO は必須ではなく、これらは単に pub-sub アダプタの他にアプリケーションで使用可能なコンポーネントの例として示されています。

図 5-3 サブスクライブ用の組み込み Pub-Sub アダプタ

サブスクライブ用の組み込み Pub-Sub アダプタ

上記の図では、以下のことが行われます。

 


アプリケーションでの組み込み HTTP Pub-Sub アダプタの使用 : 一般的な手順

以下の手順では、Oracle CEP アプリケーションで組み込みの pub-sub アダプタを使用するための一般的な手順について説明します。

注意 : この節では、Oracle CEP アプリケーションが EPN アセンブリ ファイルとコンポーネント コンフィグレーション ファイルを使用してすでに作成済みであり、組み込みの pub-sub アダプタを使用するようにアプリケーションを更新する必要があると想定しています。まだ作成していない場合は、Oracle CEP アプリケーションの作成の概要について、「Oracle Complex Event Processing アプリケーションの作成の概要」を参照してください。
  1. 着信または発信メッセージがイベント タイプに変換される方法をカスタマイズする必要がある場合は、必要に応じてコンバータ Java クラスを作成します。メッセージと特定のイベント タイプの間のマップ プロパティ名に基づいて Oracle CEP で変換が行われるよう指定できるため、この手順は省略できます。
  2. HTTP Pub-Sub メッセージとイベント タイプの間のカスタム コンバータの作成」を参照してください。

  3. Oracle CEP インスタンスに関連付けられたローカルの HTTP pub-sub サーバをローカル パブリッシュ用に使用する場合は、Oracle CEP 管理ツールの Visualizer を使用して、アプリケーションで必要なチャネル パターンで新しいチャネルを作成します。
  4. 詳細については、Visualizer オンライン ヘルプの HTTP パブリッシュ/サブスクライブ サーバのコンフィグレーションを参照してください。

  5. コンポーネント コンフィグレーション ファイルを更新して、アプリケーションに追加される組み込みの pub-sub アダプタをコンフィグレーションします。
  6. HTTP Pub-Sub アダプタのコンフィグレーション」を参照してください。

  7. アプリケーションに追加される各組み込み pub-sub アダプタの宣言を追加して、EPN アセンブリ ファイルを更新します。
  8. EPN アセンブリ ファイルの更新」を参照してください。

  9. Import-Package ヘッダにパッケージ com.bea.core.encryption を追加して、アプリケーションの MANIFEST.MF ファイルを更新します。例を示します。
  10. Import-Package:  
    com.bea.core.encryption
    com.bea.wlevs.adapter.defaultprovider;version="2.0.0.0",
    ...

    マニフェスト ファイルの追加情報については、「MANIFEST.MF ファイルの作成」を参照してください。

HTTP Pub-Sub メッセージとイベント タイプの間のカスタム コンバータの作成

メッセージ (サブスクライブでの HTTP pub-sub アダプタ経由の着信、またはパブリッシュでの HTTP pub-sub アダプタ経由の発信) からイベント タイプへの変換方法、または逆方向の変換方法をカスタマイズする場合は、独自のコンバータ Bean を作成する必要があります。

着信 HTTP pub-sub メッセージ用のカスタム コンバータ Bean では、com.bea.wlevs.adapters.httppubsub.api.InboundMessageConverter インタフェースを実装する必要があります。このインタフェースには 1 つのメソッドが含まれています。

public List convert(JSONObject message) throws Exception;

message パラメータは着信 HTTP pub-sub メッセージに対応します。戻り値は、イベント処理ネットワークの次のステージに渡されるイベントの List です。着信メッセージは JSON 形式であることが想定されます。

発信 HTTP pub-sub メッセージ用のカスタム コンバータ Bean では、com.bea.wlevs.adapters.httppubsub.api.OutboundMessageConverter インタフェースを実装する必要があります。このインタフェースには 1 つのメソッドが含まれています。

public List<JSONObject> convert(Object event) throws Exception;

パラメータは EPN のソース ノードから送られ、発信 HTTP pub-sub アダプタで受信されたイベントに対応します。戻り値は、JSON メッセージの List です。

これらの API の完全な説明については、Javadoc を参照してください。

次の例は、InboundMessageConverterOutboundMessageConvert の両方を実装するカスタム コンバータ Bean の Java ソースを示します。この Bean は着信および発信の両方の HTTP pub-sub アダプタで使用できます。

package com.sample.httppubsub;
import com.bea.wlevs.adapters.httppubsub.api.InboundMessageConverter;
import com.bea.wlevs.adapters.httppubsub.api.OutboundMessageConverter;
import com.bea.httppubsub.json.JSONObject;
import java.util.List;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class TestConverter implements InboundMessageConverter, OutboundMessageConverter {
    public List convert(JSONObject message) throws Exception {
List eventCollection = new ArrayList();
PubsubTestEvent event = new PubsubTestEvent();
event.setMessage("From TestConverter: " + message);
eventCollection.add(event);
return eventCollection;
}
    public List<JSONObject> convert(Object event) throws Exception {
List<JSONObject> list = new ArrayList<JSONObject>(1);
Map map = new HashMap();
map.put("message", ((PubsubTestEvent) event).getMessage());
list.add(new JSONObject(map));
return list;
}
}

HTTP Pub-Sub アダプタのコンフィグレーション

組み込み pub-sub アダプタのコンフィグレーションは、プロセッサやストリームなどのイベント処理ネットワークの他のコンポーネントをコンフィグレーションする場合と同じように、それぞれのコンフィグレーション ファイルで行います。これらのコンフィグレーション ファイルの概要については、「コンポーネント コンフィグレーション ファイル」を参照してください。

以下のコンフィグレーション ファイルは、3 つの組み込み pub-sub アダプタをそれぞれコンフィグレーションする場合の完全な例を示します。例の後に示す手順では、例を使用して独自のファイルを作成する方法を示します。

<?xml version="1.0" encoding="UTF-8"?>
<n1:config 
xsi:schemaLocation="http://www.bea.com/ns/wlevs/config/application wlevs_application_config.xsd"
xmlns:n1="http://www.bea.com/ns/wlevs/config/application"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <http-pub-sub-adapter>
<name>remotePublisher</name>
<server-url>http://myhost.com:9102/pubsub</server-url>
<channel>/channel1</channel>
<event-type>com.mycompany.httppubsub.PubsubEvent</event-type>
<user>wlevs</user>
<password>wlevs</password>
</http-pub-sub-adapter>
    <http-pub-sub-adapter>
<name>localPublisher</name>
<server-context-path>/pubsub</server-context-path>
<channel>/channel2</channel>
</http-pub-sub-adapter>
    <http-pub-sub-adapter>
<name>remoteSubscriber</name>
<server-url>http://myhost.com:9102/pubsub</server-url>
<channel>/channel3</channel>
<event-type>com.mycompany.httppubsub.PubsubEvent</event-type>
</http-pub-sub-adapter>
</n1:config>

以下の手順では、アプリケーションの組み込み pub-sub アダプタをコンフィグレーションするための主な手順を示します。簡略化のため、この手順ではアプリケーションのすべてのコンポーネントが 1 つのコンフィグレーション XML ファイルにコンフィグレーションされ、アプリケーションのこのファイルがすでに作成されていると想定します。

組み込み pub-sub アダプタのコンフィグレーションを記述する完全な XSD スキーマについては、コンポーネント コンフィグレーション ファイルの XSD スキーマ リファレンスを参照してください。

  1. 任意の XML エディタを使用してコンフィグレーション XML ファイルを開きます。
  2. コンフィグレーションする必要のある各組み込み pub-sub アダプタについて、<config> ルート要素の <http-pub-sub-adapter> 子要素を追加します。<name> 子要素を使用してユニークに識別します。この name 値は、後で、アプリケーションのイベント処理ネットワークを定義する EPN アセンブリ ファイルにある <wlevs:adapter> タグの id 属性として使用します。このように指定することで、Oracle CEP では、このアダプタ コンフィグレーションが適用される EPN アセンブリ ファイル内の特定のアダプタを認識します。
  3. たとえば、コンフィグレーション ファイルにはすでにプロセッサが含まれており (簡略化のため内容は省略します)、3 つの組み込み pub-sub アダプタの各インスタンスをコンフィグレーションする必要があると想定します。更新されたファイルは、以下のようになります。アダプタのコンフィグレーションの詳細については、後述します。

    <?xml version="1.0" encoding="UTF-8"?>
    <n1:config 
    xsi:schemaLocation="http://www.bea.com/ns/wlevs/config/application wlevs_application_config.xsd"
    xmlns:n1="http://www.bea.com/ns/wlevs/config/application"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <processor>
    ...
    </processor>
        <http-pub-sub-adapter>
    <name>remotePublisher</name>
    ...
    </http-pub-sub-adapter>
        <http-pub-sub-adapter>
    <name>remoteSubscriber</name>
    ...
    </http-pub-sub-adapter>
        <http-pub-sub-adapter>
    <name>localPublisher</name>
    ...
    </http-pub-sub-adapter>
    </n1:config>
  4. (パブリッシュおよびサブスクライブ用の) 各リモート pub-sub アダプタについて、<http-pub-sub-adapter><server-url> 子要素を追加して、Oracle CEP アプリケーションでパブリッシュまたはサブスクライブされるリモート HTTP pub-sub サーバの URL をそれぞれ指定します。リモート pub-sub サーバには、Oracle CEP の別のインスタンス、WebLogic Server インスタンス、または任意のサードパーティ pub-sub サーバを指定できます。例を示します。
  5.     <http-pub-sub-adapter>
    <name>remotePublisher</name>
    <server-url>http://myhost.com:9102/pubsub</server-url>
    ...
    </http-pub-sub-adapter>

    この例では、remotePublisher アダプタがイベントをパブリッシュするリモート HTTP pub-sub サーバの URL は http://myhost.com:8102/pubsub です。

  6. パブリッシュ用の各ローカル pub-sub アダプタについて、<server-context-path> 要素を追加して、現在の Oracle CEP アプリケーションをホストする Oracle CEP インスタンスに関連付けられたローカル HTTP pub-sub サーバのパスを指定します。
  7. デフォルトでは、各 Oracle CEP サーバはパス /pubsub の HTTP pub-sub サーバでコンフィグレーションされていますが、新しいローカル HTTP pub-sub サーバを作成した場合や、デフォルトのコンフィグレーションを変更した場合は、サーバの config.xml ファイルの <http-pubsub> 要素の <path> 子要素の値を指定します。例を示します。

        <http-pub-sub-adapter>
    <name>localPublisher</name>
    <server-context-path>/pubsub</server-context-path>
    ...
    </http-pub-sub-adapter>
  8. ローカルまたはリモート、パブリッシュまたはサブスクライブに関わらず、すべての pub-sub アダプタについて <channel> 子要素を追加して、pub-sub アダプタがパブリッシュまたはサブスクライブする適切なチャネルを指定します。例を示します。
  9.     <http-pub-sub-adapter>
    <name>localPublisher</name>
    <server-context-path>/pubsub</server-context-path>
    <channel>/channel2</channel>
    </http-pub-sub-adapter>

    この例では、pub-sub アダプタ localPublisher はパターン /channel2 のローカル チャネルにパブリッシュします。

  10. サブスクライブ用のすべての pub-sub アダプタについて、着信メッセージがマップされる JavaBean を指定する <event-type> 要素を追加します。この要素はすべてのサブスクライブ用アダプタで指定する必要があります。実行時、Oracle CEP では着信メッセージのキーと値のペアを使用して、メッセージ データが指定のイベント タイプにマップされます。
  11. パブリッシュされるイベントのタイプを <event-type> 要素で指定されたタイプのみに制限する必要がある場合は、必要に応じてパブリッシュ用の pub-sub アダプタで <event-type> 要素を使用することもできます。それ以外の場合は、pub-sub アダプタに送信されたすべてのイベントがパブリッシュされます。例を示します。

        <http-pub-sub-adapter>
    <name>remoteSubscriber</name>
    <server-url>http://myhost.com:9102/pubsub</server-url>
    <channel>/channel3</channel>
    <event-type>com.mycompany.httppubsub.PubsubEvent</event-type>
    </http-pub-sub-adapter>

    このイベント タイプが、<wlevs:event-type-repository> 要素の子要素として指定することによって EPN アセンブリ ファイルに登録されていることを必ず確認してください。

  12. 最後に、Oracle CEP アプリケーションがパブリッシュする HTTP pub-sub サーバでユーザ認証が要求される場合は、<user> および <password> (または <encrypted-password>) 要素を追加してユーザ名とパスワードまたは暗号化されたパスワードを指定します。例を示します。
  13.     <http-pub-sub-adapter>
    <name>remotePublisher</name>
    <server-url>http://myhost.com:9102/pubsub</server-url>
    <channel>/channel1</channel>
    <event-type>com.mycompany.httppubsub.PubsubEvent</event-type>
    <user>wlevs</user>
    <password>wlevs</password>
    </http-pub-sub-adapter>

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

イベント処理ネットワークの各 pub-sub アダプタについて、ネットワークを記述する EPN アセンブリ ファイルでは対応する <wlevs:adapter> タグを追加する必要があります。provider 属性を使用して、アダプタがパブリッシュまたはサブスクライブのどちらに使用されるかを指定します。以下のガイドラインに従います。

EPN の他のステージと同様に、<wlevs:adapter> タグにリスナを追加して pub-sub アダプタをイベント処理ネットワークに統合します。通常、サブスクライブ用 pub-sub アダプタは (メッセージを受信するため) EPN の最初のステージであり、パブリッシュ用 pub-sub アダプタは (メッセージを送信するため) より後方のステージです。ただし、pub-sub アダプタが配置されるネットワーク内の場所は、独自の Oracle CEP アプリケーションの要件に応じて定義されます。

また、pub-sub アダプタで使用されるイベント タイプが <wlevs:event-type-repository> タグを使用してイベント タイプ リポジトリに登録されていることを必ず確認してください。

以下の EPN ファイルの例は、ローカルおよびリモートのパブリッシュ用の 2 つの組み込み pub-sub アダプタが含まれたイベント処理ネットワークを示します。例の後に説明があります。

<?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.xsd">
    <wlevs:event-type-repository>
<wlevs:event-type type-name="com.mycompany.httppubsub.PubsubEvent">
<wlevs:class>com.mycompany.httppubsub.PubsubEvent</wlevs:class>
</wlevs:event-type>
</wlevs:event-type-repository>
    <wlevs:adapter id="receiveFromFeed"
class="com.mycompany.httppubsub.ReceiveFromFeed">
</wlevs:adapter>
    <wlevs:processor id="pubsubProcessor" />
    <wlevs:adapter id="remotePublisher" provider="httppub"/>
    <wlevs:adapter id="localPublisher" provider="httppub"/>
    <wlevs:stream id="feed2processor">
<wlevs:source ref="receiveFromFeed"/>
<wlevs:listener ref="pubsubProcessor"/>
</wlevs:stream>
    <wlevs:stream id="pubsubStream">
<wlevs:listener ref="remotePublisher"/>
<wlevs:listener ref="localPublisher"/>
<wlevs:source ref="pubsubProcessor"/>
</wlevs:stream>
</beans>

上記の例では、以下のことが行われます。

以下の EPN ファイルの例は、サブスクライブ用の組み込み pub-sub アダプタが含まれたイベント処理ネットワークを示します。例の後に説明があります。

<?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.xsd">
    <wlevs:event-type-repository>
<wlevs:event-type type-name="com.mycompany.httppubsub.PubsubEvent">
<wlevs:class>com.mycompany.httppubsub.PubsubEvent</wlevs:class>
</wlevs:event-type>
</wlevs:event-type-repository>
    <wlevs:adapter id="remoteSubscriber" provider="httpsub">
<wlevs:listener ref="myEventBean"/>
</wlevs:adapter>
    <bean id="myEventBean"
class="com.mycompany.httppubsub.MyEventBean">
</bean>
    <wlevs:stream id="pubsubStream" manageable="true">
<wlevs:listener>
<bean id="mySink"
class="com.mycompany.httppubsub.MySink"/>
</wlevs:listener>
<wlevs:source ref="myEventBean"/>
</wlevs:stream>
</beans>

上記の例では、以下のことが行われます。


  ページの先頭       前  次