Я пытаюсь получать сообщения от моего производителя пищух. Я следую этому руководству: https://thewikihow.com/video_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
, контейнер красиво выводит приветствие на стандартный вывод. Почему моя служба не регистрируется на стандартном выходе? Кроме того, кажется, что он работает правильно - когда я пытаюсь создать исключение, моя служба выдает ошибку. Когда он выходит из строя, он также начинает печатать сообщения. В противном случае он не печатает сообщения об ошибках.
Есть ли способ решить эту проблему?
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()
Добавьте эти строки в конец вашего кода. Это назначит обратный вызов в качестве функции сообщения, а start_consuming
скажет pika начать использовать очередь.
Более подробные примеры доступны здесь.
Что произойдет, если вы добавите печать вверху приложения Python? Скорее всего, вы застряли, пытаясь подключиться к IP (неправильная сеть?).
Фактическая функциональность, кажется, работает нормально, и все сообщения отправляются. Только печать не работает... что-то с docker-compose наверное. Количество подключений увеличивается, поэтому я знаю, что он подключается. Проблема только с печатью.
может быть связано с переменной окружения PYTHONUNBUFFERED=1
.
Та же проблема. Рабочий контейнер без вывода. Я добавил PYTHONUNBUFFERED=1
для включения журнала.
# Dockerfile
ENV PYTHONUNBUFFERED=1
Я забыл добавить нижнюю часть моего кода. Я только что добавил это. Проблема только в сервисе, а не когда запускаю файл вручную.