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>

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

 

 

 

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值