Celery:发送任务时忽略交换名称
Celery: it ignores the exchange name when sending a task
我有一个非常简单的代码:
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 协议级别进行调试时,我看到发送了一个发布事件(没问题)但具有以下特征
reserved-1': 0,
'exchange-name': '',
'routing-key': 'celery',
'mandatory': False,
'immediate': False
所以似乎参数完全被忽略了,因为即使在交换声明事件期间,也使用了名称 "celery"。
但根据文档 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!")
我正确地看到了交易所名称,所以我想知道我做错了什么?
在查看 the code 和一些实验之后,您似乎还需要在调用 send_task
.[=14 时指定 exchange_type
和 routing_key
参数=]
我有一个非常简单的代码:
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 协议级别进行调试时,我看到发送了一个发布事件(没问题)但具有以下特征
reserved-1': 0,
'exchange-name': '',
'routing-key': 'celery',
'mandatory': False,
'immediate': False
所以似乎参数完全被忽略了,因为即使在交换声明事件期间,也使用了名称 "celery"。
但根据文档 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!")
我正确地看到了交易所名称,所以我想知道我做错了什么?
在查看 the code 和一些实验之后,您似乎还需要在调用 send_task
.[=14 时指定 exchange_type
和 routing_key
参数=]