この章では、アダプタからログイン資格証明を渡す方法を含むアプリケーションと外部コンポーネント間のイベント・データを送受信するための独自のOracle Event Processingアダプタの実装および構成方法について説明します。
イベント・データをOracle Event Processingに付属のアダプタでサポートされない外部コンポーネントと交換するアダプタを開発できます。付属のアダプタの詳細は、第11章「Java Message Serviceの統合」、第12章「HTTPパブリッシュ・サブスクライブ・サーバーの統合」および第21章「ロード・ジェネレータおよびcsvgenアダプタを使用したアプリケーションのテスト」を参照してください。
この章の内容は次のとおりです。
イベント・データをOracle Event Processingに付属のアダプタでサポートされない外部コンポーネントと交換するカスタム・アダプタを開発できます。
着信データの形式およびアダプタ・コードで変換に使用される技術に応じて、様々なタイプのアダプタを作成できます。最も一般的なタイプのアダプタは、以下のとおりです。
Reuters、Wombat、またはBloombergなどのデータ・ベンダーAPIを使用します。
TIBCO Rendezvousなどのメッセージング・システムを使用します。
顧客独自のデータ・プロトコルへのソケット接続を使用します。
作成するアダプタは、データを受信するEPNの先頭か、または他の場所でイベント・データを送信するEPNの最後に配置されます。
カスタム・アダプタを使用して、次を実行できます。
外部コンポーネントからrawイベント・データを受信し、アプリケーションでイベントを処理するために使用できるイベント・タイプ・インスタンスにデータを変換します。必要に応じて、実装によって外部コンポーネントで自身を認証できます。
アダプタの主な役割の1つには、マーケット・データ・フィードなどの着信データをOracle Event Processingイベントに変換する作業があります。これらのイベントはその後、EPNの他のコンポーネントに渡されます。
イベント処理ネットワーク内からイベント・タイプ・インスタンスを受信し、データを外部コンポーネントで使用できる形式に変換します。アプリケーションの出口ポイントとして、アダプタはEPNの別のステージからイベントを受信し、外部アプリケーションで読取り可能な形式にイベントのデータを変換し、それらのデータを送信します。
Javaでアダプタ・クラスを作成して、アダプタを実装します。アダプタ・クラスは、イベントを作成、送信または受信するOracle Event Processingインタフェースを実装します。詳細は、15.2項「カスタム・アダプタの実装」を参照してください。
EPNアセンブリ・ファイルで構成して、アダプタをEPNに追加します。コンポーネント構成ファイルでアダプタを構成して、実行時に編集可能な構成設定をさらに指定できます。詳細は、15.5項「カスタム・アダプタの構成」を参照してください。
次のリストのサンプルには、ソースおよびシンク・サンプル・コードが含まれます。
外国為替取引(FX)サンプルには、通貨データ・フィードからデータを読み込み、ネットワークの次のコンポーネントであるプロセッサに特定のイベント・タイプの形式でデータを渡す3つのアダプタが含まれています。詳細は、2.8項「外国為替取引(FX)サンプル」を参照してください。
Oracle Spatialサンプルには、ファイルからデータを読み取り、データからイベント・タイプ・インスタンスを作成するアダプタが含まれます。詳細は、2.7項「Oracle Spatialサンプル」を参照してください。
統合する外部コンポーネントと通信できるJavaコードを書き込み、カスタム・アダプタを実装します。アダプタ・クラス実装には、EPNのアダプタが配置される場所に応じて、イベント・タイプ・インスタンスを受信または送信するコードも含まれます。
実装では、Oracle Event Processing APIからいくつかのクラスを使用する可能性があります。それらのJavadocリファレンスは、Oracle Fusion Middleware Oracle Event Processing Java APIリファレンスに関する項を参照してください。サンプル・コードは、例15-1「入力アダプタ・クラスの上位レベル・ビュー」を参照してください。
カスタム・アダプタを作成する場合に通常実行する上位レベルの手順を次に示します。
アダプタで使用する外部コンポーネントと通信できるJavaクラスを実装します。コードの詳細は、外部コンポーネントがアダプタで処理するデータを送信または受信する方法に大きく依存します。
アダプタで一時停止および再開をサポートする場合(アンデプロイおよびデプロイする場合など)、これらのイベントを処理するインタフェースを実装できます。詳細は、15.3.2項「アダプタ・イベント処理の一時停止および再開」を参照してください。
アダプタのスレッドを微調整して、アプリケーションのスケーラビリティを向上できます。詳細は、15.3.1項「マルチスレッド・アダプタでのスケーラビリティの向上」を参照してください。
Javaコードで、イベント・タイプ・インスタンスの送信または受信をサポートするために必要なインタフェースを実装します。
アダプタが入力アダプタのように着信rawイベント・データから作成したイベントなどのイベントを送信する場合、イベント・ソースとして実装できます。詳細は、16.2.2項「イベント・ソースの実装」を参照してください。
アダプタがEPNの他のステージからイベントを受信する場合、イベント・シンクとして実装します。詳細は、16.2.1項「イベント・シンクの実装」を参照してください。
入力アダプタのようにカスタム・アダプタがデータ・フィード・プロバイダで自身を認証する必要がある場合、ログイン資格証明をイベント・データを提供するコンポーネントに渡すJavaロジックを書き込みます。詳細は、15.4項「アダプタからデータ・フィード・プロバイダへのログイン資格証明の受け渡し」を参照してください。
オプションとして、ファクトリ・クラスを作成します。複数のアプリケーションがカスタム・アダプタのインスタンスを使用する場合のみ、この手順を実行する必要があります。詳細は、15.6項「カスタム・アダプタ・ファクトリの作成」を参照してください。
複数のアプリケーションで共有できるようにカスタム・アダプタを固有のJARファイルにバンドルする必要がある場合は、23.2.4.1項「カスタム・アダプタの固有のバンドルでのアセンブリ方法」を参照してください。
EPNアセンブリ・ファイルで構成して、アダプタをイベント処理ネットワークに追加します。詳細は、15.5項「カスタム・アダプタの構成」を参照してください。
この項では、ファイルからrawイベント・データを取得し、データをイベントに変換し、イベントをEPNのダウンストリーム・ステージに送信する入力アダプタの上位レベルの説明について説明します。
ここのコードは、Oracle Spatialサンプル・アプリケーションから引用しています。完全な実装は、ソース・コードを必ず参照してください。詳細は、2.7項「Oracle Spatialサンプル」を参照してください。
例15-1「入力アダプタ・クラスの上位レベル・ビュー」は実世界のシナリオではありませんが、入力アダプタの基本フローを示しています。このクラスで実行される処理の概要を次に示します。
依存関係インジェクションを介して、このクラスは、次を含む処理の一部を実行するクラスのインスタンスにインジェクトされます。
アダプタの構成で指定されたイベント・タイプのインスタンスを取得するために使用するEventTypeRepositoryインスタンス(setEventTypeRepositoryメソッドに組み込まれています)。
生成するイベントを送信するために使用するStreamSenderインスタンス(setEventSenderメソッドに組み込まれています)。
setPathおよびsetEventTypeメソッドを介して、クラスはアダプタのEPNアセンブリ・ファイル構成で指定されたプロパティ値に組み込まれます。
RunnableBeanインタフェースを実装する場合、このクラスは、アダプタの実際の処理(rawイベント・データの取得、イベント・タイプ・インスタンスへのデータの解析およびダウンストリームEPNステージへの新しいイベントの送信)を実行するrun()メソッド実装を提供します。
例15-1 入力アダプタ・クラスの上位レベル・ビュー
package com.oracle.cep.sample.spatial;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.bea.wlevs.ede.api.EventProperty;
import com.bea.wlevs.ede.api.EventRejectedException;
import com.bea.wlevs.ede.api.EventType;
import com.bea.wlevs.ede.api.EventTypeRepository;
import com.bea.wlevs.ede.api.RunnableBean;
import com.bea.wlevs.ede.api.StreamSender;
import com.bea.wlevs.ede.api.StreamSink;
import com.bea.wlevs.ede.api.StreamSource;
import com.bea.wlevs.util.Service;
import java.lang.RuntimeException;
public class BusStopAdapter implements RunnableBean, StreamSource, StreamSink
{
static final Log s_logger =
LogFactory.getLog("BusStopAdapter");
private String m_filePath;
private String m_eventTypeName;
private EventType m_eventType;
private StreamSender m_eventSender;
private boolean m_stopped;
private int m_repeat = 1;
private EventTypeRepository m_etr = null;
public BusStopAdapter()
{
super();
}
/**
* Called by the server to pass in the path
* to the file with bus stop data.
*
* @param path The value specified for the path
* property in the adapter's configuration
* in the EPN assembly file.
*/
public void setPath(String path) throws RuntimeException
{
// Code to create a File instance from the path. This
// File object will be used to retrieve event data
// from the file.
}
/**
* Called by the server to pass in the name of the event
* type to which event data should be bound.
*
* @param path The value specified for the path
* property in the adapter's configuration
* in the EPN assembly file.
*/
public void setEventType(String typ)
{
m_eventTypeName = typ;
}
/**
* Called by the server to set an event type
* repository instance that knows about event
* types configured for this application.
*
* This repository instance will be used to retrieve an
* event type instance that will be populated
* with event data retrieved from the event data file.
*
* @param etr The event repository.
*/
@Service(filter = EventTypeRepository.SERVICE_FILTER)
public void setEventTypeRepository(EventTypeRepository etr)
{
m_etr = etr;
}
/**
* Executes to retrieve raw event data and
* create event type instances from it, then
* sends the events to the next stage in the
* EPN.
*
* This method, implemented from the RunnableBean
* interface, executes when this adapter instance
* is active.
*/
public void run()
{
if (m_etr == null)
{
throw new RuntimeException("EventTypeRepository is not set");
}
// Get the event type from the repository by using
// the event type name specified as a property of
// this adapter in the EPN assembly file.
m_eventType = m_etr.getEventType(m_eventTypeName);
if (m_eventType == null)
{
throw new RuntimeException("EventType(" +
m_eventType + ") is not found.");
}
BufferedReader reader = null;
System.out.println("Sending " + m_eventType +
" from " + m_filePath);
while ((m_repeat != 0) && (!m_stopped))
{
try
{
reader = new BufferedReader(new FileReader(m_filePath));
} catch (Exception e)
{
m_stopped = true;
break;
}
while (!isStopped())
{
try
{
// Create an object and assign to it
// an event type instance generated
// from event data retrieved by the
// reader.
Object ev = null;
ev = readLine(reader);
if (ev == null)
{
reader.close();
break;
}
// Send the newly created event type instance
// to a downstream stage that is
// listening to this adapter.
m_eventSender.sendInsertEvent(ev);
} catch (Exception e)
{
m_stopped = true;
break;
}
}
}
}
/**
* Called by the server to pass in a
* sender instance that will be used to
* send generated events to a downstream
* stage.
*
* @param sender A sender instance.
*/
public void setEventSender(StreamSender sender)
{
m_eventSender = sender;
}
/**
* Returns true if this adapter instance has
* been suspended, such as because an exception
* occurred.
*/
private synchronized boolean isStopped()
{
return m_stopped;
}
/**
* Reads data from reader, creating event type
* instances from that data. This method is
* called from the run() method.
*
* @param reader Raw event data from a file.
* @return An instance of the event type specified
* as a property of this adapter.
*/
protected Object readLine(BufferedReader reader) throws Exception
{
// Code to read raw event data and return an event type
// instance from it.
}
/**
* Called by the server to pass in an
* insert event received from an
* upstream stage in the EPN.
*/
@Override
public void onInsertEvent(Object event) throws EventRejectedException
{
// Code to begin executing the logic needed to
// convert incoming event data to event type instances.
}
}
特定のスレッドおよび処理の特性を実装または構成してアダプタの処理を管理する方法を向上できます。
スケーラビリティを向上するには、たとえば、アダプタのマルチスレッドを構成できます。EPNが一時停止または再開する場合によく応答するロジックを実行するには、Oracle Event Processing APIで使用できるインタフェースを実装できます。
詳細は、次の項を参照してください。
1つ以上のスレッドを使用してデータ・ソースから読み取るためにアダプタを実装または構成できます。たとえば、イベント処理の負荷が高い場合、マルチスレッド・アダプタによってパフォーマンスが向上する可能性があります。
アダプタがシングルスレッドであると、イベント順序が保証されることに注意してください。イベント順序はマルチスレッド・アダプタで保証されません。
スレッドを管理する最も簡単な方法はワーク・マネージャを使用してアダプタを構成することです。ワーク・マネージャは、アプリケーションで処理の実行に優先順位を付けることができるサーバー機能です。アダプタだけが使用する専用のワーク・マネージャを指定するか、他のアダプタなどのいくつかのコンポーネントでワーク・マネージャを共有できます。
詳細は、次を参照してください:
com.bea.wlevs.ede.api.RunnableBeanインタフェースを実装して、シングルスレッド・アダプタも作成できます。run()メソッドを実装する場合、着信データを読み取るコードを配置し、Oracle Event Processingイベント・タイプ・インスタンスに変換して、イベントをEPNの次のステージに送信します。このインタフェースの詳細なリファレンスは、Oracle Fusion Middleware Oracle Event Processing Java APIリファレンスに関する項を参照してください。
アダプタでサーバーによる処理の一時停止または再開をサポートするよう、アダプタのJavaクラスを実装できます。たとえば、アダプタが含まれるイベント処理ネットワークが一時停止する場合、アダプタのイベントの処理を停止できます。EPNの処理を再開すると、アダプタの他のコードはイベントの処理を再開できます。これらの状況のサポートは、処理を実行するためにアダプタで取得するリソースの管理を意味する場合もあります。
一時停止または再開をサポートするには、アダプタはOracle Event Processing APIのインタフェースを実装します。これらには、表15-1「アダプタの一時停止および再開をサポートするインタフェース」に示されているインタフェースが含まれます。
表15-1 アダプタの一時停止および再開をサポートするインタフェース
| インタフェース | 説明 |
|---|---|
|
|
これを実装して、EPNを一時停止する場合に実行するロジックを提供します。インタフェースの一時停止メソッド、リソースを一時停止したり、イベントの処理を停止する場合があります。 |
|
|
これを実装して、EPNが処理を再開する場合に実行するロジックを提供します。 |
これらのインタフェースの詳細なリファレンスは、Oracle Fusion Middleware Oracle Event Processing Java APIリファレンスに関する項を参照してください。
外部データ・フィードにアクセスする場合、アダプタはユーザー認証のためユーザー名とパスワードなどのログイン資格をデータ・フィードに渡す必要がある場合があります。
最も簡単で安全性の低い方法は、アダプタのJavaコード内に暗号化されていないログイン資格証明をハード・コード化することです。ただし、この方法ではパスワードを暗号化することができず、コードを再コンパイルせずに後からログイン資格証明を変更することもできません。
次の手順では、これらの問題が考慮された異なる方法について説明します。この手順では、データ・フィードにアクセスするユーザー名にjuliet、パスワードにsuperSecretを想定しています。
ログイン資格証明をEPNアセンブリ・ファイルで静的に構成するか、アダプタの構成を拡張して動的に構成するかを最初に指定する必要があります。EPNアセンブリ・ファイルで資格証明を静的に構成する方が簡単ですが、後から資格証明が変更された場合は、EPNアセンブリ・ファイルへの更新が反映されるようにアプリケーションを再起動する必要があります。アダプタの構成を拡張する方法では、アプリケーションを再起動せずに資格証明を動的に変更できますが、構成の拡張には、XSDファイルの作成や、JAXBオブジェクトへのコンパイルなどの追加の手順が必要になります。
この項では次について説明します:
詳細は、第26章「コンポーネント構成の拡張」を参照してください。
この項では、EPNアセンブリ・ファイルで静的に構成したログイン資格証明を渡す方法について説明します。
データ・フィード・プロバイダへ静的ログイン資格証明を受け渡すには、次の手順を実行します。
コマンド・ウィンドウを開き、3.2項「開発環境の設定」の説明に従って、環境を設定します。
アプリケーションのEPNアセンブリ・ファイルがあるディレクトリに移動します。
EPNアセンブリXMLファイルを編集して、アダプタを宣言している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>
EPNアセンブリ・ファイルを保存します。
コマンド・プロンプトで、EPNアセンブリ・ファイルのpassword要素の値を暗号化するためにencryptMSAConfigコマンドを実行します。
prompt> ORACLE_CEP_HOME/ocep_11.1/bin/encryptMSAConfig . epn_assembly_file aesinternal.dat_file
このコマンドの内容は以下のとおりです。
ORACLE_CEP_HOMEは、d:\oracle_cepなどのOracle Event Processingのインストール先のメイン・ディレクトリです。
2番目の引数はEPNアセンブリ・ファイルが含まれているディレクトリです。この手順では実際にそのディレクトリに移動しているため、例では「.」と示されています。
epn_assembly_fileパラメータはEPNアセンブリ・ファイルの名前です。
最後に、aesinternal.dat_fileパラメータは、ドメインに関連付けられている.aesinternal.datファイルの場所です。デフォルトでは、このファイルはDOMAIN_DIR/servernameディレクトリにあります。DOMAIN_DIRは、/oracle_cep/user_projects/domains/mydomainなどのドメイン・ディレクトリであり、servernameはサーバー・インスタンスです。
詳細は、『Oracle Fusion Middleware Oracle Event Processing管理者ガイド』のencryptMSAConfigコマンドライン・ユーティリティに関する項を参照してください。
コマンドを実行すると、EPNアセンブリ・ファイルのpassword要素の値が暗号化されます。
構成されたログイン資格証明のプロパティにアクセスしてパスワードを復号化するよう、アダプタのJavaコードを更新します。
15.4.3項「実行時のログイン資格証明へのアクセス方法」を参照してください。
アプリケーションのMANIFEST.MFファイルを編集し、Import-Packageヘッダーにcom.bea.core.encryptionパッケージを追加します。23.2.2.1項「MANIFEST.MFファイルの作成」を参照してください。
アプリケーションを通常通り再アセンブルしてデプロイします。第23章「Oracle Event Processingアプリケーションのアセンブルおよびデプロイ」を参照してください。
この項では、アダプタの構成を拡張して動的に構成したログイン資格証明を渡す方法について説明します。
データ・フィード・プロバイダへ動的ログイン資格証明を受け渡すには、次の手順を実行します。
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>
詳細は、第26章「コンポーネント構成の拡張」を参照してください。
コマンド・ウィンドウを開き、3.2項「開発環境の設定」の説明に従って、環境を設定します。
アダプタのコンポーネント構成XMLファイルがあるディレクトリに移動します。
構成拡張で定義した<user>および<password>要素を使用して必要なログイン資格証明を追加して、このコンポーネント構成XMLファイルを更新します。ここで、cleartextのパスワード値を指定します。後からこの値は暗号化されます。例:
<?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>
アダプタの構成ファイルを保存します。
アダプタ構成ファイルのpassword要素の値を暗号化するためにencryptMSAConfigコマンドを実行します。
prompt> ORACLE_CEP_HOME/ocep_11.1/bin/encryptMSAConfig . adapter_config_file aesinternal.dat_file
このコマンドの内容は以下のとおりです。
ORACLE_CEP_HOMEは、d:\oracle_cepなどのOracle Event Processingのインストール先のメイン・ディレクトリです。
2番目の引数はアダプタの構成ファイルが含まれているディレクトリです。この手順では実際にそのディレクトリに移動しているため、例では「.」と示されています。
adapter_config_fileパラメータは、アダプタ構成ファイルの名前です。
最後に、aesinternal.dat_fileパラメータは、ドメインに関連付けられている.aesinternal.datファイルの場所です。デフォルトでは、このファイルはDOMAIN_DIR/servernameディレクトリにあります。DOMAIN_DIRは、/oracle_cep/user_projects/domains/mydomainなどのドメイン・ディレクトリであり、servernameはサーバー・インスタンスです。
詳細は、『Oracle Fusion Middleware Oracle Event Processing管理者ガイド』のencryptMSAConfigコマンドライン・ユーティリティに関する項を参照してください。
コマンドを実行すると、password要素の値が暗号化されます。
構成されたログイン資格証明のプロパティにアクセスしてパスワードを復号化するよう、アダプタのJavaコードを更新します。
15.4.3項「実行時のログイン資格証明へのアクセス方法」を参照してください。
アプリケーションのMANIFEST.MFファイルを編集し、Import-Packageヘッダーにcom.bea.core.encryptionパッケージを追加します。23.2.2.1項「MANIFEST.MFファイルの作成」を参照してください。
アプリケーションを通常通り再アセンブルしてデプロイします。第23章「Oracle Event Processingアプリケーションのアセンブルおよびデプロイ」を参照してください。
この項では、拡張されたアダプタ構成から動的にユーザーとパスワードの値を取得し、com.bea.core.encryption.EncryptionService APIを使用して暗号化されたパスワードを復号化するようにカスタム・アダプタのJavaコードを更新する方法について説明します。
実行時にログイン資格証明プロパティにアクセスするには、次の手順を実行します。
暗号化されたパスワードの復号化に必要な追加の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();
}
拡張されたアダプタ構成へのアクセスに関する情報は、26.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を使用してこれらの資格証明をデータ・フィード・プロバイダに渡します。
カスタム・アダプタを作成する場合、EPNアセンブリ・ファイルで構成して、EPNに追加できます。特定の機能のランタイム構成変更をサポートするため、アダプタ構成をコンポーネント構成ファイルに追加することもできます。
詳細は、次の項を参照してください。
アプリケーションの他のコンポーネントの登録を含む、構成ファイルの完全な説明は、5.3項「EPNアセンブリ・ファイルの作成」を参照してください。
EPNアセンブリ・ファイルでは、wlevs:adapter要素を使用してアダプタをイベント・プロセッサ・ネットワークのコンポーネントとして宣言します。構成コードはファクトリから作成されるイベントBeanによって異なるので注意してください。詳細は、15.6項「カスタム・アダプタ・ファクトリの作成」を参照してください。
|
注意: カスタム・アダプタを作成および構成する最も簡単な方法は、Oracle Event Processing IDE for Eclipseアダプタ・ウィザードを使用することです。詳細は、7.4.1.2項「アダプタ・ノードの作成方法」を参照してください。 |
wlevs:adapterのwlevs:instance-property子要素を使用して、アダプタの静的プロパティを設定することもできます。静的プロパティはアダプタのデプロイ後に動的に変更されないプロパティです。
次の例では、BusStopAdapterクラスはアダプタとして構成され、クラスのメソッドとして実装されるプロパティ(setPath、setEventTypeおよびsetBuffer)を設定します。
<wlevs:adapter id="BusStopAdapter"
class="com.oracle.cep.sample.spatial.BusStopAdapter" >
<wlevs:instance-property name="path" value="bus_stops.csv"/>
<wlevs:instance-property name="eventType" value="BusStop"/>
<wlevs:instance-property name="buffer" value="30.0"/>
</wlevs:adapter>
wlevs:listener要素を使用して、イベント・シンクであるアダプタを参照します。次の例では、BusPositionGen CSVアダプタは、イベントをBusStopAdapterに送信します。
<wlevs:adapter id="BusPositionGen" provider="csvgen">
<!-- Code omitted -->
<wlevs:listener ref="BusStopAdapter"/>
</wlevs:adapter>
コンポーネント構成ファイルのアダプタの構成を追加できます。ここで追加する構成は、実行時に更新するために使用できます。コンポーネント構成ファイルの構成の追加では、EPNアセンブリ・ファイルで構成してアダプタをEPNに追加済と仮定します(詳細は、15.5.1項「EPNアセンブリ・ファイルのカスタム・アダプタの構成」を参照)。
開発環境の必要に応じて、個別のコンポーネント構成XMLファイルも作成することもできます。たとえば、アプリケーションに複数のカスタム・イベントBeanが含まれている場合は、各カスタム・イベントBeanごとに個別のXMLファイルを作成するか、すべてのカスタム・イベントBeanの構成を含む単一のXMLファイルを作成するか、またはアプリケーションのすべてのコンポーネント(Bean、アダプタ、プロセッサ、およびストリーム)を含むファイルを作成できます。
次の例では、BusStopAdapterアダプタはイベントの記録のために構成されます。各アダプタ構成には、config要素の個別のadapter子要素が必要です。
<?xml version="1.0" encoding="UTF-8"?>
<wlevs:config
xmlns:wlevs="http://www.bea.com/ns/wlevs/config/application">
<adapter>
<name>BusStopAdapter</name>
<record-parameters>
<dataset-name>spatial_sample</dataset-name>
<event-type-list>
<event-type>BusPos</event-type>
<event-type>BusStop</event-type>
<event-type>BusPosEvent</event-type>
<event-type>BusStopArrivalEvent</event-type>
<event-type>BusStopPubEvent</event-type>
<event-type>BusStopPubEvent</event-type>
</event-type-list>
<batch-size>1</batch-size>
<batch-time-out>10</batch-time-out>
</record-parameters>
</event-bean>
</wlevs:config>
name子要素で各アダプタを一意に識別します。この名前は、アプリケーションのイベント処理ネットワークを定義するEPNアセンブリ・ファイルのwlevs:adapter要素のid属性の値と一致している必要があります。これが、この構成が適用される対象の、EPNアセンブリ・ファイル内の特定のカスタム・アダプタ・コンポーネントをOracle Event Processingが認識する仕組みです。
独自の要素を使用してコンポーネント構成を拡張することもできます。詳細は、第26章「コンポーネント構成の拡張」を参照してください。
詳細は、次を参照してください:
アダプタ・ファクトリを実装および構成して、複数のイベント処理ネットワークで単一アダプタ実装を使用できます。ファクトリ・クラスは、リクエストするアプリケーションのアダプタ・インスタンスを提供します。
ここで説明するAPIの詳細は、Oracle Fusion Middleware Oracle Event Processing Java APIリファレンスに関する項を参照してください。
アダプタ・ファクトリを作成するには、以下の手順を実行します。
アダプタ・クラスでは、アダプタがファクトリで返されるよう、com.bea.wlevs.ede.api.Adapterインタフェースを実装します。これはマーカー・インタフェースなので、メソッドは実装されません。
public class BusStopAdapter implements Adapter, StreamSource {
// Adapter implementation code.
}
アダプタ・ファクトリ・クラスを実装して、アダプタのインスタンスを作成して返します。
アダプタ・ファクトリ・クラスは、com.bea.wlevs.ede.api.AdapterFactoryインタフェースを実装する必要があります。createメソッドを実装する場合、アダプタのインスタンスを作成します。
import com.oracle.cep.sample.spatial.BusStopAdapter;
import com.bea.wlevs.ede.api.AdapterFactory;
public class BusStopAdapterFactory implements AdapterFactory {
public BusStopAdapterFactory() {}
public synchronized BusStopAdapter create()
throws IllegalArgumentException {
// Your code might have a particular way to create the instance.
return new BusStopAdapter();
}
}
EPNアセンブリ・ファイルでは、ファクトリ・クラスを構成します。
次の例に示すように、wlevs:factory要素を使用してEPNアセンブリ・ファイルにファクトリを登録します。
<wlevs:factory provider-name="busStopAdapterProvider"
class="com.oracle.cep.sample.spatial.BusStopAdapterFactory"/>
サービスのプロパティを指定する必要がある場合は、osgi:service要素を使用して、EPNアセンブリ・ファイルにOSGIサービスとしてファクトリを登録する必要もあります。OSGIサービス・レジストリの範囲は、すべてのOracle Event Processingです。このため、指定のサーバーにデプロイされた複数のアプリケーションが同じアダプタ・ファクトリを使用する場合は、ファクトリをOSGIサービスとして登録するのが必ず一度きりになるようにします。
エントリを追加して、サービスをcom.bea.wlevs.ede.api.AdapterFactoryインタフェースの実装として登録します。key属性のtype、およびこのアダプタ・プロバイダを参照する名前を使用して、プロパティを指定します。最後に、ネストされた標準のSpring bean要素を追加して、Springアプリケーション・コンテキストで特定のアダプタ・クラスを登録します。
<osgi:service interface="com.bea.wlevs.ede.api.AdapterFactory">
<osgi:service-properties>
<entry key="type" value="busStopAdapterProvider"</entry>
</osgi:service-properties>
<bean class="com.oracle.cep.sample.spatial.BusStopAdapterFactory" />
</osgi:service>
アダプタのインスタンスを使用するアプリケーションでは、次の例に示すように、クラス名でアダプタを指定するのではなく、プロバイダとして構成されたファクトリを指定してアダプタを構成します。
<wlevs:adapter id="BusStopAdapter"
provider="busStopAdapterProvider">
// ...
</wlevs:adapter>