A hosszú ideig futó tevékenységek vezérlése időzítők használatával

Befejeződött

Ha hosszú ideig futó munkafolyamattal dolgozik, fontos megfontolni néhány további forgatókönyvet. Például mi történjen akkor, ha egy tevékenység nem fejeződik be elfogadható időn belül? Hogyan tudja majd ellenőrizni a tevékenység állapotát? Kezelhetők ezek a problémák időkorlátok és eszkalációs útvonalak alkalmazásával.

A példaforgatókönyvben az volt a feladata, hogy egészítse ki új munkafolyamatát egy eszkalációs lépéssel, amely akkor lép működésbe, ha a projekttervezetet nem hagyják jóvá időben.

Ebben a leckében megtanulhatja, hogyan vezérelheti a hosszan futó feladatokat tartós időzítőkkel, és hogyan adhat hozzá eszkalációs útvonalat az időzítő alapján.

A Durable Functions időzítői

A Durable Functions a vezénylő függvényeken belül időzítőket biztosít, amelyekkel késleltetések valósíthatók meg, vagy időtúllépések állíthatók be az aszinkron műveletekhez. A setTimeout() és a setInterval() függvények helyett érdemes a vezérlőfüggvényekben található tartós időzítőket alkalmazni.

Tartós időzítőt a DurableOrchestrationContext createTimer() metódusának meghívásával hozhat létre. A metódus egy olyan tevékenységet ad vissza válaszként, amely egy adott időpontban fog folytatódni.

Késleltetés az időzítők használatával

A következő példa azt mutatja be, hogyan lehet a tartós időzítőket késleltetésre használni, amely 10 napon át napi emlékeztetőket küld.

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

Az aktuális dátumot és időpontot a Date.now vagy a Date.UTC lehetőségek helyett érdemes mindig a currentUtcDateTime tulajdonság használatával lekérdezni.

Időtúllépés létrehozása az időzítők használatával

Az alábbi példa a tartós időzítők időtúllépéskor történő használatát szemlélteti, ami ilyenkor egy másik elérési utat hajt végre. A példában a függvény mindaddig várakozni fog, amíg a GetQuote (Árajánlat kérése) tevékenységfüggvény be nem fejeződik, vagy a deadline (határidő) időzítő le nem jár. Ha a tevékenységfüggvény befejeződik, akkor a kód a success case (siker esetén) útvonalat, ellenkező esetben pedig a timeout case (időtúllépés esetén) útvonalat fogja követni.

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

A következő gyakorlatban ezeket az információkat használva eszkalációs útvonalat adhat hozzá a vezénylő függvényben található mintaforgatókönyvhez.