我正在Celery中设置一个任务,以使其从某个主题交流中“消费”。当我将消息发送到有问题的交换机时,我收到错误消息:“已接收并删除了未知消息。目的地错误?!?”在celery控制台上。
我制作了一个单独的项目文件夹,以复制该问题,其中所有内容都称为具有以下结构的测试内容:
celery-test/
L celery.py
L celeryconfig.py
L tasks.py
我已经看到各种涉及librabbitmq软件包的StackOverflow问题和GitHub问题。解决方案是卸载此软件包,但我什至没有安装它,因此无处可去。发现了一些建议解决方案的问题/问题:
-https://github.com/celery/celery/issues/3675
-Celery &Rabbitmq:WARNING/MainProcess] Received and deleted unknown message. Wrong destination?!?- a experiment on the GIT
我还尝试过任务路由设置,因为我认为问题出在atm上,但是我无法使其正常工作。
对于任何想知道为什么端口关闭1的人,这是因为它指向我的docker容器中的Rabbitmq,它不再可以使用5672。
celery.py
app = Celery('celery_test', include=['celery_test.tasks'])
app.config_from_object('celery_test.celeryconfig')
celeryconfig.py
broker_url = 'amqp://guest:guest@localhost:5673//'
result_backend = 'rpc://'
default_exchange = Exchange('default', type='direct')
test_exchange = Exchange('test_exchange', type='topic')
task_queues = (
Queue('default', default_exchange, routing_key='default'),
Queue('test_queue', test_exchange, routing_key='test123test')
)
task_routes = {
'celery_test.tasks.test_method': {
'queue': 'test_queue'
}
}
tasks.py
@app.task
def test_method():
print('test_method')
return 'test_method'
然后是我用来发送消息的文件:send.py
connection = pika.BlockingConnection(pika.URLParameters('amqp://guest:guest@localhost:5673/'))
channel = connection.channel()
exchange = 'test_exchange'
routing_key = 'test123test'
message = 'Testmessage'
channel.exchange_declare(exchange=exchange, exchange_type='topic', durable=True)
channel.basic_publish(exchange=exchange, routing_key=routing_key, body=message)
connection.close()
答案 0 :(得分:0)
这可能不是真正的答案,而是更多的跟进工作。但是我想我会让人们知道遇到这个问题的人。 (这篇文章是我的全部解释,由于我是新来芹菜的,所以您可能应该撒些盐。)
所以基本上,我认为发生这种情况的原因是因为Celery不理解该消息。 Celery需要很多标头和其他属性,才能了解消息正在试图做什么。
可以对这些标头进行逆向工程来模拟它们,但是我将不进行介绍,因为有更简单的方法可以解决我打算进行的应用。
如果有人对本主题有更多的了解,请随时纠正我。
答案 1 :(得分:0)
这适用于 2021 年受此影响的任何人。我有一个使用 celery 3.1.x 的旧服务(我们称之为“遗留”)和一个使用 celery 5.0.x 版本的最近创建的服务(我们称之为“现代”) ).
在现代代码库中,Celery.signature()
方法用于创建签名,然后调用 apply_async()
以调用遗留任务。旧版 celery 确实收到了我的消息,但由于此错误而将其丢弃:
收到并删除了未知消息。错误的目的地?!?
我通过在 celeryconfig.py
文件中添加这一行解决了这个问题:
task_protocol = 1
解释在这里:https://github.com/celery/celery/issues/3675#issuecomment-294129297