GAE: Tareas programadas con cron para Java

El servicio cron de App Engine te permite configurar tareas programadas regularmente que operan en momentos definidos o intervalos regulares. Estas tareas se conocen comúnmente como tareas cron. El servicio cron de App Engine activa automáticamente estas tareas cron. Por ejemplo, puedes utilizarlo para enviar un correo electrónico de informe a diario, para actualizar los datos almacenados en la caché cada 10 minutos o para actualizar la información de resumen cada hora.

Una tarea cron invocará una URL, mediante una solicitud GET HTTP, en un momento concreto del día. Una URL invocada por el servicio cron está sujeta a los mismos límites y cuotas que una solicitud HTTP normal, incluido el límite de tiempo de la solicitud. Las tareas cron se ejecutan únicamente para la versión predeterminada de tu aplicación.

Una aplicación puede contener hasta 20 tareas programadas.

Acerca de cron.xml

Un archivo cron.xml del directorio WEB-INF de la aplicación (junto con appengine-web.xml) controla el servicio cron de la aplicación Java. A continuación, se muestra un ejemplo del archivo cron.xml:

<?xml version="1.0" encoding="UTF-8"?>
<cronentries>
  <cron>
    <url>/recache</url>
    <description>Repopulate the cache every 2 minutes</description>
    <schedule>every 2 minutes</schedule>
  </cron>
  <cron>
    <url>/weeklyreport</url>
    <description>Mail out a weekly report</description>
    <schedule>every monday 08:30</schedule>
    <timezone>America/New_York</timezone>
  </cron>
</cronentries>

En el caso de que un XSD describa el formato, consulta el archivo docs/cron.xsd del SDK.

Un archivo cron.xml consta de varias definiciones de tarea. Una definición de tarea debe contener <url> y <schedule>. Opcionalmente, puedes especificar también<description> y <timezone>. La descripción se puede ver en la consola de administración.

El campo url es simplemente una URL de la aplicación. El formato del campo schedule se trata más detenidamente en la sección Formato de la programación.

La zona horaria debe tener el nombre de una zona horaria zoneinfo estándar. Si no especificas una zona horaria, las tareas se ejecutarán en la hora UTC (también conocida como hora GMT).

Formato de la programación

Las programaciones cron se especifican mediante un formato tipo inglés sencillo.

A continuación, se muestran ejemplos de programaciones:

every 5 minutes
every 12 hours
2nd,third mon,wed,thu of march 17:00
every monday 09:00
1st monday of sep,oct,nov 17:00
every day 00:00

Si no necesitas ejecutar una tarea repetida en un momento específico pero, necesitas ejecutarla en intervalos regulares, utiliza el siguiente formato: every N (hours|mins|minutes), donde N es un número y horas o minutos especifica la unidad de tiempo. El tiempo más breve que se puede especificar en la ejecución de una tarea es 1 minuto.

De forma predeterminada, una programación con intervalos comienza en el siguiente intervalo después de haberse completado la última tarea. Si quieres que las tareas comiencen en intervalos regulares durante el día independientemente del momento en que se completó la última tarea, añade la palabra synchronized a la descripción del intervalo. Por ejemplo:

every 2 hours synchronized

Esta configuración ejecuta una tarea 12 veces al día en intervalos de dos horas, a partir de la medianoche.

Si quieres establecer tiempos más específicos, puedes especificar la programación del siguiente modo:

("every"|ordinal) (days) ["of" (monthspec)] (time)

Los paréntesis se emplean solo a modo de ejemplo y las comillas indican un valor literal.

Donde:

  • ordinal indica una lista separada por comas de “1st”, “first” y así sucesivamente (ambas formas son correctas).
  • days indica una lista de días de la semana separados por comas (por ejemplo, “mon”, “tuesday”; se aceptan tanto la forma corta como la forma larga); “every day” equivale a “every mon,tue,wed,thu,fri,sat,sun”.
  • monthspec indica una lista de meses separados por comas (por ejemplo, “jan”, “march”, “sep”). Si se omite, implica todos los meses. También puedes incluir “month” para indicar todos los meses, como en “1,8,15,22 of month 09:00”.
  • time indica la hora del día, en formato HH:MM y horario de 24 horas.

Protección de direcciones URL para cron

Para evitar que los usuarios accedan a las URL utilizadas por las tareas programadas, puedes restringir el acceso a las cuentas del administrador. Las tareas programadas pueden acceder a las URL exclusivas de los administradores. Puedes obtener más información sobre cómo restringir las URL en la sección Seguridad y autenticación. A continuación, se muestra un ejemplo que puedes utilizar en web.xml para restringir todo lo que empiece por /cron/ únicamente a los administradores:

    <security-constraint>
        <web-resource-collection>
            <url-pattern>/cron/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <role-name>admin</role-name>
        </auth-constraint>
    </security-constraint>

Nota: aunque las tareas cron pueden utilizar rutas de URL restringidas con <role-name>admin</role-name>no pueden utilizar rutas de URL restringidas con <role-name>*</role-name>.

Para obtener más información sobre el formato de web.xml, consulta la documentación del descriptor de implementación.

Para probar una tarea cron, accede como administrador e introduce la URL del controlador en el navegador.

Las solicitudes procedentes del servicio cron contienen también una cabecera HTTP:

X-AppEngine-Cron: true

Si te quieres asegurar de que solo las solicitudes cron puedan activar el controlador, busca esta cabecera.

Versiones de cron y de la aplicación

Las solicitudes cron siempre se envían a la versión predeterminada de la aplicación.

Subida de tareas cron

Puedes utilizar AppCfg para subir las tareas cron. Cuando subas la aplicación a App Engine a través de AppCfg update, el servicio cron se actualizará con el contenido decron.xml. Puedes actualizar solo la configuración cron sin subir el resto de la aplicación a través de AppCfg update_cron.

Para eliminar todas las tareas cron, modifica el archivo cron.xml para que contenga solo lo siguiente:

<?xml version="1.0" encoding="UTF-8"?>
<cronentries/>

Compatibilidad del servicio cron con la Consola del administrador

La Consola del administrador te permite ver el estado de tus tareas cron. Selecciona el enlace “Tareas cron” en el menú lateral para ver el estado de las tareas, incluida la última vez que se ejecutó la tarea, así como su resultado.

Para ver cuándo se han añadido o eliminado las tareas cron, selecciona la página Registros del administrador en el menú de la Consola del administrador.

Compatibilidad del servicio cron con el servidor de desarrollo

El servidor de desarrollo no ejecuta automáticamente las tareas cron. Puedes utilizar el servicio cron del escritorio local o la interfaz de tareas programadas para acceder a las URL de las tareas a través de curl o de una herramienta similar.