WSDL为document类型时BPEL赋值操作问题的解决

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该如何实现相应的赋值操作呢?BPELassign操作支持基于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>

流程服务重新部署并工作完全正常

你可能感兴趣的:(xml,Blog,ejb,Gmail)