实现动态 BPEL 流程(一)

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

  Web服务和面向服务体系结构 (SOA) 使业务流程可以通过与其他业务流程和应用程序进行交互而轻松扩展。BPEL 流程通过合作伙伴链接定义此交互。这些链接定义了接口(消息和操作)、传输协议,并且最重要的是定义了要使用的每个服务的位置。

  在大多数基本流程设计中,合作伙伴链接是静态的;它们引用开发人员在设计时指定的一个外部流程。该方法适用于高度定向或高度限制的系统。而在大型系统中,业务流程更为复杂。它们与多个外部服务交互,并定义了多个合作伙伴链接,而且其中的某些合作伙伴链接在设计时可能是不可知的。因此,必须在业务流程内部构建所有可能的调出以及用于确定要使用的合作伙伴链接的逻辑,这将使该流程不必要地复杂化。此外,随着合作伙伴链接的增加,最终的流程变得越来越难以处理,这是因为对合作伙伴链接的任何更改都要求修改整个业务流程。

  幸运地是,BPEL 语言支持合作伙伴链接的动态绑定 概念。动态绑定使开发人员可以通过配置或运行时的输入添加新服务。该方法不需要在设计时预计和管理所有父子关系。

  在 BPEL 指南的这一部分中,我将概述一个有效的策略,即让系统在运行时动态管理合作伙伴链接,从而使 BPEL 流程不受合作伙伴关系链接变化的影响。此外,我还将介绍如何按顺序或并行地动态调用多个 BPEL 流程。

  动态绑定概述

  与传统编程领域的面向对象的分析和设计相似,合作伙伴链接的动态绑定可以实现代码模块化以及流程之间的运行时绑定。该方法的好处包括:

  · 通过将功能组件细分为工作单元支持面向小组的开发

  · 不必修改和重新部署父流程即可创建和部署更多子流程组件

  · 使用、维护和增强单个重叠流程的需要降低

  · 父流程可以自动获知子流程的更改和增强

  本质上而言,动态流程使系统可以适应在设计时不可知的条件。例如,可以根据数据内容确定流程 – 如果数据不充分,则可以在运行时调用外部数据源(如外部数据库)来确定流程。

  使用动态流程还可以为在高级流程的开发与配置和维护之间存在职责划分的组织带来重要好处。开发小组可以负责了解 BPEL 实现以及流程组件创建的细节,随后,业务分析员或支持小组等领域专家便可以将这些组件组装到单个工作流中,而不必详细了解合作伙伴链接、命名空间、WSDL、XPATH 以及其他技术细节。

  构建动态 BPEL 流程

  正如我在前面所介绍的,合作伙伴链接描述业务流程或其他服务的接口。BPEL 流程使用合作伙伴链接中存储的信息调用这些外部服务。

  合作伙伴链接使用 WSDL 中的 portTypes 定义构成服务接口的操作和消息类型。如图 1 所示,portTypes 还间接定义了用于与服务(绑定)和服务的位置(服务)进行通信的传输。

  图 1 工作中的 portTypes

  在静态 BPEL 流程中,合作伙伴链接信息在设计时定义。但在某些情况下,开发人员并不知道所有合作伙伴链接信息,或者需要在运行时更改所有合作伙伴链接信息以满足数据或其他动态要求。

  来看一个贷款处理情景的示例。在该示例中,您需要根据输入数据(如地理区域、贷款额或信用记录)选择贷款提供商。该数据在运行时是不可知的,并且如果涉及很多可能的贷款提供商,则可能很难将该流程的模型构建为静态地管理您可使用的所有不同服务。

  动态地选择提供商则解决了这个问题。WS-Addressing 标准提供了一个称作端点引用的机制,使您可以在 WSDL 中选择一个可用服务,甚至还可以在运行时定义新服务。业务流程静态地依赖于 portType 中定义的接口信息,而端点引用(将绑定映射到服务)使您可以动态重新定义服务位置。本质上而言,端点引用是 WSDL 中定义的静态服务元素的动态替换项。在很多情况下,只要服务全部与标准接口一致,流程设计者便可以不必决定要调用哪些服务。Oracle BPEL 流程管理器附带的 DynamicPartnerLink 示例为了解这些主题提供了一个不错的切入点。我们将逐步研究该示例;然后,您将了解如何从头构建一个动态流程。(注意:建议您在使用该示例之前熟悉一下标准 LoanFlow 教程。)

  了解 DynamicPartnerLink 示例

  DynamicPartnerLink 示例是了解合作伙伴链接和端点引用这两个基本概念的十分好的资源。它允许您从三个贷款服务提供商(United、Star 和 American)中指定一个,并根据流程输入动态调用相应的服务。

  在本文中,您将使用 Oracle BPEL 流程管理器 10.1.2 的 GA 版本中提供的示例;您将在目录 [BPEL_HOME]samplesreferencesDynamicPartnerLink 中找到它。我使用 10.1.2 版的补丁 1 开发并测试了本文介绍的代码。

  注意:当您初次加载和部署 Dynamic Partner Link 示例时,请不要在 Oracle JDeveloper 可视化设计器中对代码进行任何修改,只按原样部署它即可。如果要进行并保存这样的更改,JDeveloper 将通过引入换行符基于它的标准 XML 布局重新格式化 BPEL 代码。JDeveloper 修改<EndpointReference> 数据内部的 <Address> 和 <ServiceName> 标记,在 </Address> 和 </ServiceName> 结束标记之前添加一个换行符。附加到这些元素内部的数据的换行符用于中断绑定。如有必要,可以删除服务和地址上位于结束标记之前的换行符来更正该问题。稍后,我将介绍另一个方法来填充不受 JDeveloper 所应用格式影响的端点引用。

  从控制台启动该示例时,将要求您填写贷款流程演示的标准贷款应用程序数据(SSN、电子邮件等)以及“provider”域。在 provider 字符串中指定以下值之一:united、american 或 star。分别使用这三个值运行该示例,查看它的运行情况。该流程将动态调用相应的贷款提供商。也可以在 provider 字符串中使用某个其他值或根本不使用值来试用该示例。

  要了解该动态流程如何工作,首先必须分析 DynamicPartnerLink.bpel 文件。该文件中第一个比较有意义的项是贷款服务合作伙伴链接:

<partnerLink name=”LoanService” partnerLinkType=”services:LoanService”
myRole=”LoanServiceRequester” partnerRole=”LoanServiceProvider”/>

  该链接指定了一个通用贷款服务名称和类型 (services:LoanService),而没有定义特定的贷款服务(如 UnitedLoan)。LoanService 合作伙伴链接是在 LoanService.wsdl 文件中定义的;导入该文件的方法是将它添加到 bpel.xml 文件的 <partnerLinkBindings> 部分中,如下所示:

<partnerLinkBinding name=”LoanService”>
<property name=”wsdlLocation”>LoanService.wsdl</property>
</partnerLinkBinding>

  在 LoanService.wsdl 文件中您将发现,每个可用的贷款供应商都在这个 WSDL 文件中定义为 <service>,如下所示。

<service name=”StarLoan”>
<port name=”LoanServicePort” binding=”tns:LoanServiceBinding”>
<soap:address location=”http://localhost:9700/orabpel/default/StarLoan”/>
</port>
</service>
 
<service name=”UnitedLoan”>
<port name=”LoanServicePort” binding=”tns:LoanServiceBinding”>
<soap:address location=”http://localhost:9700/orabpel/default/UnitedLoan”/>
</port>
</service> 
 
<service name=”AmericanLoan”>
<port name=”LoanServicePort” binding=”tns:LoanServiceBinding”>
<soap:address location=”http://localhost:9700/orabpel/default/AmericanLoan”/>
</port>
</service> 

  必须应认识到,并不存在“真正”名为“LoanService”的服务。而 LoanService 只是一个模板,不过从中可以选择真正的贷款提供商服务(UnitedLoan、AmericanLoan、StarLoan)。只要真正的服务全都支持模板 WSDL 中定义的同一接口(相同的数据类型、消息、角色、端口和合作伙伴链接类型),该方法便会有效。由于此处的更改可能会彻底影响许多流程,因此必须仔细地定义该模板。

  LoanService.wsdl 文件定义了所有服务选项,父流程可以从中选择要动态调用的选项。该模型要求在添加每个新服务时重新部署 WSDL 文件。与修改父流程以使每个新服务都包含新合作伙伴链接和路由逻辑相比,该方法有了很大的改进。(稍后,您还将了解如何将服务端点与 WSDL 文件解除关联。)
返回到 DynamicPartnerlink.bpel 文件,我们要了解的下一个特性是 partnerReference 变量:

<variable name=”partnerReference” element=”wsa:EndpointReference”/>

  该变量的类型为 EndpointReference。它包含一个命名空间 wsa,后者在该文件的顶部定义为
xmlns:wsa=http://schemas.xmlsoap.org/ws/2003/03/addressing

  WS-Addressing 标准提供了 EndpointReference 类型的模式。可以使用 <assign> 将此类变量指定到合作伙伴链接以便修改地址和服务信息,这样就可以在运行时修改合作伙伴链接了。

 

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

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

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

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

相关推荐