BEA ホーム | 製品 | デベロッパ・センタ | support | askBEA
 ドキュメントのダウンロード   サイト マップ   用語集 
検索

アダプタの開発

 前 次 目次 索引 PDFで表示  

イベント アダプタの開発

この章の内容は以下のとおりです。

 


イベント アダプタの概要

イベント アダプタは、情報を EIS から WebLogic Integration 環境に伝播します。このタイプのアダプタは、情報のパブリッシャといえます。

すべての WebLogic Integration イベント アダプタには、次の 3 つの機能があります。

WebLogic Integration には、すべてのイベント アダプタに共通の 3 つの機能に関する要素が実装されており、アダプタの EIS 固有の要素のみに焦点をあてることができます。

 


実行時環境におけるイベント アダプタ

図7-1 は、実行時環境におけるイベントの動作を示しています。


 

図7-1 実行時環境におけるイベント アダプタ


 


 


 

 


イベントのフロー

図7-2 は、イベント アダプタの開発手順の概要を示しています。

図7-2 イベント アダプタのイベント フロー


 

 


手順 1 : アダプタの定義

イベント アダプタの開発を始める前に、その要件を定義する必要があります。これに必要な情報の詳細については、アダプタ設定ワークシートを参照してください。ここでは、手順 1 を行う際に最も重要なタスクの概要を説明します。

  1. 以下の事項を考慮して、イベントを定義します。

  2. 以下のデータ抽出メソッドのうち 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 つの手順を実行する必要があります。

  1. イベント ジェネレータを作成します。このプロセスでは、データ抽出メソッド(プッシュまたはプル モード)と IEventGenerator インタフェースを実装します(このインタフェースは、イベント生成処理の実行時にイベント ルータで使用されます)。この手順については、手順 3a : イベント ジェネレータの作成で説明しています。

  2. データ変換メソッドを実装します。この手順については、手順 3b : データ変換メソッドの実装で説明しています。

手順 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 に、抽象メソッドをいくつか用意していますが、実際の実装ではこれをオーバーライドします。これらのメソッドについて以下の表に示します。

表7-1 AbstractPullEventGenerator メソッド

メソッド

説明

postEvents()

他のイベント生成、メッセージ変換、およびルーティング コードの制御メソッドで、ポーリングおよびルーティング コードを追加できる。イベント ルータ コンフィグレーション ファイルで指定された間隔で、AbstractPullEventGenerator の実行メソッドから呼び出される。

setupNewTypes()

デプロイされる IEventDefinition オブジェクトを前処理するためのメソッド。有効な新しい IEventDefinition オブジェクトだけがこのメソッドに渡される。

removeDeadTypes()

アンデプロイされる IEventDefinition オブジェクトに対して要求されたクリーンアップを処理する。WebLogic Integration エンジンは、関連イベントのアプリケーション ビューがアンデプロイされた場合にこのメソッドを呼び出す。

doInit()

イベント ジェネレータが作成されるときに呼び出される。初期化プロセスで、イベント ジェネレータによって事前定義されたコンフィグレーション値が使用されて、イベント生成処理に必要なステートまたは接続情報が設定される。

doCleanUpOnQuit()

イベント生成プロセスで割り当てられたリソースを解放する。イベント生成処理を行っているスレッドの終了前に呼び出される。


 

プッシュ モード

プッシュ モードは、イベントのルーティングをトリガする通知を使用します。これを実装するには、com.bea.adapter.event パッケージの AbstractPushEventGenerator クラスからイベント ジェネレータを取得します。このイベント パッケージには、他にもいくつかのサポート クラスが入っています。表 7-2 でサポート クラスを説明しています。

注意: adk-eventgenerator.jar ファイルには、イベント ジェネレータの実装に必要な WebLogic Integration ベース クラスが含まれます。これは、WAR メイク ファイルに含まれます。

表7-2 AbstractPushEventGenerator クラス

クラス

説明

AbstractPushEventGenerator

AbstractPullEventGenerator と同じ抽象メソッドおよび具象メソッドが入っているクラス。両方の実装(AbstractPullEventGenerator and AbstractPushEventGenerator)におけるメソッドの使用目的は同じである。それぞれに割り当てられているメソッドと役割のリストについては、表 7-1 を参照。

IPushHandler

おもにイベントのルーティングからイベントの生成を行うためのインタフェース。データ抽出のプッシュ モードの実装には必要とされない。IPushHandler は、PushEventGenerator と密に結合して使用するために設計されている。PushEventGenerator は、PushHandler の実装の初期化、サブスクライブ、クリーンアップを行う。IPushHandler は、生成ロジックを行う簡単なインタフェースである。このインタフェースによって、リソースの初期化、プッシュ イベントへのサブスクライブ、およびクリーン アップを行う。

PushEvent

java.util.EventObject から派生するイベント オブジェクト。PushEvent オブジェクトは EIS 通知のラッパとして設計されており、あらゆる IPushEventListener オブジェクトに送信する。

EventMetaData

イベント生成に必要なデータをラップする。このクラスは、初期化時に IPushHandler に渡される。


 

イベント ジェネレータの実装方法

イベント ジェネレータの実装は、通常、次の制御フローに従って行います。

  1. doInit() メソッドは、EIS に対する接続を作成し、有効性を検証します。

  2. setupNewTypes() メソッドは、処理に必要なデータ構造を作成する IEventDefinition オブジェクトを処理します。

  3. postEvents() メソッドは、以下のデータ抽出モードのいずれか 1 つを繰り返し呼び出します。

  4. removeDeadTypes() メソッドは、イベント処理に使用されているデータ構造から無効な IEventDefinition オブジェクトを削除します。これらのオブジェクトに関連付けられたリソースも解放されます。IEventDefinition オブジェクトは、アプリケーション ビューがデプロイされていない場合に、無効とみなされます。

  5. doCleanUpOnQuit() メソッドは、イベント処理中に割り当てられたリソースを削除します。

リスト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-6removeDeadTypes() の実装方法を示します。

コード リスト 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 からでも実行できます。詳細は、アダプタのデプロイを参照してください。

 

ページの先頭 前 次