为什么我的WSO2 EI(ESB)代理服务会挂起3分钟?

时间:2017-07-10 15:37:43

标签: wso2 wso2esb wso2bps wso2ei

我有一个BPS进程,可以快速执行对ESB代理的大量调用。 ESB代理调用ESB API,该API调用我们自己产品的API。

通常,BPS进程在等待ESB的响应时暂停3分钟。 3分钟后,一切都继续,好像什么也没发生。使用Wireshark和一些其他Log调解器,我发现了以下内容:

  • 挂起发生在ESB代理中,就在输出序列之前。
  • 根据Wireshark的说法,当发生挂起时,ESB API已经将响应发送到ESB代理。

这种悬挂需要3分钟的事实应该是一个暗示。我在配置文件中搜索了指定180秒的任何内容,但唯一的是http套接字超时和http transportReceiver的threadKeepAliveTime。如果我减少那些,BPS会抛出p2p通信错误而不是继续。对我来说,这表明某些事情在背景中仍然会导致一些电话延迟3分钟。

顺便说一下,仅对某些特定的呼叫不会挂起。我已经多次测试,每次执行完全相同的呼叫,我无法预测哪个呼叫会挂起,或者即使任何呼叫都会挂起。

4 个答案:

答案 0 :(得分:1)

我建议你在<send />添加至少faultSequence个调解员。 也许还会添加一个简单的makefault调解员(暂时不要太复杂 - 只需要一个静态错误响应 - 在这个阶段你不想要在faultSequence中产生错误)

我怀疑后端服务或输出序列中有一些错误,甚至可能没有处理faultSequence - 这意味着代理不会向你的调用者发送响应,代理会挂起,直到超时

PS:如果您发布代理的源代码也很有帮助

答案 1 :(得分:1)

我曾经尝试在没有请求主体的情况下调用PUT或POST方法时遇到过相同的经历。但是,默认情况下,当http方法为POST或PUT时,WSO2 ESB期望消息体将请求发送到后端服务器。

我必须使用请求正文发送请求(至少是空的JSON:{}),或者在API中使用属性FORCE_POST_PUT_NOBODY。

有关如何使用FORCE_POST_PUT_NOBODY属性的更多详细信息,请阅读此post

答案 2 :(得分:0)

我最终获得了WSO2支持。显然,我遇到了一些非常罕见的边缘情况,这对于WSO2工程师来说非常难以重现。

最后,修复结果是在代理服务中的发送中介之前添加了以下属性:

<property name="NO_KEEPALIVE" value="true" scope="axis2"/>

答案 3 :(得分:0)

如果您在WSO2中启用了有线日志,您将意识到NGIX正在请求中使用HTTP 1.0客户端。

为了修复那个改变你的NGINX映射使用“proxy_http_version 1.1;”问题将被排序。

干杯。