Transactions SOAComposite到OSB-SoaDirect事务传播

Transactions SOAComposite到OSB-SoaDirect事务传播,transactions,bpel,osb,sca,Transactions,Bpel,Osb,Sca,我有以下场景: 为了简化,假设DBAdapter1从数据库表中删除记录,而DBAdapter2(通过OSB代理调用)在另一个表中插入记录。我希望能够在第二次DBAdapter调用失败时回滚第一次DBAdapter调用 在BPEL流程中,我使用SOADIRECT调用DBAdapter1和OSB代理。我的bpel流程具有事务=必需 在OSB代理中,我在MessageHandling选项卡中设置TransactionRequired=ENABLED,并在Route活动中将QOS设置为“恰好一次”,以

我有以下场景:

为了简化,假设DBAdapter1从数据库表中删除记录,而DBAdapter2(通过OSB代理调用)在另一个表中插入记录。我希望能够在第二次DBAdapter调用失败时回滚第一次DBAdapter调用

在BPEL流程中,我使用SOADIRECT调用DBAdapter1和OSB代理。我的bpel流程具有事务=必需

在OSB代理中,我在MessageHandling选项卡中设置TransactionRequired=ENABLED,并在Route活动中将QOS设置为“恰好一次”,以调用DBAdapter2

此配置工作正常,即,如果DBAdapter2(或osb代理)中发生错误,则回滚所有事务,但是我无法将错误从osb代理发送回BPEL。 BPEL调用将以以下内容结束:

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


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

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

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

让我知道

我只得到一个错误: oracle.soa.api.invocation.InvocationException:com.bea.wli.sb.transports.client.SBTransportException:sb传输消息处理过程中发生传输异常。 当OSB服务没有将正确的SOAP错误返回给BPEL时

如果正确格式的SOAP错误返回给SOA,您可以在BPEL实例中看到该错误。并且可以根据元素类型捕捉故障

SOAP Fault必须提供一个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>

flt:故障响应EMSG
SOAP错误字符串
SOAP错误参与者
击倒对手

同样的问题,使用错误处理程序和传播soap错误修复问题。谢谢分享:)