У меня следующий сценарий:
Для упрощения предположим, что 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?
Спасибо,