调用多个动态流程。 在某些情况下,可能需要将单个数据集按顺序或并行传递给多个子流程。您可以使用一个或多个 while 循环实现此类行为。
我们来看一个简单的示例。贷款服务提供商的办公时间可能是按一周的日期安排的。该信息存储在数据库中。贷款请求于星期一到达,当查询数据库时,它返回一个可用贷款服务提供商(United 和 Star)列表。要处理此贷款,需要按顺序或并行调用 United 和 Star 子流程。数据库查询返回以下结果:
<dbOutput>
<part name=”response-
headers”>null</part>
<part
name=”DynamiclinksCollection”>
<n:DynamiclinksCollection
>
<Dynamiclinks>
<address>http://localhost:9700/orabpel/default/UnitedLoan</address>
<day>monday</day>
<uid>1</uid>
</Dynamiclinks>
<Dynamiclinks>
<address>http://localhost:9700/orabpel/default/StarLoan</address>
<day>united</day>
<uid>4</uid>
</Dynamiclinks>
</n:DynamiclinksCollection>
</part>
</dbOutput>
为了按顺序调用这些服务,您应创建一个 while 循环。该 while 循环从集合中获得地址并对每个服务执行一个动态调用/接收。
<!– first setup the counter variable “i” –>
<assign name=”CounterReset”>
<copy>
<from expression=”1″/>
<to variable=”i”/>
</copy>
</assign>
<!– while loop goes until all link collection notes are done –>
<while name=”LoanLoop” condition=”bpws:getVariableData(‘i’) <=
count(bpws:getVariableData(‘dbOutput’,’DynamiclinksCollection’,
‘/ns3:Dynamiclin ksCollection/Dynamiclinks’))”>
<sequence name=”Sequence_1″>
<!– reset the endpoint with the usual xml fragment –>
<assign name=”ClearEndpoint”>
<copy>
<from>
<EndpointReference
>
<Address/>
</EndpointReference>
</from>
<to variable=”partnerReference”/>
</copy>
</assign>
<!– set the address in the endpoint variable
based on the current node –>
<assign name=”SetEndpoint”>
<copy>
<from variable=”dbOutput” part=”DynamiclinksCollection”
query=”/ns3:DynamiclinksCollection/Dynamiclinks
[number(bpws:getVariableData(‘i’))]/address”/>
<to variable=”partnerReference”
query=”/wsa:EndpointReference/wsa:Address”/>
</copy>
</assign>
<!– copy the endpoint variable into the partner link –>
<assign name=”DoPartnerlink”>
<copy>
<from variable=”partnerReference”/>
<to partnerLink=”LoanService”/>
</copy>
</assign>
<!– invoke the partner link –>
<invoke name=”Invoke_2″ partnerLink=”LoanService”
portType=”ns2:LoanService” operation=”initiate”
inputVariable=”loanInput”/>
<!– be sure to increment your counter or you have an infinite loop –>
<assign name=”CounterIncrement”>
<copy>
<from expression=”bpws:getVariableData(‘i’)+1″/>
<to variable=”i”/>
</copy>
</assign>
</sequence>
</while>
在以上示例中,您调用了异步服务。但可以并行调用这些异步服务,方法是从 <invoke> while 循环中删除 <receive> 并为它提供一个自己的 while 循环。在运行 <receive> 捕获每个调出流程的响应之前,这些响应将排队。receive 任务将按照响应的返回顺序收集这些响应。该方法将避免短时间运行的任务发出的响应排在长时间运行的任务发出的响应之后。
在收集了所有异步响应之前,建议不要在 <receive> while 循环外部继续运行。
结论
您在本文已经了解到,通过使用端点引用进行动态绑定,BPEL 流程可以变得更为灵活并快速适应不断变化的业务条件。通过将业务逻辑与合作伙伴地址分离,可以增强流程的自适应性和可移植性。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
相关推荐
-
SAP收购CallidusCloud 与Salesforce竞争
一直被称为后台办公巨头的SAP现在似乎也想在前台办公大展拳脚。 最新的迹象是SAP收购CallidusClou […]
-
API设计如龙生九子 各不相同
IT咨询管理公司CA Technologies对API产业做了个问卷调查,问卷内容涉及API设计风格以及管理部署的新动向。调查结果表明,JSON与XML可谓两分天下。
-
从头开始实现领域驱动设计
领域描述业务;它是驱动企业的概念和逻辑的集合。如果遵循领域驱动设计(DDD)这一本质,那么领域就是应用程序中最重要的组成部分。
-
走出思维定式 数据库/大型机现代化不再是问题
升级和改变组织的主要利益驱动应用的前景,正处于一个压倒性的位置,所以组织将要面临一系列的改变。