【发布时间】:2021-04-17 07:21:46
【问题描述】:
我在 Spring-Boot 应用程序中使用 Camel 从 AMQ-Queue 进行路由。来自该队列的消息将被发送到 REST-Web 服务。它已经在使用这个代码行了:
from("amq:queue:MyQueue").process("jmsToHttpProcessor").to(uri);
我的 uri 看起来像这样:
http4://localhost:28010/application/createCustomer
现在我要求到 Web 服务的路由应该并行完成:
为了实现这一点,我在 JmsConfiguration 中配置了 concurrentConsumers,如下所示:
@Bean
public JmsComponent amq(@Qualifier("amqConnectionFactory") ConnectionFactory amqConnectionFactory, AMQProperties amqProperties) {
JmsConfiguration jmsConfiguration = new JmsConfiguration(amqConnectionFactory);
jmsConfiguration.setConcurrentConsumers(50);
jmsConfiguration.setMaxConcurrentConsumers(50);
return new JmsComponent(jmsConfiguration);
}
@Bean
public ConnectionFactory amqConnectionFactory(AMQProperties amqProperties) throws Exception {
ConnectionFactoryParser parser = new ConnectionFactoryParser();
ConnectionFactory returnValue = parser.newObject(parser.expandURI(amqProperties.getUrl()), "amqConnectionFactory");
return returnValue;
}
它按预期工作,但不是从一开始就立即。我有现象:
- 我的 ActiveMQ 队列中有 100 条消息
- 我启动我的 Spring 应用程序
- Camel 在前一条消息得到响应后仅创建 1 个线程消耗 1 条消息
- 我观察到队列中的消息数量只会缓慢减少(99.... 98... 97... 96...)
- 我正在用新的 100 条消息填充队列
- 现在正在创建并发消费者,因为我可以观察到消息迅速减少。
有人知道,为什么 concurrentConsumers 不能从一开始就立即工作吗?
【问题讨论】:
-
尝试设置
asyncConsumer=true(默认为false) -
你设置了消息预取吗?尝试将 AMQ 代理(或客户端 URL)上的消息预取设置为 0 或 1。