内容


向 SOA 转型,第 4 部分

在 IBM Rational Software Architect 中如何将 Web 服务过程从 UML 转换为 BPEL

基于定购单过程(Purchase Order Process)模型的实例

Comments

系列内容:

此内容是该系列 # 部分中的第 # 部分: 向 SOA 转型,第 4 部分

敬请期待该系列的后续内容。

此内容是该系列的一部分:向 SOA 转型,第 4 部分

敬请期待该系列的后续内容。

面向 Web 服务的业务过程执行语言(Business Process Execution Language for Web Services,BPEL4WS 或 BPEL)是用于指定基于 Web 服务的业务过程行为的基于 XML 的标准。它建立在 Web 服务定义语言(Web Services Definition Language,WSDL)和 XML 模式定义(XML Schema Definition,XSD)之上。UML(统一建模语言,Unified Modeling Language)到 BPEL 的转换可以接受用 UML 工具,例如 IBM Rational Software Architect 或 Rational Software Modeler,开发的过程的模型,并将其转变为实现该过程所必需的正确的 BPEL、XSD,和 WSDL 文件。

目前,可以在 IBM®Rational® Software Architect(7.0.0.5)中执行的 UML-to-BPEL 转换不是独立的转换,因此,您不单独运行转换。相反,当必要时,UML-to-SOA(面向服务的体系结构)转换会调用 UML-to-BPEL 转换。Rational Software Architect 提供了许多帮助软件架构师设计系统的有用工具。UML 转换,例如 UML 到 XSD 和 UML 到 WSDL,只存在于 Rational Software Architect 中,并且 UML-to-BPEL 转换使用 UML 转换来生成 XSD 和 WSDL 工件。

BPEL 概述

BPEL 提供了用于指定基于 Web 服务的业务过程行为的 XML 标记和相关的语义。BPEL4WS 过程是根据其与合伙人的交互来定义的。合伙人可能向该过程提供服务,需要来自该过程的服务,或者参加与该过程的双向交互。因而,BPEL 通过指定一个顺序来编排 Web 服务的集成,按照此顺序可以有意义地调用一组服务,并且 BPEL 可以向合伙人分派每个服务的职责。

使用 UML 的理由

UML 是一个可以提供可视化的建模标记,并且对设计和理解复杂系统很有意义的 Object Management Group(OMG)标准。UML 有许多普遍的优点:

  • 它是最众所周知的面向对象建模标记。
  • 它使用容易理解的图形标记。
  • 它提供丰富的语义来获取面向对象系统的关键特性。

UML 在面向对象软件的开发中广泛使用。通过定制,它还用于基于组件的软件、业务过程建模、服务建模,和系统设计。这令您能够将相当多部分的 UML 体验应用于成熟的 Web 服务技术。

映射为面向 Web 服务的 BPEL

UML-to-BPEL 转换使用以下方法来生成 BPEL 文件:

  1. 根据 UML 组件生成 BPEL 过程。
  2. 在 BPEL 过程中为每个 UML 组件的 UML 活动生成 BPEL 范围。
  3. 根据 UML 组件所拥有的端口细节生成 BPEL 合伙人链接。

UML-to-BPEL 转换需求应该考虑到 UML 活动建模的过程。

此处的关注点主要是目前 Rational Software Architect Version 7.0.0.4 如何支持 UML-to-BPEL 转换,以及一些生成 BPEL 工件所必需的 UML 建模的关键需求。本文使用一个示例模型,定购单过程,来阐述当您为活动图建模时的一些 UML-to-BPEL 转换需求。

目前,UML-to-BPEL 转换的过程不需要对 UML 进行扩展或自定义,但当您对活动图建模时需要适当地有一些详细信息。

详细的定购单模型

让我们进一步观察此示例过程。UML OrderProcessor 组件包含四个端口:

  • Purchasing 端口包含了名为 Purchasing 的已提供的接口。
  • Invoicing 端口包含一个名为 InvoiceProcessing 的已提供的接口,以及一个名为 Invoicing 的所需要的接口。
  • Scheduling 端口包含名为 Scheduling 的所需的接口。
  • Shipping 端口包含一个名为 ScheduleProcessing 的以提供的接口和一个名为 Shipping 的所需的接口。

UML processPurchaseOrder 活动 OrderProcessor 组件自拥有的行为,它是为组件提供所有必需的实现细节的活动。

图 1 展示了 OrderProcessor(UML 组件)自拥有的行为的 UML 活动。OrderProcessor 组件如图 2 中所示。

图 1. processPurchaseOrder,UML 活动
OrderProcessor 的自拥有的行为
OrderProcessor 的自拥有的行为
图 2. OrderProcessor,UML 组件
OrderProcessor 组件
OrderProcessor 组件

这是规范的属性值设置:

Purchasing::processPurchaseOrder(customerInfo:Customer, 
purchaseOrder:PurchaseOrder):Invoice

活动必须拥有与活动规范操作中的参数相对应的活动参数。前面图 1中显示的活动包含代表 customerInfo 的三个活动参数节点:

  • Customer
  • purchaseOrder: PurchaseOrder
  • invoice: Invoice

注意:
活动参数必须与操作的参数的签名相匹配。

UML-to-BPEL 转换生成了带有两个输出参数的 BPEL Receive 活动,代码如清单 1 所示。

清单 1. 对于 processPurchaseOrder 的过程中的 BPEL Receive 活动
<bpws:receive createInstance="yes" name="processPurchaseOrder" 
operation="processPurchaseOrder" partnerLink="purchasingPurchasing" 
portType="ns2:Purchasing">
      <wpc:output>
        <wpc:parameter name="customerInfo" variable="processpurchaseorder_customerInfo"/>
        <wpc:parameter name="purchaseOrder" variable=
"processpurchaseorder_purchaseOrder"/>
      </wpc:output>
</bpws:receive>

在 Receive 活动中有三个活动划分(Invoicing、Shipping,和 Scheduling),它们分别代表组件中的每个端口。当将它们设置为组件中相应的端口时,它们就代表每个划分的属性。控制流从 Receive 活动中的初始节点(initialNode)开始,并且连接到分支节点(forkNode)。三个控制流(controlFlows)从分支节点(forkNode)开始,每一个都连接到分离的动作上。这说明当控制到达分支节点(forkNode)时,将有多个动作序列运行。UML-to-BPEL 转换生成 BPEL Flow 活动和流中的三个 BPEL 序列。

控制流从初始节点(initialNode)开始,它连接到分支节点(forkNode)上。三个控制流(controlFlows)从分支节点(forkNode)开始,每一个都连接到分离的动作上。这说明当控制达到分支节点(forkNode)时,许多动作序列可以同时执行。UML-to-BPEL 转换生成 BPEL Flow 活动和流中的三个 BPEL 序列。

让我们分析从分支节点(forkNode)出发的第一个输出控制流。该流连接到名为 initiatePriceCalculation(Call Operation 动作)的动作上,并且该动作的 UML 操作被设置为:

PurchaseOrderProcess::com::acme::credit:
:Invoicing::initiatePriceCalculationOperation(customerInfo
        : Customer, purchaseOrder : PurchaseOrder)

因此,该动作包含三个 输入插脚(inputPins)。最右边的输入插脚(inputPins)是 targetInputPin(插脚的名称为空,因为该动作是活动划分的一部分)。第一个和第二个输入插脚(inputPins)指示与动作相关的操作有两个输入参数。插脚的名称必须表示数据对象。该对象可以是必须存在于 UML 活动或 UML 组件中的 UML 变量、UML 属性,或 UML 参数的名称。在此模型中,customerInfopurchaseOrder 是活动中的参数。UML-to-BPEL 转换生成了带有两个输入参数的 BPEL Invoke 活动,如清单 2 所示。

清单 2. 对于 initiatePriceCalculation 的过程中的 BPEL Invoke 活动
<bpws:invoke name="initiatePriceCalculation" operation="initiatePriceCalculation" 
partnerLink="invoicingInvoicingPartner" portType="ns3:Invoicing">
            <wpc:input>
              <wpc:parameter name="customerInfo" 
variable="processpurchaseorder_customerInfo"/>
              <wpc:parameter name="purchaseOrder" 
variable="processpurchaseorder_purchaseOrder"/>
            </wpc:input>
</bpws:invoke>

来自 initiatePriceCalculation 动作的输出控制流连接到 completePriceCalculation 动作上(Call Operation 动作),并且对于动作的 UML 操作的设置如下:

PurchaseOrderProcess::com::acme::credit::Invoicing::completePriceCalculation
        (shippingInfo : Manifest)

此动作包含两个输入插脚(inputPins)(最右边的输入插脚(inputPins)是 targetInputPin,但其名称为空,因为该动作是活动划分的一部分)。该单个的输入插脚(inputPins)指示与动作相关的操作有一个输入参数。插脚的名称表示数据对象,这可以是 UML 活动或 UML 组件中必须存在的 UML 变量、UML 属性,或 UML 参数的名称。在此模型中,shippingInfo 是组件中的 UML 属性。您可能已经注意到来自 requestShipping 动作的另一个引入的控制,这说明在完成名为 requestShipping 的动作之前必须调用 completePriceCalculation 动作。

UML-to-BPEL 转换生成带有一个输入参数的 BPEL Invoke 活动,到 requestShipping 动作的目标的 BPEL 链接,以及将设置为对于 requestShipping 动作的 Invoke 活动中源 BPEL 链接的链接,您可以在清单 3 中看到。

清单 3. 对于 completePriceCalculation 的过程中的 BPEL Invoke
<bpws:invoke name="completePriceCalculation" 
operation="completePriceCalculation" partnerLink="invoicingInvoicingPartner" 
portType="ns3:Invoicing">
            <wpc:input>
              <wpc:parameter name="shippingInfo" variable="shippingInfo"/>
            </wpc:input>
            <bpws:targets>
              <bpws:target linkName="processPurchaseOrderLink1"/>
            </bpws:targets>
</bpws:invoke>

来自 completePriceCalculation 动作的输出控制流是连接到 processInvoice 动作(Accept Call 动作)上的。来自该动作的触发器包含一个 CallEvent,对其相关的操作的设置如下:

PurchaseOrderProcess::org::ordermanagement::InvoiceProcessing::processInvoice
        (invoice : Invoice)

该动作包含两个输出插脚(outputPin)(最右边的输出插脚(outputPin)代表动作的 returnInforation 属性)。单个的输出插脚(outputPin)指示与动作相关的操作有一个输出参数。插脚的名称表示数据对象,这可以是 UML 活动或 UML 组件中必须存在的 UML 变量、UML 属性,或 UML 参数的名称。在此实例中,Invoice 是活动中的参数。UML-to-BPEL 转换生成带有一个输出参数的 BPEL Receive 活动。

对来自分支节点(forkNode)的其他两个控制流序列的处理是类似的。最后,生成了 BPEL Reply 活动,因为 Activity::specification 操作包含一个返回参数。(在此实例中,活动规范操作是 PurchaseOrderProcess::org::ordermanagement::Purchasing::processPurchaseOrder。)这如清单 4 所示。

清单 4. 对于 processPurchaseOrder 的过程中的 BPEL Reply 活动
<bpws:reply name="processPurchaseOrder" operation=
"processPurchaseOrder" partnerLink="purchasingPurchasing" portType=
"ns2:Purchasing">
      <wpc:input>
        <wpc:parameter name="result" 
variable="processpurchaseorder_result"/>
      </wpc:input>
</bpws:reply>

清单 5 显示了由 UML-to-BPEL 转换为 orderProcessor 组件所生成的完整的 BPEL 文件。

清单 5. 所产生 BPEL 的全部清单
<?xml version="1.0" encoding="UTF-8"?>
<bpws:process xmlns:bpws="
http://schemas.xmlsoap.org/ws/2004/03/business-process/" 
xmlns:ns="http://org/ordermanagement/OrderProcessorArtifacts/" 
xmlns:ns0="http://org/crm/" 
xmlns:ns1="http://org/crm/domain/" 
xmlns:ns2="http://org/ordermanagement/Purchasing/" 
xmlns:ns3="http://com/acme/credit/Invoicing/" 
xmlns:ns4="http://org/ordermanagement/InvoiceProcessing/" 
xmlns:ns5="http://com/acme/shipping/Shipping/" 
xmlns:ns6="http://org/ordermanagement/ScheduleProcessing/" 
xmlns:ns7="http://com/acme/productions/Scheduling/" 
xmlns:wpc="http://www.ibm.com/xmlns/prod/websphere/business-process/6.0.0/" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" expressionLanguage="
http://www.ibm.com/xmlns/prod/websphere/business-process/expression-lang/java/6.0.0/" 
name="OrderProcessor" suppressJoinFailure="yes" targetNamespace="
http://org/ordermanagement/OrderProcessor/">  <bpws:import importType="
http://schemas.xmlsoap.org/wsdl/" 
location="OrderProcessorArtifacts.wsdl" namespace="
http://org/ordermanagement/OrderProcessorArtifacts/"/>
  <bpws:import importType="
http://www.w3.org/2001/XMLSchema" 
location="../../../PurchaseOrderProcess/org/crm/PurchaseOrder.xsd" 
namespace="http://org/crm/"/>
  <bpws:import importType="
http://www.w3.org/2001/XMLSchema" 
location="../../../PurchaseOrderProcess/org/crm/Invoice.xsd" 
namespace="http://org/crm/"/>
  <bpws:import importType="
http://www.w3.org/2001/XMLSchema" 
location="../../../PurchaseOrderProcess/org/crm/Manifest.xsd" 
namespace="http://org/crm/"/>
  <bpws:import importType="
http://www.w3.org/2001/XMLSchema" location="
../../../PurchaseOrderProcess/org/crm/domain/Customer.xsd" 
namespace="http://org/crm/domain/"/>
  <bpws:import importType="
http://www.w3.org/2001/XMLSchema" 
location="../../../PurchaseOrderProcess/org/crm/Schedule.xsd" 
namespace="http://org/crm/"/>  <bpws:partnerLinks>
    <bpws:partnerLink myRole="PurchasingRole" 
name="purchasingPurchasing" 
partnerLinkType="ns:PurchasingPLT"/>
    <bpws:partnerLink name="
invoicingInvoicingPartner" 
partnerLinkType="ns:InvoicingPLT" 
partnerRole="InvoicingRole"/>
    <bpws:partnerLink myRole="InvoiceProcessingRole" 
name="invoicingInvoiceProcessing" 
partnerLinkType="ns:InvoiceProcessingPLT"/>
    <bpws:partnerLink name="schedulingSchedulingPartner" 
partnerLinkType="ns:SchedulingPLT" 
partnerRole="SchedulingRole"/>
    <bpws:partnerLink name="shippingShippingPartner" 
partnerLinkType="ns:ShippingPLT" 
partnerRole="ShippingRole"/>
    <bpws:partnerLink myRole="ScheduleProcessingRole" 
name="shippingScheduleProcessing" 
partnerLinkType="ns:ScheduleProcessingPLT"/>
  </bpws:partnerLinks>  <bpws:variables>
    <bpws:variable name="id" 
type="xsd:string"/>
    <bpws:variable name="shippingInfo" 
type="ns0:Manifest"/>
    <bpws:variable name="schedule" 
type="ns0:Schedule"/>
    <bpws:variable name="
processpurchaseorder_customerInfo" 
type="ns1:Customer"/>
    <bpws:variable name="
processpurchaseorder_purchaseOrder" 
type="ns0:PurchaseOrder"/>
    <bpws:variable name="
processpurchaseorder_result" 
type="ns0:Invoice"/>  </bpws:variables>
  <bpws:sequence name="Sequence">
    <bpws:receive createInstance="yes" 
name="processPurchaseOrder" 
operation="processPurchaseOrder" 
partnerLink="purchasingPurchasing" 
portType="ns2:Purchasing"> <wpc:output>
        <wpc:parameter name="customerInfo" 
variable="processpurchaseorder_customerInfo"/>
        <wpc:parameter name="purchaseOrder" 
variable="processpurchaseorder_purchaseOrder"/>
      </wpc:output> </bpws:receive>
    <bpws:scope name="
processPurchaseOrder">
      <bpws:flow name="
processPurchaseOrderFlow"> <bpws:links>
          <bpws:link name="
processPurchaseOrderLink1"/> <bpws:link name="
processPurchaseOrderLink2"/> </bpws:links>
        <bpws:sequence name="Sequence3">
          <bpws:invoke name="
initiatePriceCalculation" operation="
initiatePriceCalculation" partnerLink="
invoicingInvoicingPartner" 
portType="ns3:Invoicing"> <wpc:input>
              <wpc:parameter name="customerInfo" 
variable="processpurchaseorder_customerInfo"/>
              <wpc:parameter name="purchaseOrder" 
variable="processpurchaseorder_purchaseOrder"/>
            </wpc:input> </bpws:invoke>
          <bpws:invoke name="completePriceCalculation" 
operation="completePriceCalculation" 
partnerLink="invoicingInvoicingPartner" 
portType="ns3:Invoicing"> <wpc:input>
              <wpc:parameter name="shippingInfo" 
variable="shippingInfo"/>
            </wpc:input> <bpws:targets>
              <bpws:target linkName="
processPurchaseOrderLink1"/>
            </bpws:targets> </bpws:invoke>
          <bpws:receive name="processInvoice" 
operation="processInvoice" 
partnerLink="invoicingInvoiceProcessing" 
portType="ns4:InvoiceProcessing"> 
<wpc:output> 
         <wpc:parameter name="invoice" 
variable="processpurchaseorder_result"/>
            </wpc:output> </bpws:receive>
        </bpws:sequence> <bpws:sequence name="Sequence4">
          <bpws:assign name="Assign1">
            <bpws:copy> <bpws:from 
variable="processpurchaseorder_purchaseOrder">
                <bpws:query queryLanguage="
http://www.w3.org/TR/1999/REC-xpath-19991116"><!
[CDATA[/oid]]></bpws:query>
              </bpws:from> <bpws:to variable="
processpurchaseorder_customerInfo">
                <bpws:query queryLanguage="
http://www.w3.org/TR/1999/REC-xpath-19991116"><!
[CDATA[/firstname]]></bpws:query>
              </bpws:to></bpws:copy>
          </bpws:assign><bpws:invoke name="requestShipping" 
operation="requestShipping" 
partnerLink="shippingShippingPartner" 
portType="ns5:Shipping">
            <wpc:input>
              <wpc:parameter name="customerInfo" 
variable="processpurchaseorder_customerInfo"/>
              <wpc:parameter name="shippingInfo" 
variable="shippingInfo"/>
            </wpc:input><bpws:sources>
              <bpws:source linkName="processPurchaseOrderLink1"/>
            </bpws:sources> </bpws:invoke>
          <bpws:receive name="processSchedule" 
operation="processSchedule" 
partnerLink="shippingScheduleProcessing" 
portType="ns6:ScheduleProcessing">
            <wpc:output>
              <wpc:parameter name="schedule" 
variable="schedule"/>
            </wpc:output> <bpws:sources>
              <bpws:source linkName="
processPurchaseOrderLink2"/>
            </bpws:sources> </bpws:receive>
        </bpws:sequence> <bpws:sequence name="Sequence5">
          <bpws:invoke name="
requestProductionScheduling" operation="
requestProductionScheduling" partnerLink="
schedulingSchedulingPartner" 
portType="ns7:Scheduling"> <wpc:input>
              <wpc:parameter name="customerInfo" 
variable="processpurchaseorder_customerInfo"/>
              <wpc:parameter name="purchaseOrder" 
variable="processpurchaseorder_purchaseOrder"/>
            </wpc:input> </bpws:invoke>
          <bpws:invoke name="sendShippingSchedule" 
operation="sendShippingSchedule" 
partnerLink="schedulingSchedulingPartner" 
portType="ns7:Scheduling"> <wpc:input>
              <wpc:parameter name="schedule" 
variable="schedule"/>
            </wpc:input> <bpws:targets>
              <bpws:target linkName="
processPurchaseOrderLink2"/>
            </bpws:targets>
          </bpws:invoke>
        </bpws:sequence>
      </bpws:flow>
    </bpws:scope>
    <bpws:reply name="processPurchaseOrder" 
operation="processPurchaseOrder" 
partnerLink="purchasingPurchasing" 
portType="ns2:Purchasing">
      <wpc:input>
        <wpc:parameter name="result" 
variable="processpurchaseorder_result"/>
      </wpc:input>
    </bpws:reply>
  </bpws:sequence>
</bpws:process>

UML-to-BPEL 转换对 UML 元素的解释

UML-to-BPEL 转换利用来自 UML 模型的具体信息来生成 BPEL 工件。不正确的或不完整的模型可能生成错误或不正确的 BPEL 工件,或二者都生成。当然,您希望避免这种事。以下的表格应该帮助您了解来源于各种转换活动的预期的结果。

UML 元素的转换

表 1 列出了转换所支持的 UML 元素,以及转换所创建的相应的 BPEL 结构或活动。

表 1. UML 元素和 BPEL 结果
UML 元素转换输出
Component如果组件包含一个或多个活动的话,转换用和组件相同的名称来创建 BPEL 过程。组件为其拥有的所有行为和相应的 BPEL 过程中的变量提供环境。

如果组件包含一个空的活动,那么转换为所提供的接口中的每个操作创建一个空的 BPEL Scope 活动。

BPEL 过程和相关的 WSDL 工件文件的命名空间包括用于组件及其包含的包的元素。

Component::ownedAttribute如果在所拥有的属性的 Type 属性中指定的类型不是带有端口的组件,那么转换就在相应的 BPEL 过程中创建 BPEL 变量。
AcceptCallAction生成了 BPEL Receive 活动。

转换分析与动作相关的触发器列表来确定哪个操作与 CallEvent 类型相关联,并且确定哪个操作映射为 BPEL 操作。

当插脚的名称不是空,并且名称必须与端口名相匹配时,转换利用与动作的 ReturnInformation 属性相关联的输出插脚的名称来生成合伙人。否则,转换利用 ActivityPartition::represents 属性,ActivityPartition::represents 属性的值必须是端口或端口类型。操作容器必须是其中一个端口中的已提供的接口,通过它可以接收调用。

动作中的输出插脚的数量必须与操作的[out]参数的数量匹配。操作还必须包含表示操作的 Return Information 属性的额外输出插脚。

没有引入的边界的 AcceptEventAction 有一个或多个引入的边界的 AcceptEventAction 带有事件必须为 SignalEvent 的触发器的 AcceptEventAction。当 AcceptEventAction::triggers 中有一个或多个 SignalEvents 时,将生成 BPEL 流。

BPEL 不支持多个引入的 ControlFlows 和对动作的相同输入插脚(InputPin)的多个引入的对象流。

生成 BPEL Receive 活动。该操作来源于表示可以接收信号的接收。

注意:AcceptEventAction 必须在表示端口或端口类型的 ActivityPartition 中,通过它可以接收事件。所提供的端口的接口必须包含对每个信号的接收。AcceptEventAction 必须有一个对于每个与 AcceptEventAction::triggers 中的 SignalEvents 相关联的信号的输出插脚(OutputPin)。插脚类型必须与信号类型相匹配。

带有事件必须为 TimeEvent 的触发器的 AcceptEventAction。 时间表达式与 TimeEvent::when 属性相关联生成 BPEL 等待活动。

根据时间表达式设置 BPEL 等待活动的 For 或 Until 属性。

要为 Until 属性指定价值,表达式必须是以下格式:年,月,日,时,分,秒。

要为 For 属性指定值,表达式必须是以下格式:年数,月数、天数,小时数,分钟数,和秒数。

注意:您不能指定多个时间事件。

作为组件的自拥有的行为,以及该组件所提供的操作的方法的 Activity转换在组件的 BPEL 过程的顶层流中创建 BPEL Scope 活动。
Activity::Specification如果组件只包含活动,那么转换将为与规范相关联的操作创建顶层的 BPEL Receive 活动。

如果组件包含多个活动,那么转换为与每个 Activity::Specification 相关联的每个操作创建 BPEL Pick 活动和 onMessage 事件类型。

如果规范操作包含 Out 或 Return 参数,那么转换将创建 BPEL Reply 活动。

Activity::ownedParameter:Parameter转换创建与组件相对应的 BPEL 过程中的 BPEL 过程变量。

变量名称必须用活动名称限定,从而确保组件中没有与其相冲突的其他活动的参数。

与活动规范相关联的参数名称和操作类型必须有与名称和类型均匹配的活动参数。

Activity::ownedAttribute:Property 转换为过程中的活动创建顶层 Scope 元素中的 BPEL 变量。
Activity::variable:Variable 转换为过程中的活动创建顶层范围中的 BPEL 变量。
ActivityFinalNode转换创建 BPEL Terminate 活动。
ActivityPartition::representsRepresents 属性值必须是端口或端口类型。

转换为端口中每个所提供的或所需要的接口生成 BPEL 合伙人链接。

这使得转换能够为与划分中的动作相关联的操作确定出正确的 BPEL 合伙人。

CallOperationAction生成 BPEL Invoke 活动。

当插脚的名称不是空时,并且插脚的名称必须匹配端口名称时,转换利用目标输入插脚的名称生成合伙人。另外,转换利用 ActivityPartition::represents 属性,并且 ActivityPartition::represents 属性的值必须是端口或端口类型。操作容器必须是其中一个端口中的所需的接口,通过它可以调用操作。

输入插脚的数量必须与操作中的[in]参数的数量相匹配。该动作还必须包含表示动作的目标输入插脚的额外的输入插脚。

动作中的输出插脚的数量必须与操作中的[out]参数的数量相匹配。

InitialNode转换利用此元素指示 BPEL 活动的开始,它不为该节点创建任何 BPEL 工件。
OpaqueAction当操作的名称使用例如 lvalue:= rvalue 的表达式时(lvalue 将 BPEL 设置为不同的,并且 rvalue 用各种不同的值设置 BPEL ),转换创建 BPEL 分派活动。对于多个任务,您可以使用分号 (;) 作为分隔符:aVar:=bVar ;cVar:=dVar。

当动作的语言属性设置为 Java 时,转换创建了 BPEL Java™ 部分,并且与动作相关联的 body 属性的值是在一个部分中。当动作的语言属性设置为 HTML 或 JSP(™Server Page)时,转换创建了新的空的 BPEL 人的任务。

SendSignalAction生成了 BPEL Invoke 活动。BPEL 调用的操作与 SendSignalAction::signal 属性的接收相对应。

当插脚的名称为空时,通过使用目标输入插脚的名称来生成合伙人。此外,转换使用 ActivityPartition::represents 属性。

操作容器必须是其中一个端口中的所需的接口,通过它可以发送事件。当插脚名称为空时,目标插脚的名称必须与端口名称匹配。

ActivityPartition::represents 属性的值必须是端口或端口类型。

UML 活动边界的转换

表 2 列出了转换所支持的活动边界类型,以及转换所创建的相应的 BPEL 序列和链接。

表 2. UML 活动边界类型和相应的 BPEL 序列和链接
UML 活动边界转换输出
ControlFlow转换为并发控制创建 BPEL 序列和链接。
ObjectFlow转换为并发控制创建 BPEL 序列和链接。

如果有必要,转换根据对象流名称生成变量。如果对象流的名称是空的话就应用已生成的名称。

控制或决策节点的转换

表 3 列出了转换支持的控制和决策节点,以及转换创建的相应的 BPEL 输出。

表 3. UML 控制和决策节点及 BPEL 输出
控制或决策节点转换输出
DecisionNode转换为来自该节点的每个输出流创建 BPEL Switch 活动和 BPEL Case 分支。在每个 BPEL Case 分支中创建的 BPEL 序列适应从每个输出流的目标生成的 BPEL 活动。每个输出流的每个保护为 BPEL Case 分支设置 BPEL 条件。

当保护值等于 Else 并且语言属性为空时,转换为输出流创建 BPEL Otherwise 分支。

ForkNode 转换生成指定 BPEL 流活动开始的代码:

<flow name="ForkNode.name">

在 <flow> 活动中,转换为每个退出分支节点的每个流创建嵌套的 BPEL Sequence 活动。

JoinNode 转换生成了指定 BPEL 流活动的结束的代码:</flow>
MergeNode转换创建到合成节点的每个引入流的源节点和合成节点的输出流的目标节点之间的 BPEL 链接。

对象节点的转换

表 4 列出了转换支持的对象节点,以及转换生成的相应的 BPEL 活动。

表 4. UML 对象节点和相应的 BPEL 活动
控制或对象节点转换输出
ActivityParameterNode转换不创建相应的 BPEL 工件。

只有当对象流连接到 ActivityParameterNode 对象节点时,转换才分析 ActivityParameterNode 对象节点来确定序列顺序。 ActivityParameterNode 对象节点必须有相应的活动参数。

LoopNode转换为 UML 组件的自拥有的行为的 UML 活动中的每个 LoopNode 创建 BPEL While 活动。
LoopNode::decider转换利用与输出插脚相关联的 BPEL 变量为 BPEL while 活动创建 BPEL 条件。

相关联的输出插脚必须是 UMLPrimitiveTypes::Boolean 类型的。

LoopNode 中的 UML 元素在 BPEL while 活动中,转换为 UML-to-BPEL 转换支持的 UML 元素创建适当的 BPEL 活动。
InputPin输入插脚的所有者是 AcceptCallAction、CallOperationAction,或 OpaqueAction 动作的实例时,转换分析 InputPin 元素。

输入插脚的数量必须和与拥有输入插脚的动作相关联的操作的[in]参数相匹配。只有当动作是 CallOperationAction 的实例时,额外的输入插脚必须代表 <<target>> 输入插脚。

如果输入插脚没有被对象流边界连接到活动上,那么插脚的名称必须对应于活动或拥有活动的组件中的活动参数、变量,或属性。

OutputPin当输出插脚的所有者是 AcceptCallAction、 CallOperationAction,或 OpaqueAction 动作的实例时,转换分析 OutputPin 元素。

当动作是 CallOperationAction,或 AcceptCallAction 的实例时,插脚的数量必须与和拥有输出插脚的动作相关联的操作的[out]参数相匹配。

当动作是 AcceptCallAction 的实例时,额外的输出插脚必须表示拥有插脚的动作的 Return Information 属性

如果输出插脚没有被对象流边界连接到活动上,那么插脚必须有一个与活动或拥有活动的组件中的活动参数、变量,或属性相对应的有效名称。

如果输出插脚没有任何引入的或输出的对象流边界,那么转换将使用相应的 BPEL 变量来为与拥有插脚的动作相关联的相应操作创建 BPEL 输出参数。

循环节点的转换

表 5 列出了转换支持的循环节点元素,以及转换生成的相应的 BPEL 活动。

表 5. UML 循环节点元素和生成的 BPEL 活动
循环节点或循环节点元素转换输出
LoopNode转换为 UML 组件的自拥有的行为的 UML 活动中的每个 LoopNode 创建 BPEL while 活动。
LoopNode::decider转换利用与输出插脚相关联的 BPEL 变量创建 BPEL While 活动的 BPEL 条件。

相关的输出插脚必须是 UMLPrimitiveTypes::Boolean 类型的。

LoopNode 中的 UML 元素在 BPEL While 活动中,转换为 UML-to-BPEL 转换支持的 UML 元素创建适当的 BPEL 活动。

到哪里了解更多信息

现在您已经了解了 UML-to-BPEL 转换的基础,以及一些如何用 UML 对 BPEL Process 实现建模的细节,您可能想要阅读一些参考资料中列出的相关文章,从而找到用例场景。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Rational, SOA and web services
ArticleID=349358
ArticleTitle=向 SOA 转型,第 4 部分: 在 IBM Rational Software Architect 中如何将 Web 服务过程从 UML 转换为 BPEL
publish-date=10172008