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更改为相应的服务器)。一旦通过身份验证,应该看到类似于下图所示的屏幕截图页面。

在该页的页面底部你会看到“获取消息(Get Messages)”模块。如果将“消息”字段值从1依次递增到10,然后单击“获取消息”,则应该看到之前发布的10条消息中的每一条。确保将“重发队列(Requeue)”字段值设置为“Yes”。该字段告诉RabbitMQ,在获取消息以便在管理界面中进行显示的同时,将它们添加回队列中。如果你没有做这一步,没关系;回去重新运行代码发布。

【浅浅总结一下】

实现一个简单的消息生产者程序需要如下几步骤:

  • 导入库
  • 使用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。

posted @ 2022-07-01 16:03  libai1024  阅读(259)  评论(0编辑  收藏  举报