使用計時器來控制長時間執行的工作

已完成

當您使用長時間執行的工作流程時,考慮一些其他案例非常重要。 例如,如果工作未在可接受的一段時間內完成時,應該發生什麼情況? 您如何檢查工作的狀態? 您可以使用逾時和呈報路徑來處理這些考量。

在範例案例中,已要求您修改新工作流程來納入呈報步驟,以在專案設計提案未及時獲得核准時採取動作。

在本單元中,您會了解如何使用持久計時器來控制長時間執行的工作,以及如何根據計時器來新增呈報路徑。

Durable Functions 中的計時器

Durable Functions 會提供計時器以供在協調器函式中使用,您可以使用這些計時器來實作延遲或設定逾時來執行非同步動作。 您應該在協調器函式中使用耐久的計時器,而不是在 setTimeout()setInterval() 函式中使用。

您可以藉由呼叫 DurableOrchestrationContextcreateTimer() 方法,來建立耐久性計時器。 此方法會傳回一個在指定日期和時間繼續執行的工作。

將計時器用於延遲

下列範例說明如何將耐久的計時器用於延遲,其會在 10 天內於每天傳送提醒。

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

您應一律使用 currentUtcDateTime 來取得目前的日期和時間,而不要使用 Date.nowDate.UTC

將計時器用於逾時

下列範例說明如何將耐久的計時器用於逾時,其將會在發生逾時時執行不同的路徑。 在此範例中,函式會等到 GetQuote 活動函式完成或 deadline (期限) 計時器到期為止。 如果活動函式完成,程式碼就會依循 success case (成功案例) 執行,否則會依循 timeout case (逾時案例) 執行。

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

在下一個練習中,您將使用此資訊將升級路徑新增至協調器函式中的範例案例。