Celery: it ignores the exchange name when sending a task

all*_*mon 5 python celery celery-task kombu

I have a very simple code:

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                                                                                                                                                                                                          
)                                                                                                                                                                                                                                            
Run Code Online (Sandbox Code Playgroud)

我真的需要将任务发送到交换“I_am_useless”,但是它没有发送到那里,当我在 AMQP 协议级别调试时,我看到发送了一个发布事件(可以)但具有以下特征

reserved-1': 0,
'exchange-name': '',
'routing-key': 'celery',
'mandatory': False,
'immediate': False
Run Code Online (Sandbox Code Playgroud)

因此似乎该参数完全被忽略,因为即使在交换声明事件期间,也会使用名称“celery”。但根据文档send_task采用与https://docs.celeryproject.org/en/latest/reference/celery.app.task.html#celery.app.task.Task.apply_async相同的参数,我们可以看到有一个应接受字符串的“交换”参数。

但是如果我直接打电话给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!")                                                                                                                                                                                                            

Run Code Online (Sandbox Code Playgroud)

我正确地看到了交易所名称,所以我想知道我做错了什么?

Tom*_*art 4

在研究了代码并进行了一些实验之后,似乎您还需要在调用时指定exchange_type和参数。routing_keysend_task