Camel ApacheMQ - > AHC行为(阻止?)

时间:2015-05-09 23:52:47

标签: apache-camel activemq asynchttpclient

我刚刚开始使用Apache Camel,我很好奇异步http客户端(AHC)看似违反直觉的默认行为。在消费来自ActiveMQ的消息时,我无法让它以非阻塞的方式运行。

我的路线如下:

@Component
public class Broadcaster extends RouteBuilder {

  @Override
  public void configure() throws Exception {
    errorHandler(deadLetterChannel("activemq:failed.messages"));

    from("activemq:outbound.messages")
    .setExchangePattern(ExchangePattern.InOnly)
    .recipientList(simple("ahc:${in.header[PublishDestination]}"))
    .end();
  }
}

我排队了几条消息,其中一半是我发送到延迟的Web服务器,另一半是正常消息。我期望看到快速服务器立即消耗所有正常消息,并且随着时间的推移逐渐消耗慢速消息。但是,这是在快速Web服务器上观察到的行为:

00:24:02.585, <hello>World</hello>
00:24:03.622, <hello>World</hello>
00:24:04.640, <hello>World</hello>
00:24:05.658, <hello>World</hello>

正如您所看到的,每个记录的请求之间恰好有一秒钟对应于慢速服务器上的假设1秒延迟。根据路由时序,看起来JMS使用者在消耗队列中的下一条消息之前等待AHC完成:

Processor                                 Elapsed (ms)
[activemq://outbound.messages           ] [      1020]
[setExchangePattern[InOnly]             ] [         0]
[ahc:${in.header[PublishDestination]}}  ] [      1018]

我是否应该在这些情况下明确使用异步生成器并编写回调处理程序,还是我还缺少其他东西?谢谢!

1 个答案:

答案 0 :(得分:1)

嗯,我想是一个RTFM的情况,虽然我的ActiveMQ页面在可用于端点配置的属性方面有很多不足之处。应该有一个说明,说大多数(所有?)JMS配置选项也可用于ActiveMQ组件。无论如何,解决方案是按如下方式定义消费者:

from("activemq:outbound.messages?asyncConsumer=true")