1

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

我找到了下一个 WSO2 ESB 版本的“已解决的固定”Jira 票证,这似乎可以解决我的问题,但没有等待这个版本让它工作的奢侈: https ://wso2.org/jira /浏览/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] 调试 {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}

4

1 回答 1

0

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

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

于 2012-04-20T19:39:11.490 回答