我有以下情况:
为简化起见,假设 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?
谢谢,