Управление длительными задачами с помощью таймеров
При работе с длительным рабочим процессом важно учитывать некоторые дополнительные сценарии. Например, что должно происходить, если задача не завершается в течение допустимого периода времени? Как проверить состояние задачи? Эти вопросы можно решить с помощью времени ожидания и путей эскалации.
В нашем примере вам предлагается дополнить новый рабочий процесс этапом эскалации, который выполняет указанное действие при отсутствии своевременного утверждения предложения по разработке проекта.
В этом уроке вы узнаете, как управлять длительными задачами с помощью устойчивых таймеров и как добавить путь эскалации на основе таймера.
Таймеры в Устойчивых функциях
Устойчивые функции предоставляют таймеры для использования в функциях оркестрации. Так можно реализовать задержки или время ожидания для асинхронных действий. Необходимо применять устойчивые таймеры в функциях оркестрации вместо функций 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;
}
});
В следующем упражнении показано, как использовать эти сведения для добавления пути эскалации в функцию оркестрации из нашего примера.