Planifier des tâches avec Cron pour Java 8

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 tâches Cron. Ces tâches Cron sont automatiquement déclenchées par le service Cron d'App Engine. Par exemple, vous pouvez utiliser une tâche Cron pour envoyer quotidiennement un rapport par e-mail, pour mettre à jour des données en cache toutes les 10 minutes ou pour actualiser les informations de résumé une fois par heure.

Chaque tâche Cron envoie une demande HTTP GET à une URL, selon les paramètres planifiés. Le gestionnaire de cette URL exécute la logique lors de l'appel. Une demande 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 de la console Google Cloud Platform.

Créer une tâche Cron

  1. Créez le fichier cron.xml dans le répertoire WEB-INF/ de votre application (avec le fichier appengine-web.xml).
  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.

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

    <?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 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 de la tâche Cron. En savoir plus sur la syntaxe et les options de cron.xml

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 faire des demandes 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.xml.
  2. Choisissez et définissez les paramètres de nouvelle tentative dans le bloc retry-parameters.

    Voici un exemple de fichier cron.xml 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.

    <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>
    

En savoir plus sur les options de nouvelle tentative de Cron

Déployer des tâches Cron

Option 1 : Importer l'ensemble de l'application

Pour importer l'ensemble de votre application, qui met également à jour le service Cron avec les entrées de votre fichier cron.xml, exécutez la commande suivante :

./appengine-java-sdk/bin/appcfg.sh -A your-app-id -V app-version update [YOUR_APP_DIR]
Option 2 : Importer uniquement les mises à jour Cron

Si vous ne souhaitez que mettre à jour la configuration Cron sans importer le reste de l'application, exécutez la commande suivante :

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

Supprimer toutes les tâches Cron

Pour supprimer toutes les tâches Cron :

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

    <?xml version="1.0" encoding="UTF-8"?>
    <cronentries/>
    
  2. Déployez le fichier cron.xml sur App Engine.

Sécuriser des URL pour Cron

Vous pouvez empêcher les utilisateurs d'accéder aux URL des tâches planifiées en octroyant l'accès uniquement aux comptes administrateurs. Les tâches planifiées peuvent accéder aux URL réservées aux administrateurs. Pour en savoir plus sur la restriction des URL, consultez la section Sécurité et authentification. Voici un exemple que vous utiliseriez dans web.xml pour accorder l'accès à tout élément commençant par /cron/ uniquement aux administrateurs :

<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>

Pour en savoir plus sur le format du fichier web.xml, consultez la documentation relative au descripteur de déploiement.

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.

Google App Engine émet les requêtes Cron à partir de l'adresse IP 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 des tâches Cron dans la console GCP

Vous pouvez vérifier les tâches Cron planifiées sur la page Tâches Cron de la console GCP.

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 cron.xml.

Cette page vous a-t-elle été utile ? Évaluez-la :

Envoyer des commentaires concernant…

Environnement standard App Engine pour Java 8