2

我是 BPEL 写作的新手。我已经实现了下面的简单过程:

接收1 | | 调用1 | | 接收2 | | 调用2

问题是该过程正确运行到“receive2”,但是当我通过soapUI调用时,与“receive2”关联的操作没有任何反应。我已阅读有关 BPEL 的其他帖子,但没有与此问题匹配的帖子。在所涉及的实际活动(我省略了分配的活动)下方。

    <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

您需要为第二次接收定义一个相关集。发送到连接到第一个接收活动的操作的每条消息都将创建一个新的流程实例。这意味着您可能有多个实例并行运行。当这些实例到达第二次接收时,它们正在等待第二条消息,但是在您的示例中,没有办法区分,哪个消息针对哪个流程实例。我假设您的 BPEL 引擎还记录了它无法将消息路由到目标实例。

为了解决这个问题,您需要在消息的有效负载中找到一个标识符,并用这个值初始化一个相关集。然后,当使用与第二个接收相同的相关集时,所有包含相同标识符的消息将被路由到这个特定的流程实例。有关相关集的更多信息,我建议阅读BPEL 入门,第 4.2.4 节。

于 2011-04-20T09:46:59.057 回答