BPEL 2.0の同時onMessageブランチに関する必知事項
BPEL 2.0のOracle BPEL Process Managerの実装では、pickアクティビティの同時onMessageブランチはサポートされていません。
開始アクティビティとして(どちらも相関定義でinitiate
がjoin
に設定されている)2つのonMessageブランチと、起動を次々に転送する起動プロセスを持つpickアクティビティがプロセスにある場合、どちらの起動も、起動されたプロセスの同じインスタンスに到達すると想定されます。ただし、Oracle BPEL Process ManagerのBPEL 2.0の実装では、起動されたプロセスの2つのインスタンスは起動ごとに作成されます。
これは想定されている動作ですが、BPEL 2.0仕様に記載されているものとは異なります。
たとえば、同期BPELプロセスAがあり、2つのパラレル・ブランチを持つflowアクティビティがあると仮定します。
-
ブランチ1は、非同期BPELプロセスBで操作processMessage1を呼び出します。
-
ブランチ2は、非同期BPELプロセスBで操作processMessage2を起動します。起動は5秒間待機した後に行われます。その後、BPELプロセスAはBPELプロセスBからのコールバックで待機し、出力をクライアントに返します。
起動されたプロセスの1つのインスタンスを作成し、最初のインスタンスがアクティブで実行中の状態になった後、2番目の起動が行われるという考えです。
BPELプロセスBには、createInstance
がyes
に設定されたpickアクティビティがあります。pickアクティビティ内には2つのonMessageブランチがあります。
-
一方のブランチはprocessMessage1操作に使用されます。この操作では、約10秒間スリープ状態になります。
-
もう一方のブランチはprocessMessage2操作に使用されます。この操作では、5秒間待機します。
どちらの操作も入力メッセージ・タイプは同じで、initiate
をjoin
に設定して相関が定義されています。processMessage1が直接呼び出されてBPELプロセスBのインスタンスが作成され、それが10秒間スリープすると想定します。5秒後に、起動プロセスはprocessMessage2の起動をBPELプロセスBに転送し、この起動は新しいインスタンスを作成するのではなく、既存のインスタンスに進みます(相関IDが同じで、initiate
がjoin
に設定されているため)。
ただし、起動ごとにBPELプロセスBの新しいインスタンスが作成され、結果は予測できません。
-
processMessage2操作のブランチが先に完了した場合、後続の割当て操作は失敗します。これは、processMessage1からの入力変数はnullと想定されるためです(そのインスタンスの場合)。
-
processMessage1操作のブランチが先に完了した場合、プロセスは一部の情報のみを含むコールバック・データを返します(processMessage2からの入力は含まれません)。
Oracle BPEL Process Managerの実装では、2つの操作(processMessage1またはprocessMessage2)のいずれかによって新しいインスタンスが作成されます。この実装により、すでに作成されたインスタンスがあるかどうかを確認するためにデータベース問合せを行う必要がなくなります。
この問題を解決するには、2つの異なる操作によって開始される2つのプロセスを作成します。