Управление длительными задачами с помощью таймеров

Завершено

При работе с длительным рабочим процессом важно учитывать некоторые дополнительные сценарии. Например, что должно происходить, если задача не завершается в течение допустимого периода времени? Как проверить состояние задачи? Эти вопросы можно решить с помощью времени ожидания и путей эскалации.

В нашем примере вам предлагается дополнить новый рабочий процесс этапом эскалации, который выполняет указанное действие при отсутствии своевременного утверждения предложения по разработке проекта.

В этом уроке вы узнаете, как управлять длительными задачами с помощью устойчивых таймеров и как добавить путь эскалации на основе таймера.

Таймеры в Устойчивых функциях

Устойчивые функции предоставляют таймеры для использования в функциях оркестрации. Так можно реализовать задержки или время ожидания для асинхронных действий. Необходимо применять устойчивые таймеры в функциях оркестрации вместо функций setTimeout() и setInterval().

Вы можете создать устойчивый таймер, вызвав метод createTimer() объекта DurableOrchestrationContext. Этот метод возвращает задачу, выполнение которой возобновляется в указанные дату и время.

Использование таймеров для задержки

В следующем примере показано, как использовать устойчивые таймеры для задержки. Этот пример каждый день в течение 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 или истечет период ожидания deadline*. Если функция действия завершится успешно, выполняется ветвь успеха, в противном случае функция переходит к ветви превышения времени ожидания.

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

В следующем упражнении показано, как использовать эти сведения для добавления пути эскалации в функцию оркестрации из нашего примера.