2

私はBPELの作成に不慣れです。以下の簡単なプロセスを実現しました。

受信1 | | | インボーク1 | | | 受信2 | | | インボーク2

問題は、プロセスが「receive2」まで正しく実行されることですが、soapUI を介して呼び出すと、「receive2」に関連付けられた操作は何も起こりません。BPEL に関する他の投稿を読みましたが、この質問に一致するものはありません。関係する実際のアクティビティ (私は Assign のものを省略しました) の下に。

    <bpel:receive name="receiveInput" partnerLink="client"
             portType="tns:HealthMobility"
             operation="initiate" variable="input"
             createInstance="yes"/>

    <bpel:invoke name="getTreatmentOptions" 
     partnerLink="treatmentProviderPL" operation="getTreatmentOptions"  
     inputVariable="getTreatmentOptionsReq" outputVariable="getTreatmentOptionsResp"> 
    </bpel:invoke>

    <bpel:receive name="bookMobility" partnerLink="client" operation="bookMobility" 
     variable="bookMobilityReq" portType="tns:HealthMobility"/>

    <bpel:invoke name="getTripOptions" partnerLink="mobilityMultiProvidersPL"  
     operation="getTripOptions" inputVariable="getTripOptionsReq" 
     outputVariable="getTripOptionsResp"></bpel:invoke>

受信を削除し、getTriOptions 呼び出しで必要な入力変数を静的に初期化するだけで、簡単にデバッグできるようにしました。この場合、すべて正常に動作するため、必然的に、SOAPUI を介して bookMobility を呼び出した場合にも、プロセスは引き続き受信を待機します。私の質問は:なぜですか?何か足りない?

ありがとう

4

1 に答える 1

3

2 番目の受信の相関セットを定義する必要があります。最初の receive アクティビティに接続された操作に送信される各メッセージは、新しいプロセス インスタンスを作成します。これは、複数のインスタンスが並行して実行されている可能性があることを意味します。これらのインスタンスが 2 番目の受信に到達すると、2 番目のメッセージを待機しますが、この例では、どのメッセージがどのプロセス インスタンスを対象としているかを区別する手段がありません。BPEL エンジンも、メッセージをターゲット インスタンスにルーティングできなかったことをログに記録したと思います。

この問題を解決するには、メッセージのペイロードで識別子を見つけ、この値で相関セットを初期化する必要があります。次に、2 番目の受信で同じ相関セットを使用すると、同じ識別子を含むすべてのメッセージがこの特定のプロセス インスタンスにルーティングされます。相関セットの詳細については、BPEL 入門書のセクション 4.2.4 を読むことをお勧めします。

于 2011-04-20T09:46:59.057 に答える