BPEL中的partnerlink和partnerlinktype

转自:http://www.blog.edu.cn/user1/2746/archives/2005/241277.shtml#cmt


partnerlink是bpel与外界实体通讯的管道。下面是我对partnerlink和partnerlinktype个人的理解,不敢保证完全正确。(以下都省略partner前缀,简称link和linktype)

根据其中定义的role的个数是一个还是两个,linktype分为单向和双向的。linktype只定义通道,但没有定义通道的“方向”,即哪一 端是bpel,哪一端是客户(相对于bpel)。对双向的linktype而言,这个link中用myrole和partnerrole说明这个link 的“方向”。

单向的linktype说明这个link通道中的信息流动是单向的。所以对应的link中只能指定myrole或者partnerrole,不能二者兼有。

一个linktype可以定义多个link。比如loan-approval的例子(见bpel规范),一个叫customer的link和一个叫 approver的link都是同一个linktype——loanApprovalLinkType,这个linktype只有一个role,叫 “approver”。

bpel是真实approver的代理,从顾客customer的观点来看,顾客认为bpel就是approver。所以customer link中把approver定为“myrole”。相对于真正的approver而言,bpel是客户(准确的说是客户的代理),真正的 approver是bpel的“partner”。所以approver link中,把approver认作“partnerrole”。这里xxx link很容易混淆其含义。记住,link的名字都是相对bpel而言的。

可以推知,凡是link中定义了myrole的地方,都是外界要调用bpel的地方,必然对应receive操作。

另外,这种“代理”的用法可以认为是对原先接口的重载。在loan-approval例子中,并不是所有的request都要经过真正的 approver;准确的说,真正的approver只处理数量>10000的货物。小额的货物就被bpel直接通过了。可以理解为如下的代码:
bool bpel::approve (request)
{
if (request.amount > 10000)
approver.approve(request);
else
...
}
因为是同一个role,对应同一个portType,所以接口是完全相同的。

你可能感兴趣的:(Blog)