【问题标题】:WSO2 ESB: How to perform JMS rollback upon SOAP fault in Response?WSO2 ESB:如何在响应中的 SOAP 错误时执行 JMS 回滚?
【发布时间】:2012-04-30 10:55:43
【问题描述】:

使用版本 4.0.3,我目前有一个参与 JMS 到 HTTP 代理的 IN 和 OUT 序列,该代理使用错误处理程序定义,如果出现异常,该处理程序将成功回滚 JMS 本地事务,但是错误是在响应中返回 SOAPFault 的情况下不会抛出(仅来自 ClientHandler 的 WARN 消息),因此我丢失了原始 JMS 消息(已提交)。我应该注意,如果我解析 OUT 序列中的响应并在那里发现故障,则执行回滚没有任何效果,因为当它到达 OUT 序列时,JMS 事务已提交。

我找到了下一个 WSO2 ESB 版本的“已解决的固定”Jira 票证,可能似乎解决了我的问题,但没有时间等待这个版本让它工作: https://wso2.org/jira/browse/ESBJAVA-906

我的问题是,我可以在 4.0.3 中实施任何解决方法吗?有没有办法阻止执行提交的线程,直到我可以确定结果等?如果没有,您能否参考新版本的源代码,以便我可以根据 Jira 票证中实施的修复将必要的故障自己提供到突触 ClientHandler(或类似)中?

这是我收到的警告(我必须是错误)以及一些额外的调试信息:

TID:[] [WSO2 ESB] [2012-04-18 17:18:23,786] INFO {org.apache.synapse.core.axis2.TimeoutHandler} - 此引擎将在 : 86400 秒后过期所有回调,与超时无关动作,在指定或可选超时后 {org.apache.synapse.core.axis2.TimeoutHandler} TID:[] [WSO2 ESB] [2012-04-18 17:18:23,790] 调试 {org.apache.synapse.core.axis2.SynapseCallbackReceiver} - 添加了回调。等待的回调总数:1 {org.apache.synapse.core.axis2.SynapseCallbackReceiver} TID:[] [WSO2 ESB] [2012-04-18 17:18:24,006] WARN {org.apache.synapse.transport.nhttp.ClientHandler} - 收到内部服务器错误:内部服务器错误:127.0.0.1: 8080 请求:Axis2Request [消息 ID:urn:uuid:6322ced4-801f-40fe-a3a7-bb4019b02cdb] [状态已完成:真] [状态发送完成:真] {org.apache.synapse.transport.nhttp.ClientHandler} TID:[] [WSO2 ESB] [2012-04-18 17:18:24,015] DEBUG {org.apache.synapse.core.axis2.SynapseCallbackReceiver} - 已删除请求消息 ID 的回调:urn:uuid:6322ced4-801f- 40fe-a3a7-bb4019b02cdb。待处理的回调计数:0 {org.apache.synapse.core.axis2.SynapseCallbackReceiver} TID: [] [WSO2 ESB] [2012-04-18 17:18:24,016] DEBUG {org.apache.synapse.core.axis2.SynapseCallbackReceiver} - Synapse 收到异步响应消息 {org.apache.synapse.core. axis2.SynapseCallbackReceiver} TID:[] [WSO2 ESB] [2012-04-18 17:18:24,016] 调试 {org.apache.synapse.core.axis2.SynapseCallbackReceiver} - 接收到:null {org.apache.synapse.core.axis2.突触回调接收器} TID:[] [WSO2 ESB] [2012-04-18 17:18:24,017] 调试 {org.apache.synapse.core.axis2.SynapseCallbackReceiver} - SOAPAction:{org.apache.synapse.core.axis2.SynapseCallbackReceiver} TID:[] [WSO2 ESB] [2012-04-18 17:18:24,017] 调试 {org.apache.synapse.core.axis2.SynapseCallbackReceiver} - WSA 操作:{org.apache.synapse.core.axis2.突触回调接收器} TID:[] [WSO2 ESB] [2012-04-18 17:18:24,021] 调试 {org.apache.synapse.core.axis2.SynapseCallbackReceiver} - 正文:
<?xml version='1.0' encoding='utf-8'?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <soap:Fault>
      <faultcode>soap:Server</faultcode>       
      <faultstring>org.apache.cxf.service.factory.ServiceConstructionException: Failed to create service.</faultstring>
    </soap:Fault>
  </soap:Body>
</soap:Envelope>

{org.apache.synapse.core.axis2.SynapseCallbackReceiver}

【问题讨论】:

    标签: jms wso2 wso2esb esb


    【解决方案1】:

    我能够解决,但不是按照我希望的方式;试图避免修改 Synapse 行为:

    更改 org.apache.synapse.transport.nhttp.ClientHandler 允许我为这种类型的条件(SOAP 错误)抛出一个错误,它在将请求标记为已完成之前执行执行回滚的错误序列。 (我还希望我可以捕获传输异常,例如连接失败以类似方式执行回滚,因为这是 Synapse 允许事务处理消息传递的能力中的另一个令人惊讶的漏洞)。我开始怀疑是否有人真的在企业中将它用于这种类型的 JMS-to-HTTP 模式,因为随着它的实现,消息泄漏的机会很大,例如,如果端点关闭或抛出SOAP 错误。我已经查看了备用的“存储和转发”模式,但这是异步的,并且要求消息存储队列可以在中断或故障的情况下跨分布式 ESB 恢复和可用——我的主消息队列系统已经具备了这一点。出于这个原因,我觉得事务 JMS 是要走的路。我错过了什么吗?我应该考虑使用 Synapse/WSO2 是否有更好的模式(了解我需要以接近零的消息丢失进行同步 JMS 到 HTTP/SOAP 代理)?

    【讨论】:

      猜你喜欢
      • 2013-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多