目前,我使用Camel作为编排引擎(HTTP请求进来,我的Camel应用程序将发送某些HTTP消息并根据回复做出决定)。 Camel应用程序运行在Apache的TomCat之上。
作为测试的一部分,我开始向Camel应用程序发送越来越多的同步请求。剥离了cenario如下:
HTTP POST --> Camel --> HTTP GET to server Z
<-- 200 ok (this could take up to 5 sec)
<-- 200 ok
问题:当同时发送20个请求时,一切都很顺利(所有请求都由Camel应用程序处理得很好)。
但是,当发送21个请求时,我看到以下行为:正在处理前20个请求,并且只有当第一个请求收到最终答复(= 200 ok)时,才会将第21个HTTP GET请求发送到服务器Z ??
这意味着对于20个请求,所有请求都会在大约5秒内完成。但是当发送21个请求时,需要10秒钟(最后一个请求只能在5秒后由服务器Z处理)!!
现在,我已经添加了一些日志记录到Camel代码(将HTTP GET消息发送到服务器Z之前和之后的时间戳),这让我很困惑:根据日志信息,Camel会立即发送第21个请求出来! (它不等待第一条消息的200 ok最终回复?!)
所以,我想知道......这个第21个请求(HTTP GET到服务器Z)在哪里被卡住了5秒?为什么?这真的打破了我的大脑......
所以,总结第21个要求:
在Camel日志中:
time x = POST comes in
time x+some msec = Camel sends HTTP GET to server Z
time x+10 = Camel receives 200 ok on HTTP GET
在wireshark中:
time x = POST comes in
time x+5 = Camel sends HTTP GET to server Z
time x+10 = Camel receives 200 ok on HTTP GET
注意:我在Camel代码中按如下方式打印时间戳:
.log("${date:now:yyyyMMdd-HH-mm-ss-SSS} **** Sending HTTP GET message... ****")
.to("{{serverZ.endpoint}}")
答案 0 :(得分:3)
经过一番进一步调查后,我发现了限制因素。 Apache的HTTP公共客户端有一个名为“MAX TOTAL CONNECTIONS”的参数,其默认值为... 20!
增加此参数后,我不再遇到问题。
注意:我使用的是Spring框架(STS)和Eclipse IDE。对于我的Camel应用程序,我调整了applicationContext.xml文件,如下所示:
<bean id="http" class="org.apache.camel.component.http.HttpComponent">
<property name="camelContext" ref="camel"/>
<property name="httpConnectionManager" ref="myHttpConnectionManager"/>
</bean>
<bean id="myHttpConnectionManager" class="org.apache.commons.httpclient.MultiThreadedHttpConnectionManager">
<property name="params" ref="myHttpConnectionManagerParams"/>
</bean>
<bean id="myHttpConnectionManagerParams" class="org.apache.commons.httpclient.params.HttpConnectionManagerParams">
<property name="defaultMaxConnectionsPerHost" value="1000"/>
<property name="maxTotalConnections" value="1000"/>
</bean>