Ich benutze Django und Sellerie und ich versuche, Routing zu mehreren Warteschlangen einzurichten. Wenn ich die Aufgaben routing_key
und exchange
(entweder im Task Decorator oder unter Verwendung von apply_async()
) spezifiziere, wird die Aufgabe dem Broker nicht hinzugefügt (das ist Kombu, das eine Verbindung zu meiner MySQL-Datenbank herstellt).Django & Sellerie - Routing Probleme
Wenn ich den Namen der Warteschlange im Task Decorator angeben (was bedeutet, dass der Routing-Schlüssel ignoriert wird), funktioniert die Aufgabe gut. Es scheint ein Problem mit dem Routing/Exchange-Setup zu sein.
Irgendeine Idee, was das Problem sein könnte?
Hier ist das Setup:
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)
Aufgabe einleiten:
from tasks import my_important_task
my_important_task.delay()
Wie übergeben Sie routing_key ? Mit async_apply? – mher
Ich verwende die 'delay()' Methode, die nur eine Verknüpfung für 'apply_async()' ist. Ich versuche, die "routing_key" -Spezifikation mit der Task-Methode (über den Dekorator) zu behalten, anstatt wenn sie aufgerufen wird. Ich habe versucht, den Schlüssel mit 'apply_async()' stattdessen zu übergeben, aber ich bekomme das gleiche Problem. –
Verzögerung akzeptiert routing_key-Schlüsselwort nicht. Es ist eine vereinfachte Version von apply_async, aber sie sind nicht identisch. – mher