Ří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. V funkcích orchestrátoru byste měli místo funkcí setTimeout() a setInterval() použít trvalé časovače.

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

Vždy byste měli použít currentUtcDateTime k získání aktuálního data a času 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čí buď funkce aktivity GetQuote , nebo vyprší platnost časovače konečného termínu . Pokud se funkce aktivity dokončí, kód následuje případ úspěchu, jinak následuje případ č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.