我是BPEL写作的新手。我已经实现了以下简单的流程:
receive1 | | invoke1 | | receive2 | | invoke2
问题是进程正确运行直到“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,它必然会继续等待接收。我的问题是:为什么?我错过了什么?
谢谢
答案 0 :(得分:3)
您需要为第二次接收定义相关集。发送到连接到第一个接收活动的操作的每条消息都将创建一个新的流程实例。这意味着您可以并行运行多个实例。当这些实例到达第二个接收时,它们正在等待第二个消息,但在您的示例中,没有办法区分哪个消息是针对哪个流程实例。我假设你的BPEL引擎也记录了它无法将消息路由到目标实例。
要解决此问题,您需要在消息的有效负载中查找标识符,并使用此值初始化相关集。然后,当使用与第二次接收相同的相关集时,包含相同标识符的所有消息将被路由到此特定流程实例。有关相关集的更多信息,我建议您阅读BPEL primer,第4.2.4节。