Programa tareas con cron para Java 8 (basadas en la CLI de gcloud)

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 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 programada al extremo especificado en la misma aplicación en la que se configuró el trabajo cron. El controlador para esa URL ejecuta la lógica cuando se lo llama.

El servicio Cron de App Engine no se puede usar para llamar a los extremos web fuera de la app host de App Engine. No se puede usar para llamar a los extremos de App Engine desde otras apps además de la app host.

Una solicitud de trabajo cron está sujeta a los mismos límites que la lista de tareas en cola.

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 la consola de Google Cloud.

Crea un trabajo cron

  1. Crea el archivo cron.yaml en el directorio raíz de la aplicación (junto con app.yaml).
  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. Revisa la sintaxis y las opciones de cron.yaml para obtener más detalles sobre los elementos del archivo cron.yaml.

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

    cron:
    - description: "daily summary job"
      url: /tasks/summary
      target: beta
      schedule: every 24 hours
    

    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.

Prueba los trabajos cron en el servidor de desarrollo

El servidor de desarrollo local no ejecuta tus 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.yaml.
  2. Elige y establece los parámetros de reintento en el bloque retry_parameters.

    Por ejemplo, este archivo cron.yaml 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.

    cron:
    - description: "retry demo"
      url: /retry
      schedule: every 10 mins
      retry_parameters:
        min_backoff_seconds: 2.5
        max_doublings: 5
    

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

Implementa trabajos cron

Para implementar los trabajos cron que se especificaron en el archivo de configuración cron.yaml, ejecuta el siguiente comando:

gcloud

gcloud app deploy cron.yaml

Maven

mvn appengine:deployCron cron.yaml

Gradle

gradle appengineDeployCron cron.yaml

IDE

Si usas IntelliJ o Eclipse, selecciona los archivos de configuración individuales que se implementarán mediante el formulario de implementación.

Cómo borrar todos los trabajos cron

Sigue estos pasos para borrar todos los trabajos cron:

  1. Edita el contenido del archivo cron.yaml de la siguiente manera:

    cron:
    
  2. Implementa el archivo cron.yaml en App Engine.

Protege las URL para cron

Un controlador cron es solo un controlador normal definido en app.yaml. Puedes evitar que los usuarios accedan a las URL que usan las tareas programadas si restringes el acceso a las cuentas de administrador. Las tareas programadas pueden acceder a las URL exclusivas para administradores. Si deseas restringir una URL, puedes agregar login: admin a la configuración del controlador en app.yaml.

Un ejemplo podría verse así en app.yaml:

application: hello-cron
version: 1
runtime: java
api_version: 1

handlers:
- url: /report/weekly
  servlet: mysite.server.CronServlet
  login: admin

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

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

X-Appengine-Cron: true

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 app, 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.

App Engine genera solicitudes cron desde la dirección IP 0.1.0.2. En el caso de los trabajos cron creados con versiones anteriores de gcloud (antes de 326.0.0), las solicitudes provienen de 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 tu app y llama a la clase y al método del extremo desde el código del controlador.

Visualiza trabajos cron en la consola de Google Cloud

Puedes ver los trabajos cron programados en la pestaña Trabajos cron de App Engine de Cloud Scheduler.

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

Más información

Para obtener más información sobre la definición de trabajos cron, consulta la Referencia de cron.yaml.