spring boot 自学笔记(七) Rabbitmq并发消费

本文介绍如何在Spring Boot中通过设置Messagelistener的containerconcurrency属性来实现RabbitMQ消息的并发消费,并提供了XML配置及Boot配置的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

默认情况下,Rabbitmq消费者为单线程串行消费,这也是队列的特性,当然在有些业务中需要并发消费,本文主要示例spring中和boot中指定消费者数量来并发消费。spring amqp文档也有相关描述:文档地址


通过设置Messagelistener 的containerconcurrency属性来设置消费者数量

XML示例:

<rabbit:listener-container connection-factory="connectionFactory" acknowledge="manual" concurrency= "5">
        <rabbit:listener ref="myMessageListener" queue-names="hello"/>
</rabbit:listener-container>


Boot中消费者配置可以参考前面文章,但是在@RabbitListener中,concurrency并不是配置在注解中,而且通过配置containerFactory来设置:

定义containerFactory bean:

	@Bean("pointTaskContainerFactory")
	public SimpleRabbitListenerContainerFactory pointTaskContainerFactory(SimpleRabbitListenerContainerFactoryConfigurer configurer, ConnectionFactory connectionFactory) {
		SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
		factory.setPrefetchCount(PointTaskConstant.DEFAULT_PREFETCH_COUNT);
		factory.setConcurrentConsumers(PointTaskConstant.DEFAULT_CONCURRENT);
		configurer.configure(factory, connectionFactory);
		return factory;
	}

	/**
	 * 消费者数量,默认10
	 */
	public static final int DEFAULT_CONCURRENT = 10;
	
	/**
	 * 每个消费者获取最大投递数量 默认50
	 */
	public static final int DEFAULT_PREFETCH_COUNT = 50;


Listenner:

@RabbitListener(queues = MQConstant.POINT_TASK_QUEUE_NAME,containerFactory = "pointTaskContainerFactory")


MQConstant.POINT_TASK_QUEUE_NAME 为队列名称,常量,自定义


在多消费同时消费情况下,必须要考虑到多线程安全问题。


### Python RabbitMQ 并发消费者实现 为了实现在Python中使用RabbitMQ进行并发消息消费,可以创建多个线程来监听同一个队列。这可以通过`pika`库中的`BlockingConnection`以及多线程机制共同完成。下面展示了一种方式,在此案例中定义了一个名为 `RabbitmqConsumer` 的类,该类初始化时接受队列名称、用于处理消息的函数以及线程数量作为参数[^1]。 ```python import threading import pika class RabbitmqConsumer: def __init__(self, queue_name, consuming_function, threads_num): self.queue_name = queue_name self.consuming_function = consuming_function self.threads_num = threads_num self.connection_params = pika.ConnectionParameters('localhost') def start(self): threads = [] for _ in range(self.threads_num): thread = threading.Thread(target=self._consume_messages) thread.start() threads.append(thread) for thread in threads: thread.join() def _consume_messages(self): connection = pika.BlockingConnection(self.connection_params) channel = connection.channel() channel.queue_declare(queue=self.queue_name) def callback(ch, method, properties, body): self.consuming_function(body.decode()) ch.basic_ack(delivery_tag=method.delivery_tag) channel.basic_qos(prefetch_count=1) channel.basic_consume( queue=self.queue_name, on_message_callback=callback ) try: channel.start_consuming() except KeyboardInterrupt: channel.stop_consuming() finally: connection.close() def f(message): print(f"Processing message: {message}") if __name__ == "__main__": rabbitmq_consumer = RabbitmqConsumer('queue_test', consuming_function=f, threads_num=20) rabbitmq_consumer.start() ``` 上述代码片段展示了如何设置一个具有指定工作线程数目的消费者实例,并让这些线程各自独立地从同一队列中拉取消息并执行给定的任务函数。这里还设置了预取计数(`prefetch_count`)为1,这意味着每个消费者一次只获取一条未确认的消息,有助于更均匀地分配负载和提高效率[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值