Exercice : Ajouter un minuteur durable pour gérer une tâche longue

Effectué

Votre entreprise vous a demandé de modifier votre nouveau workflow pour y ajouter une étape d’escalade qui déclenche une action si une proposition de conception de projet n’est pas approuvée en temps voulu.

Dans cet exercice, vous ajoutez un minuteur pour contrôler le délai d’expiration durant l’exécution de votre workflow. Vous apprenez également à utiliser le délai d’expiration pour contrôler le chemin d’exécution pris par le workflow.

Ajouter un package npm « moment » à votre application de fonction

Avant de changer notre workflow, nous allons ajouter le package npm moment à notre application de fonction par le biais de la console.

  1. Connectez-vous au portail Azure en utilisant le même compte que celui avec lequel vous avez activé le bac à sable.

  2. Dans le menu du Portail Azure ou sur la page Accueil, sous Services Azure, sélectionnez Toutes les ressources, puis l’application de fonction que vous avez créée dans l’exercice précédent. Votre volet Application de fonction s’affiche.

  3. Dans la barre de menus de gauche, sous Outils de développement, sélectionnez Console. Le volet Console s’affiche pour votre application de fonction.

  4. Vérifiez que la fenêtre de console s’ouvre dans le dossier C:\home\site\wwwroot, puis exécutez les commandes suivantes pour installer les bibliothèques requises pour cet exemple d’application de fonction.

    1. Exécutez la commande suivante pour installer la bibliothèque TypeScript, qui est une dépendance nécessaire pour le typage statique.

      npm install typescript
      
    2. Exécutez la commande suivante pour installer la bibliothèque moment, qui contient des fonctions de date/heure utilisables avec les fonctions durables.

      npm install moment
      

      Ces commandes peuvent prendre quelques secondes avant d’aboutir. Il est par ailleurs possible que le gestionnaire de package de nœud affiche des avertissements, que vous pouvez ignorer.

  5. Attendez la fin de l’installation de tous les packages, puis fermez la fenêtre de la console.

Ajouter une activité d’escalade à votre application de fonction

  1. Dans le menu du portail Azure ou dans la page Accueil, sous Services Azure, sélectionnez Toutes les ressources, puis sélectionnez votre application de fonction. Votre volet Application de fonction s’affiche.

  2. Sélectionnez l’onglet Fonctions au centre de l’écran.

  3. Dans la barre de menus de l’onglet Fonctions, sélectionnez Créer. Le volet Créer une fonction s’affiche.

  4. Sous Sélectionner un modèle, dans la zone Filtre, entrez Activité Durable Functions, puis sélectionnez ce modèle dans la liste. Ce modèle crée une fonction durable qui s’exécute lorsqu’une activité est appelée par une fonction orchestrator.

  5. Sous Détails du modèle, pour le champ Nouvelle fonction, entrez Escalation pour le nom de la fonction, puis sélectionnez Créer. Le volet escalade de votre fonction s’affiche.

  6. Dans le volet du menu de gauche, sélectionnez Code + test sous Développeur. Le volet Code + Test s’affiche pour votre fonction.

    Le code du fichier index.js s’affiche dans l’éditeur.

  7. Remplacez le code existant par le code suivant :

    module.exports = async function (context) {
        return `ESCALATION : You have not approved the project design proposal - reassigning to your Manager!  ${context.bindings.name}!`;
    };
    

    Ce code retourne un message indiquant que le workflow a été escaladé. Dans un système de production, cette fonction contient la logique pour envoyer un rappel au destinataire ou réattribuer la tâche.

  8. Dans la barre de menus supérieure, sélectionnez Enregistrer pour enregistrer votre nouvelle fonction.

Mettre à jour la fonction d’orchestration pour utiliser la fonction d’escalade

  1. Dans le menu du portail Azure ou dans la page Accueil, sous Services Azure, sélectionnez Toutes les ressources, puis sélectionnez votre application de fonction. Votre volet Application de fonction s’affiche.

  2. Sélectionnez l’onglet Fonctions au centre de l’écran.

  3. Sélectionnez la fonction OrchFunction que vous avez créée dans l’exercice précédent. Le volet de la fonction OrchFunction s’affiche.

  4. Dans le volet du menu de gauche, sélectionnez Code + test sous Développeur. Le volet Code + Test s’affiche pour votre fonction.

    Le code du fichier index.js s’affiche dans l’éditeur.

  5. Ajoutez la référence suivante à la bibliothèque moment.

    const moment = require("moment");
    
  6. Remplacez le corps de la fonction par le code suivant, qui teste si l’échéance de l’approbation est dépassée.

    module.exports = df.orchestrator(function* (context) {
        const outputs = [];
        const deadline = moment.utc(context.df.currentUtcDateTime).add(20, "s");
        const activityTask = context.df.waitForExternalEvent("Approval");
        const timeoutTask = context.df.createTimer(deadline.toDate());
    
        const winner = yield context.df.Task.any([activityTask, timeoutTask]);
        if (winner === activityTask) {
            outputs.push(yield context.df.callActivity("Approval", "Approved"));
        }
        else
        {
            outputs.push(yield context.df.callActivity("Escalation", "Head of department"));
        }
    
        if (!timeoutTask.isCompleted) {
            // All pending timers must be complete or canceled before the function exits.
            timeoutTask.cancel();
        }
    
        return outputs;
    });
    

    Pour simplifier les choses dans le cadre de cet exercice, si la fonction d’approbation ne répond pas dans les 20 secondes, la fonction d’escalade est appelée. Le code change également l’appel à Approval pour attendre une entrée externe. De cette façon, nous pouvons contrôler à quel moment la réponse est retournée à des fins de test.

  7. Dans la barre de menus supérieure, sélectionnez Enregistrer.

Vérifier que le workflow Durable Functions démarre

  1. Dans le menu du portail Azure ou dans la page Accueil, sous Services Azure, sélectionnez Toutes les ressources, puis sélectionnez votre application de fonction. Votre volet Application de fonction s’affiche.

  2. Dans le volet Vue d’ensemble, dans la barre de menus supérieure, sélectionnez Redémarrer, puis cliquez sur Oui lorsque vous êtes invité à redémarrer. Attendez la fin du redémarrage avant de continuer. Votre volet Application de fonction s’affiche à nouveau.

  3. Sélectionnez l’onglet Fonctions au centre de l’écran.

  4. Sélectionnez votre fonction HttpStart. Le volet HttpStart s’affiche.

  5. Dans la barre de menus supérieure, sélectionnez Obtenir l’URL de la fonction et copiez l’URL. L’URL doit ressembler à l’exemple suivant :

    https://example.azurewebsites.net/api/orchestrators/{functionName}?code=AbCdEfGhIjKlMnOpQrStUvWxYz==
    

    Vous utiliserez cette URL pour exécuter vos fonctions.

  6. Ouvrez une nouvelle fenêtre de navigateur, puis accédez à l’URL que vous avez copiée. Dans l’URL, remplacez l’espace réservé {functionName} par OrchFunction, comme dans l’exemple suivant :

    https://example.azurewebsites.net/api/orchestrators/OrchFunction?code=AbCdEfGhIjKlMnOpQrStUvWxYz==
    

    Le message de réponse contient un ensemble de points de terminaison d’URI que vous pouvez utiliser pour superviser et gérer l’exécution, et qui ressemble à l’exemple suivant :

    {
      "id": "f0e1d2c3b4a5968778695a4b3c2d1e0f",
      "statusQueryGetUri": "https://example.azurewebsites.net/...",
      "sendEventPostUri": "https://example.azurewebsites.net/...",
      "terminatePostUri": "https://example.azurewebsites.net/...",
      "rewindPostUri": "https://example.azurewebsites.net/...",
      "purgeHistoryDeleteUri": "https://example.azurewebsites.net/..."
    }
    
  7. Copiez la valeur de statusQueryGetUri, puis accédez à cette URL dans votre navigateur web. Le message de réponse qui apparaît indique l’état En cours d’exécution en attendant que le minuteur ait fini le décompte des 20 secondes, comme dans l’exemple suivant :

    {
      "name": "OrchFunction",
      "instanceId": "f0e1d2c3b4a5968778695a4b3c2d1e0f",
      "runtimeStatus": "Running",
      "input": null,
      "customStatus": null,
      "output": null,
      "createdTime": "2019-04-14T13:17:26Z",
      "lastUpdatedTime": "2019-04-14T13:17:27Z"
    }
    
  8. Attendez 20 secondes et actualisez la fenêtre du navigateur. Le délai d’attente aura été atteint et le workflow appellera l’activité Escalader. Vous voyez une réponse qui doit ressembler à l’exemple suivant :

    {
        "name": "OrchFunction",
        "instanceId": "f0e1d2c3b4a5968778695a4b3c2d1e0f",
        "runtimeStatus": "Completed",
        "input": null,
        "customStatus": null,
        "output": [
            "ESCALATION : You have not approved the project design proposal - reassigning to your Manager!  Head of department!"
        ],
        "createdTime": "2019-04-14T13:43:09Z",
        "lastUpdatedTime": "2019-04-14T13:43:31Z"
    }