在Python中创建生产者和消费者应用程序

nzkunb0c  于 2023-10-15  发布在  Python
关注(0)|答案(2)|浏览(119)

我正在尝试使用pika为rabbitmq编写python生产者和消费者代码。然而,对于我的特定情况,我需要在不同的主机上运行生产者,在其他主机上运行消费者。
我已经写了一个生产者代码:

import pika

credentials = pika.PlainCredentials('username', 'password')
parameters = pika.ConnectionParameters('ip add of another host', 5672, '/', credentials)

connection = pika.BlockingConnection()
channel = connection.channel()

channel.queue_declare(queue='test')

channel.basic_publish(exchange='', routing_key='test', body='hello all!')
print (" [x] sent 'Hello all!")

connection.close()

上面的生产者代码运行没有任何错误。我还创建了一个新用户,并在rabbitmq-server上为其提供了管理员凭据。然而,当我在另一个运行rabbitmq-server的主机上运行消费者代码时,我没有看到任何输出:

import pika

credentials = pika.PlainCredentials('username', 'password')
parameters = pika.ConnectionParameters('localhost', 5672, '/', credentials)

connection = pika.BlockingConnection()
channel = connection.channel()

channel.queue_declare(queue='test')

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

channel.basic_consume(
      queue='test', on_message_callback=callback, auto_ack=True)

print (' [x] waiting for messages. To exit press ctrl+c')

channel.start_consume()

所以,在这里我有两个主机在同一个网络上安装了rabbitmq。然而,一个有3.7.10,另一个有3.7.16版本的rabbitmq。
生产者能够发送文本而不会出错,但另一台主机上的消费者没有收到任何文本。
当两者都在同一台机器上运行时,我不会遇到任何问题,因为我只是用localhost替换连接设置。由于默认情况下只允许用户guest连接到localhost,所以我在运行rabbitmq-server的消费者主机上创建了一个新用户。

wlp8pajw

wlp8pajw1#

您似乎没有将parameters传递给BlockingConnection示例。

import pika

rmq_server = "ip_address_of_rmq_server"
credentials = pika.PlainCredentials('username', 'password')
parameters = pika.ConnectionParameters(rmq_server, 5672, '/', credentials)

connection = pika.BlockingConnection(parameters)
channel = connection.channel()

此外,您的消费者正在连接到localhost主机名。确保这实际上解决了,并且您的RabbitMQ服务正在侦听本地主机地址(127.0.0.1),它可能没有绑定到该地址。我相信RMQ会默认绑定到所有接口(以及所有地址),但我不确定。

mwg9r5ms

mwg9r5ms2#

您的消费者和生产者应用程序必须连接到相同的RabbitMQ服务器。如果你有两个RabbitMQ示例运行,它们是独立的。消息不会从RabbitMQ的一个示例移动到另一个示例,除非您配置了Shovel或Federation。

相关问题