Сельдерей: игнорирует обменное имя при отправке задачи - PullRequest
4 голосов
/ 24 сентября 2019

У меня очень простой код:

celery = Celery(broker="amqp://guest:guest@172.17.0.1:5672/")                                                                                                                                                                                                           
celery.send_task(                                                                                                                                                                                                                            
    "robot.worker",                                                                                                                                                                                                                
    kwargs={},                                                                                                                                                                                                                               
    exchange="I_am_useless", # with  exchange=Exchange("I_am_useless") I got the same results                                                                                                                                                                                                          
)                                                                                                                                                                                                                                            

Мне действительно нужно отправить задачу на обмен "I_am_useless", однако она не отправляется туда, когда я отлаживаю на уровне протокола AMQP Iувидеть, что отправлено событие публикации (что нормально), но со следующей характеристикой

reserved-1': 0,
'exchange-name': '',
'routing-key': 'celery',
'mandatory': False,
'immediate': False

, поэтому кажется, что параметр полностью игнорируется, поскольку даже во время события объявления обмена используется имя "сельдерей",но согласно документации send_task принимает те же параметры, что и https://docs.celeryproject.org/en/latest/reference/celery.app.task.html#celery.app.task.Task.apply_async, и мы можем видеть, что есть параметр "exchange", который должен принимать строку.

однако, если я вызываю kombu напрямую

rabbit_url = "amqp://guest:guest@172.17.0.1:5672/"                                                                                                                                                                                           
conn = Connection(rabbit_url)                                                                                                                                                                                                               
channel = conn.channel()                                                                                                                                                                                                                    
exchange = Exchange("example-exchange", type="direct")                                                                                                                                                                                      
producer = Producer(exchange=exchange, channel=channel, routing_key="BOB")                                                                                                                                                                  
queue = Queue(name="example-queue", exchange=exchange, routing_key="BOB")                                                                                                                                                                   
queue.maybe_bind(conn)                                                                                                                                                                                                                      
queue.declare()                                                                                                                                                                                                                             
producer.publish("Hello there!")                                                                                                                                                                                                            

Я правильно вижу название обмена, поэтому мне интересно, что я делаю не так?

1 Ответ

2 голосов
/ 24 сентября 2019

Изучив код и немного поэкспериментировав, кажется, что вам нужно также указать exchange_type и routing_key аргументы при вызове send_task.

...