Programa tareas con cron para Java 8

El servicio Cron de App Engine te permite configurar tareas generalmente programadas que operan a horas definidas o intervalos regulares. Estas tareas se conocen comúnmente como trabajos cron. Los trabajos cron se activan de manera automática con el servicio cron de App Engine. Por ejemplo, puedes usar un trabajo cron para enviar un informe que se puede enviar por correo electrónico a diario, actualizar algunos datos almacenados en caché cada 10 minutos o actualizar la información de resumen una vez por hora.

Un trabajo cron realiza una solicitud GET HTTP a una URL según lo programado. El controlador para esa URL ejecuta la lógica cuando se lo llama. Una solicitud de trabajo cron está sujeta a los mismos límites que la lista de tareas en cola de envío.

Antes de comenzar

Para implementar o actualizar los programas, tu cuenta requiere una de las funciones de IAM siguientes:

  • Propietario
  • Editor

Puedes configurar el permiso en la página de IAM en Google Cloud Console.

Crea un trabajo cron

  1. Crea el archivo cron.xml en el directorio WEB-INF/ de la aplicación (junto con appengine-web.xml).
  2. Agrega una o más entradas <cron> al archivo y define los elementos necesarios para el trabajo, incluidos los elementos <url> y <schedule> obligatorios.

    En el siguiente ejemplo, se crea un trabajo cron básico que se ejecuta a diario:

    <?xml version="1.0" encoding="UTF-8"?>
    <cronentries>
      <cron>
        <url>/tasks/summary</url>
        <target>beta</target>
        <description>daily summary job</description>
        <schedule>every 24 hours</schedule>
      </cron>
    </cronentries>
    

    La especificación de destino es opcional y es el nombre de un servicio o versión. Si está presente, el destino se antepone al nombre de host de la aplicación, lo que hace que el trabajo se enrute a ese servicio o versión. Si no se especifica un destino, el trabajo se ejecutará en las versiones del servicio default que se configuraron para el tráfico.

  3. Crea un controlador para la URL del trabajo cron. El controlador debe ejecutar las tareas que quieras programar. El controlador debe responder con un código de estado HTTP entre 200 y 299 (inclusive) para indicar el éxito. Se pueden mostrar otros códigos de estado y usarse para reintentar el trabajo cron.

El controlador puede ser tan simple como un Servlet en la app. El mapa de URL de Servlet en web.xml debe ser igual que la URL del trabajo cron. Obtén más información sobre la sintaxis y las opciones de cron.xml.

Prueba los trabajos cron en el servidor de desarrollo

El servidor de desarrollo local no ejecuta los trabajos cron de manera automática. Puedes realizar solicitudes directamente a la URL de tu trabajo cron para probar la funcionalidad. Puedes usar tu cron local o la interfaz de tareas programadas para activar las URL de tus trabajos con curl o una herramienta similar.

Cómo reintentar los trabajos cron que contienen errores

Si el controlador de solicitudes de un trabajo cron muestra un código de estado que no está entre 200 y 299 (inclusive), App Engine considera que el trabajo falló. De forma predeterminada, los trabajos fallidos no se reintentan, a menos que se muestre un código de estado 503, en cuyo caso se reintenta cada minuto hasta que tenga éxito o se muestre un código de estado entre 200 y 299.

Para configurar que los trabajos fallidos se reintenten, haz lo siguiente:

  1. Incluye un bloque retry-parameters en el archivo cron.xml.
  2. Elige y establece los parámetros de reintento en el bloque retry-parameters.

    Por ejemplo, este archivo cron.xml de muestra contiene un solo trabajo cron que está configurado para reintentarse hasta cinco veces (el valor predeterminado) con una retirada inicial de 2.5 segundos que se duplica cada vez.

    <cronentries>
      <cron>
        <url>/retry</url>
        <description>Retry on jsdk</description>
        <schedule>every 10 minutes</schedule>
        <retry-parameters>
          <min-backoff-seconds>2.5</min-backoff-seconds>
          <max-doublings>5</max-doublings>
        </retry-parameters>
      </cron>
    </cronentries>
    

Obtén más información sobre las opciones de reintento de cron.

Cómo implementar trabajos cron

Opción 1: sube toda la aplicación

Para subir toda la aplicación, que también actualiza el servicio Cron con las entradas del archivo cron.xml, ejecuta el siguiente comando:

./appengine-java-sdk/bin/appcfg.sh -A your-app-id -V app-version update [YOUR_APP_DIR]
Opción 2: sube solo las actualizaciones cron

Ejecuta el siguiente comando para actualizar solo la configuración cron sin subir el resto de la aplicación:

./appengine-java-sdk/bin/appcfg.sh -A your-app-id -V app-version update_cron [YOUR_APP_DIR]

Cómo borrar todos los trabajos cron

Sigue estos pasos para borrar todos los trabajos cron:

  1. Edita el contenido del archivo cron.xml de esta forma:

    <?xml version="1.0" encoding="UTF-8"?>
    <cronentries/>
    
  2. Implementa el archivo cron.xml en App Engine.

Protege las URL para cron

Puedes evitar que los usuarios accedan a las URL que utilizan las tareas programadas si restringes el acceso a las cuentas de administrador. Las tareas programadas pueden acceder a las URL exclusivas de administrador. Puedes obtener más información para restringir las URL en Seguridad y autenticación. A continuación, se muestra un ejemplo que puedes usar en web.xml para restringir todo lo que comienza con /cron/ de modo que sea exclusivo de administrador:

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

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

Para probar un trabajo cron, accede como administrador y visita la URL del controlador en el navegador.

Las solicitudes del servicio cron también contendrán un encabezado HTTP:

X-Appengine-Cron: true

Google App Engine configura el encabezado X-Appengine-Cron de forma interna. Si el controlador de solicitudes encuentra este encabezado, puedes confiar en que la solicitud es cron. Si el encabezado está presente en una solicitud de usuario externa a la aplicación, este se quita, excepto en el caso de las solicitudes de los administradores que hayan accedido a la aplicación, ya que estos tienen permitido configurar el encabezado con fines de prueba.

Google App­­ Engine emite solicitudes cron desde la dirección IP 0.1.0.1.

Llama a Google Cloud Endpoints

No puedes especificar un Google Cloud Endpoint en el campo url de un trabajo cron. Si deseas que el trabajo cron llame a un Google Cloud Endpoint, emite una solicitud a un objetivo entregado por un controlador en la aplicación y llama a la clase y al método del extremo desde el código del controlador.

Visualiza trabajos cron en Cloud Console

Puedes comprobar los trabajos cron programados en la página Trabajos cron en Cloud Console.

También puedes ver los registros para visualizar cuándo se agregaron o quitaron los trabajos cron.

Más información

Consulta la Referencia de cron.yaml para obtener información detallada sobre la definición de trabajos cron.