Steuern zeitintensiver Aufgaben mithilfe von Timern

Abgeschlossen

Wenn Sie mit einem langlaufenden Workflow arbeiten, müssen Sie einige zusätzliche Szenarien berücksichtigen. Was soll beispielsweise geschehen, wenn eine Aufgabe nicht innerhalb eines akzeptablen Zeitrahmens abgeschlossen wird? Wie können Sie den Status einer Aufgabe überprüfen? Sie können mit Timeouts und Eskalationspfaden auf diese Überlegungen reagieren.

Im Beispielszenario hatten Sie die Aufgabe, den neuen Workflow so anzupassen, dass er einen Eskalationsschritt beinhaltet, der eine Aktion auslöst, wenn ein Projektentwurfsvorschlag nicht in einem angemessenen Zeitraum genehmigt wird.

In dieser Lerneinheit erfahren Sie, wie Sie zeitintensive Aufgaben mithilfe von langlebigen Timern steuern und wie Sie auf Grundlage des Timers einen Eskalationspfad hinzufügen.

Timer in Durable Functions

Durable Functions stellt Timer für die Verwendung in den Orchestratorfunktionen bereit. Mit diesen Timern können Sie Verzögerungen implementieren oder Timeouts für asynchrone Funktionen einrichten. Für Orchestratorfunktionen sollten Sie statt der Funktionen setTimeout() und setInterval() langlebige Timer verwenden.

Sie können einen langlebigen Timer erstellen, indem Sie die createTimer()-Methode von DurableOrchestrationContext aufrufen. Die Methode gibt eine Aufgabe zurück, die an einem bestimmten Datum zu einer bestimmten Zeit fortgesetzt wird.

Verwenden von Timern für Verzögerungen

Das folgende Beispiel veranschaulicht, wie Sie einen langlebigen Timer für Verzögerungen verwenden. Dieser sendet zehn Tage lang jeden Tag eine Erinnerung.

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

Damit das aktuelle Datum und die aktuelle Uhrzeit abgerufen werden, sollten Sie immer currentUtcDateTime anstelle von Date.now oder Date.UTC verwenden.

Verwenden von Timern für Zeitlimits

Das folgende Beispiel veranschaulicht, wie langlebige Timer für Timeouts verwendet werden. Dabei wird ein anderer Pfad ausgeführt, wenn ein Timeout auftritt. In diesem Beispiel wartet die Funktion, bis entweder die GetQuote-Aktivitätsfunktion abgeschlossen ist oder der deadline-Timer abläuft. Wenn die Aktivitätsfunktion abgeschlossen ist, folgt der Code dem success case (Erfolgsfall), andernfalls dem timeout case (Zeitlimitfall).

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

In der nächsten Übung verwenden Sie diese Informationen, um dem Beispielszenario einen Eskalationspfad in der Orchestratorfunktion hinzuzufügen.