首先现在工程里面安装pika
pip install pika
producer.py 代码如下:
import pika
# 资质(账号)
credentials = pika.PlainCredentials('zl', 'zl')
# 建立一个实体
connection = pika.BlockingConnection(
pika.ConnectionParameters("192.168.2.155", 5672, '/', credentials)
)
# 声明一个管道
channel = connection.channel()
# 再管道里声明queue
channel.queue_declare(queue='hello')
# RabbitMQ a message can never be sent directly to the queue, it always needs to go through an exchange.
# RabbitMQ 需要经过一个Exchange 发送到queue, 不会直接发送给queue
channel.basic_publish(exchange='', # exchange 名称
routing_key='hello', # 绑定名称
body='Hello World!'
)
connection.close()
consumer.py 代码如下
import pika
# 建立资质
credentials = pika.PlainCredentials('zl', 'zl')
# 建立一个实体
connection = pika.BlockingConnection(
pika.ConnectionParameters("192.168.2.155", 5672, '/', credentials)
)
# 声明一个管道
channel = connection.channel()
# 为什么声明了一个‘hello’队列?
# 如果确定已经声明了,可以不声明。但是你不知道那个机器先运行,所以要声明两次。
# 通常是先运行消费者
channel.queue_declare(queue='hello')
# ##### 以上内容跟生产者的内容完全一样。
def callback(ch, method, properties, body):
"""
回调函数, 获取消息后, 用于处理
:param ch:
:param method:
:param properties:
:param body: 收到的消息, bytes 类型
:return:
"""
print('properties', properties)
print('method', method)
print('ch', ch)
body = str(body, 'utf-8')
print('收到消息%s' % body)
"""
回调函数中 打印的内容
properties <BasicProperties>
method <Basic.Deliver(['consumer_tag=ctag1.b998f5fa76f248fb8173f6fc7be84114', 'delivery_tag=1', 'exchange=', 'redelivered=False', 'routing_key=hello'])>
ch <BlockingChannel impl=<Channel number=1 OPEN conn=<SelectConnection OPEN transport=<pika.adapters.utils.io_services_utils._AsyncPlaintextTransport object at 0x000001EA39C9E760> params=<ConnectionParameters host=192.168.2.155 port=5672 virtual_host=/ ssl=False>>>>
收到消息b'Hello World!'
"""
channel.basic_consume(on_message_callback=callback, queue='hello', auto_ack=True)
channel.start_consuming() # 开始消费消息
结果:(先启动consumer)我们成功收到消息