我刚刚开始使用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]
我是否应该在这些情况下明确使用异步生成器并编写回调处理程序,还是我还缺少其他东西?谢谢!
答案 0 :(得分:1)
嗯,我想是一个RTFM的情况,虽然我的ActiveMQ页面在可用于端点配置的属性方面有很多不足之处。应该有一个说明,说大多数(所有?)JMS配置选项也可用于ActiveMQ组件。无论如何,解决方案是按如下方式定义消费者:
from("activemq:outbound.messages?asyncConsumer=true")