Planifier des tâches avec Cron pour Java 8 (basé sur gcloud CLI)

Le service Cron d'App Engine permet de configurer des tâches planifiées qui s'exécutent à des heures définies ou à intervalles réguliers. Ces tâches sont communément appelées jobs Cron. Ces jobs Cron sont automatiquement déclenchés par le service Cron d'App Engine. Par exemple, vous pouvez utiliser un job Cron pour envoyer quotidiennement un rapport par e-mail, pour mettre à jour des données en cache toutes les 10 minutes ou pour actualiser des informations récapitulatives une fois par heure.

Un job Cron envoie une requête HTTP GET planifiée vers le point de terminaison spécifié dans l'application où le job Cron est configuré. Le gestionnaire de ce point de terminaison exécute la logique lors de l'appel.

Le service Cron d'App Engine ne peut pas être utilisé pour appeler des points de terminaison Web en dehors de l'application hôte App Engine. Vous ne pouvez pas l'utiliser pour appeler des points de terminaison App Engine à partir d'autres applications en dehors de l'application hôte.

Une requête de tâche Cron est soumise aux mêmes limites que celles des files d'attente d'envoi de tâches.

Avant de commencer

Pour déployer ou mettre à jour les planifications, votre compte requiert l'un des rôles IAM suivants :

  • Propriétaire
  • Éditeur

Vous pouvez définir l'autorisation sur la page "IAM" dans Google Cloud Console.

Créer une tâche Cron

  1. Créez le fichier cron.yaml dans le répertoire racine de votre application (avec app.yaml).
  2. Ajoutez une ou plusieurs entrées <cron> à votre fichier et définissez les éléments nécessaires à votre tâche, y compris les éléments <url> et <schedule> requis. Examinez la syntaxe et les options du fichier cron.yaml pour en savoir plus sur les éléments du fichier cron.yaml.

    Dans l'exemple suivant, une tâche Cron de base s'exécutant quotidiennement a été créée :

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

    La spécification cible est facultative et correspond au nom d'un service / d'une version. Le cas échéant, la cible est ajoutée au début du nom d'hôte de votre application, ce qui a pour effet d'acheminer la tâche vers ce service / cette version. Si aucune cible n'est spécifiée, la tâche s'exécute dans les versions du service default configurées pour le trafic.

  3. Créez un gestionnaire pour l'URL de la tâche Cron. Le gestionnaire doit exécuter toutes les tâches que vous souhaitez planifier. Il doit répondre avec un code d'état HTTP compris entre 200 et 299 (inclus) pour indiquer que l'opération a réussi. D'autres codes d'état peuvent être renvoyés et peuvent être utilisés pour relancer l'exécution de la tâche Cron.

Le gestionnaire peut être simplement un servlet dans l'application. Le mappage de l'URL du servlet dans le fichier web.xml doit être identique à l'URL du job Cron.

Tester les tâches Cron sur le serveur de développement

Le serveur de développement local n'exécute pas automatiquement les tâches Cron. Vous pouvez envoyer des requêtes directement à l'URL de la tâche Cron pour en tester la fonctionnalité. Vous pouvez utiliser votre interface Cron locale ou l'interface de gestion des tâches planifiées pour déclencher les URL associées à vos tâches, à l'aide de curl ou d'un outil similaire.

Exécuter à nouveau les tâches Cron qui échouent

Si le gestionnaire de requêtes d'une tâche Cron renvoie un code d'état qui n'est pas compris entre 200 et 299 (inclus), App Engine considère que la tâche a échoué. Par défaut, les tâches qui ont échoué ne font pas l'objet de nouvelles tentatives, sauf si un code d'état 503 est renvoyé. Dans ce cas, elles sont relancées toutes les minutes jusqu'à ce qu'elles aboutissent ou jusqu'au renvoi d'un code d'état compris entre 200 et 299.

Pour configurer la relance des tâches qui échouent, procédez comme suit :

  1. Incluez un bloc retry_parameters dans votre fichier cron.yaml.
  2. Choisissez et définissez les paramètres de nouvelle tentative dans le bloc retry_parameters.

    Voici un exemple de fichier cron.yaml contenant une seule tâche Cron configurée pour être relancée jusqu'à cinq fois (valeur par défaut) avec un intervalle initial de 2,5 secondes entre les tentatives, qui double à chaque nouvelle tentative.

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

En savoir plus sur les options de nouvelle tentative de Cron

Déployer des tâches Cron

Pour déployer les tâches Cron spécifiées dans votre fichier de configuration cron.yaml, exécutez la commande suivante :

gcloud

gcloud app deploy cron.yaml

Maven

mvn appengine:deployCron cron.yaml

Gradle

gradle appengineDeployCron cron.yaml

IDE

Si vous utilisez IntelliJ ou Eclipse, vous devez sélectionner les fichiers de configuration spécifiques à déployer à l'aide du formulaire de déploiement.

Supprimer toutes les tâches Cron

Pour supprimer toutes les tâches Cron :

  1. Remplacez le contenu du fichier cron.yaml par ce qui suit :

    cron:
    
  2. Déployez le fichier cron.yaml sur App Engine.

Sécuriser des URL pour Cron

Un gestionnaire Cron n'est autre qu'un gestionnaire normal défini dans le fichier app.yaml. Vous pouvez empêcher les utilisateurs d'accéder aux URL utilisées par les tâches planifiées en n'accordant l'accès qu'aux comptes administrateurs. Les tâches planifiées peuvent accéder aux URL réservées aux administrateurs. Vous pouvez restreindre l'accès à une URL en ajoutant login: admin à la configuration du gestionnaire dans le fichier app.yaml.

Un exemple dans app.yaml peut prendre la forme suivante :

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

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

Pour tester une tâche Cron, connectez-vous en tant qu'administrateur et accédez à l'URL du gestionnaire dans votre navigateur.

Les requêtes du service Cron contiennent également un en-tête HTTP :

X-Appengine-Cron: true

L'en-tête X-Appengine-Cron est défini en interne par Google App Engine. Si le gestionnaire de requêtes trouve cet en-tête, il peut valider qu'il s'agit d'une requête Cron. Si l'en-tête est présent dans une requête d'utilisateur externe adressée à votre application, il est supprimé, sauf dans les requêtes des administrateurs connectés de l'application qui sont autorisés à définir l'en-tête à des fins de test.

App Engine émet des requêtes Cron à partir de l'adresse IP 0.1.0.2. Pour les tâches Cron créées avec des versions anciennes de gcloud (antérieures à la version 326.0.0), les requêtes Cron proviennent de 0.1.0.1.

Appeler Google Cloud Endpoints

Vous ne pouvez pas spécifier de point de terminaison Google Cloud Endpoints dans le champ url d'une tâche Cron. Si vous souhaitez que votre tâche Cron appelle un point de terminaison Google Cloud Endpoints, envoyez une requête à une cible diffusée par un gestionnaire dans votre application, puis appelez la classe et la méthode du point de terminaison à partir du code du gestionnaire.

Afficher les tâches Cron dans la console Google Cloud

Vous pouvez afficher les tâches Cron planifiées dans l'onglet Tâches Cron d'App Engine de Cloud Scheduler.

Vous pouvez également afficher les journaux pour savoir quand des tâches Cron ont été ajoutées ou supprimées.

En savoir plus

Consultez les informations détaillées sur la définition des tâches Cron dans la documentation de référence sur le fichier cron.yaml.