SOAComposite для OSB - распространение транзакции SoaDirect
У меня следующий сценарий:
Для упрощения предположим, что DBAdapter1 удаляет записи из таблицы базы данных, а DBAdapter2 (вызывается через прокси OSB) вставляет записи в другую таблицу. Я хочу иметь возможность откатить первый вызов DBAdapter в случае сбоя во 2-м.
В рамках процесса BPEL я вызываю DBAdapter1 и прокси OSB, используя SOADIRECT. Мой процесс bpel имеет транзакцию = ТРЕБУЕТСЯ.
В прокси OSB я устанавливаю TransactionRequired=ENABLED на вкладке обработки сообщений, а также устанавливаю QOS как EXACTLY-ONCE в действии Route для вызова 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 ответа
Попробуй это. используйте split/join между вашим прокси-сервером и dbAdapter и добавьте настраиваемую ошибку в split/Join, где вы вызываете свой адаптер.
в обработчике ошибок определите переменную error и в ответе скажите "распространять мыльную ошибку"
Вы получите элемент неисправности, если протестируете свой прокси сейчас.
дай мне знать.!
Я получаю только ошибку:oracle.soa.api.invocation.InvocationException: com.bea.wli.sb.transports.client.SBTransportException: исключение транспорта произошло во время обработки сообщения транспорта SB. когда нет правильной ошибки 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>