一、需求
使用rabbitmq转发大量消息,提高效率。由于springboot中rabbitmq默认是单线程监听,所以需要我们加以配置。
二、方案
配置rabbitmq多线程监听,提供SimpleRabbitListenerContainerFactory
类的bean,为数据量大的队列指定这个bean。
设置多线程批量处理。在任意配置类中,提供这个bean。(注意配置类中的Listener会覆盖配置文件中的配置)
// 配置批量监听容器
@Bean("batchQueueRabbitListenerContainerFactory")
public SimpleRabbitListenerContainerFactory batchQueueRabbitListenerContainerFactory(ConnectionFactory connectionFactory) {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
//设置批量
factory.setBatchListener(true);
factory.setConsumerBatchEnabled(true);//设置BatchMessageListener生效
factory.setBatchSize(1000);//设置监听器一次批量处理的消息数量
factory.setConcurrentConsumers(10); //设置线程数
factory.setMaxConcurrentConsumers(10); //最大线程数
return factory;
}
为队列指定这个bean
// 创建消费者,比较两者时间
@RabbitListener(queues = "xiaomi",containerFactory = "batchQueueRabbitListenerContainerFactory")
public void xiaomiHandler(List<Message> messages) throws IOException, ClassNotFoundException {
log.info("xiaomiHandler>>>>>" + messages.size());
}
三、测试
确实是10个线程并发监听。