SOAComposite в OSB — Распространение транзакций SoaDirect

У меня следующий сценарий:

введите здесь описание изображения

Для упрощения предположим, что DBAdapter1 удаляет записи из таблицы базы данных, а DBAdapter2 (вызванный через прокси-сервер OSB) вставляет запись в другую таблицу. Я хочу иметь возможность откатить первый вызов DBAdapter в случае сбоя во втором.

В процессе BPEL я вызываю DBAdapter1 и прокси-сервер OSB, используя SOADIRECT. В моем процессе bpel транзакция = REQUIRED.

В OSB Proxy я устанавливаю TransactionRequired=ENABLED на вкладке обработки сообщений, а также устанавливаю QOS как «EXACTLY-ONCE» в действии Route для вызова DBAdapter2.

Эта конфигурация работает нормально, т. е. если возникает ошибка в DBAdapter2 (или osb proxy), вся транзакция откатывается, однако я не могу отправить ошибку обратно из OSB Proxy в 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 Proxy не должен завершать глобальную транзакцию, инициированную в BPEL. Если я добавлю обработчик ошибок в свою прокси-службу, я смогу перехватить правильную ошибку, поступающую от DBAdapter2, однако эта ошибка никогда не распространяется обратно в BPEL.

Любая идея, что я делаю неправильно здесь? Как я могу распространять транзакции и ошибки с помощью soadirect из osb в bpel?

Спасибо,


person Fabio    schedule 22.01.2015    source источник


Ответы (2)


Попробуй это. используйте разделение/объединение между вашим прокси-сервером и dbAdapter и сгенерируйте настроенную ошибку внутри разделения/объединения, где вы вызываете свой адаптер.

в обработчике ошибок определите переменную ошибки и в ответе скажите «распространить ошибку мыла»

Вы получите элемент ошибки, если сейчас протестируете свой прокси.

дайте мне знать.!

изображение

person spattanaik75    schedule 05.03.2015
comment
Та же проблема, но с помощью обработчиков ошибок и распространить ошибку мыла решить проблему. Спасибо, что поделился :) - person Gueorgui Obregon; 22.06.2016

Я получаю только ошибку: oracle.soa.api.invocation.InvocationException: com.bea.wli.sb.transports.client.SBTransportException: во время обработки сообщения SB Transport произошло исключение транспорта. когда есть не является правильной ошибкой SOAP, возвращаемой службой OSB обратно в BPEL.

Если правильно сформированная ошибка SOAP возвращается обратно в SOA, вы можете увидеть ошибку в экземпляре BPEL. и может поймать неисправность на основе типа элемента.

Ошибка SOAP должна предоставить значение кода ошибки, которое содержит полное имя элемента, ссылающееся на элемент wsdl:portType>wsdl:operation>wsdl:fault из WSDL. Если это неверно, 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>

person Adam H    schedule 16.01.2017