63 lines
2.1 KiB
Python
63 lines
2.1 KiB
Python
import asyncio
|
|
import aio_pika
|
|
|
|
from config import RABBITMQ_URI
|
|
|
|
|
|
async def topic_consumer(queue_name: str, consumer_id: str):
|
|
"""
|
|
监听指定队列的消费者
|
|
:param queue_name: 要监听的队列名称
|
|
:param consumer_id: 消费者标识,用于区分不同消费者
|
|
"""
|
|
# 建立连接
|
|
connection = await aio_pika.connect_robust(RABBITMQ_URI)
|
|
channel = await connection.channel()
|
|
|
|
# 开启公平调度,确保消费者处理完一条消息再接收下一条
|
|
await channel.set_qos(prefetch_count=1)
|
|
|
|
# 声明要监听的队列(与生产者中创建的队列保持一致)
|
|
queue = await channel.declare_queue(
|
|
queue_name,
|
|
durable=True,
|
|
auto_delete=False
|
|
)
|
|
|
|
# 消息处理函数
|
|
async def on_message(message: aio_pika.IncomingMessage):
|
|
# 自动确认消息(处理完成后从队列中删除)
|
|
async with message.process():
|
|
message_content = message.body.decode("utf-8")
|
|
print(f"【消费者{consumer_id}】收到消息: {message_content}")
|
|
print(f"【消费者{consumer_id}】消息路由键: {message.routing_key}")
|
|
print(f"【消费者{consumer_id}】来自队列: {queue_name}\n")
|
|
|
|
# 模拟消息处理耗时(根据实际业务逻辑调整)
|
|
await asyncio.sleep(1)
|
|
|
|
# 开始消费队列中的消息
|
|
await queue.consume(on_message)
|
|
print(f"【消费者{consumer_id}】已启动,正在监听队列: {queue_name}")
|
|
|
|
# 保持消费者运行(无限期阻塞)
|
|
await asyncio.Future()
|
|
|
|
|
|
async def start_all_topic_consumers(queue_prefix="demo.topic.queue-"):
|
|
"""启动所有Topic Exchange对应的消费者"""
|
|
# 与setup_topic_exchange中的队列名称对应
|
|
consumer_tasks = [
|
|
topic_consumer(f"{queue_prefix}critical", "CriticalHandler"),
|
|
topic_consumer(f"{queue_prefix}order", "OrderHandler"),
|
|
topic_consumer(f"{queue_prefix}user.login", "UserLoginHandler")
|
|
]
|
|
|
|
# 同时启动所有消费者
|
|
await asyncio.gather(*consumer_tasks)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
# 启动消费者
|
|
asyncio.run(start_all_topic_consumers())
|