python3 RabbitMQ (Hello World!)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yangxiaodong88/article/details/83176181

介绍

RabbitMQ 是一个消息代理:它接收和转发消息。你可以把它看作是一个邮局:当你想把你要投寄的邮件放在邮箱里时,你可以确定收信人先生或女士最终会把邮件寄给你的收件人呢。 在这个类比中, RabbitMQ 是一个邮箱, 一个邮局和一个邮递员。

RabbitMQ 和邮局之间主要区别是它不是纸质的, 而是, 接收, 存贮和转发二进制数据 - 消息

RabbitMQ 和消息传递 通常使用一下术语。
生产就是发送。发送消息的程序就是生产者:
在这里插入图片描述

队列是位于RabbitMQ 内邮箱的名称。尽管消息流经RabbitMQ 和你的应用程序, 但是它们只能存贮在队列中。队列只受主机的内存和磁盘限制, 他的本质上是一个大的缓冲区。许多生产者可以向一个队列发送消息, 许多消费者可以尝试从一个队列接收数据。 这是我们表示队列的方式。
在这里插入图片描述

消费与接受有着相似的含义。消费者是一个等待接受消息的程序。

注意, 生成者和消费者不是必须驻留在同一个主机上面。实际上, 在大多数应用程序中并不是这样。 应用程序也可以是生产者和消费者。

Hello World !

(using the Pika Python client)
在这部分的指南中我们将会用Python 写一个简单的小程序
, 一个发送单个消息的生产者, 一个接受消息的消费者, 然后打印出结果。 它是 Hello World 消息。

在下面的图解中 “P” 是我们得生产者 “C"是我们得消费者。中间的盒子是一个队列-RabbitMQ 代表使用者保存的消息缓冲区

我们得整体设计是这样的:
在这里插入图片描述

生产者发送消息 hello 给队列, 生成者从这个队列里面接收消息

Sending
在这里插入图片描述

我们得第一个程序send.py 将会发送单个消息给队列, 我们首先要做的就是与RabbitMQ服务器 创建一个连接。

#!/usr/bin/env python
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

我们现在连接到本地机器上的代理-因此是localhost. 如果我们想连接到另一台机器上的代理, 我们只需要再这里指定他的名称或者IP 地址。

接下来,在发送之前,我们需要确保接收队列存在。如果我们将消息发送到不存在的位置,RabbitMQ将删除消息。让我们创建一个hello队列,消息将发送到该队列:

channel.queue_declare(queue='hello')

现在我们准备发送一条消息。我们的第一个消息将只包含一个字符串Hello World!我们想把它发送到hello队列。

在RabbitMQ中,消息永远不能直接发送到队列,它总是需要通过交换。但是,我们不要被细节拖垮——您可以在本教程的第三部分阅读关于exchange的更多信息。现在我们只需要知道如何使用由空字符串标识的默认交换。这个交换是特殊的——它允许我们精确地指定消息应该放在哪个队列中。队列名称需要在routing_key参数中指定:

channel.basic_publish(exchange='',
                      routing_key='hello',
                      body='Hello World!')
print(" [x] Sent 'Hello World!'")

在退出程序之前,我们需要确保网络缓冲区已刷新,并且我们的消息实际上已传递给RabbitMQ。我们可以轻轻地关闭连接。

connection.close()

发送没有用的情况

如果这是您第一次使用RabbitMQ,而您没有看到“已发送”消息,那么您可能会感到挠头,不知道哪里出了问题。可能代理启动时没有足够的空闲磁盘空间(默认情况下它至少需要200 MB的空闲空间),因此拒绝接受消息。检查代理日志文件以确认并在必要时减少限制。配置文件文档将向您展示如何设置disk_free_limit。

Receiving
在这里插入图片描述

我们得第二个程序receive.py 将会从队列接收消息并打印到屏幕上面

同样,首先我们需要连接到RabbitMQ服务器。负责连接Rabbit的代码与之前一样。

与前面一样,下一步是确保队列存在。使用queue_declare创建一个队列是等幂的——我们可以任意多次运行该命令,而且只会创建一个

channel.queue_declare(queue='hello')

您可能会问我们为什么再次声明队列——我们已经在前面的代码中声明了它。如果我们确信队列已经存在,就可以避免这种情况。例如if send。py程序以前运行过。但我们还不确定先运行哪个程序。在这种情况下,最好在两个程序中重复声明队列。

在不同的系统中去看 刚才发送的消息

linux
sudo rabbitmqctl list_queues

windows
rabbitmqctl.bat list_queues

从队列接收消息更为复杂。它通过向队列订阅回调函数来工作。每当我们收到消息时,Pika库都会调用这个回调函数。在我们的示例中,此函数将在屏幕上打印消息的内容。

def callback(ch, method, properties, body):
    print(" [x] Received %r" % body)

接下来,我们需要告诉RabbitMQ这个特殊的回调函数应该接收来自hello队列的消息:

channel.basic_consume(callback,
                      queue='hello',
                      no_ack=True)

要使该命令成功,我们必须确保要订阅的队列存在。幸运的是,我们对此很有信心——我们在上面创建了一个队列——使用queue_declare。

稍后将描述no_ack参数。
最后,我们进入一个永无止境的循环,等待数据并在必要时运行回调。

print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()

放完整代码
send.py

#!/usr/bin/env python
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
channel = connection.channel()


channel.queue_declare(queue='hello')

channel.basic_publish(exchange='',
                      routing_key='hello',
                      body='Hello World!')
print(" [x] Sent 'Hello World!'")
connection.close()

receive.py

#!/usr/bin/env python
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
channel = connection.channel()


channel.queue_declare(queue='hello')

def callback(ch, method, properties, body):
    print(" [x] Received %r" % body)

channel.basic_consume(callback,
                      queue='hello',
                      no_ack=True)

print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()

猜你喜欢

转载自blog.csdn.net/yangxiaodong88/article/details/83176181