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 教程。)
