当前位置: 首页 > 知识库问答 >
问题:

WSO2 ESB:如何响应SOAP错误执行JMS回滚?

穆子琪
2023-03-14

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

我已经为下一个版本的WSO2 ESB找到了以下“已解决的固定”Jira票证,它似乎解决了我的问题,但没有时间等待这个版本来解决这个问题:https://WSO2.org/Jira/browse/esbjava-906

我的问题是,在4.0.3中有没有可以实现的变通方法?是否有一种方法可以阻止执行提交的线程,直到我可以确定结果等?如果没有,您是否可以引用新版本的源代码,以便我可以根据Jira票证中实现的修复将必要的错误自己提供到synapse ClientHandler(或类似的)中?

以下是我收到的警告(我需要是一个错误)以及一些额外的调试信息:

TID: [] [WSO2 ESB] [2012-04-18 17:18:23,786]  INFO {org.apache.synapse.core.axis2.TimeoutHandler} -  This engine will expire all callbacks after : 86400 seconds, irrespective of the timeout action, after the specified or optional timeout {org.apache.synapse.core.axis2.TimeoutHandler}
TID: [] [WSO2 ESB] [2012-04-18 17:18:23,790] DEBUG {org.apache.synapse.core.axis2.SynapseCallbackReceiver} -  Callback added. Total callbacks waiting for : 1 {org.apache.synapse.core.axis2.SynapseCallbackReceiver}
TID: [] [WSO2 ESB] [2012-04-18 17:18:24,006]  WARN {org.apache.synapse.transport.nhttp.ClientHandler} -  Received an internal server error : Internal Server Error For : 127.0.0.1:8080 For Request : Axis2Request [Message ID : urn:uuid:6322ced4-801f-40fe-a3a7-bb4019b02cdb] [Status Completed : true] [Status SendingCompleted : true] {org.apache.synapse.transport.nhttp.ClientHandler}
TID: [] [WSO2 ESB] [2012-04-18 17:18:24,015] DEBUG {org.apache.synapse.core.axis2.SynapseCallbackReceiver} -  Callback removed for request message id : urn:uuid:6322ced4-801f-40fe-a3a7-bb4019b02cdb. Pending callbacks count : 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 received an asynchronous response message {org.apache.synapse.core.axis2.SynapseCallbackReceiver}
TID: [] [WSO2 ESB] [2012-04-18 17:18:24,016] DEBUG {org.apache.synapse.core.axis2.SynapseCallbackReceiver} -  Received To: null {org.apache.synapse.core.axis2.SynapseCallbackReceiver}
TID: [] [WSO2 ESB] [2012-04-18 17:18:24,017] DEBUG {org.apache.synapse.core.axis2.SynapseCallbackReceiver} -  SOAPAction:  {org.apache.synapse.core.axis2.SynapseCallbackReceiver}
TID: [] [WSO2 ESB] [2012-04-18 17:18:24,017] DEBUG {org.apache.synapse.core.axis2.SynapseCallbackReceiver} -  WSA-Action:  {org.apache.synapse.core.axis2.SynapseCallbackReceiver}
TID: [] [WSO2 ESB] [2012-04-18 17:18:24,021] DEBUG {org.apache.synapse.core.axis2.SynapseCallbackReceiver} -  Body :
<?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>

共有1个答案

文增
2023-03-14

我能够解决,尽管不是以我希望的方式;试图避免改变突触行为:

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

 类似资料:
  • 下面是我正在使用的一段代码: 期望reponse conatins的状态行:“HTTP/1.1400坏请求”想知道这是可以实现的吗?如果是,那么我如何继续做同样的事情。

  • 我的代理配置是: 为什么这样?他们的jms配置有问题吗?请引导我。

  • 问题内容: 所以我有一个简单的Web服务: 书的类也很简单: 现在,当您在浏览器的测试器中调用此Web服务时,我得到: 是否有可能将返回的 HashMap 对象显示在标记中,例如 我想要返回标签中的值的原因是,从客户端来看,我在网页中使用jQuery AJAX调用此Web服务,而我得到的响应XML只是空标签。我如何从AJAX客户端获得真实的账面价值? 这是我的AJAX网络代码: 我使用简单的Hel

  • 我已经删除了。锁定文件和节点\u模块并再次尝试安装。然而,它不起作用。你能帮我修一下吗?

  • 我正在从前端向后端中的路由发出请求,该路由正在验证与用户关联的令牌,如果令牌已过期,则会将错误响应发送回前端。我正在发送一些,但是在执行捕获块中的错误消息,未显示沿错误响应发送的json。 像这样发送错误响应 但是我在前端的 catch 块中得到的响应没有收到错误时发送的 json 的迹象。 岗位http://localhost:3001/check-验证401(未经授权)错误:请求失败,在XML

  • 我试图利用固有的WSO2ESB主题发布到jms队列。我已经创建了主题,并提供了一个订阅者URL:jms:/topictest?transport.jms.destinationtype=queue。然而,当我将消息发布到主题时,它不能被传递到队列。日志生成以下内容 “系统无法从jms:/queue?destination=topictest URL推断传输信息。” 另外,我似乎不知道如何发布到WS