BPEL 实例教程(四)

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

  接下来,我们需要调用雇员出差状态 Web 服务。但在调用之前,我们必须为此 Web 服务准备输入。查看雇员 Web 服务的 WSDL,可以看到我们必须发送由雇员部分组成的消息。我们可以通过复制客户端发送的消息的雇员部分来构造此消息。编写相应的赋值语句:


<!– Prepare the input for the Employee Travel Status Web Service –>
<assign>
<copy>
<from variable=”TravelRequest” part=”employee”/>
<to variable=”EmployeeTravelStatusRequest” part=”employee”/>
</copy>
</assign>

  现在,我们就可以调用雇员出差状态 Web 服务了。为了进行同步调用,我们使用<invoke>  活动。我们使用 employeeTravelStatus 合作伙伴链接,并对 EmployeeTravelStatusPT 端口类型调用 EmployeeTravelStatus 操作。我们已经在 EmployeeTravelStatusRequest 变量中准备了输入消息。由于它是同步调用,因此该调用等待回应并将其存储在 EmployeeTravelStatusResponse 变量中:


<!– Synchronously invoke the Employee Travel Status Web Service –>
<invoke partnerLink=”employeeTravelStatus”
portType=”emp:EmployeeTravelStatusPT”
operation=”EmployeeTravelStatus”
inputVariable=”EmployeeTravelStatusRequest”
outputVariable=”EmployeeTravelStatusResponse” />

  下一步是调用上述两个航空公司 Web 服务。同样,我们先准备所需的输入消息(这两个 Web 服务的输入消息相同)。FlightTicketRequest 消息包含两部分:

  flightData:它从客户端消息 (TravelRequest) 中检索而得。
  travelClass:它从 EmployeeTravelStatusResponse 变量中检索而得。

  因此,我们编写一个包含两个 copy 元素的赋值:


<!– Prepare the input for AA and DA –>
<assign>
<copy>
<from variable=”TravelRequest” part=”flightData”/>
<to variable=”FlightDetails” part=”flightData”/>
</copy>
<copy>
<from variable=”EmployeeTravelStatusResponse” part=”travelClass”/>
<to variable=”FlightDetails” part=”travelClass”/>
</copy>
</assign>

  输入数据包含需要传递给航空公司 Web 服务的数据。由于格式相同,因此我们可以使用一个简单复制直接传递它。在实际情况下,通常需要执行转换。为此,可以使用具有 <assign> 的 XPath 表达式、使用转换服务(如 XSLT 引擎)或使用由特定 BPEL 服务器提供的转换功能。

  现在,我们准备调用这两个航空公司 Web 服务。我们将进行并发的异步调用。为表述并发,BPEL 提供了 活动。对每个 Web 服务的调用将包含两个步骤:

  使用 <invoke> 活动进行异步调用。
  使用 <receive> 活动等待回调。

  我们使用 <sequence> 对这两个活动进行分组。这两个调用只在合作伙伴链接名称上存在差别。我们对一个调用使用 AmericanAirlines,对另一个调用使用 DeltaAirlines。两者均对 FlightAvailabilityPT 端口类型调用 FlightAvailability 操作,发送 FlightDetails 变量中的消息。

  使用 <receive> 活动接收回调。我们再次使用这两个合作伙伴链接名。<receive> 等待对 FlightCallbackPT 端口类型调用 FlightTicketCallback 操作。我们将结果消息分别存储到 FlightResponseAA 和 FlightResponseDA 变量中:


<!– Make a concurrent invocation to AA in DA –>
<flow>
      
<sequence>
<!– Async invoke of the AA web service and wait for the callback–>
        
<invoke partnerLink=”AmericanAirlines” 
portType=”aln:FlightAvailabilityPT” 
operation=”FlightAvailability”
inputVariable=”FlightDetails” />
<receive partnerLink=”AmericanAirlines” 
portType=”aln:FlightCallbackPT” 
operation=”FlightTicketCallback”
variable=”FlightResponseAA” />
</sequence>
<sequence>
<!– Async invoke of the DA web service and wait for the callback–>
        
<invoke partnerLink=”DeltaAirlines” 
portType=”aln:FlightAvailabilityPT” 
operation=”FlightAvailability”
inputVariable=”FlightDetails” />
<receive partnerLink=”DeltaAirlines” 
portType=”aln:FlightCallbackPT” 
operation=”FlightTicketCallback”
variable=”FlightResponseDA” />
</sequence>
</flow>

  在该流程的这个阶段,我们收到两个机票报价。在下一步中,我们必须选择一个机票报价。为此,我们使用 <switch> 活动。


<!– Select the best offer and construct the TravelResponse –>
<switch>
              
<case condition=”bpws:getVariableData(‘FlightResponseAA’,
‘confirmationData’,’/confirmationData/Price’) 
<= bpws:getVariableData(‘FlightResponseDA’,
‘confirmationData’,’/confirmationData/Price’)”>
                    
<!– Select American Airlines –>
<assign>
<copy>
<from variable=”FlightResponseAA” />
<to variable=”TravelResponse” />
</copy>
</assign>
</case>
                    
<otherwise>
<!– Select Delta Airlines –>
<assign>
<copy>
<from variable=”FlightResponseDA” />
<to variable=”TravelResponse” />
</copy>
</assign>
</otherwise>
</switch>

  在 <case> 元素中,我们检查美国航空公司的机票报价 (FlightResponseAA) 是等于还是低于达美航空公司的机票报价 (FlightResponseDA)。为此,我们使用 BPEL 函数 getVariableData 并指定变量名。价格位于 confirmationData 消息的内部,虽然它是唯一的消息部分,但我们仍必须指定它。我们还必须指定查询表达式以找到价格元素。此处,我们采用简单的 XPath 1.0 表达式。

 

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

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

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

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

相关推荐

  • SAP收购CallidusCloud 与Salesforce竞争

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

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

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

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

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

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

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