以下の環境
・Fusion Middleware 11g + JDeveloper 11g
・SoapUI
前回やってみた結果、Flow アクティビティ内部に置いた他サービスの同期呼び出し(invoke)は、本来は互いに結果受信を待ったりせずに並列実行されるのが望ましいが、実際、そうはならず逐次実行されてしまうことがわかった。つまり、並行する2つのブランチで実行される10秒ずつのサービスが、並列に10秒で実行されるのではなく、1つずつ合計20秒で実行されることになる。また、パートナーリンクの nonBlockingInvoke プロパティを設定しても、結局並列実行にはならなかった。
で、今回は次善の策として、明示的な非同期呼び出しを試した。
■ 試行-パートナーリンク
前回同様、受信XMLに含まれるミリ秒だけ待って、開始終了時間を返す外部サービスを適当に作った(ただし今回は非同期なサービスとした)。これをパートナーリンクで指定して BPEL から呼び出してみる。
まずこれを呼び出す BPEL 定義を、ブランチ一本の Flow アクティビティを使ってやってみる。
まあ、普通に問題なく動いた。
次にこのFlowアクティビティに、同じ構成のブランチを一本追加してみる。
あまり期待していなかったが、やっぱりエラーがでた。
<faultstring>receiveが競合しています.
類似したreceiveアクティビティが同じプロセスで宣言されています。.
別のreceiveアクティビティまたは同等のもの(現在のところ、pickアクティビティのonMessageブランチ)が、partnerLink "WaitAsyncProcess1"、操作名"processResponse"および相関セット"" (または対話ID)ですでに有効になっています。BPEL 1.1仕様の「Appendix A - Standard Faults」によると、このような状況ではフォルトがスローされます。
競合しているreceiveアクティビティを削除してからプロセスを再デプロイしてください。.</faultstring>
類似したreceiveアクティビティが同じプロセスで宣言されています。.
別のreceiveアクティビティまたは同等のもの(現在のところ、pickアクティビティのonMessageブランチ)が、partnerLink "WaitAsyncProcess1"、操作名"processResponse"および相関セット"" (または対話ID)ですでに有効になっています。BPEL 1.1仕様の「Appendix A - Standard Faults」によると、このような状況ではフォルトがスローされます。
競合しているreceiveアクティビティを削除してからプロセスを再デプロイしてください。.</faultstring>
なるほど、受信系のアクティビティは、partnerLink、操作名、相関セットの組で一意に識別されるらしい。
というわけで、同じサービスについて別々の partnerLink を定義して、Flowアクティビティ以下の各ブランチで呼ぶようにしてみる。
なるほど上手くいった。
■ 試行2-相関セット
さらに相関セットも試してもみた。
- まずブランチ1本の Flow から相関セットを指定して非同期呼び出しをやってみて確認。まあ当たり前だが、これは上手く行く。
- 次に、ブランチを足してみる。試しに上で使ったのと同じ相関セットを指定してみると、「同じ相関セットは2度初期化できない」といった感じのエラーになる。
- 上の相関セットと同じプロパティを用いて、別の相関セットを追加定義してみる。これは上手くいった。
- プロパティとプロパティエイリアスを別途追加定義して、上で追加した相関セットに関連付けてみる。例外発生。
→ <detail>java.lang.NullPointerException
受信XML の同じ部分に別々のプロパティエイリアスを関連付けるのがNGという事なのか。NullPointerException なのでよく分からない。
at com.collaxa.cube.engine.delivery.CorrelationProperty.<init>(CorrelationProperty.java:53)
at com.collaxa.cube.engine.delivery.DeliveryHelper.createCorrelationSet(DeliveryHelper.java:231)
at com.collaxa.cube.engine.ext.common.ReceiveHandler.handleNormalInput(ReceiveHandler.java:178)
・・・以下略
■ 結び
結局、ある ParallelSplit の別々の分岐で同じサービスを invoke する場合、(1)パートナーリンクを別途定義する方法と、(2)同一プロパティに相関セットを別途定義する方法があるらしいことが分かった。
ただ、本当に正しいやり方なのか、何となく不安な感じもある(特に相関セットの方)。以外にネット上の言説も少なくて、これらのやり方で良いのか、またどちらのやり方が良いのかなど、確信が得られない。
あと、方法として問題なかったとしても、パートナーリンクや相関セットを定義する都合上、事前に分岐の数が決まっている必要があるので、FlowNでは使えないということになる。
元はといえば、Flow アクティビティの並列実行が、文字通り本当に並列実行できていれば問題ないのだけど、なんだかちょっと面倒くさい事になっている。
Oracle BPEL だからなのか、他製品もそうなのか・・・
0 件のコメント:
コメントを投稿