#2direct 实现根据关键字发布消息
# 在发送消息的时候使用routing_key参数指定关键字,rabbitmq的exchange会判断routing_key的值,然后只将消息转发至匹配的队列,
# 注意,此时需要订阅者先创建队列配置参数为exchange的type=direct,然后定义routing_key即可
mq_direct_producer.py
import pika
credient = pika.PlainCredentials(username='admin',password='admin')
connection = pika.BlockingConnection(pika.ConnectionParameters(host='0.0.0.0',port=5672,virtual_host='/',credentials=credient))
channel = connection.channel()
channel.exchange_declare(exchange='direct_exchange',exchange_type='direct',durable=True)
for i in range(10):
message = f'time {i}'
if i % 2 ==0:
channel.basic_publish(exchange='direct_exchange',routing_key='direct',body=message,properties=pika.BasicProperties(
delivery_mode=2,)) # 确保消息是持久的,设置消息持久化,将要发送的消息的属性标记为2,表示该消息要持久化
else:
channel.basic_publish(exchange='direct_exchange',routing_key='notdirect',body=message,properties=pika.BasicProperties(delivery_mode=2,))
print(message)
connection.close()
mq_direct_consumer1.py
import pika
credient = pika.PlainCredentials(username='admin',password='admin')
connection = pika.BlockingConnection(pika.ConnectionParameters(host='0.0.0.0',port=5672,credentials=credient))
channel = connection.channel()
channel.exchange_declare(exchange='direct_exchange',exchange_type='direct',durable=True)
channel.queue_declare(queue='direct_queue1',durable=True,auto_delete=True)
channel.queue_bind(exchange='direct_exchange',queue='direct_queue1',routing_key='direct') # routing_ke队列指定以什么规则绑定交换和队列
def callback(channel,method,properity,body):
channel.basic_ack(delivery_tag=method.delivery_tag)
print(body.decode())
channel.basic_qos(prefetch_count=1)
channel.basic_consume(on_message_callback=callback,queue='direct_queue1')
channel.start_consuming()
mq_direct_consumer2.py
import pika
import time
credient = pika.PlainCredentials(username='admin',password='admin')
connection = pika.BlockingConnection(pika.ConnectionParameters(host='0.0.0.0',port=5672,virtual_host='/',credentials=credient))
channel = connection.channel()
channel.exchange_declare(exchange='direct_exchange',exchange_type='direct',durable=True)
channel.queue_declare(queue='direct_queue1',durable=True,auto_delete=True)
channel.queue_bind(exchange='direct_exchange',queue='direct_queue1',routing_key='notdirect')
def callback(channel,method,properity,body):
time.sleep(2)
channel.basic_ack(delivery_tag=method.delivery_tag)
print(body.decode())
channel.basic_qos(prefetch_count=1)
channel.basic_consume(on_message_callback=callback,queue='direct_queue1')
channel.start_consuming()