Řízení dlouhotrvajících úkolů pomocí časovačů

Dokončeno

Při práci s dlouhotrvajícím pracovním postupem je důležité zvážit některé další scénáře. Například co by se mělo stát, pokud se úkol nedokončí v rámci přijatelné doby? Jak můžete zkontrolovat stav úkolu? Můžete tyto obavy vyřešit pomocí časových limitů a eskalačních cest?

V ukázkovém scénáři jste byli požádáni, abyste nový pracovní postup pozměnili tak, aby byl začleněn krok eskalace s provedením akce v případě, že návrh projektu nebude schválen včas.

V této lekci se dozvíte, jak řídit dlouhotrvající úlohy pomocí trvalých časovačů a jak přidat cestu eskalace na základě časovače.

Časovače v rozšíření Durable Functions

Rozšíření Durable Functions poskytuje časovače, které můžete použít ve funkcích orchestrátoru k implementaci zpoždění nebo nastavení časových limitů pro asynchronní funkce. Trvalé časovače ve funkcích orchestrátoru byste měli používat místo funkcí setTimeout() a setInterval().

Trvalý časovač můžete vytvořit voláním createTimer() metody DurableOrchestrationContext. Tato metoda vrátí úkol, který se obnoví k zadanému datu a času.

Použití časovačů pro zpoždění

Následující příklad ukazuje, jak použít trvalé časovače pro zpoždění, aby se každý den po dobu 10 dnů odeslala připomínka.

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

K získání aktuálního data a času byste měli vždy použít currentUtcDateTime místo Date.now nebo Date.UTC.

Použití časovačů pro časový limit

Následující příklad ukazuje, jak použít trvalé časovače pro časový limit, aby se při vypršení časového limitu spustila jiná cesta. V tomto příkladu funkce počká, dokud se nedokončí funkce aktivity GetQuote nebo nevyprší časovač deadline. Pokud se funkce aktivity dokončí, kód následuje případ úspěchu, jinak následuje případ vypršení časového limitu.

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

V dalším cvičení použijete tyto informace k přidání cesty eskalace do našeho ukázkového scénáře ve funkci orchestrátoru.