BEA ホーム | 製品 | デベロッパ・センタ | support | askBEA |
![]() |
![]() |
|
![]() |
e-docs > WebLogic Integration > AI トピック > アダプタの開発 > イベント アダプタの開発 |
アダプタの開発
|
イベント アダプタの開発
この章の内容は以下のとおりです。
イベント アダプタの概要
イベント アダプタは、情報を EIS から WebLogic Integration 環境に伝播します。このタイプのアダプタは、情報のパブリッシャといえます。
すべての WebLogic Integration イベント アダプタには、次の 3 つの機能があります。
WebLogic Integration には、すべてのイベント アダプタに共通の 3 つの機能に関する要素が実装されており、アダプタの EIS 固有の要素のみに焦点をあてることができます。
実行時環境におけるイベント アダプタ
図7-1 は、実行時環境におけるイベントの動作を示しています。
イベントのフロー
図7-2 は、イベント アダプタの開発手順の概要を示しています。
図7-2 イベント アダプタのイベント フロー
手順 1 : アダプタの定義
イベント アダプタの開発を始める前に、その要件を定義する必要があります。これに必要な情報の詳細については、アダプタ設定ワークシートを参照してください。ここでは、手順 1 を行う際に最も重要なタスクの概要を説明します。
手順 2 : 開発環境のコンフィグレーション
この手順では、アダプタの開発環境に応じてコンピュータを設定するための 5 つの手順について説明します。
手順 2a : ファイル構造の設定
イベント アダプタ開発環境に必要なファイル構成は、サービス アダプタの開発に必要なファイル構成と同じです。詳細は、サービス アダプタの開発の手順 2a : ディレクトリ構造の設定を参照してください。
手順 2b : アダプタへの論理名の割り当て
アダプタに論理名を割り当てます。一般的に、この名前は、ベンダ名、アダプタに接続される EIS のタイプ、および EIS のバージョン番号で構成され、vendor_EIS-type_EIS version という形式で表されます。たとえば、
BEA_WLS_SAMPLE_ADK となります。
この名前には、以下の構成要素が含まれます。
手順 2c :ビルド プロセスの設定
WebLogic Integration では、Ant という Java 言語のみで作成した Java ベースのビルド ツールに基づくビルド プロセスを採用しています。Ant がどのように機能するかについては、Ant ベースのビルド プロセスを参照してください。Ant の使用方法については、以下のサイトを参照してください。
http://jakarta.apache.org/ant/index.html
WebLogic Integration に付属のサンプル アダプタには、Ant ビルド ファイルが格納されています(WLI_HOME/adapters/sample/project/build.xml)。このファイルには、J2EE 準拠アダプタを構築するのに必要なタスクが収められています。GenerateAdapterTemplate ユーティリティを実行して、アダプタの開発ツリーを複製すると、使用するアダプタ専用の build.xml ファイルが作成されます。このファイルは自動的に生成されるため、サンプル build.xml ファイルをカスタマイズする必要はなく、コードの正当性も保証されています。GenerateAdapterTemplate ユーティリティの使用方法の詳細については、カスタム開発環境の作成を参照してください。
ビルド プロセスの詳細については、サービス アダプタの開発の手順 2c : ビルド プロセスの設定を参照してください。
手順 2d : メッセージ バンドルの作成
エンド ユーザ向けのメッセージは、メッセージ バンドルに入れます。「key=value」の組み合わせから構成される .properties テキスト ファイルで、メッセージをインターナショナライズできます。実行時に地理的ロケールと地域言語が指定されると、メッセージの内容が、「key=value」の組み合わせに基づいて解釈され、指定された言語でメッセージが表示されます。
メッセージ バンドルの作成方法については、次に示すサイトにある JavaSoft チュートリアルを参照してください。
http://java.sun.com/docs/books/tutorial/i18n/index.html
手順 2e : ロギングのコンフィグレーション
ロギングは、Apache Jakarta プロジェクトの一環として開発された、Log4j と呼ばれるロギング ツールによって実行されます。
この手順を開始する前に、基本開発コンセプトでロギングについて、そしてロギング ツールキットの使い方で Log4j の使用方法について学ぶことをお勧めします。
イベント生成ロギング カテゴリの作成
イベント アダプタを使用する場合、そのイベント生成に対してロギング カテゴリを作成する必要があります(ロギング カテゴリの詳細については、メッセージ カテゴリを参照してください)。特定のアダプタに対するロギング コンフィグレーション ファイルを編集するには(WLI_HOME/adapters/YOUR_ADAPTER/src/
adapter_logical_name.xml)、以下のリストに示すコードを追加してください。
コード リスト 7-1 イベント生成ロギング カテゴリを作成するサンプル コード
<category name='BEA_WLS_SAMPLE_ADK.EventGenerator' class='com.bea.
logging.LogCategory'>
</category>
BEA_WLS_SAMPLE_ADK を開発対象のアダプタの論理名に置き換えます。
このカテゴリにパラメータを設定しない場合、親カテゴリのすべてのプロパティ設定を継承します。この例では、親カテゴリは BEA_WLS_SAMPLE_ADK です。ルート カテゴリとしてアダプタ論理名を使用する必要はありませんが、複数アダプタ環境で他のアダプタに影響を及ぼさないよう、ユニークな識別子を使用する必要があります。
手順 3 : アダプタの実装
イベント アダプタを実装するには、以下の 2 つの手順を実行する必要があります。
手順 3a : イベント ジェネレータの作成
イベント生成機能により、EIS から通知を受信したり、または EIS をポーリングしたりして特定のイベントの発生をチェックするメカニズムがアダプタに装備されます。WebLogic Integration エンジンは、複数タイプのイベントをサポートする強力なイベント ジェネレータを提供します。イベント タイプは、イベントのコンフィグレーション プロパティで定義されます。
イベント プロパティは、通常、設計時にイベントに関連付けられたプロパティで定義されます。イベント アダプタをコンフィグレーションする場合、アダプタがイベント プロパティを収集する Web ページを 1 ページ以上指定することができます。これらのプロパティは、アプリケーション ビュー記述子とともに保存され、実行時にイベントに戻されます。WebLogic Integration エンジンでは、このプロパティおよびソース アプリケーション ビューを使用して、リスナへ戻すルーティングが決定されます。たとえば、同じプロパティが定義された同一のイベント ジェネレータ 2 つを別々にデプロイしても、WebLogic Integration エンジンでは 1 つの IEventDefinition しか作成されませんが、異なるプロパティが指定された場合は、単一のイベント アダプタの各デプロイメントに対し、1 つの IEventDefinition が作成されます。イベント ジェネレータは、ルーティング処理でどの IEventDefinition を使用するかを決定する必要があります。この決定は、通常、プロパティの値と特定のイベント発生に基づいて行われます。
IEventDefinition オブジェクトは、イベント ジェネレータの実装で使用され、特定のイベントをリスナに戻すルーティングを行います。別に説明するとおり、WebLogic Integration エンジンによってイベントを含むデプロイされたアプリケーション ビューの IEventDefinition オブジェクトを作成します。IEventDefinition オブジェクトを使用して、アプリケーション ビューのデプロイメントに関する特定のプロパティを抽出したり、スキーマおよびルーティング オブジェクトにアクセスしたりできます。これらの属性は、イベントのルーティング時に使用します。
データ抽出メカニズムの実装
WebLogic Integration では、次に示す 2 つのデータ抽出モードをサポートしています。
プル モード
プル モードでは、ポーリング手法によりイベントの発生が判断されます。これを実装するには、com.bea.adapter.event パッケージの AbstractPullEventGenerator からイベント ジェネレータを取得します。
注意: adk-eventgenerator.jar ファイルには、イベント ジェネレータの実装に必要な ADK ベース クラスが含まれます。これは、WAR メイク ファイルに含まれます。
ADK では、AbstractPullEventGenerator に、抽象メソッドをいくつか用意していますが、実際の実装ではこれをオーバーライドします。これらのメソッドについて以下の表に示します。
プッシュ モード プッシュ モードは、イベントのルーティングをトリガする通知を使用します。これを実装するには、com.bea.adapter.event パッケージの AbstractPushEventGenerator クラスからイベント ジェネレータを取得します。このイベント パッケージには、他にもいくつかのサポート クラスが入っています。表 7-2 でサポート クラスを説明しています。 注意: adk-eventgenerator.jar ファイルには、イベント ジェネレータの実装に必要な WebLogic Integration ベース クラスが含まれます。これは、WAR メイク ファイルに含まれます。
イベント ジェネレータの実装方法 イベント ジェネレータの実装は、通常、次の制御フローに従って行います。
リスト7-2 は、サンプル アダプタの(プル モード)イベント ジェネレータのクラス宣言を示しています。
コード リスト 7-2 データ抽出のプル モードの実装例
public class EventGenerator
extends AbstractPullEventGenerator
注意: AbstractPullEventGenerator は、独自のスレッドで実行できるようにするため、Runnable インタフェースを実装します。
手順 3a : イベント ジェネレータの作成では、さらに、データ抽出のプル モードでイベント ジェネレータの実装コード例を示します。
サンプル EventGenerator
リスト7-3 は、イベント ジェネレータ用の簡単なコンストラクタを示しています。親のメンバーが正しく初期化されるように、親のコンストラクタを呼び出します。また、doInit() メソッドを使用して、map 変数からコンフィグレーション情報を受信し、パラメータの有効性を検証するための方法をこのリストで示します。サンプルでは、設計時にイベント ジェネレータに関連付けられたパラメータが使用されています。
コード リスト 7-3 EventGenerator 用のサンプル コンストラクタ
public EventGenerator()
{
super();
}
protected void doInit(Map map)
throws java.lang.Exception
{
ILogger logger = getLogger();
m_strUserName = (String)map.get("UserName");
if (m_strUserName == null || m_strUserName.length() == 0
{
String strErrorMsg =
logger.getI18NMessage("event_generator_no_UserName");
logger.error(strErrorMsg);
throw new IllegalStateException(strErrorMsg);
}
m_strPassword = (String)map.get("Password");
if (m_strPassword == null || m_strPassword.length() == 0)
{
String strErrorMsg = logger.getI18NMessage
("event_generator_no_Password");
logger.error(strErrorMsg);
throw new IllegalStateException(strErrorMsg);
}
リスト7-4 に示されているように、postEvents() が親クラスの実行メソッドから呼び出されます。このメソッドが、EIS をポーリングして、新しいイベント発生の有無を判別します。このメソッドは、一定間隔(この間隔は、イベント ルータの web.xml ファイルで定義する)で呼び出されます。
コード リスト 7-4 postEvents () の実装例
*/ protected void postEvents(IEventRouter router)
throws java.lang.Exception
{
ILogger logger = getLogger();
// 作業 : 実際のアダプタでは EIS を呼び出して、
// 前回このメソッドが呼び出された後に新しいイベントが発生
// したかどうかの判別が必要となる。例示のため、
// このメソッドが呼び出されるたびに 1 つのイベントを通知する・・・
// イベント データは現在イベント定義に従って
// フォーマットされたシステムにあるいくつかの・・・
// イベント タイプを検索する・・・
Iterator eventTypesIterator = getEventTypes();
if (eventTypesIterator.hasNext())
{
do
{
// イベント ルータはまだこのタイプのイベントに関連性がある
IEventDefinition eventDef = (IEventDefinition)
eventTypesIterator.next();
logger.debug("Generating event for " + eventDef.getName());
// デフォルト イベント(ブランクまたはデフォルト データ)を作成する
IEvent event = eventDef.createDefaultEvent();
// イベントのフォーマットを取得する
java.util.Map eventPropertyMap = eventDef.
getPropertySet();
String strFormat = (String)eventPropertyMap.get
("Format");
if( logger.isDebugEnabled() )
logger.debug("Format for event type '"+eventDef.
getName()+"' is '"+strFormat+"'");
java.text.SimpleDateFormat sdf =
new java.text.SimpleDateFormat(strFormat);
IDocument payload = event.getPayload();
payload.setStringInFirst("/SystemTime", sdf.format(new
Date()));
// ここで、監査メッセージのログを取る...
try
{
logger.audit(toString() + ": postEvents >>> posting event
["+payload.toXML()+"] to router");
}
catch (Exception exc)
{
logger.warn(exc);
}
// この呼び出しによって実際に IEventRouter にイベントが通知される
router.postEvent(event);
} while (eventTypesIterator.hasNext());
}
}// postEvents の終了
実際のアダプタは、EIS をクエリして、前回このメソッドが呼び出された後に新しいイベントが発生したかどうかを判別する必要があります。ADK に付属の DBMS サンプル アダプタで提供される、このような呼び出しの具体例は、EventGenerator.java ファイルの postEvent() メソッドです。
WLI_HOME/adapters/dbms/src/com/bea/adapter/dbms/event/EventGenerator.java
新しいのイベント タイプの追加
新しいのイベント タイプの処理更新時には、setupNewTypes() が呼び出されます。通常、イベント ジェネレータは、EIS からのイベントを受け取るために EIS にリソースを割り当てる必要があります。たとえば、DBMS サンプル アダプタでは、新しいイベント タイプを処理するために、DBMS でトリガが作成されます。setupNewTypes() メソッドにより、新しいタイプを処理するのに必要な定義をセットアップできます。親クラスですでにlistOfNewTypes() ファイルの健全性チェックがなされ、ログに記録されているので、ここでチェックは行いません。
コード リスト 7-5 setupNewTypes() のテンプレート サンプル
protected void setupNewTypes(java.util.List listOfNewTypes)
{
Iterator iter = listOfNewTypes.iterator();
while (iter.hasNext())
{
IEventDefinition eventType = (IEventDefinition)iter.next();
}
}
アンデプロイされているアプリケーション ビューのイベント タイプの削除
アンデプロイされたアプリケーション ビューのイベント タイプの削除時には、removeDeadTypes() が呼び出されます。
クリーンアップ処理を実行する必要があります。
未使用イベント タイプが今後処理されないようにするため、クリーンアップ処理を行う必要があります。たとえば、未使用のイベント タイプの処理に必要なリソースをクローズします。リスト7-6 に removeDeadTypes() の実装方法を示します。
コード リスト 7-6 removeDeadTypes() テンプレートに基づくサンプル コード
protected void removeDeadTypes(java.util.List listOfDeadTypes)
{
Iterator iter = listOfDeadTypes.iterator();
while (iter.hasNext())
{
IEventDefinition eventType = (IEventDefinition)iter.next();
リソースの削除
イベント ジェネレータのシャットダウン時に、doCleanUpOnQuit() が呼び出されます。このメソッドはイベント処理中に割り当てられたリソースを削除します。サンプル アダプタはこのメソッドで停止します。以下のリストでは、このメソッドを実装するテンプレートを示します。
コード リスト 7-7 doCleanUpOnQuit() メソッドの呼び出し例
protected void doCleanUpOnQuit()
throws java.lang.Exception
{
ILogger logger = getLogger();
logger.debug(this.toString() + ": doCleanUpOnQuit");
}
}
手順 3b : データ変換メソッドの実装
データ変換は、EIS からデータを取り出してアプリケーション サーバが読み取れる XML スキーマに変換する処理です。各イベントに対し、スキーマが SOM および IDocument クラス ライブラリを使用して XML 出力の外観を定義します。以下のコード リストに、データ変換処理中のイベントのシーケンスを示します。
コード リスト 7-8 EIS データを XML スキーマに変換するサンプル コード
SOMSchema schema = new SOMSchema();
SOMElement root = new SOMElement("SENDINPUT");
SOMComplexType mailType = new SOMComplexType();
root.setType(mailType);
SOMSequence sequence = mailType.addSequence();
SOMElement to = new SOMElement("TO");
to.setMinOccurs("1");
to.setMaxOccurs("unbounded");
sequence.add(to);
SOMElement from = new SOMElement("FROM");
from.setMinOccurs("1");
from.setMaxOccurs("1");
sequence.add(from);
SOMElement cc = new SOMElement("CC");
cc.setMinOccurs("1");
cc.setMaxOccurs("unbounded");
sequence.add(cc);
SOMElement bcc = new SOMElement("BCC");
bcc.setMinOccurs("1");
bcc.setMaxOccurs("unbounded");
sequence.add(bcc);
SOMElement subject = new SOMElement("SUBJECT");
subject.setMinOccurs("1");
subject.setMaxOccurs("1");
sequence.add(bcc);
SOMElement body = new SOMElement("BODY");
if (template == null)
{ body.setMinOccurs("1");
body.setMaxOccurs("1");
}else
{ Iterator iter = template.getTags();
if (iter.hasNext())
{ SOMComplexType bodyComplex = new SOMComplexType();
body.setType(bodyComplex);
SOMAll all = new SOMAll();
while (iter.hasNext())
{ SOMElement eNew = new SOMElement((String)iter.next());
all.add(eNew);
}//endwhile
bodyComplex.setGroup(all);
}//endif
}//endif
sequence.add(body);
schema.addElement(root);
コード リスト 7-9 リスト7-8 のコードで作成された XML スキーマ
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="SENDINPUT">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="TO" maxOccurs="unbounded"
type="xsd: string"/>
<xsd:element name="FROM" type="xsd:string"/>
<xsd:element name="CC" maxOccurs="unbounded"
type="xsd:string"/>
<xsd:element name="BCC" maxOccurs=
"unbounded" type= "xsd:string"/>
<xsd:element name="BCC" maxOccurs="unbounded"
type="xsd:string"/>
<xsd:element name="BODY" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
コード リスト 7-10 リスト7-9 のスキーマで作成された有効な XML ドキュメント
</xsd:schema>
<?xml version="1.0"?>
<!DOCTYPE SENDINPUT>
<SENDINPUT>
<TO/>
<FROM/>
<CC/>
<BCC/>
<BCC/>
<BODY/>
</SENDINPUT> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
手順 4 : アダプタのテスト
WebLogic Integration に用意されているアダプタ テスト支援機能を使用して、アダプタをテストできます。このツールとその使用方法の詳細については、サービス アダプタの開発の手順 5 : アダプタのテストを参照してください。
手順 5 : アダプタのデプロイ
新しいアダプタを再構築したら、そのアダプタを WebLogic Integration 環境にデプロイします。アダプタのデプロイは、手動でも WebLogic Server Administration Console からでも実行できます。詳細は、アダプタのデプロイを参照してください。
![]() |
![]() |
![]() |
![]() |
||
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |