2011-04-20 64 views
2

我是BPEL寫作中的新手。我已經實現了以下簡單的過程:BPEL流程在第二次接收時停止

receive1 | | invoke1 | | receive2 | | invoke2

問題是,過程正確運行到「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,這個過程會繼續等待接收。我的問題是:爲什麼?我錯過了什麼?

謝謝

回答

3

您需要爲第二次接收定義相關集。發送到連接到第一個接收活動的操作的每條消息都將創建一個新的流程實例。這意味着你可能有多個實例並行運行。當這些實例到達第二次接收時,它們正在等待第二條消息,但在您的示例中,沒有辦法區分哪條消息針對哪個流程實例。我假定您的BPEL引擎也記錄了它不能將消息路由到目標實例。

要解決此問題,您需要在消息的有效內容中找到標識符,並使用此值初始化相關集。然後,當使用與第二次接收相同的相關集時,包含相同標識符的所有消息將被路由到此特定流程實例。有關相關集的更多信息,我建議閱讀BPEL primer,第4.2.4節。

+0

感謝vanto爲您的答案, 我已經發現它是這樣的東西。 無論如何,我對BPEL規範中的另一句話感到有些困惑:「業務流程實例不能同時爲同一個partnerLink,portType,operation和correlationSet啓用兩個或多個活動」。 現在我的進程的第二次接收使用第一個和同一個合作伙伴角色和端口類型相同的partnerLink,但自然是一個不同的操作。老實說,在我看來,最好的辦法就是繼續。無論如何,我會嘗試設置correletion。 再次感謝 – user716658 2011-04-20 12:32:34

+0

partnerLink,portType,操作和關聯集合必須唯一的限制也具有相同的原因。實際上,它不是關於相關集定義,而是關於它的實例。限制的目標是確保始終只有一個實例與某個相關令牌關聯。因此,讓我們考慮一個簡單的過程,首先接收登錄消息(用戶名,密碼),在用戶數據庫中執行查找並創建會話。會話ID被髮送回客戶端,然後接收或選擇正在等待例如訂單(續下一條評論)。 – vanto 2011-04-20 15:45:10

+0

@vanto(續下一評論)??? – 2016-07-22 13:52:12