1

我有以下情况:

在此处输入图像描述

为简化起见,假设 DBAdapter1 从数据库表中删除记录,而 DBAdapter2(通过 OSB 代理调用)在不同的表中插入记录。我希望能够回滚第一个 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?

谢谢,

4

2 回答 2

1

尝试这个。在您的代理和 dbAdapter 之间使用拆分/连接,并在您调用适配器的拆分/连接内引发自定义错误。

在错误处理程序中定义一个错误变量,并在回复中说“传播肥皂错误”

如果您现在测试您的代理,您将收到故障元素。

让我知道。!

图片

于 2015-03-05T11:33:09.190 回答
-1

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

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

SOAP 故障必须提供一个故障代码值,该值包含一个限定元素名称,该名称引用来自 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>

于 2017-01-16T15:08:58.587 回答