业务流程执行语言 (BPEL) 基于 XML 语言,专门针对业务流程行为。IBM®、BEA Systems Inc. 和 Microsoft 的开发人员最早编写了 BPEL,并于 2003 年 4 月将其提交给 Organization for the Advancement of Structured Information Standards (OASIS) 标准委员会。BPEL 将业务流程描述为 Web 服务之间的交互,并且将流程表示为 Web 服务。 IBM WebSphere® Business Integration Server Foundation V5.1包含了对该语言的实现。WebSphere Application Developer Integration Edition (Application Developer Integration) 包含了一个用于 BPEL 流程的图形编辑器,并且可以从业务流程创建 EAR 文件。
BPEL 流程描述的只是在处理过程中调用的抽象 Web 服务。当 Application Developer Integration 通过 BPEL 源文件创建一个可安装的 EAR 文件时,流程开发者必须提供实际的绑定和具体的服务端点。然而,存在着这样的情况,在流程开发时,实现抽象 Web 服务的服务端点是未知的。只能在业务流程处理的过程中确定实际服务端点的地址。
本文讲述了如何完成这样的动态服务绑定。在第一部分中,我将示范如何从 BPEL 流程中调用 Web 服务。然后,我将演示如何使用 Application Developer Integration 将服务端点绑定到 BPEL 流程。最后,我将向您展示如何在流程运行时重写服务绑定,并完成实现使用动态服务绑定的 BPEL 业务流程所必需的各个步骤。文章的屏幕截图和详细指导可以帮助您在 Application Developer Integration 中重现每一个步骤。
这一部分描述如何从 BPEL 流程中调用 Web 服务。同时也将介绍必要的 BPEL 和 Web 服务描述语言(WSDL)元素,并讲述如何使用 Application Developer Integration 来创建这些元素。
下面假定 BPEL 流程验证顾客的信用卡信息。提供该操作的抽象 WSDL 如 图 1 所示:
图 1. 信用卡验证服务的抽象 WSDL
要通过 BPEL 流程调用 verifyInformation 操作,下列 BPEL 元素是必需的:
在流程中,
<伙伴链接> 用作信用卡服务的占位符,并且是 BPEL 文件的一部分。伙伴链接类型(请参见
下一部分)进一步定义了合作伙伴链接,并且有别于业务流程中其他元素的名称。示例如下:
清单 1. 合作伙伴链接
<partnerLink
|
WSDL 文件定义了合作伙伴链接类型。伙伴链接类型可以有一个或两个角色。每个角色都分配了端口类型。如果两个合作伙伴互相对话,也就是说,双方都调用各自伙伴的操作,此时伙伴链接类型就有两个角色。如果是一个伙伴发生操作调用,则合作伙伴链接类型就必定只有一个角色。
由于您不希望信用卡服务出现任何回调(异步),而只是对从信用卡服务调用操作感兴趣,所以您需要在合作伙伴链接类型中创建一个角色,并分配端口类型(
creditCardPort )到该角色:
清单 2. 合作伙伴链接类型
<plnk:partnerLinkType name="CreditCardServicePLT">
<plnk:role name="ServiceRole">
<plnk: portType name="wsdl1:creditCardPort"/>
</plnk:role>
</plnk:partnerLinkType>
|
其中,plnk 引用名称空间 http://schemas.xmlsoap.org/ws/2003/05/partner-link/。
要使用 Application Developer Integration V5.1 中的 BPEL 编辑器创建
<partnerLinkType> 和
<partnerLink>
,请按照下列步骤进行操作:
- 单击
Partner Links区域内的
图标。
- 单击详细情况区域内的
Description 选项卡,在名称字段中键入
CreditCardService。 - 单击详细情况区域内的 Implementation选项卡。
- 单击 New创建一个新的合作伙伴链接类型。弹出 New Partner Link Type 对话框。
- 对 File 和 Partner Link Type 采用缺省设置。
- 角色数选择 One Role。
- 在 First Role 字段键入
ServiceRole。 - 单击 Browse...来指定包含服务合作伙伴链接类型的 WSDL 文件。用相同的方法选择包含信用卡服务抽象服务描述的 WSDL 文件。
- 确保选择端口类型为 creditCardPort。
-
图 2是完整的 Partner Link Type 对话框。
图 2. 完整的 Partner Link Type 对话框
- 单击 OK结束合作伙伴链接类型和合作伙伴链接的定义。
变量保存着从信用卡服务接受到或是发送到信用卡服务的数据。对于这种情况,变量的定义如下所示:
清单 3. 变量定义
<variable messageType="wsdl1:informationRequest" name="creditCheckIn"/> <variable messageType="wsdl1:informationResponse" name="creditCheckOut"/> |
要使用 Application Developer Integration V5.1 创建这些变量,请按照下列步骤进行操作:
- 单击
Variables区域内的
图标。
- 单击详细情况区域内的
Description 选项卡,在名称字段中键入
creditCheckIn。 - 单击详细情况区域内的 Message选项卡,然后单击 Browse... 来选择包含该变量消息定义的文件,如 图 3所示。
- 选择包含信用卡服务的抽象服务描述的 WSDL 文件。
- 在下拉列表中选择
informationRequest。
图 3. 用来选择流程变量 WSDL 消息的浏览对话框
- 单击 OK结束 WSDL 消息的选择。
- 重复这些操作以创建保存信用卡服务响应的其他变量。
调用服务的
<invoke> 活动:
清单 4. 调用活动
<invoke name="creditCardCheck"
|
要使用 Application Developer Integration V5.1 创建一个
<invoke> 活动,请按照下列步骤进行操作:
- 单击选项板中的
Invoke图标(
)。然后,单击该选项板,向流程中添加一个调用活动。
- 单击详细情况区域内的
Description 选项卡,在名称栏键入
creditCardCheck。 - 单击详细情况区域内的 Implementation选项卡。
- 单击 Partner Link 下拉列表中的 CreditCardService,如 图 4所示。
- 在 Operation 下拉列表中选择 verifyInformation。
- 单击 Request 下拉列表中的 creditCheckIn。
- 单击 Response 下拉列表中的
creditCheckOut。
creditCheckIn 变量的内容将发送到信用卡服务。服务返回流程的数据将保存在 creditCheckOut 变量中。
图 4. 调用活动的实现
从前面的部分可以看出,BPEL 流程定义并没有引用调用的 Web 服务的绑定和服务地址。BPEL 标准没有指定在 BPEL 文件中定义服务绑定和地址。 WebSphere Process Choreographer使用组件和连线文件(wiring file)将连接绑定和服务信息与 BPEL 文件中的信息连接起来。
这一部分描述了 WebSphere Business Integration Server Foundation V5.1 中如何为 BPEL 流程提供服务端点。
WebSphere Studio Integration Edition 自动为流程和调用的 Web 服务创建 .component 文件。该文件描述了流程或 Web 服务的接口和实现。
例如,为上一部分的信用卡服务创建的 .component 文件如下所示:
清单 5. 信用卡服务的组件文件
<interfaces>
<wInterface portType="wsdl1:creditCardPort"/>
</interfaces>
<implementation xsi:type="service:OutboundServiceImplementation">
<wsdl ref="creditCardService.wsdl"
serviceName="wsdl1:creditCardSOAPService"
portTypeName="wsdl1:creditCardPort"
portName="creditCardPortSOAPPort"/>
</implementation>
|
而 BPEL 流程的 .component 文件又包含对信用卡服务的引用。该引用与 BPEL 文件中所包含的合作伙伴链接定义相匹配。
清单 6. BPEL 流程的组件文件
<interfaces>
... interface of the process ...
</interfaces>
<references>
<wReference name="CreditCardService" portType="wsdl1:creditCardPort"/>
... other services the process invokes ...
</references>
<implementation xsi:type="wcdlProcess:ProcessImplementation">
... implementation of the process ...
</implementation>
|
当 BPEL 流程的部署代码生成后,流程和服务的组件文件便 连接在一起。当流程执行和调用 verifyInformation 操作时,它将使用 Web 服务的信用卡组件文件来提供服务和端口的信息。
要使用 Application Developer Integration V5.1 在 BPEL 流程和 Web 服务之间创建绑定,可以按照下列步骤进行操作:
- 右键单击 Services 视窗中的 BPEL流程。
- 选择 Enterprise Services > Generate Deploy Code。会弹出 Generate BPEL Deploy Code 对话框。您可以将具体的绑定和端口分配给流程中所用的每个 Web 服务。
- 在 Referenced Partners区域中,选择 CreditCardService,如 图 5所示。
- 单击 Browse...并选择包含信用卡服务定义的 WSDL 文件。
- 确保在
Port区域中选择您需要使用的端口。
- 单击
OK 启动生成 .wiring 文件和部署代码。
图 5. Generate deploy code 对话框
当从流程中调用 Web 服务时,WebSphere Process choreographer 总会要求您指定具体的端口和端点。因此,如果您在流程开发时不知道将调用什么服务,就需要创建 虚拟服务来匹配以后将在某些区域内调用的服务。
虚拟服务必须:
- 实现与以后将要调用的服务相同的端口类型。
- 有与最终要调用的服务相同的绑定类型(doc/lit、rpc/encoded 等等)。
要在流程实例运行时使合作伙伴链接能够绑定到另一个服务端点,您必须将合作伙伴链接的 resolutionScope属性设置为 computed:
清单 7. 带有解析范围的合作伙伴链接
<partnerLink
name="CreditCardService"
partnerLinkType="wsdl0:CreditCardServicePLT"
partnerRole="ServiceRole"
wpc:resolutionScope="computed"/>
|
要使用 Application Developer Integration V5.1 来设置该属性,可以按照下列步骤进行操作:
- 单击 Partners 区域内的 CreditCardService。
- 单击详细情况区域内的 Server选项卡,如 图 6所示。
- 在 Resolution Scope 下拉框中,选择
computed。
图 6. 设置合作伙伴链接的解析范围
在流程运行时,您需要知道调用服务的服务端点。取决于流程内的其他数据,您可能来到要使用的服务端点,也可能通过您在控制流程流的过程中进行的 UDDI 查询来接收服务端点。您也可以在流程实例启动时提交服务端点。
对于任何一种方法,您都需要变量来保存服务端点。WSDL 消息定义变量,而变量又含有
EndpointReferenceType 类型的复杂部分。
图 7显示了这样的消息的一个示例:
图 7. 保存服务端点的消息示例
WSAddressing.xsd 定义了复杂类型
EndpointReferenceType 。它有几个复杂部分,如
图 8所示:
图 8. EndpointReferenceType 的结构
然而,如果使用
EndpointReferenceType 来进行动态服务绑定,就只有地址部分是必须设定的。应用于虚拟服务的限制(不可改变的端口类型和绑定类型)会导致其他部分的值被忽略,即使可能设置了它们的值也是如此。
对于 BPEL 流程中使用的每一个变量,Application Developer Integration 都会生成一个反映变量结构的 Java 类。如果包含有部分
EndpointReferenceType 类型的消息定义了变量,
com.ibm.websphere.srm.bpel.wsaddressing.EndpointReferenceType 类就保存服务端点数据。
下面的 Java 代码片断向您展示了如何初始化此
EndpointReferenceType 类的实例以将其用于动态服务绑定。对于这些代码,假定服务和绑定如
图 9所示。
清单 8. 创建端点引用
com.ibm.websphere.srm.bpel.wsaddressing.AttributedURI address = new AttributedURI();
com.ibm.ws.webservices.engine.types.URI addressValue = new URI();
com.ibm.websphere.srm.bpel.wsaddressing.EndpointReferenceType e =
new EndpointReferenceType();
|
图 9. 信用卡服务的服务和绑定
您已经知道如何重写服务的合作伙伴链接,如何创建保存服务端点的变量,以及如何创建保存该变量的服务端点。您最后需要做的事情就是,为用于调用活动的合作伙伴链接分配服务端点。
首先,在调用活动之前,您需要将分派活动添加到流程控制流(请参见
图 10):
图 10. 将分派活动添加到流程
然后,按照下列步骤实现分派活动:
- 在 From 下拉框中选择 Variable or Part,如 图 11所示。
- 在左边的框中选择包含 EndpointReferenceType 的变量部分。
- 在 To 下拉框中选择Select Partner Link Reference。
- 在右边的框中选择
CreditCardService。
图 11. 实现分派活动
现在,可以准备部署并运行流程。当流程实例在 WebSphere Process Choreographer 中运行时,在变量中保存的服务端点信息可用于调用活动。动态选择的信用卡服务验证顾客的信用卡信息。
- 您可以参阅本文在 developerWorks 全球站点上的
英文原文.
- 您可以在 WebSphere Developer Domain 中获得有关 Process Choreographer 的更多信息。
WebSphere Application Server Enterprise Process Choreographer页面上列出了当前所有的文章。
- 访问 developerWorks 上的
WebSphere Business Integration主页,以获取有关 WebSphere Business Integration Server Foundation 的更多信息。
-
阅读IBM developerWorks 上的 Web 服务寻址(WS-Addressing)规范。您还可以获取与该规范有关的
XSD文件。
- 访问 developerWorks 上的
WebSphere Studio zone、
WebSphere,以了解如何获取和使用有关应用程序开发的 IBM 系列工具的综合信息。
- 在
developerWorksSOA and Web services 技术专区
上查找其他 SOA 和 Web 服务技术资源。
- 在
Developer Bookstore上以折扣价购买关于各种技术主题的图书。