Ich bin ein Neuling in Sellerie und ich versuche diese Aufgabenwarteschlange in mein Projekt zu integrieren, aber ich verstehe immer noch nicht, wie Sellerie die gescheiterten Aufgaben behandelt und ich würde gerne alle in einer Warteschlange für ambiente Briefe behalten.Sellerie: Wie kann ich eine fehlgeschlagene Aufgabe in eine Warteschlange für unzustellbare Nachrichten leiten
Laut dem Dokument here scheint es, dass die Erhöhung von Reject in einem Task mit acks_late den gleichen Effekt wie das Ackern der Nachricht erzeugt und dann haben wir ein paar Worte über Warteschlangen für unzustellbare Nachrichten.
So habe ich eine benutzerdefinierte Standardwarteschlange zu meiner Sellerie Config
celery_app.conf.update(CELERY_ACCEPT_CONTENT=['application/json'],
CELERY_TASK_SERIALIZER='json',
CELERY_QUEUES=[CELERY_QUEUE,
CELERY_DLX_QUEUE],
CELERY_DEFAULT_QUEUE=CELERY_QUEUE_NAME,
CELERY_DEFAULT_EXCHANGE=CELERY_EXCHANGE
)
und meine Kombu Objekte wie
CELERY_DLX_EXCHANGE = Exchange(CELERY_DLX_EXCHANGE_NAME, type='direct')
CELERY_DLX_QUEUE = Queue(CELERY_DLX_QUEUE_NAME, exchange=DLX_EXCHANGE,
routing_key='celery-dlq')
DEAD_LETTER_CELERY_OPTIONS = {'x-dead-letter-exchange': CELERY_DLX_EXCHANGE_NAME,
'x-dead-letter-routing-key': 'celery-dlq'}
CELERY_EXCHANGE = Exchange(CELERY_EXCHANGE_NAME,
arguments=DEAD_LETTER_CELERY_OPTIONS,
type='direct')
CELERY_QUEUE = Queue(CELERY_QUEUE_NAME,
exchange=CELERY_EXCHANGE,
routing_key='celery-q')
suchen und die Aufgabe, die ich bin ausgeführt werden:
class HookTask(Task):
acks_late = True
def run(self, ctx, data):
logger.info('{0} starting {1.name}[{1.request.id}]'.format(self.__class__.__name__.upper(), self))
self.hook_process(ctx, data)
def on_failure(self, exc, task_id, args, kwargs, einfo):
logger.error('task_id %s failed, message: %s', task_id, exc.message)
def hook_process(self, t_ctx, body):
# Build context
ctx = TaskContext(self.request, t_ctx)
logger.info('Task_id: %s, handling request %s', ctx.task_id, ctx.req_id)
raise Reject('no_reason', requeue=False)
Ich machte einen kleinen Test mit ihm, aber keine Ergebnisse beim Auslösen einer Ausnahme von Ausfällen.
Jetzt frage ich mich, ob es eine gute Idee ist, die fehlgeschlagene Task-Route in die Warteschlange für nicht zustellbare Nachrichten zu zwingen, indem Sie Task.on_failure überschreiben. Ich denke, das würde funktionieren, aber ich denke auch, dass diese Lösung nicht so sauber ist, denn nach dem, was ich rot Sellerie sollte das ganz alleine tun.
Danke für Ihre Hilfe.
Traurig, dass niemand geantwortet hat. Hast du eine Lösung gefunden? @onizukaek –