Control de tareas de larga duración con temporizadores

Completado

Cuando se trabaja con un flujo de trabajo de ejecución prolongada, es importante tener en cuenta algunos escenarios adicionales. Por ejemplo, ¿qué debería pasar si una tarea no se completa dentro de un período aceptable? ¿Cómo puede comprobar el estado de una tarea? Puede abordar estos problemas con los tiempos de espera y las rutas de escalación.

En el escenario de ejemplo, se le pide que modifique el flujo de trabajo nuevo para incorporar un paso de escalación para tomar medidas si una propuesta de diseño de proyecto no se aprueba de manera oportuna.

En esta unidad, aprenderá a controlar las tareas de larga duración con temporizadores durables y cómo agregar una ruta de remisión a una instancia superior basada en el temporizador.

Temporizadores en Durable Functions

Durable Functions proporciona temporizadores para funciones de orquestador, que se pueden emplear para implementar retrasos o configurar tiempos de espera para acciones asincrónicas. Use temporizadores duraderos en las funciones de orquestador en lugar de las funciones setTimeout() y setInterval().

Puede crear un temporizador duradero al llamar al método createTimer de DurableOrchestrationContext. El método devuelve una tarea que se reanuda en una fecha y hora especificada.

Uso de temporizadores para retrasar una ejecución

En el ejemplo siguiente se muestra cómo usar temporizadores duraderos para el retraso, que envía un recordatorio cada día durante 10 días.

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

Use siempre currentUtcDateTime para obtener la fecha y hora actual en lugar de Date.now o Date.UTC.

Uso de temporizadores para tiempo de espera

En el ejemplo siguiente se muestra cómo usar temporizadores duraderos para un tiempo de espera. Estos temporizadores ejecutarán una ruta de acceso diferente cuando el tiempo de espera se agote. En este ejemplo, la función espera hasta que la función de actividad GetQuote se completa o el temporizador deadline expira. Si la función de actividad finaliza, el código muestra success case, de lo contrario, muestra 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;
    }
});

En el ejercicio siguiente, usará esta información para agregar una ruta de acceso de escalación a nuestro escenario de ejemplo en la función de orquestador.