首页 文章

SOAComposite到OSB - SoaDirect事务传播

提问于
浏览
1

我有以下情况:

enter image description here

为简化起见,假设DBAdapter1从数据库表中删除记录,DBAdapter2(通过OSB代理调用)在不同的表中插入记录 . 我希望能够在第二个DBUnapter调用失败的情况下回滚第一个DBAdapter调用 .

在BPEL流程中,我使用SOADIRECT调用DBAdapter1和OSB代理 . 我的bpel流程有transaction = REQUIRED .

在OSB代理中,我在消息处理选项卡中设置TransactionRequired = ENABLED,并在Route活动中将QOS设置为'EXACTLY-ONCE'以调用DBAdapter2 .

此配置工作正常,即,如果DBAdapter2(或osb代理)中发生错误,则回滚所有事务,但是我无法将故障从OSB代理发送回BPEL . BPEL Invoke将完成:

oracle.soa.api.invocation.InvocationException: com.bea.wli.sb.transports.client.SBTransportException: A Transport Exception occurred during an SB Transport message processing.
JTA transaction is not in active state.

这似乎对我没有任何意义,因为OSB代理不应该结束在BPEL中启动的全局事务 . 如果我在代理服务中添加错误处理程序,我可以捕获来自DBAdapter2的正确错误,但是此错误永远不会传播回BPEL .

知道我在这里做错了什么吗?如何使用soadirect从osb到bpel传播事务和错误?

谢谢,

2 回答

  • 1

    试试这个 . 在您的代理和dbAdapter之间使用拆分/连接,并在您调用适配器的split / Join中抛出自定义错误 .

    在错误处理程序中定义一个faultvariable并在回复中说“传播soap fault”

    如果您现在测试代理,您将收到fault元素 .

    让我知道 . !

    image

  • -1

    我只收到错误:oracle.soa.api.invocation.InvocationException:com.bea.wli.sb.transports.client.SBTransportException:SB传输消息处理期间发生传输异常 . 当没有从OSB服务返回到BPEL的正确SOAP错误时 .

    如果将正确形成的SOAP错误返回给SOA,则可以在BPEL实例中看到错误 . 并且可以根据元素类型捕获错误 .

    SOAP Fault must 提供了一个faultcode值,其中包含一个引用WSDL中 wsdl:portType>wsdl:operation>wsdl:fault 元素的限定元素名称 . 如果这不正确,则BPEL将显示调用的服务的错误,但不会填充错误消息部分 .

    请参阅WSDL:

    <wsdl:definitions name="Update_direct" 
    targetNamespace="http://oracle.com/sca/soapservice/TransactionPropPOC/TransactionPropPOC/Update_direct"
     xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
     xmlns:inp1="http://xmlns.oracle.com/pcbpel/adapter/db/Update_Direct" 
     xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
     xmlns:tns="http://oracle.com/sca/soapservice/TransactionPropPOC/TransactionPropPOC/Update_direct">
    
    <wsdl:types>
        <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <xsd:import namespace="http://xmlns.oracle.com/pcbpel/adapter/db/Update_Direct" schemaLocation="UpdateExternal.xsd"/>
        </xsd:schema>
    </wsdl:types>
    <wsdl:message name="requestMessage">
        <wsdl:part name="UpdateInput_msg" element="inp1:UpdateInput"/>
    </wsdl:message>
    <wsdl:message name="response_msg">
        <wsdl:part name="response_msg" element="inp1:Response"/>
    </wsdl:message>
    <wsdl:message name="faultResponse">
        <wsdl:part name="faultResponsePart" element="inp1:FaultResponse"/>
    </wsdl:message>
    
    <wsdl:portType name="Update_ptt">
        <wsdl:operation name="Update">
            <wsdl:input message="tns:requestMessage"/>
            <wsdl:output message="tns:response_msg"/>
            <wsdl:fault message="tns:faultResponse" name="FaultResponseMsg"/>
        </wsdl:operation>
    </wsdl:portType>
    
    <wsdl:binding name="UpdateBinding" type="tns:Update_ptt">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="Update">
      <soap:operation style="document" soapAction="http://service.example.co.uk/update"/>
      <wsdl:input>
        <soap:body use="literal" parts="UpdateInput_msg"/>
      </wsdl:input>   
       <wsdl:output>
        <soap:body use="literal" parts="response_msg"/>
      </wsdl:output>
      <wsdl:fault name="FaultResponseMsg">
        <soap:fault name="FaultResponseMsg" use="literal"/>
      </wsdl:fault>
    </wsdl:operation>
    

    请参阅故障响应:

    <env:Body xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
    <env:Fault xmlns:flt="http://oracle.com/sca/soapservice/TransactionPropPOC/TransactionPropPOC/Update_direct">
      <faultcode>flt:FaultResponseMsg</faultcode>
      <faultstring>SOAP Fault String</faultstring>
      <faultactor>SOAP Fault Actor</faultactor>
      <detail>
        <ns0:FaultResponse xmlns:ns0="http://xmlns.oracle.com/pcbpel/adapter/db/Update_Direct">
            <ns0:Status>KO</ns0:Status>
        </ns0:FaultResponse>
      </detail>
    </env:Fault>
    

相关问题