2011-05-25 5 views
11

Je voudrais créer une tâche périodique pour le céleri en utilisant l'interface d'administration django-celery. J'ai une tâche configurée qui fonctionne bien lorsqu'elle est appelée manuellement ou par script. Il ne fonctionne tout simplement pas à travers celerybeat. Selon les journaux de débogage, la tâche est définie sur enabled = False lors de la première récupération et je me demande pourquoi.celerybeat désactive automatiquement la tâche périodique

Lors de l'ajout de la tâche périodique et de l'envoi de [1, False] en tant qu'arguments positionnels, la tâche est automatiquement désactivée et aucune autre sortie ne s'affiche. Lorsqu'elle est ajoutée sans arguments, la tâche est exécutée mais déclenche une exception instantanément car je n'ai pas fourni les arguments nécessaires (ce qui est logique).

Quelqu'un voit-il quel est le problème ici?

Merci d'avance.

C'est la sortie après arguments fournissant:

[DEBUG/Beat] SELECT "djcelery_periodictask"."id", [...] 
      FROM "djcelery_periodictask" 
      WHERE "djcelery_periodictask"."enabled" = true ; args=(True,) 

[DEBUG/Beat] SELECT "djcelery_intervalschedule"."id", [...] 
      FROM "djcelery_intervalschedule" 
      WHERE "djcelery_intervalschedule"."id" = 3 ; args=(3,) 

[DEBUG/Beat] SELECT (1) AS "a" 
      FROM "djcelery_periodictask" 
      WHERE "djcelery_periodictask"."id" = 3 LIMIT 1; args=(3,) 

[DEBUG/Beat] UPDATE "djcelery_periodictask" 
      SET "name" = E'<taskname>', "task" = E'<task.module.path>', 
       "interval_id" = 3, "crontab_id" = NULL, 
       "args" = E'[1, False,]', "kwargs" = E'{}', "queue" = NULL, 
       "exchange" = NULL, "routing_key" = NULL, 
       "expires" = NULL, "enabled" = false, 
       "last_run_at" = E'2011-05-25 00:45:23.242387', "total_run_count" = 9, 
       "date_changed" = E'2011-05-25 09:28:06.201148' 
      WHERE "djcelery_periodictask"."id" = 3; 
      args=(
        u'<periodic-task-name>', u'<task.module.path>', 
        3, u'[1, False,]', u'{}', 
        False, u'2011-05-25 00:45:23.242387', 9, 
        u'2011-05-25 09:28:06.201148', 3 
      ) 

[DEBUG/Beat] Current schedule: 
<ModelEntry: celery.backend_cleanup celery.backend_cleanup(*[], **{}) {<crontab: 0 4 * (m/h/d)>} 
[DEBUG/Beat] Celerybeat: Waking up in 5.00 seconds. 

EDIT: Il fonctionne avec le paramètre suivant. Je n'ai toujours aucune idée pourquoi cela ne fonctionne pas avec django-celery.

CELERYBEAT_SCHEDULE = { 
    "example": { 
     "task": "<task.module.path>", 
     "schedule": crontab(), 
     "args": (1, False) 
    }, 
} 
+0

Pouvez-vous poster votre tâche et configuration periodictask? –

+0

Merci d'avoir vu mon problème. Je n'ai pas défini 'CELERYBEAT_SCHEDULE' parce que j'ai utilisé l'administration de django-celery à la place. J'ai également vérifié la [FAQ] (http://docs.celeryproject.org/en/latest/faq.html#why-won-t-my-task-run) mais comme je l'ai dit dans l'article original, je suis capable de lancer la tâche depuis le shell manuellement. Y a-t-il autre chose que j'aurais pu ignorer? – jnns

+0

Avoir exactement le même problème ... Des solutions? – Aldarund

Répondre

14

J'ai eu le même problème. Assurez-vous que les arguments sont au format JSON. Par exemple, essayez de mettre les arguments positionnels à [1, false] - en minuscules 'false' - je viens de le tester sur une instance de django-céleri (version 2.2.4) et cela a fonctionné.

Pour les args mot-clé, utilisez quelque chose comme { "name": "aldarund"}

+1

Oui, je suis confirmer, le problème est l'encodage. En fait, pour les arguments de chaîne, vous devez utiliser des guillemets doubles "au lieu du seul" –

7

Je suis le même problème.

Avec la description des modèles PeriodicTask dans djcelery ("arguments positionnels codés JSON"), identique à la réponse Evan. J'essaie d'utiliser python json lib pour encoder avant de sauvegarder.

Et ce travail avec moi

import json 
o = PeriodicTask() 
o.kwargs = json.dumps({'myargs': 'hello'}) 
o.save() 

version céleri 3.0.11

+0

les gars cette réponse a effectivement résolu mon problème. – vipin

Questions connexes