我有以下情况:
为简化起见,假设DBAdapter1从数据库表中删除记录,DBAdapter2(通过OSB代理调用)在不同的表中插入记录 . 我希望能够在第二个DBUnapter调用失败的情况下回滚第一个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传播事务和错误?
谢谢,
2 回答
试试这个 . 在您的代理和dbAdapter之间使用拆分/连接,并在您调用适配器的split / Join中抛出自定义错误 .
在错误处理程序中定义一个faultvariable并在回复中说“传播soap fault”
如果您现在测试代理,您将收到fault元素 .
让我知道 . !
我只收到错误:oracle.soa.api.invocation.InvocationException:com.bea.wli.sb.transports.client.SBTransportException:SB传输消息处理期间发生传输异常 . 当没有从OSB服务返回到BPEL的正确SOAP错误时 .
如果将正确形成的SOAP错误返回给SOA,则可以在BPEL实例中看到错误 . 并且可以根据元素类型捕获错误 .
SOAP Fault must 提供了一个faultcode值,其中包含一个引用WSDL中 wsdl:portType>wsdl:operation>wsdl:fault 元素的限定元素名称 . 如果这不正确,则BPEL将显示调用的服务的错误,但不会填充错误消息部分 .
请参阅WSDL:
请参阅故障响应: