2011-05-25 13 views
11

Me gustaría crear una tarea periódica para el apio usando interfaz de administración de django-apio. Tengo una tarea configurada que funciona muy bien cuando se llama manualmente o por script. Simplemente no funciona a través de celerybeat. De acuerdo con los registros de depuración, la tarea se establece en enabled = False en la primera recuperación y me pregunto por qué.celerybeat deshabilita automáticamente la tarea periódica

Al agregar la tarea periódica y pasar [1, False] como argumentos posicionales, la tarea se desactiva automáticamente y no veo ningún resultado adicional. Cuando se agrega sin argumentos, la tarea se ejecuta pero genera una excepción al instante porque no proporcioné los argumentos necesarios (tiene sentido).

¿Alguien ve cuál es el problema aquí?

Gracias de antemano.

Ésta es la salida después de que suministran argumentos:

[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: Funciona con la siguiente configuración. Todavía no tengo idea de por qué no funciona con django-apio.

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

Se puede publicar la configuración de la tarea y periodictask? –

+0

Gracias por ver mi problema. No configuré 'CELERYBEAT_SCHEDULE' porque en su lugar usé la administración de django-apio. También revisé las [preguntas frecuentes] (http://docs.celeryproject.org/en/latest/faq.html#why-won-t-my-task-run) pero como dije en la publicación original, estoy capaz de lanzar la tarea desde el caparazón manualmente. ¿Hay algo más que podría haber pasado por alto? – jnns

+0

Tienen exactamente el mismo problema ... ¿Alguna solución? – Aldarund

Respuesta

14

Tuve el mismo problema. Asegúrese de que los argumentos tengan formato JSON. Por ejemplo, intente establecer los argumentos posicionales en [1, falso] - minúscula 'falso' - Acabo de probarlo en una instancia django-apio (versión 2.2.4) y funcionó.

Para los argumentos de palabras clave, usar algo como { "name": "aldarund"}

+1

Sí, estoy seguro, el problema es la codificación. De hecho, para los argumentos de cadena debes usar comillas dobles "en lugar de la única". –

7

Tengo el mismo problema también.

Con la descripción de los modelos PeriodicTask en djcelery ("argumentos posicionales codificados JSON"), al igual que Evan answer. Intento usar python json lib para codificar antes de guardar.

Y este trabajo conmigo

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

versión 3.0.11 apio

+0

chicos, esta respuesta en realidad resolvió mi problema. – vipin

Cuestiones relacionadas