我如何让芹菜工人消耗“外部” RabbitMQ队列?

时间:2018-09-18 13:46:56

标签: python rabbitmq celery

我有以下脚本:

celery_tasks.py

from celery import Celery
app = Celery(broker='amqp://guest:guest@localhost:5672//')
app.conf.task_default_queue = 'test_queue'

@app.task(acks_late=True)
def test(a):
   return a

publish.py

from celery_tasks import test
test.delay('abc')

当我运行publish.py并启动工作程序(celery -A celery_tasks工作程序--loglevel = DEBUG)时,“ abc”内容将发布在“ test_queue”中,并由工作程序使用。

工人是否有办法消费队列中未被Celery发布的东西?例如,当我通过RabbitMQ直接在test_queue中放入某些内容而没有通过Celery发布者,并运行Celery worker时,它给了我以下警告:

  

WARNING / MainProcess]已接收和删除未知消息。目的地不正确?!?

     

邮件正文的完整内容为:正文:'abc'(3b)

     

{content_type:无content_encoding:无     delivery_info:{'exchange':'','redelivered':False,'delivery_tag':1,'consumer_tag':'None2','routing_key':'test_queue'}标头= {}}

有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:1)

这是一个较晚的答案,但自定义消费者可能会为您提供帮助。我正在使用它来消费来自Rabbitmq的消息。这些消息是使用pika从另一个应用程序中填充的。

http://docs.celeryproject.org/en/latest/userguide/extending.html#custom-message-consumers

答案 1 :(得分:0)

Celery具有特定的格式和需要维护的一组标题以符合该格式。因此,您将不得不对其进行反向工程,以使芹菜不产生符合芹菜的消息。 请记住,实际上不是通过芹菜在代理之间发送消息,而是发送任务,这是增强型消息,因此amqp消息的标头部分有额外的内容