Desde la versión 1.2.0 de Google App Engine este permite la creación de tareas programadas con cron. El soporte para tareas programadas en Google Ap Engine es una de las cosas más demandadas y esperadas de la plataforma, ya que hasta ese momento no había forma de hacer operaciones de forma asíncrona, tan necesarias en aplicaciones altamente escalables.
Para crear tareas programadas se debe crear un archivo cron.yaml a la altura del app.yaml que ya deberíamos tener. Si por el contrario estáis empezando con Google App Engine os recomiendo leer el artículo de gimenete Introducción a Google App Engine
En el archivo cron.yaml debemos definir las tareas programadas de nuestra aplicación. Un ejemplo de cron.yaml sería el siguiente:
cron: - description: counting foo url: /apocalipto schedule: every wednesday of month 11:11 timezone: Europe/Madrid - description: execute pending tasks url: /task.queue schedule: every 2 minutes
Los campos url y schedule son obligatorios, mientras que description y timezone son optativos. Si no está presente el campo timezone se toma por defecto UTC. El campo timezone puede tomar múltiples valores.
Con este cron de ejemplo crearíamos dos tareas, una que se ejecutaría cada 24 horas y que llamaría a una clase nuestra que actualizaría un contador de usuarios y otra que se llamaría cada martes a las 10 de la mañana y enviaría un resumen, por email, de lo acontecido en la aplicación.
Google App Engine acepta dos formatos en los que introducir las fechas para las tareas programadas
every N (hours|mins|minutes)
Donde N es el número de horas o minutos que queremos que transcurra desde una llamada a la siguiente. El tiempo mínimo que permite Google App Engine es de 1 minuto. Ejemplos
every 5 minutes every 12 hours
El otro formato sigue el siguiente patrón
("every"|ordinal) (days) "of" (monthspec) (time)La siguiente tarea crearía una tarea programada que se ejecutaría cada lunes del mes de Marzo
every monday of march 09:00
Como en el ejemplo que hemos visto al principio podemos también crear una tarea programada que se ejecute todos los lunes de forma independiente al mes en el que nos encontremos
every monday of month 09:00
Pero Google App Engine nos permite ser más concretos todavía, indicando varios días a la semana por ejemplo o varios meses al año, como por ejemplo
every mon,fri of april 16:00 every monday of sep,oct,nov 10:00
Google app Engine nos permite ser más concretos, pudiendo ejecutar una tarea cada X día del mes. Por ejemplo la siguiente fecha ejecutaría una tarea cada primer viernes de mes
1st friday of month 10:00
O incluso varios. El siguiente ejemplo cearía una tarea programada los primeros y segundos Lunes y Jueves de cada mes
first,second mon,thu of month 10:00
Nota En el momento en el que este artículo ha sido escrito la documentación oficial contiene fechas con el formato
every monday 09:00
El formato no es correcto, da error al desplegar el cron. Si queremos una tarea que se haga todos los meses debemos incluir of month, así que quedaría de la siguiente forma
every monday of month 09:00
Google app engine permite actualizar las tareas haciendo deploy de la aplicación de forma normal, aunque también permite refrescar sólo las tareas programadas usando
appcfg.py update_cron carpeta/
Si lo que queremos es borrar todas las tareas de cron que tenemos basta con dejar el fichero cron.xml con un aspecto como el siguiente:
cron:
En la consola de administración de Google app Engine se pueden ver las tareas de cron que hay en la aplicación, así como el estado y la fecha en la que fueron ejecutadas por última vez.

Para más información podéis echar un vistazo a la documentación oficial
He trabajado en Zaragoza, Luxemburgo y Barcelona. Participé como estudiante en el Google Summer of Code del 2007, concretamente con el proyecto Apache OpenJPA. Me interesa la programación en general y las metodologías ágiles.
joradom escribió
hace 1 años
© Copyright 2008-2009 debug_mode=ON | Aviso legal | Contacto | FAQ | ¿Quiénes somos? |
#1
gracia plunchete, todavía no me habia dado tiempo a meterme con esto, pero seguro que me ahorará un monton de tiempo :)