Beheren van langlopende taken met behulp van timers

Voltooid

Wanneer u met een langlopende werkstroom werkt, is het belangrijk om rekening te houden met enkele aanvullende scenario's. Wat moet er bijvoorbeeld gebeuren als een taak niet voltooid is binnen een acceptabele periode? Hoe kunt u de status van een taak controleren? U kunt deze problemen met time-outs en escalatiepaden oplossen.

In het voorbeeldscenario bent u gevraagd om de nieuwe werkstroom zo aan te passen dat er een escalatiestap wordt opgenomen om actie te ondernemen als een voorstel voor een projectontwerp niet tijdig wordt goedgekeurd.

In deze les leert u hoe u langlopende taken beheert met behulp van duurzame timers en hoe u een escalatiepad toevoegt op basis van de timer.

Timers in Durable Functions

Durable Functions biedt timers voor gebruik in de orchestrator-functies, waarmee u vertragingen kunt implementeren of time-outs voor asynchrone acties kunt instellen. U dient duurzame timers te gebruiken in orchestrator-functies, niet de functies setTimeout() en setInterval().

U kunt een duurzame timer maken door de methode createTimer() van durableOrchestrationContext aan te roepen. Met deze methode wordt een taak geretourneerd dieop een opgegeven datum en tijd wordt hervat.

Timers gebruiken voor vertraging

In het volgende voorbeeld ziet u hoe u duurzame timers voor vertraging kunt gebruiken, waarmee 10 dagen lang elke dag een herinnering wordt verstuurd.

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

U dient altijd currentUtcDateTime te gebruiken om de huidige datum en tijd op te halen, niet Date.now of Date.UTC.

Timers gebruiken voor time-out

In het volgende voorbeeld ziet u hoe u duurzame timers gebruikt voor een time-out, waardoor een ander pad wordt uitgevoerd als er een time-out optreedt. In dit voorbeeld wacht de functie totdat de activiteit-functie GetQuote is voltooid of de timer deadline is verlopen. Als de activiteit-functie is voltooid, volgt de code de case geslaagd, anders volgt deze de case time-out.

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

In de volgende oefening gebruikt u deze informatie om een escalatiepad toe te voegen aan ons voorbeeldscenario in de orchestratorfunctie.