document类型的BPEL赋值操作问题的解决
文章仅供大家参考,所有评论 , 错误报告 , 其他信息以及批评 , 请邮寄到
Jeffery.Lee AT gmail.com
或者访问我的个人blog同我交流
( http://ibuddie.spaces.live.com/ )
。本文遵从
GNU
的自由文档许可证
(Free Document License)
的条款,欢迎转载,如若修改、散布,请注明文章原始出处和来源。
问题描述:
JSSOA环境下中ESB上部署的子服务的WSDL文件,大多基于document类型的并自动生成,在进行服务组合时进行相应的assign操作时与传统的RPC风格会有较大的不同,目前使用的BPEL设计器对document风格支持并不完善。在贷款服务组合例子中,就遇到变量赋值的问题。
流程在调用完Assessor服务并得到返回值为“low”时(表示贷款风险低),将自动返回一个值为yes变量给用户。BPEL代码在具体实现时根据相应子服务的WSDL类型不同,需要做不同的处理:
如果是RPC风格的话,只要将yes赋值给相应变量的part即可,因为一个part对应的一种类型,而一个messge可以由多个不同的part组成和描述的。例如:
<bpel:assign name="AssignYestoAccept">
…………
<bpel:copy>
<bpel:from>
<bpel:literal>yes</bpel:literal>
</bpel:from>
<bpel:to part="accept" variable="approval"/>
</bpel:copy>
</bpel:assign>
在这个例子中part具体的类型是标准的string类型,定义如下
<wsdl:message name="approvalMessage">
<wsdl:part name="accept" type="xsd:string" />
</wsdl:message>
我们目前的ejb服务生成的WSDL是基于document风格,一个part对应的是一个element,而一个message中只包含一个part,这个part的名字皆为parameters。例如:
<wsdl:message name="loanResponse">
<wsdl:part name="parameters" element="tns:requestResponse"/>
</wsdl:message>
而这个part的具体定义是在相应的element中实现,例如:
<xsd:element name="requestResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element maxOccurs="1" minOccurs="1" name="out" nillable="true" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
那BPEL该如何实现相应的赋值操作呢?BPEL的assign操作支持基于XPath语言对part对应类型的相应element元素的访问,例如:
<bpel:assign>
<bpel:copy>
<bpel:from variable="request-bpel" part="payload" query="/getRequest/parameter1" />
<bpel:to variable="request-add" part="payload" query="/getRequest /addParameter1" />
</bpel:copy>
</bpel:assign>
以上定义依然是基于RPC风格,因为上面这个例子中的part依然对应的是一个type,而不是element。
目前BPEL相关资料关于document类型下的assign操作具体使用介绍很少,大多围绕RPC风格进行。当前使用的ActiveBPEL Designer在可视化环境下没有提供直接针对document风格的assign操作辅助设计。在一个BPEL的教程中提到document风格的处理方法,内容如下:
If we had used document-style web services, which use messages defined as XML elements, we would have to use a slightly different XPath query expression. Instead of the part name we would use the element name for the first step in the query expression.
可惜并未给出实例,围绕该思路针对我们目前的贷款组合服务,对BPEL代码反复进行修改,但BPEL引擎执行时会认为结点选择出错,围绕相关XPath语句反复修改测试,一直无法通过。
<bpel:assign name="YesToReplyAssign">
…………
<bpel:copy>
<bpel:from>
<bpel:literal>
yes
</bpel:literal>
</bpel:from>
<bpel:to part="parameters" variable="LoanResponse">
<bpel:query>………… </bpel:query>
</bpel:to>
</bpel:copy>
</bpel:assign>
解决方案
从<from>入手,直接以XML语言对相应part进行赋值。BPEL改写为:
<bpel:assign name="YesToReplyAssign">
…………
<bpel:copy>
<bpel:from>
<bpel:literal>
<js:requestResponse>
<js:out>yes</js:out>
</js:requestResponse>
</bpel:literal>
</bpel:from>
<bpel:to part="parameters" variable="LoanResponse"/>
</bpel:copy>
</bpel:assign>
流程服务重新部署并工作完全正常