2017-08-10 7 views
2

Supposons que je dois cette définition de tâche:Exception Céleri Manipulation

def some_other_foo(input) 
raise Exception('This is not handled!') 
return input 

@app.task(
    bind=True, 
    max_retries=5, 
    soft_time_limit=20) 
def some_foo(self, someInput={}): 
    response="" 
    try: 
    response = some_other_foo(someInput) 
    except Exception as exc: 
    self.retry(countdown=5, exc=exc) 
    response="error" 
return response 

J'ai un problème cette exception ne sont pas traités dans some_foo, j'obtiens l'erreur au lieu de réponse = « erreur », la tâche est tombé en panne et je reçois Traceback cela indique qu'une exception a été déclenchée.

Est-il possible de retourner une réponse régulière, mais de régler la tâche de céleri comme échouée, ce qui entraînera l'échec de la floraison?

J'utilise:
Céleri 4.1
AMPQ en tant que courtier
Céleri Fleur comme la surveillance

Répondre

1

Try \ except fonctionne très bien. Votre tâche sera toujours infructueuse, car vous avez appelé self.retry avant return. Faisons un petit test:

from celery import Celery 

app = Celery(name_app,broker_settings_etc....) 

def some_other_foo(value): 
    raise Exception('This is not handled!') 

@app.task(
    bind=True, 
    max_retries=5, 
    soft_time_limit=20) 
def some_foo(self): 
    response = "" 

    try: 
     response = some_other_foo('test') 
    except Exception as exc: 
     self.retry(countdown=5, exc=exc) 
     response = "error" 

    return response 

Exécutez l'application de céleri et appelez notre tâche. Vous verrez dans les journaux de céleri quelque chose comme ceci:

3fb-81de-e4149fa88f4c] retry: Retry in 5s: Exception('This is not handled!',) 
[2017-08-18 15:50:34,160: INFO/MainProcess] Received task: tasks.some_foo[b656731b-c85d-43fb-81de-e4149fa88f4c] eta:[2017-08-18 12:50:39.156912+00:00] 
[2017-08-18 15:50:34,161: INFO/MainProcess] Task tasks.some_foo[b656731b-c85d-43fb-81de-e4149fa88f4c] retry: Retry in 5s: Exception('This is not handled!',) 
[2017-08-18 15:50:39,511: ERROR/MainProcess] Task tasks.some_foo[b656731b-c85d-43fb-81de-e4149fa88f4c] raised unexpected: Exception('This is not handled!',) 
Traceback (most recent call last): 
# trace here... 
Exception: This is not handled! 

Comment cela fonctionne. Vous définissez pour la tâche max_retries=5. Lorsque vous avez appelé self.retry(countdown=5, exc=exc) Céleri interrompt le traitement de la tâche et essayez de redémarrer la tâche avec countdown (dans notre cas = 5). Après 5 tentatives (max_retries) Céleri ne relance pas la tâche.

Maintenant, nous allons changer notre bloc try \ except à:

try: 
    response = some_other_foo('test') 
except Exception: 
    print 'handled' 
    response = "bad response" 

Redémarrez Céleri et exécuter notre tâche. Vérifions le journal:

[2017-08-18 15:58:41,893: INFO/MainProcess] Received task: tasks.some_foo[1437e7ce-1c69-4042-824b-5602f486c025] 
[2017-08-18 15:58:41,895: WARNING/Worker-3] handled 
[2017-08-18 15:58:41,896: INFO/MainProcess] Task tasks.some_foo[1437e7ce-1c69-4042-824b-5602f486c025] succeeded in 0.00186271299026s: 'bad response' 

Comme vous pouvez le voir, le gestionnaire fonctionne correctement.

Donc, résumez. Si vous appelez self.retry, Celery interrompt le traitement de la tâche et essaie de redémarrer une tâche en cours.