Controllare le attività a esecuzione prolungata tramite i timer

Completato

Quando usi un flusso di lavoro a esecuzione prolungata, è importante prendere in considerazione alcuni scenari aggiuntivi. Ad esempio, che cosa accade se un'attività non viene completata entro un periodo di tempo accettabile? Com'è possibile controllare lo stato di un'attività? È possibile risolvere questi problemi con timeout e percorsi di escalation.

Nello scenario di esempio, è stato richiesto di modificare il nuovo flusso di lavoro per incorporare un passaggio di escalation, in modo da eseguire un'azione se una proposta di progetto non viene approvata tempestivamente.

In questa unità verrà illustrato come controllare le attività a esecuzione prolungata tramite timer permanenti e come aggiungere un percorso di escalation basato su timer.

Timer in Durable Functions

Durable Functions mette a disposizione timer da usare nelle funzioni dell'agente di orchestrazione, per implementare ritardi o configurare timeout per le azioni asincrone. È necessario usare i timer permanenti nelle funzioni dell'agente di orchestrazione anziché le funzioni setTimeout() e setInterval().

Puoi creare un timer permanente, chiamare il metodo createTimer() di DurableOrchestrationContext. Questo metodo restituisce un'attività che riprende a una data e un'ora specificata.

Uso dei timer per il ritardo

L'esempio seguente illustra come usare i timer permanenti per il ritardo, che invia un promemoria tutti i giorni per 10 giorni.

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");
    }
});

Usare sempre currentUtcDateTime per ottenere la data e l'ora correnti, invece di Date.now o Date.UTC.

Uso dei timer per il timeout

L'esempio seguente illustra come usare i timer permanenti per un timeout, per eseguire un percorso diverso se si verifica un timeout. In questo esempio la funzione attende fino al completamento della funzione di attività GetQuote o alla scadenza del timer deadline. Se la funzione di attività viene completata, il codice segue il caso esito positivo, altrimenti segue il caso timeout.

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;
    }
});

Nell'esercizio seguente si useranno queste informazioni per aggiungere un percorso di escalation allo scenario di esempio nella funzione dell'agente di orchestrazione.