partnerLinkType通过定义在会话中每一个服务的角色、说明每一个服务在会话的上下文中为接受数据而提供的端口类型,来刻画两个服务之间的关系。每一个role说明了唯一一个WSDL的端口类型。一个partnerLinkType说明了会话中的两个服务的抽象信息(即portType。角色信息也可以只有一个,因为有的服务能够连接任意形式的服务,对会话中的另一个服务不作要求)。
partnerLink:与业务流程进行交互的服务建模为partnerLink,每一个partnerLink具有一个partnerLinkType类型,不同的partnerLink可以具有相同的partnerLinkType类型。通过名称区分不同的partnerLink,在其作用域内其名称必须唯一。
BPEL流程通过对端点引用的赋值支持partnerLink的动态绑定。因为外部partner可能是有状态的,服务端点信息可能需要加入流程实例相关的信息。
partnerLink的生命周期与定义它的process与scope一致。
根据BPEL的定义,抽象的服务接口(由portType定义)是不能变化的,而实际的接口(由Port定义)则可以在动态运行时决定。
端点引用(Endpoint Reference)
BPEL严格区分端口类型(portType)和端口(port)。端口类型通过使用抽象的消息定义抽象的功能。端口提供了实际的访问信息,包括通信服务端口和其它的部署相关信息(通过使用扩展元素)例如,用于加密目的的公开密钥。绑定提供了两者的胶合。服务用户必须静态依赖于由端口类型定义的抽象接口,一些包含在port中的定义能够动态发现并使用。
端点引用的基本应用是服务之间端口具体数据的动态通信。一个端口引用能够使得WS-BPEL为具体类型的服务动态选择一个服务提供者,并调用其操作。由于WS-BPEL为一个有状态服务的相关消息提供了一种通用机制(Correlation Set),因此在一般情况下,端点引用只需要包含实例中立(与实例无关)的端口信息就够了。但是,一般情况下,需要在端点引用中包含额外的实例相关标识符。
与myRole及partnerRole端点引用相关的端点引用表现为一个服务引用容器(<serf:service-ref>),这个容器用做包含实际端口引用值的信封。
PartnerLink的实例(选自BPEL2.0规范186页):
- 对PartnerLinkType的定义:
<plnk:partnerLinkType name="auctionHouseAuctionRegistrationServiceLT">
<plnk:role name="auctionRegistrationService" portType="tns:auctionRegistrationPT" /> <plnk:role name="auctionHouse" portType="tns:auctionRegistrationAnswerPT" />
</plnk:partnerLinkType>
下面是一个对消息的定义,在后面partnerLink的赋值中使用
<wsdl:message name="auctionData">
<wsdl:part name="auctionId" type="xsd:integer" />
<wsdl:part name="amount" type="xsd:integer" />
<wsdl:part name="auctionHouseEndpointReference" type="sref:ServiceRefType" />
</wsdl:message>
这里将一个partnerLink和一个WSDL中的portType进行对应,portType说明了一个抽象的接口,这个值是不能改变的。一般情况下要定义两个角色,但是有些时候可以定义只定义一个角色,因为某些服务能够连接其他任意类型的partner,没有任何额外要求。(直白的说,就是第一个partnerLinkType一般情况下要同时说明自己和伙伴分别对应那个角色,但是有时候对伙伴不做要求,这种情况下只要说明第一项自己的角色即可)。
- 在流程(一个拍卖服务)中定义partnerLink:
<partnerLink name="auctionRegistrationService"
partnerLinkType="as:auctionHouseAuctionRegistrationServiceLT"
myRole="auctionHouse"
partnerRole="auctionRegistrationService" />
- 在赋值活动中改变parnerLink:
<assign>
<copy>
<from>
<literal>
<sref:service-ref>
<addr:EndpointReference>
<addr:Address> http://example.com/auction/
RegistrationService/
</addr:Address>
<addr:ServiceName> as:RegistrationService
</addr:ServiceName>
</addr:EndpointReference>
</sref:service-ref>
</literal>
</from>
<to partnerLink="auctionRegistrationService" /> //这里只能使用修改partnerRole的值
</copy>
<copy>
<from partnerLink="auctionRegistrationService"
endpointReference="myRole" />
<to>$auctionData.auctionHouseEndpointReference</to>
</copy>
<assign>