RabbitMQ【1】python实现RabbitMQ简单应用
RabbitMQ【1】python实现RabbitMQ简单应用
1.1 用python编写消息发送者
# 导入RabbitMQ客户端库
import rabbitpy
# 指定连接URL(使用'guest'账号和'guest'密码进行连接)
url = 'amqp://guest:guest@localhost:5672/#/'
# 使用上述URL连接到RabbitMQ
connection = rabbitpy.Connection(url)
# 在该连接上打开一个新的信道
channel = connection.channel()
# 创造一个名为'example'的交换器对象,传入Chanel以使用
exchange = rabbitpy.Exchange(channel,'example')
# 使用交换器对象的declare方法在RabbitMQ中声明交换器
exchange.declare()
#创建一个名为'test-msg'的队列对象,传入Chanel以使用
queue = rabbitpy.Queue(channel , 'test-msg')
#在RabbitMQ服务器上声明队列
queue.declare()
#可以调用队列对象的bind方法,将队列绑定到交换器,传入交换器和路由键参数来发送Queue.Bind命令,以下代码中,路由键是example-routing-key
queue.bind(exchange,'example-routing-key')
#通过创建和绑定交换器和队列,你现在可以将测试消息发布到RabbitMQ并存储在test-msg队列中。为了确保有足够的消息可供使用,以下示例将10条测试消息发布到队列中。
for number in range(0,10):
print(number)
message= rabbitpy.Message(channel,
"test_msq{%s}"%number,
{'content_type':'txt/plain'},
opinionated=True
)
message.publish(exchange,'example-routing-key')
# 为了发布测试消息,在每个循环中创建一个新的rabbitpy.Message对象,并传入信道、消息体和消息属性字典。一旦消息创建成功,publish方法就会被调用,该方法创建Basic.Publish帧、内容头帧和一个消息体帧,并将它们全部投递给RabbitMQ。
现在应该进入RabbitMQ Web管理控制台,看看你的消息是否已经进入队列:打开你的Web浏览器并访问http://localhost:15672/#/queues/%2F/example中的管理界面(如果你的代理服务器位于不同的计算机上,请将URL中的localhost更改为相应的服务器)。一旦通过身份验证,应该看到类似于下图所示的屏幕截图页面。
【浅浅总结一下】
实现一个简单的消息生产者程序需要如下几步骤:
- 导入库
- 使用URL创建链接
- 打开该连接的信道
- 创建使用该信道的交换器,并在RabbitMQ中声明
- 创建使用该信道队列,并在RabbitMQ中声明
- 调用队列bind方法,将队列绑定到交换器,传入参数为交换器对象和路由键
- 创建rabbitpy.Message对象,传入信道、消息体、消息属性字典等参数
- 调用publish方法生成消息投递给RabbitMQ
1.2 用python编写消息接收者
import rabbitpy
url = 'amqp://guest:guest@localhost:5672/#/'
connection = rabbitpy.Connection(url)
channel = connection.channel()
queue = rabbitpy.Queue (channel, 'example')
while len(queue) > 0:
message = queue.get()
print('Message:')
print('ID:%s'%message.properties['message_id'])
print('Time:%s' % message.properties['timestamp'].isoformat())
print('Body:%s' % message.properties['message_id'])
message.ack()
【代码已经改为python3的语法 测试过 放心食用】
【运行效果如下】
【一堆废话】
输入并执行前面的消费者代码,应该看到之前发布的10条消息中的每一条。如果仔细观察,你可能已经注意到,尽管在发布消息时没有指定message_id或timestamp属性,但从消费者打印出来的每条消息中都有它们。如果不指定它们,rabbitpy客户端库将自动为你填充这些属性。另外,如果你发送了一个Python dict结构作为消息,rabbitpy会自动将数据序列化为JSON格式,并将content-type属性设置为application/json。