【发布时间】:2012-05-22 17:49:25
【问题描述】:
我正在使用 Django 和 Celery,并且正在尝试设置到多个队列的路由。当我指定任务的 routing_key 和 exchange(在任务装饰器中或使用 apply_async())时,任务不会添加到代理(即 Kombu 连接到我的 MySQL 数据库)。
如果我在任务装饰器中指定队列名称(这意味着路由键被忽略),任务工作正常。路由/交换设置似乎有问题。
知道可能是什么问题吗?
设置如下:
settings.py
INSTALLED_APPS = (
...
'kombu.transport.django',
'djcelery',
)
BROKER_BACKEND = 'django'
CELERY_DEFAULT_QUEUE = 'default'
CELERY_DEFAULT_EXCHANGE = "tasks"
CELERY_DEFAULT_EXCHANGE_TYPE = "topic"
CELERY_DEFAULT_ROUTING_KEY = "task.default"
CELERY_QUEUES = {
'default': {
'binding_key':'task.#',
},
'i_tasks': {
'binding_key':'important_task.#',
},
}
tasks.py
from celery.task import task
@task(routing_key='important_task.update')
def my_important_task():
try:
...
except Exception as exc:
my_important_task.retry(exc=exc)
启动任务:
from tasks import my_important_task
my_important_task.delay()
【问题讨论】:
-
如何传递routing_key?使用 async_apply?
-
我正在使用
delay()方法,它只是apply_async()的快捷方式。我正在尝试使用任务方法(通过装饰器)而不是在调用它时保留routing_key规范。我尝试使用apply_async()传递密钥,但我遇到了同样的问题。 -
delay 不接受 routing_key 关键字。它是 apply_async 的简化版本,但它们并不相同。
-
我在启动任务时没有传递任何路由信息,我在任务装饰器中指定了它,并带有方法定义。请参阅上面的代码以查看我的设置。
-
我是否认为我可以在任务装饰器中指定路由/交换信息并且在调用时应该尊重它?
标签: django celery django-celery kombu