Styra långvariga uppgifter med hjälp av timers

Slutförd

När du arbetar med ett långvarigt arbetsflöde är det viktigt att överväga några ytterligare scenarier. Vad skulle till exempel hända om en uppgift inte slutförs inom en acceptabel tidsperiod? Hur kan du kontrollera statusen för en uppgift? Du kan åtgärda dessa problem med hjälp av tidsgränser och eskaleringsvägar.

I exempelscenariot har du blivit ombedd att ändra det nya arbetsflödet genom att införa ett eskaleringssteg som vidtar åtgärd om ett projektdesignförslag inte godkänns inom rimlig tid.

I den här lektionen får du lära dig hur du styr långvariga uppgifter med hjälp av varaktiga timers och hur du lägger till en eskaleringssökväg baserat på timern.

Timers i Durable Functions

Durable Functions tillhandahåller timers som används i Orchestrator-funktioner, som du kan använda för att implementera fördröjningar eller ställa in tidsgränser för asynkrona åtgärder. Du bör använda hållbara timers i orkestreringsfunktioner i stället för funktionerna setTimeout() och setInterval().

Du kan skapa en varaktig timer genom att anropa metoden createTimer() i DurableOrchestrationContext. Den här metoden returnerar en uppgift som återupptas vid angivet datum och tid.

Använda timers för fördröjning

I följande exempel visas hur du använder hållbara timers för fördröjning, vilket skickar en påminnelse varje dag under 10 dagar.

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

Du bör också alltid använda currentUtcDateTime för att hämta aktuellt datum och tid i stället för Date.now eller Date.UTC.

Använda timers för tidsgräns

I följande exempel visas hur du använder varaktiga timers för en tidsgräns, vilket kommer att köra en annan sökväg om en timeout inträffar. I det här exemplet väntar funktionen tills antingen aktivitetsfunktionen GetQuote har slutförts eller deadline-timern går ut. Om aktivitetsfunktionen slutförs följer koden det lyckade fallet. I annat fall följer den timeout-fallet.

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

I nästa övning använder du den här informationen för att lägga till en eskaleringssökväg till vårt exempelscenario i orchestrator-funktionen.