【问题标题】:Apache Camel: who takes care of sending out HTTP messages?Apache Camel:谁负责发送 HTTP 消息?
【发布时间】:2012-05-14 14:09:03
【问题描述】:

目前,我使用 Camel 作为编排引擎(一个 HTTP 请求进来,我的 Camel 应用程序将发送某些 HTTP 消息并根据回复做出决定)。 Camel 应用程序运行在 Apache 的 TomCat 之上。

作为测试的一部分,我开始向我的 Camel 应用程序发送越来越多的并发请求。精简后的场景如下:

 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 代码中添加了一些日志记录(向服务器 Z 发送 HTTP GET 消息之前和之后的时间戳),这让我很困惑:根据日志信息,Camel 确实立即发送了第 21 个请求出去 ! (它不等待第一条消息的 200 ok 最终回复?!)

所以,我想知道......第 21 个请求(到服务器 Z 的 HTTP GET)在哪里卡住了 5 秒?为什么?这真的是我的脑筋急转弯......

所以,总结一下第 21 个请求:

在骆驼日志中:

  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}}")

【问题讨论】:

  • 您是否考虑过查看服务器 Z 日志?是否以某种方式在服务器中存在潜在延迟?
  • 您好,Petter,感谢您的回复。无需检查服务器 Z:我已经检查了运行 Camel 代码的机器上的 wireshark 痕迹。在收到第 20 个请求的 200 OK 之前,第 21 个请求的 HTTP GET 不会发送到服务器 Z ...
  • 能否请您发布您的骆驼配置?

标签: http apache-camel


【解决方案1】:

经过进一步调查,我发现了限制因素。 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>

【讨论】:

    猜你喜欢
    • 2020-07-10
    • 2014-12-30
    • 2013-12-25
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    相关资源
    最近更新 更多