我有一个BPS进程,可以快速执行对ESB代理的大量调用。 ESB代理调用ESB API,该API调用我们自己产品的API。
通常,BPS进程在等待ESB的响应时暂停3分钟。 3分钟后,一切都继续,好像什么也没发生。使用Wireshark和一些其他Log调解器,我发现了以下内容:
这种悬挂需要3分钟的事实应该是一个暗示。我在配置文件中搜索了指定180秒的任何内容,但唯一的是http套接字超时和http transportReceiver的threadKeepAliveTime。如果我减少那些,BPS会抛出p2p通信错误而不是继续。对我来说,这表明某些事情在背景中仍然会导致一些电话延迟3分钟。
顺便说一下,仅对某些特定的呼叫不会挂起。我已经多次测试,每次执行完全相同的呼叫,我无法预测哪个呼叫会挂起,或者即使任何呼叫都会挂起。
答案 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;”问题将被排序。
干杯。