BPEL 实例教程(三)

日期: 2007-12-13 作者:Matjaz Juric 来源:TechTarget中国

  第 4 步:创建业务流程

  现在,您就可以开始编写 BPEL 流程了。通常,BPEL 流程等待客户端传入的消息,以启动业务流程的执行。在本示例中,客户端通过发送输入消息TravelRequest 启动此 BPEL 流程。然后,此 BPEL 流程通过发送 EmployeeTravelStatusRequest 消息调用雇员出差状态 Web 服务。由于此调用是同步调用,因此它等待 EmployeeTravelStatusResponse 消息。然后,此 BPEL 流程通过向上述两家航空公司 Web 服务发送 FlightTicketRequest 消息对它们进行并发异步调用。每个航空公司 Web 服务通过发送 TravelReponse 消息进行回调。然后,此 BPEL 流程选择较合适的航空公司并使用 TravelResponse 消息对客户端进行回调。

  我们首先编写一个空的 BPEL 流程提纲,它展示了每个 BPEL 流程定义文档的基本结构:

<process name=”BusinessTravelProcess” … >
  
<partnerLinks>
<!– The declaration of partner links –>
</partnerLinks>

<variables>
<!– The declaration of variables –>
</variables>

<sequence>
<!– The definition of the BPEL business process main body –>
</sequence>

</process>
 
  我们首先添加所需的命名空间。此处,我们必须定义目标命名空间以及用于访问雇员和航空公司 WSDL 以及此 BPEL 流程 WSDL 的命名空间。我们还必须为所有 BPEL 活动标记声明命名空间(此处采用缺省命名空间,以便不必限定每个 BPEL 标记名)。BPEL 活动命名空间必须为 http://schemas.xmlsoap.org/ws/2003/03/business-process/:

<process name=”BusinessTravelProcess”
targetNamespace=”http://packtpub.com/bpel/travel/”

>

  合作伙伴链接接下来,我们必须定义合作伙伴链接,它们定义与此 BPEL 流程交互的不同方。每个合作伙伴链接都与描述其特性的特定 partnerLinkType 相关。每个合作伙伴链接还最多指定两个属性:

  myRole:表明业务流程本身的角色。
  partnerRole:表明合作伙伴的角色。
  合作伙伴链接仅可以指定一个角色,通常同步请求/响应操作也仅能指定一个角色。对于异步操作,它指定两个角色。在本示例中,我们定义四个角色。第一个合作伙伴链接称作客户端,由 travelLT 合作伙伴链接类型描述其特性。此客户端调用该业务流程。我们需要指定 myRole 属性以描述此 BPEL 流程 (travelService) 的角色。我们必须指定第二个角色:partnerRole。此处,该角色为 travelServiceCustomer,它描述 BPEL 流程客户端的特性。

  第二个合作伙伴链接称作 employeeTravelStatus,由 employeeLT 合作伙伴链接类型描述其特性。它是 BPEL 流程与 Web 服务之间的一个同步请求/响应关系;我们再次仅指定一个角色。此时,该角色为 partnerRole,这是因为我们描述了 Web 服务(它是此 BPEL 流程的合作伙伴)的角色:

  最后两个合作伙伴链接对应于航空公司 Web 服务。由于它们使用同一类型的 Web 服务,因此我们基于一个合作伙伴链接类型 flightLT 指定两个合作伙伴链接。此处,由于我们使用异步回调通信,因此需要两个角色。此 BPEL 流程 (myRole) 对于航空公司 Web 服务的角色为 airlineCustomer,而航空公司 (partnerRole) 的角色为 airlineService:

<partnerLinks>
<partnerLink name=”client”
partnerLinkType=”trv:travelLT”
myRole=”travelService”
partnerRole=”travelServiceCustomer”/>

<partnerLink name=”employeeTravelStatus”
partnerLinkType=”emp:employeeLT”
partnerRole=”employeeTravelStatusService”/>

<partnerLink name=”AmericanAirlines”
partnerLinkType=”aln:flightLT”
myRole=”airlineCustomer”
partnerRole=”airlineService”/>
                  
<partnerLink name=”DeltaAirlines”
partnerLinkType=”aln:flightLT”
myRole=”airlineCustomer”
partnerRole=”airlineService”/>
</partnerLinks>
 
  变量 BPEL 流程中的变量用于存储消息以及对这些消息进行重新格式化和转换。您通常需要为发送到合作伙伴以及从合作伙伴收到的每个消息定义一个变量。就我们的流程而言,我们需要七个变量。我们将它们命名为 TravelRequest、EmployeeTravelStatusRequest、EmployeeTravelStatusResponse、FlightDetails、FlightResponseAA、FlightResponseDA 和 TravelResponse。

  我们必须为每个变量指定类型。可以使用 WSDL 消息类型、XML 模式简单类型或 XML 模式元素。在我们的示例中,我们对所有变量使用 WSDL 消息类型:

<variables>
<!– input for this process –>     
<variable name=”TravelRequest”
messageType=”trv:TravelRequestMessage”/>
<!– input for the Employee Travel Status web service –>
<variable name=”EmployeeTravelStatusRequest”
messageType=”emp:EmployeeTravelStatusRequestMessage”/>
<!– output from the Employee Travel Status web service –>
<variable name=”EmployeeTravelStatusResponse”
messageType=”emp:EmployeeTravelStatusResponseMessage”/>
<!– input for American and Delta web services –>
<variable name=”FlightDetails”
messageType=”aln:FlightTicketRequestMessage”/>
<!– output from American Airlines –>
<variable name=”FlightResponseAA”
messageType=”aln:TravelResponseMessage”/>
<!– output from Delta Airlines –>
<variable name=”FlightResponseDA”
messageType=”aln:TravelResponseMessage”/>
<!– output from BPEL process –>
<variable name=”TravelResponse”
messageType=”aln:TravelResponseMessage”/>
</variables>

  BPEL 流程主体流程主体指定调用合作伙伴 Web 服务的顺序。它通常以 <sequence>(用于定义多个将按顺序执行的操作)开始。在顺序中,我们首先指定启动业务流程的输入消息。我们使用 <receive> 构造(它等待匹配消息,在本示例中为 TravelRequest 消息)实现此目的。在 <receive> 构造中,我们不直接指定消息。而是指定合作伙伴链接、端口类型、操作名称以及可选变量(用于保存收到的消息以用于随后的操作)。

  我们将消息接收与客户端合作伙伴链接在一起,并等待对端口类型 TravelApprovalPT 调用 TravelApproval 操作。我们将收到的消息存储到 TravelRequest 变量中:

<sequence>

<!– Receive the initial request for business travel from client –>
<receive partnerLink=”client”
portType=”trv:TravelApprovalPT”
operation=”TravelApproval”
variable=”TravelRequest”
createInstance=”yes” />

 
  <receive> 等待客户端调用 TravelApproval 操作,并将传入的消息以及有关业务出差的参数存储到 TravelRequest 变量中。此处,此变量名与消息名相同,但并不一定要相同。

 

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

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

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

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

相关推荐

  • SAP收购CallidusCloud 与Salesforce竞争

    一直被称为后台办公巨头的SAP现在似乎也想在前台办公大展拳脚。 最新的迹象是SAP收购CallidusClou […]

  • API设计如龙生九子 各不相同

    IT咨询管理公司CA Technologies对API产业做了个问卷调查,问卷内容涉及API设计风格以及管理部署的新动向。调查结果表明,JSON与XML可谓两分天下。

  • 保险公司如何能从BPEL中获益

    对于保险业整合不同系统是一件寻常的工作。但保险公司经常会面临监管条例改变和应对不同的顾客需求。为了解决这些系统问题,软件专家正在使用一种强大的工具——BPEL。

  • 从头开始实现领域驱动设计

    领域描述业务;它是驱动企业的概念和逻辑的集合。如果遵循领域驱动设计(DDD)这一本质,那么领域就是应用程序中最重要的组成部分。