实现动态 BPEL 流程(三)

日期: 2007-12-13 来源:TechTarget中国

  现在,您可以使用标准复制规则填充 partnerReference 变量的 ServiceName 和 Address 元素。确保根据空白端点引用中的定义为服务指定同一命名空间 (ns1)。<assign> 应如下所示:

<assign name=”SetupPartnerlink”>
<copy>
<from>
<EndpointReference

>   
<Address/>   
<ServiceName/>
</EndpointReference>
</from>
<to variable=”partnerReference”/>
</copy>
<copy>
<from expression=”‘ns1:UnitedLoan'”/>
<to variable=”partnerReference” query=”/ns3:EndpointReference/ns3:ServiceName”/>
</copy>
<copy>
<from expression=”‘http://localhost:9700/orabpel/default/UnitedLoan'”/>
<to variable=”partnerReference” query=”/ns3:EndpointReference/ns3:Address”/>
</copy>
</assign>

  还要注意的是,直到使用 partnerReference 变量时,才会把 LoanService.wsdl 文件添加到 bpel.xml 文件中(以便可以访问 EndpointReference 模式)。

  8. 将 partnerReference 变量复制到 DynamicLoanService 合作伙伴链接中。

  在 DynamicLoanService 的 SetupPartnerlink 动作和 <invoke> 之间创建一个新的 <assign>。创建一个新副本并对它进行设置(如图 5 所示)。

  图 5 创建一个新的复制规则

  完成这些步骤后,将创建一个动态 BPEL 流程。该流程已经把地址指定硬编码了。可以用运行时收集的信息替换第 7 步中的最后两个复制规则来修正此种情况。图 6 中显示了 BPEL 流程示意图。

  图 6 新的 BPEL 流程

  提高动态流程的效率

  正如您在前一个示例中看到的,LoanService.wsdl 列出了在运行时动态调用的所有可用服务。可以通过在每次添加新服务时消除修改业务流程的需要来丰富此业务流程的动态机制。新服务在 WSDL 中定义,并重新部署 WSDL 以启用新服务。

  您可以将此动态机制再提高一个层次:WSDL 驱动的方法要求在设计时就知道新服务的位置,但您可以使流程更独立于 WSDL。该方法不需要在每次添加服务时重新部署 WSDL。

  在运行时消除地址相关性。 服务地址可能经常变化,但您可以使动态流程在运行时不受这些变化的影响。如果只指定一个服务名称而未指定地址,则将从 WSDL 中检索服务地址。为了进行演示,我们从模板复制规则的 XML 片段中删除地址的 stub (<Address/>)。由于您要很快恢复此地址信息,因此在执行此操作之前备份 MyDL.bpel 文件。此外,从 SetupPartnerLink <assign> 语句中删除操作该地址的复制规则。SetupPartnerlink <assign> 现在应如下所示:

<assign name=”SetupPartnerlink”>
<copy>
<from>
<EndpointReference
>   
<ServiceName/>
</EndpointReference>
</from>
<to variable=”partnerReference”/>
</copy>
<copy>
<from expression=”‘ns1:UnitedLoan'”/>
<to variable=”partnerReference” query=”/ns3:EndpointReference/ns3:ServiceName”/>
</copy>
</assign>

  现在,再次部署并运行 MyDL 流程。尽管缺少地址,它仍可以成功地调用 UnitedLoan 子流程。可以通过在 BPEL 控制台中查看流程树视图来验证该动作。其结果是,可以通过只部署一个新的 WSDL(它将包含已修改的服务地址信息)来修改动态流程的行为。需要权衡的是,添加新服务将需要修改和重新部署 WSDL。

  独立于 WSDL 服务。 在某些情况下,除了有许多要管理的服务以外,您可能还遇到这样的情况:服务地址经常变化,或要避免对 WSDL 文件进行频繁地更新。允许流程在运行时指定端点引用的地址即可解决该问题。

  返回前一个版本的 MyDL.bpel 文件(该文件包含地址操作复制规则)。从模板 XML 片段和 ServiceName 复制规则中删除服务信息,而不是删除地址信息。<assign> 现在应如下所示:

<assign name=”SetupPartnerlink”>
<copy>
<from>
<EndpointReference
>
<Address/>
</EndpointReference>
</from>
<to variable=”partnerReference”/>
</copy>
<copy>
<from expression=”‘http://localhost:9700/orabpel/default/UnitedLoan'”/>
<to variable=”partnerReference” query=”/ns3:EndpointReference/ns3:Address”/>
</copy>
</assign>

  运行该示例时,即使在未指定服务名称的情况下,此流程仍正确调用 UnitedLoan 服务。您可以创建只包含一个虚拟服务的 DynamicPartnerLink WSDL,并且即便某些服务不在 WSDL 中,只要在运行时知道这些服务的地址就可以调用它们。如果由于某种原因未指定地址,则它将使用 WSDL 中默认服务的地址。因此,一个好办法就是让该服务指向实际的 BPEL 流程(一个可能记录错误或发送通知的流程)。

  构建异常处理框架时就可以使用该技巧。如果有多个提供给定服务的可用地址(如本地服务器和远程冗余服务器),则可以在对主服务器的调用失败时使用异常处理程序覆盖端点引用中的地址信息并重试服务调用切换到第二个地址。

 

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

相关推荐