问题描述
我正在尝试接收来自鼠兔生产者的消息。我正在关注本教程:https://www.youtube.com/watch?v=0iB5IPoTDts。
我可以看到,当我手动运行 docker-compose exec backend bash
然后运行 python consumer.py
时,我可以接收消息并且它们通过 print()
函数被记录到标准输出。但是,当我将以下服务添加到 docker-compose.yml
时,容器未登录到标准输出:
rabbitmq_queue:
build:
context: .
dockerfile: Dockerfile
command: 'python consumer.py && echo hello'
volumes:
- .:/app
depends_on:
- db
没有错误。当我将命令更改为 echo hello
时,容器会很好地将 hello 打印到标准输出。为什么我的服务没有登录到标准输出?此外,它似乎运行正常 - 当我尝试抛出异常时,我的服务出错了。当它出错时,它也开始打印消息。否则它不会打印错误消息。
有没有办法解决这个问题?
consumer.py
:
import pika
params = pika.URLParameters(
"hidden thing here"
)
connection = pika.BlockingConnection(params)
channel = connection.channel()
channel.queue_declare(queue="main")
def callback(channel,method,properties,body):
print("[CONSUMER] Received message in main")
print(body)
# raise Exception()
channel.basic_consume(queue="main",on_message_callback=callback,auto_ack=True)
print("[CONSUMER] Started consuming")
channel.start_consuming()
channel.close()
解决方法
您需要真正开始消费消息。就像现在一样,您有一个名为 callback
的函数,它永远不会被调用(并且永远不会在您的代码中被引用)。
channel.basic_consume(queue='main',on_message_callback=callback)
channel.start_consuming()
在代码末尾添加这些行。这会将回调指定为 on 消息函数,start_consuming
将告诉 pika 开始使用队列。
更多详细示例可用 here。