Apache Camel:谁负责发送HTTP消息?

时间:2012-05-14 14:09:03

标签: http apache-camel

目前,我使用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}}")

1 个答案:

答案 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>