使用计时器控制长时间运行的任务

已完成

在处理长时间运行的工作流时,必须考虑一些附加场景。 例如,如果任务未在可接受的时间段内完成,会发生什么? 如何检查任务状态? 借助超时和升级路径,可以解决这些问题。

在示例方案中,已要求修改新的工作流,合并升级步骤,使工作流在项目设计提案未及时获得批准时采取措施。

本单元将介绍如何使用持久计时器控制长期任务,以及如何基于该计时器添加升级路径。

Durable Functions 中的计时器

Durable Functions 提供要在业务流程协调程序函数中使用的计时器,你可以使用它们来实现异步操作的延迟或设置超时。 业务流程协调程序函数中应使用持久计时器,而非 setTimeout() 和 setInterval() 函数。

可通过调用 DurableOrchestrationContext 的 createTimer() 方法创建持久计时器。 此方法返回一个将在指定的日期和时间恢复运行的任务。

使用计时器实现延迟

以下示例演示如何使用持久计时器实现延迟,它每天发送一个提醒,持续 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.now 或 Date.UTC。

使用计时器实现超时

下面的示例演示如何使用持久计时器来应对超时,如果发生超时,它将执行不同的路径。 在此示例中,函数将等到 GetQuote 活动函数完成或截止时间计时器过期。 如果活动函数完成,代码将运行 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;
    }
});

在接下来的练习中,你将使用此信息在业务流程协调程序函数的示例方案中添加升级路径。