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

BPM プラグイン プログラミング ガイド

 前 次 目次 索引 PDFで表示  

プラグイン イベントの処理

この章では、プラグイン イベントを処理する方法について説明します。この章の内容は以下のとおりです。

 


プラグイン イベントの概要

イベントとは、別のワークフローから、あるいは別のアプリケーションなどの外部ソースからの非同期通知です。ワークフローの開始、変数の初期化、ワークフロー内のノードのアクティブ化、アクションの実行を行うイベントを定義できます。イベントとイベント プロパティは、WebLogic Integration Studio を使用して、開始ノードとイベント ノードを定義するときに定義します。イベントとイベント プロパティの定義方法の詳細については、『WebLogic Integration Studio ユーザーズ ガイド』を参照してください。

BPM フレームワークは、JMS を介して配信される XML フォーマットのイベント メッセージをサポートします。XML フォーマットと非 XML フォーマットの両方のイベント メッセージをサポートするには、プラグイン イベントを定義する必要があります。

次の図に、プラグイン イベントのデータ フローを示します。

図6-1 プラグイン イベント データ フロー


 

前の図に示したように、プラグイン イベント メッセージは、次の 2 通りの方法のいずれかでシステムに渡されます。

WebLogic Integration プロセス エンジンは、着信プラグイン イベント メッセージを com.bea.wlpi.server.eventprocessor.EventData オブジェクトとして格納し、そのオブジェクトを Event Processor に渡します。EventData オブジェクトの詳細については、EventData クラスを参照してください。

Event Processor は、EventData オブジェクトを受信すると、WLPIPlugin プロパティがメッセージの一部として定義されているかどうかをまずチェックします。

WLPIPlugin メッセージ プロパティは、次のいずれかの方法で定義できます。

WLPIPlugin プロパティが定義されている場合、Event Processor は、プラグイン イベント ハンドラに EventData オブジェクトを渡して、プラグイン イベント データを前処理します。前処理されたイベント データは、EventData オブジェクトの配列として Event Processor に返されます。プラグイン イベント ハンドラの定義方法の詳細については、プラグイン イベント ハンドラの定義を参照してください。

次に、Event Processor は、結果のデータが XML フォーマットであるかどうかをチェックし、そうであれば、次の手順を実行します。

  1. イベント データを解析します。

    この時点で、Event Processor は、EventData オブジェクトにより提供されるコンテンツ タイプとイベント記述子を取得します。

    コンテンツ タイプは、MIME (Multi-Purpose Internet Mail Exensions) コンテンツ タイプを参照し、メッセージの基本データ タイプを説明します。コンテンツ タイプのデフォルトは text/xml で、データがテキスト フォーマットであり、XML のルールに従っていることを示します。

    イベント記述子は、データ フォーマットの正確な定義を提供し、コンテンツ タイプに基づいて解釈されます。

    たとえば、コンテンツ タイプが text/xml に設定されている場合、イベント記述子は XML ドキュメント タイプです。DOCTYPE タグが設定されている場合、XML ドキュメント タイプは、パブリック ID またはシステム ID(定義されている場合)、あるいはドキュメント要素名です。一方、コンテンツ タイプが application/x-java-object に設定されている場合(シリアライズされた Java オブジェクトを示す)、イベント記述子は Java クラスの完全修飾名です。

  2. 指定されている場合、イベント キー値を取得し、それを JNDI に事前定義されているキーと比較します。

    イベント キーは、主キーとして扱う必要のある着信データ フィールドを指定します。また、特定のコンテンツ タイプおよびイベント記述子と関連付けられます。イベント キーは、パフォーマンス向上のために、着信イベント データのフィルタ メカニズムを提供します。イベント キーの定義方法の詳細については、『WebLogic Integration Studio ユーザーズ ガイド』を参照してください。

    注意: プラグイン イベント ノードまたは開始ノードが、com.bea.wlpi.server.plugin.EventContext インタフェースの activateEvent() メソッドまたは postStartWatch() メソッドをそれぞれ使用し、text/xml 以外のコンテンツ タイプを渡す場合、プラグインは一致するイベント キー式をイベント キー テーブルに登録しておく必要があります。これを行うには、com.bea.wlpi.server.admin.Admin インタフェースの addEventKey() メソッドを使用します。プラグインは、このコンテンツ タイプとフォーマットの着信データからのキー値を評価するためのプラグイン フィールドも提供する必要があります。プラグイン フィールドの定義方法の詳細については、メッセージ タイプのための実行時コンポーネント クラスの定義を参照してください。

  3. コンテンツ タイプ、イベント記述子、およびイベント キー値に基づいて、イベント ウォッチ テーブルでイベント コンテンツの受信候補を検索します。

    プラグイン イベントをイベント ウォッチ テーブルにエントリとして追加する方法の詳細については、イベント ウォッチ エントリの定義を参照してください。

  4. 条件が指定されている場合、その条件を評価し、一致するものがあるかどうか調べます。

    条件は、true または false と評価される式で構成されます。条件の使用により、メッセージのコンテンツに基づいて、同じイベントに対して異なる処理を適用する複数ののワークフローを定義できます。たとえば、イベント データに [Order Amount] というフィールドが入っている場合、゛Order Amount > $500.00゛は有効な条件です。条件の定義方法の詳細については、『WebLogic Integration Studio ユーザーズ ガイド』を参照してください。

  5. 一致するイベントがある場合、イベントをトリガして、新しいワークフロー インスタンスを開始するか、または既存のワークフロー インスタンスの処理を再開します。

これらの各タスクは、イベントに対してサブスクライブされたコンシューマごとに実行されます。

プラグイン イベントをサポートする手順は次のとおりです。

  1. プラグイン イベント データを処理するプラグイン イベント ハンドラを定義します。

  2. カスタム メッセージ タイプまたはプラグイン フィールドを定義し、イベント ハンドラが返すイベント データを解析します。

  3. イベント ウォッチ エントリを定義します。

次の節では、これらの手順の詳細およびプラグイン イベント ハンドラにメッセージを送信する方法について説明します。

イベント ハンドラを作成する前に、着信プラグイン イベント メッセージを格納する EventData コンテナ クラスに関する情報の作成方法とアクセス方法を理解しておく必要があります。

 


EventData クラス

プラグイン イベント データ フローの図に示したように、com.bea.wlpi.server.eventprocessor.EventData オブジェクトには着信データ メッセージ用のコンテナ クラスがあります。

次の表に、EventData オブジェクトを作成するために使用できるコンストラクタを示します。

表6-1 EventData オブジェクト コンストラクタ

コンストラクタ

説明

public EventData(org.w3c.dom.Document document)

XML を含む事前解析された DOM オブジェクトから EventData を作成し、次の値を設定する。

コンストラクタ パラメータの定義は次のとおり。

document −XML コンテンツを示す
org.w3c.dom.Document オブジェクト。

public EventData(java.lang.String xml) throws com.bea.wlpi.common.WorkflowException

XML の入った String オブジェクトから EventData オブジェクトを作成し、次の値を設定する。

コンストラクタ パラメータの定義は次のとおり。

xml −XML コンテンツを示す
java.lang.String オブジェクト。

public EventData(
java.lang.Object
content, java.lang.String contentType, java.lang.String eventDescriptor, long expiration, java.lang.String[] templateNames, java.lang.String[] instanceIDs, java.util.Map properties)

任意のタイプのオブジェクトを入れる EventData オブジェクトを作成する。

コンストラクタ パラメータは、次のように定義される。

注意: EventData オブジェクトには、それぞれコンテンツ タイプ、イベント記述子、プラグイン名を定義する CONTENT_TYPEEVENT_DESCRIPTORPLUGIN という定数値もあります。

templateNames または instanceIDs が null でない場合、イベント データを送信するものとみなされます。

public EventData(
java.lang.Object
content, java.lang.String contentType, java.lang.String eventDescriptor, java.lang.String startInstanceID, java.util.Map properties)

任意のタイプのオブジェクトを入れる EventData オブジェクトを作成する。

コンストラクタ パラメータは、次のように定義される。

注意: EventData オブジェクトには、それぞれコンテンツ タイプ、イベント記述子、プラグイン名を定義する CONTENT_TYPEEVENT_DESCRIPTORPLUGIN という定数値もあります。


 

次の表に、EventData オブジェクト情報、その情報を定義する際に使用するコンストラクタ パラメータ、オブジェクト定義後にこの情報にアクセスする際に使用するメソッドを示します。

表6-2 EventData オブジェクト情報

オブジェクト情報

コンストラクタ パラメータ

get メソッド

XML コンテンツを入れる org.w3c.dom.Document ドキュメント(DOM)

document

public final boolean isDOM()

XML コンテンツを入れる文字列ドキュメント

xml

public final boolean isXML()

イベント データ コンテンツを入れる java.lang.Object オブジェクト。

content

public final java.lang.Object getContent()

コンテンツ タイプ

contentType

public final java.lang.String getContentType()

イベント記述子

eventDescriptor

public final java.lang.String getEventDescriptor()

有効期限

expiration

public final long getExpiration()

イベント データの送信先のテンプレート名の配列

templateNames

public final String[] getTemplateNames()

イベント データの送信先のワークフロー インスタンス ID の配列

instanceIDs

public final java.lang.String[] getInstanceIDs()

イベント データの送信先の開始ワークフロー インスタンス ID

instanceIDs

public final java.lang.String getStartInstanceID()

プラグイン メッセージ プロパティ

properties

public java.lang.Object getProperty(java.lang.String propertyName) throws com.bea.wlpi.common.WorkflowException


public java.util.Set getPropertyNames() throws com.bea.wlpi.common.WorkflowException

Event Processor により割り当てられるユニークなメッセージ識別子

注意: このメソッドは、送信されるメッセージに対してのみ適用されます。イベント メッセージ データが送信されない場合、このメソッドは null を返します。

該当なし

public final java.lang.String getMessageID()

イベント データのキー値

コンテンツ タイプとイベント記述子の組み合わせに対してキー値式が定義されている場合、Event Processor によりキー値が設定される。

該当なし

public final java.lang.String getKeyValue()


 

次の表に、XML データの解析に使用できるメソッドを示します。

表6-3 XML 解析メソッド

メソッド

説明

public final void parseXML(boolean validate) throws com.bea.wlpi.common.WorkflowException

コンテンツが XML である場合、イベント データのコンテンツを解析して org.w3c.dom.Document ドキュメント(DOM)に格納し、次の値を設定する。

メソッド パラメータの定義は次のとおり。

validate −参照された DTD に対して XML を検証する必要がある場合は true。

public final void parseXML() throws com.bea.wlpi.common.WorkflowException

コンテンツが XML である場合、イベント データのコンテンツを解析して、org.w3c.dom.Document オブジェクトに格納し、次の値を設定する。

XML は検証されない。


 

次の節では、着信 EventData オブジェクトを前処理するためのプラグイン イベント ハンドラを定義する方法について説明します。

 


プラグイン イベント ハンドラの定義

プラグイン イベント データ フローの図に示したように、プラグイン イベント データを前処理するためのプラグイン イベント ハンドラを定義し、Event Processor がデータを解析できるようにする必要があります。

プラグイン イベント ハンドラを定義するには、次のタスクを実行します。

  1. 実行ハンドラ コンポーネント クラスを定義します。

  2. 手順 1 で定義したイベント ハンドラ オブジェクトの名前を引数としてコンストラクタに渡し、com.bea.wlpi.server.plugin.EventHandlerInfo 値オブジェクトを定義します。

  3. 手順 2 で定義した EventHandlerInfo オブジェクトをコンストラクタ パラメータとしてプラグイン PluginCapabilitiesInfo オブジェクトに渡すことにより、イベント ハンドラを登録します。

次の節では、これらの手順についてさらに詳しく説明します。

イベント ハンドラ コンポーネント クラスの定義

プラグイン イベント ハンドラ コンポーネント クラスを定義するには、com.bea.wlpi.server.plugin.EventHandler インタフェースを実装します。

次の表で、着信プラグイン イベント データを前処理するために実装する必要のある EventHandler インタフェース メソッドについて説明します。

表6-4 EventHandler インタフェース メソッド

メソッド

説明

public com.bea.wlpi.server.eventprocessor.EventData[] onEvent(com.bea.wlpi.server.eventprocessor.EventData eventData)
throws com.bea.wlpi.common.plugin.PluginException

着信プラグイン イベント データを前処理する。

Event Processor は、特定のプラグインに対して送信されたイベント メッセージ(通常は JMS を介して)を受信すると、このメソッドを呼び出す。

イベント ハンドラは、1 つの着信イベントを、Event Processor により順に処理される複数の発信イベントに変換できる。

メソッド パラメータの定義は次のとおり。

eventData −プラグイン イベント データを示す
com.bea.wlpi.server.eventprocessor.EventData オブジェクト。

このメソッドは、次のいずれかの値を返す。


 

イベント ハンドラ値オブジェクトの作成

イベント ハンドラ値オブジェクト com.bea.wlpi.common.plugin.EventHandlerInfo を作成するには、EventHandlerInfo オブジェクトに定義されているコンストラクタを使用します。classNames コンストラクタ パラメータ値として、前の節で定義したイベント ハンドラ コンポーネント クラスの名前を渡す必要があります。

たとえば、次のコード抜粋では、イベント ハンドラ クラス sample.MyEventHandler の名前を渡して、新しいイベント ハンドラ値オブジェクトを作成しています。イベント ハンドラ クラスは、イベント ハンドラ コンポーネント クラスの定義に説明されているように、EventHandler com.bea.wlpi.server.plugin.EventHandler インタフェースを実装します。

eh = new EventHandlerInfo(SamplePluginConstants.PLUGIN_NAME,
bundle.getString("startOrderName"),
bundle.getString("startOrderDesc")
sample.MyEventHandler);
eventHandler = new EventHandlerInfo[]{ eh };

EventHandlerInfo オブジェクトの詳細については、EventHandlerInfo オブジェクトを参照してください。

イベント ハンドラの登録

イベント ハンドラを登録するには、PluginCapabilitiesInfo オブジェクトに定義されているように com.bea.wlpi.common.plugin.PluginCapabilitiesInfo 値オブジェクトを作成し、前の節で定義した EventHandlerInfo オブジェクトを eventHandler コンストラクタ パラメータ値として渡します。

たとえば、次のコード抜粋では、引数として com.bea.wlpi.common.plugin.EventHandlerInfo オブジェクトの名前を渡して、新しい PluginCapabilitiesInfo 値オブジェクトを作成しています。

PluginCapabilitiesInfo pci = new PluginCapabilitiesInfo(pi,
getCategoryInfo(bundle), eventInfo, fieldInfo, functionInfo,
startInfo, null, null, null, null, eventHandler);

PluginCapabilitiesInfo オブジェクトの詳細については、PluginCapabilitiesInfo オブジェクトを参照してください。

 


プラグイン メッセージ タイプの定義

プロセス エンジンがプラグイン com.bea.wlpi.server.eventprocessor.EventData オブジェクトから情報を抽出できるようにするには、プラグイン メッセージ タイプ、すなわちプラグイン フィールドを定義する必要があります。抽出した値は、ワークフロー変数に代入したり、式の一部(キー値や条件式など)として使用できます。

プラグイン メッセージ タイプの定義方法の詳細については、メッセージ タイプのための実行時コンポーネント クラスの定義を参照してください。

 


イベント ウォッチ エントリの定義

イベント ウォッチ エントリにより、Event Processor は着信イベントをプラグイン ノードと照合できます。

次の表に、各プラグイン ノード タイプについて、プロセス エンジンがプラグイン イベント エントリをイベント ウォッチ テーブルに追加する方法を示します。

表6-5 プラグイン ノード タイプに基づくイベント ウォッチ エントリの追加方法

ノード タイプ

説明

イベント ノード

ワークフロー プロセッサがノードをアクティブ化すると、プラグイン フレームワークは、com.bea.wlpi.server.plugin.PluginEvent オブジェクトの activate() メソッドを呼び出す。activate() メソッドは、com.bea.wlpi.server.plugin.EventContextactivateEvent() メソッドを呼び出すことにより、イベント ウォッチ テーブルにエントリを記録する。

activate() メソッドの実装方法の詳細については、PluginEvent インタフェース メソッドの表を参照。EventContext の詳細については、イベント コンテキストを参照。

開始ノード

ユーザがテンプレート定義をアクティブに設定すると、プラグイン フレームワークは、com.bea.wlpi.server.plugin.PluginStart2 オブジェクトの activate() メソッドを呼び出す。これにより、setTrigger() メソッドが呼び出される。setTrigger() メソッドは、com.bea.wlpi.server.plugin.EventContextpostStartWatch() メソッドを呼び出すことにより、イベント ウォッチ テーブルにエントリを記録する。

setTrigger() メソッドの実装方法の詳細については、PluginStart2 インタフェース メソッドの表を参照。EventContext の詳細については、イベント コンテキストを参照。


 

 


プラグイン イベント ハンドラに対するイベントの送信

プラグイン イベント ハンドラに対してイベントを送信するには、メッセージ送信側は、com.bea.wlpi.server.eventprocessor.EventData オブジェクトの WLPIPlugin 文字列プロパティをイベント ハンドラ名に設定する必要があります。

たとえば、次のコードは、イベント ハンドラ SamplePlugin の名前に対して WLPIPlugin プロパティを設定し、EventData コンストラクタにこの情報を渡すことにより、プロパティ マップを構築する方法を示しています。

Map props = new HashMap();
props.put("WLPIPlugin""SamplePlugin");
EventData eventData = new EventData(data,
"text/x-appplication/sample",
"Order", 0, null, null, props);

 

ページの先頭 前 次