Řízení dlouhotrvajících úkolů pomocí časovačů
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.