Spring同时处理RabbitMQ消息

时间:2016-11-28 16:10:55

标签: spring concurrency rabbitmq

我对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个线程。但我从来没有多个线程。只要我让它运行以完成消息的处理,就会处理下一条消息。我需要做什么来同时处理消息?

2 个答案:

答案 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也有话要说。案件已关闭。