我对Spring的消息处理相当新,所以请耐心等待。
我希望我的RabbitMQ消息处理程序能够在多个线程中同时处理消息。
@Component
public class ConsumerService {
@RabbitListener(queues = {"q"})
public void messageHandler(@Payload M msg) {
System.out.println(msg);
}
}
...
@Configuration
@Import({MessageConverterConfiguration.class, ConsumerService.class})
public class ConsumerConfiguration {
@Autowired
private ConnectionFactory connectionFactory;
@Bean
public List<Declarable> declarations() {
return Arrays.asList(
new DirectExchange("e", true, false),
new Queue("q", true, false, false),
new Binding("q", Binding.DestinationType.QUEUE, "e", "q", null)
);
}
@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(MessageConverter contentTypeConverter, SimpleRabbitListenerContainerFactoryConfigurer configurer) {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConcurrentConsumers(10);
configurer.configure(factory, connectionFactory);
factory.setMessageConverter(contentTypeConverter);
return factory;
}
}
在我的小测试中,队列“q”上有4条消息。我得把它们都加工好了。那样就好。但我一个接一个地处理它们。如果我在“ConsumerService.messageHandler”中设置断点(基本上是延迟处理消息的完成),我想最终在该断点中有4个线程。但我从来没有多个线程。只要我让它运行以完成消息的处理,就会处理下一条消息。我需要做什么来同时处理消息?
答案 0 :(得分:2)
实现此目的有两种方法
我看到您正在使用 concurrentConsumers 属性来自动处理Spring AMQP创建多个使用者。尝试将 PrefetchCount 设置为1并同时设置MaxConcurrentConsumers。
很可能你已经在队列中有四条消息,而且预取计数的默认值很大,只有一个消费者正在消耗队列中的所有消息。
答案 1 :(得分:1)
对不起,我忘记写了我的工作。基本上我现在拥有的是:
...
factory.setConcurrentConsumers(10);
factory.setMaxConcurrentConsumers(20);
factory.setConsecutiveActiveTrigger(1);
factory.setConsecutiveIdleTrigger(1);
factory.setPrefetchCount(100);
...
我确实相信并发消费者,它实际上最终(在足够的负载下)并行处理消息。问题是我的小测试中只有4条消息,并且它永远不会为了激活多个消费者(-thread)而烦恼。将consecutiveActiveTrigger设置为1有助于此处。猜猜prefetchCount也有话要说。案件已关闭。