python操作rabbitmq

python操作rabbitmq

Exchange 工作模式

直接(direct)
主题(topic)
标题(header)
扇出(fanout)

fanout 扇出
不需要指定 routing_key,即使指定了也是无效。
需要提前将 exchange 和 queue 绑定,一个 exchange 可以绑定多个 queue,一个queue可以绑定多个exchange。
需要先启动 订阅者,此模式下的队列是 consumer 随机生成的,发布者 仅仅发布消息到 exchange ,由 exchange 转发消息至 queue

安装

pip install pika

direct 生产者

import pika

credentials = pika.PlainCredentials('guest', 'guest')  # 用户名密码
parameters = pika.ConnectionParameters(host='192.168.33.10', port=5672, virtual_host='/', credentials=credentials) # ip port host
conn = pika.BlockingConnection(parameters) #创建链接
channel = conn.channel() #创建信道
channel.exchange_declare('test', exchange_type='direct', durable=True) # 交换机名称test, 交换机类型, durable=True是否持久化, 避免mq重启交换机丢失
queue = 'hxy_2'  # 队列名称
message = 'hello word' # 消息
channel.queue_declare(queue, durable=True) # 队列持久化
# 列如 routing_key有a和b.c, ab绑定了队列test_1, c绑定test_2, 发送消息同时给abc, test_1 2条消息(ab的消息都会发送到test_1里), test_2 一条, 
channel.queue_bind(queue, 'test', routing_key='hxy_key')  # 交换机绑定routing_key, routing_key绑定交换机, 一个队列可以绑定多个routing_key, routing_key可以绑定多个队列, 将消息发送给绑定了指定routing_keyd的队列
channel.basic_publish('test', 'hxy_key', message, properties=pika.BasicProperties(delivery_mode=2)) # 发送消息, delivery_mode=2消息持久化
conn.close()

消费者

import pika

credentials = pika.PlainCredentials('guest', 'guest')
parameters = pika.ConnectionParameters(host='192.168.33.10', port=5672, virtual_host='/', credentials=credentials)
conn = pika.BlockingConnection(parameters)
channel = conn.channel()
channel.exchange_declare('test', exchange_type='direct', durable=True)
queue = 'hxy_2'
channel.queue_declare(queue, durable=True)
channel.queue_bind(queue, 'test', routing_key='hxy_key')  # routing_key可写可不写


def callback(ch, method, properties, body):
    print(body)
    ch.basic_ack(delivery_tag=method.delivery_tag)   # 确认响应, 如果其中一个消费者程序中断, 任务发送给其他消费者


channel.basic_consume(queue, callback, auto_ack=False) # 指定为False,表示取消自动应答,交由回调函数手动应答
# 一直处于等待接收消息的状态,如果没收到消息就一直处于阻塞状态,收到消息就调用上面的回调函数
channel.start_consuming()

fanout 需要先启动消费者, 再启动生产者

# 生产者
import pika
credentials = pika.PlainCredentials('guest', 'guest')
parameters = pika.ConnectionParameters(host='192.168.33.10', port=5672, virtual_host='/', credentials=credentials)
conn = pika.BlockingConnection(parameters)
channel = conn.channel()
channel.exchange_declare(exchange='test', exchange_type='fanout', durable=True)
import json
for i in range(10):
    message=json.dumps({'OrderId':"1000%s"%i})
    channel.basic_publish('test', '', body=message, properties=pika.BasicProperties(delivery_mode = 2))

conn.close()

# 消费者
import pika


credentials = pika.PlainCredentials('guest', 'guest')
parameters = pika.ConnectionParameters(host='192.168.33.10', port=5672, virtual_host='/', credentials=credentials)
conn = pika.BlockingConnection(parameters)
channel = conn.channel()
result = channel.queue_declare('', exclusive=True)
channel.exchange_declare('test', durable=True, exchange_type='fanout')  # durable=True 持久化
channel.queue_bind(result.method.queue, 'test')  # result.method.queue 获取队列名称

def callback(ch, method, properties, body):
    print(body)
    ch.basic_ack(delivery_tag=method.delivery_tag)   # 确认响应, 如果其中一个消费者程序中断, 任务发送给其他消费者


channel.basic_consume(result.method.queue, callback)
channel.start_consuming()
  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值