Contrôler des tâches de longue durée à l’aide de minuteurs

Effectué

Avec un workflow durable, il est important de prendre en compte quelques cas de figure supplémentaires. Par exemple, que doit-il se passer si une tâche n’est pas effectuée dans un délai acceptable ? Comment vérifier l’état d’une tâche ? Vous pouvez répondre à ces besoins avec des délais d’attente et des chemins d’escalade.

Dans notre exemple de scénario, vous avez été chargé de modifier votre nouveau workflow afin d’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 cette unité, vous verrez comment contrôler des tâches de longue durée à l’aide de minuteurs durables et comment ajouter un chemin d’escalade basé sur le minuteur.

Minuteurs dans Durable Functions

Durable Functions fournit des minuteurs utilisables dans les fonctions orchestrator, qui permettent d’implémenter des retards ou de définir des délais d’attente pour les actions asynchrones. Utilisez des minuteurs durables dans les fonctions orchestrator de préférence aux fonctions setTimeout() et setInterval().

Vous pouvez créer un minuteur durable en appelant la méthode createTimer() de DurableOrchestrationContext. Cette méthode retourne une tâche qui reprend à une date et une heure spécifiées.

Utilisation de minuteurs pour le retard

L’exemple suivant montre comment utiliser des minuteurs durables pour le retard, avec envoi d’un rappel tous les jours pendant 10 jours.

const df = require("durable-functions");
const moment = require("moment");

module.exports = df.orchestrator(function*(context) {
    for (let i = 0; i < 10; i++) {
        const deadline = moment.utc(context.df.currentUtcDateTime).add(i, 'd');
        yield context.df.createTimer(deadline.toDate());
        yield context.df.callActivity("SendReminder");
    }
});

Pour obtenir la date et l’heure actuelles, utilisez toujours currentUtcDateTime, plutôt que Date.now ou Date.UTC.

Utilisation de minuteurs pour le délai d’attente

L’exemple suivant montre comment utiliser des minuteurs durables pour un délai d’attente, avec exécution d’un autre chemin en cas d’expiration du délai. Dans cet exemple, la fonction attend la fin de l’exécution de la fonction d’activité GetQuote ou l’expiration du minuteur deadline. Si la fonction d’activité est effectuée dans les temps, le code suit le chemin success case (cas de réussite) ; sinon, il suit le chemin timeout case (cas d’expiration du délai d’attente).

const df = require("durable-functions");
const moment = require("moment");

module.exports = df.orchestrator(function*(context) {
    const deadline = moment.utc(context.df.currentUtcDateTime).add(30, "s");

    const activityTask = context.df.callActivity("GetQuote");
    const timeoutTask = context.df.createTimer(deadline.toDate());

    const winner = yield context.df.Task.any([activityTask, timeoutTask]);
    if (winner === activityTask) {
        // success case
        timeoutTask.cancel();
        return true;
    }
    else
    {
        // timeout case
        return false;
    }
});

Dans le prochain exercice, vous allez utiliser ces informations pour ajouter un chemin d’escalade à l’exemple de scénario dans la fonction orchestrator.