【TechTarget中国原创】在本文的第三部分,我们用实例介绍了如何为封装WS-BPEL的服务设计WSDL定义。在这一部分,我们将运用更多的实例介绍创建WS-BPEL流程服务。
通常的面向服务设计都建议流程服务的设计应该从服务契约开始。所以为了提供更多的WSDL和WS-BPEL定义的例子,我们就来遵循这个过程。
Hello服务的WSDL定义(抽象描述)
我们从一个简单的Hello服务的新WSDL文档开始:
点击查看例6。
例6中的高亮显示部分表示的是partnerLinkType结构。在该结构中,对WS-BPEL流程和它的使用者(客户端服务)的关系进行了定义。
注意,必须为所涉及的每一个伙伴服务指定partnerLinkType的结构。不过在这个例子中,WS-BPEL流程只有一个伙伴,即流程的使用者。因此,只需在描述这个WS-BPEL流程服务的WSDL文档中指定一个partnerLinkType结构。
Hello服务WSDL定义(抽象和具体描述)
也许你已经注意到,例6中的WSDL定义没有包含部署信息(绑定和地址信息)。事实上客户端服务使用的是这个文档的修改版。基于上面的WSDL代码,WS-BPEL引擎可以动态地生成包含绑定和地址信息的文档。因此,当我们用浏览器请求这个WSDL定义时,我们应该收到下面的输出信息:
点击查看示例7。
WS-BPEL引擎隐式地生成了绑定和服务的定义,因此客户端伙伴服务能够使用这里讨论的流程服务。
Hello WS-BPEL流程定义
下一步要实施WS-BPEL流程定义。这些是相应hello.bpel文件的内容:
点击查看例8。
partnerLinks部分包含与伙伴服务建立关系的partnerLink部分;在执行过程中,这些伙伴服务与业务流程进行交互。在例8中,partnerLinks部分只包含了一个入口,即表示流程服务和客户端服务之间关系的入口。这种情况下,需要使用partnerLink元素中myRole属性,因为WS-BPEL流程服务是客户端服务的服务提供者。
注意partnerLink元素中partnerLinkType属性指定的名字。这个很重要,它就是之前提到hello.wsdl文档中对应的partnerLinkType部分指定的名字。
序列结构中定义的活动顺序非常直接明了。第一个是receive(接收)活动,用来处理客户端服务发送过来的请求消息。把receive的createInstance属性设置为“yes”,就是告诉WS-BPEL引擎:当活动接收到请求消息时,创建一个流程实例。
序列活动中的下一个活动是assign(赋值)。这里实际上是基于输入消息中的信息,生成了输出消息。
最后,定义了一个reply(回答)活动,它负责向客户端服务发送输出消息。部署完hello流程服务,知道了如何去获得向客户端描述这个服务的WSDL文档,接下来就是测试。为此,你可能需要创建并运行下面这段PHP脚本:
点击查看例9。
当执行时,上面的脚本应该会调用之前讨论的hello流程服务,并输出下面的hello消息:
Hello,Larry!
在本文的最后一部分,我们将进一步用实例介绍WS-BPEL流程服务如何与伙伴服务产生交互。
关于作者
Yuli Vasiliev是软件开发者、自由撰稿人和咨询师。目前专注于开源开发、Oracle技术和SOA。他具有十多年的软件开发经验和七年多的技术写作经验。他出版的新书《SOA and WS-BPEL》具体详述了如何使用开源产品PHP和ActiveBPEL引擎创建和部署你自己的面向服务解决方案。