在 docker-compose 服务中的 python pika 微服务消费者中没有打印

问题描述

我正在尝试接收来自鼠兔生产者的消息。我正在关注本教程: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