Ejercicio: Incorporación de un temporizador durable para administrar una tarea de larga duración

Completado

La empresa le ha pedido modificar el flujo de trabajo nuevo con el fin de incorporar un paso de escalación para tomar medidas si una propuesta de diseño de proyecto no se aprueba de manera oportuna.

En esto ejercicio, agregará un temporizador para controlar el tiempo de expiración durante la ejecución del flujo de trabajo. También aprenderá a usar el tiempo de expiración para controlar qué ruta de ejecución toma el flujo de trabajo.

Incorporación del paquete npm moment a la aplicación de función

Antes de cambiar el flujo de trabajo, se agregará el paquete npm moment a la aplicación de funciones a través de la consola.

  1. Inicie sesión en Azure Portal con la misma cuenta que ha usado para activar el espacio aislado.

  2. En el menú de Azure Portal o en la página Inicio, en Servicios de Azure, seleccione Todos los recursos y, luego, elija la aplicación de funciones que creó en el ejercicio anterior. Aparece el panel Aplicación de funciones.

  3. En la barra de menús izquierda, seleccione Consola en Herramientas de desarrollo. Aparece el panel Consola de la aplicación de funciones.

  4. Compruebe que la ventana de la consola se abre en la carpeta C:\home\site\wwwroot y, luego, ejecute los siguientes comandos para instalar las bibliotecas necesarias para esta aplicación de funciones de ejemplo.

    1. Ejecute el siguiente comando para instalar la biblioteca TypeScript, que es una dependencia necesaria para tipos estáticos.

      npm install typescript
      
    2. Ejecute el comando siguiente para instalar la biblioteca moment, que contiene funciones de fecha y hora que puede usar con Durable Functions.

      npm install moment
      

      Estos comandos pueden tardar unos segundos en completarse y es posible que el administrador de paquetes de Node muestre algunas advertencias, que puede omitir.

  5. Espere hasta que todos los paquetes hayan terminado de instalarse y cierre la ventana de la consola.

Incorporación de una actividad de escalación a la aplicación de funciones

  1. En el menú de Azure Portal o desde la página Inicio, en Servicios de Azure, seleccione Todos los recursos y luego la aplicación de funciones. Aparece el panel Aplicación de funciones.

  2. Seleccione la pestaña Funciones en el centro de la pantalla.

  3. En la barra de menús de la pestaña Funciones, seleccione Crear. Se abre el panel Crear función.

  4. En Seleccionar una plantilla, vaya al cuadro Filtrar, especifique Actividad de Durable Functions y seleccione esa plantilla de la lista. Esta plantilla crea una función duradera que se ejecuta cuando una función de orquestador llama a una actividad.

  5. En el campo Nueva función de Detalles de la plantilla, escriba Escalación como nombre de la función y, a continuación, seleccione Crear. Aparece el panel de escalación para la función.

  6. En el panel de menús izquierdo, en Desarrollador, seleccione Código y prueba. Aparece el panel Código y prueba de la función.

    El código del archivo index.js aparece en el editor.

  7. Reemplace el código existente con el siguiente:

    module.exports = async function (context) {
        return `ESCALATION : You have not approved the project design proposal - reassigning to your Manager!  ${context.bindings.name}!`;
    };
    

    Este código devuelve un mensaje que indica que el flujo de trabajo se ha escalado. En un sistema de producción, esta función contendría la lógica para recordar al destinatario o reasignar la tarea.

  8. En la barra de menús superior, seleccione Guardar para guardar la función nueva.

Actualización de la función de orquestación para usar la función de escalación

  1. En el menú de Azure Portal o desde la página Inicio, en Servicios de Azure, seleccione Todos los recursos y luego la aplicación de funciones. Aparece el panel Aplicación de funciones.

  2. Seleccione la pestaña Funciones en el centro de la pantalla.

  3. Seleccione la función OrchFunction que ha creado en el ejercicio anterior. Aparece el panel de la función OrchFunction.

  4. En el panel de menús izquierdo, en Desarrollador, seleccione Código y prueba. Aparece el panel Código y prueba de la función.

    El código del archivo index.js aparece en el editor.

  5. Agregue la referencia siguiente a la biblioteca moment.

    const moment = require("moment");
    
  6. Reemplace el cuerpo de la función por el código siguiente, que comprueba si se ha superado la fecha límite de la aprobación.

    module.exports = df.orchestrator(function* (context) {
        const outputs = [];
        const deadline = moment.utc(context.df.currentUtcDateTime).add(20, "s");
        const activityTask = context.df.waitForExternalEvent("Approval");
        const timeoutTask = context.df.createTimer(deadline.toDate());
    
        const winner = yield context.df.Task.any([activityTask, timeoutTask]);
        if (winner === activityTask) {
            outputs.push(yield context.df.callActivity("Approval", "Approved"));
        }
        else
        {
            outputs.push(yield context.df.callActivity("Escalation", "Head of department"));
        }
    
        if (!timeoutTask.isCompleted) {
            // All pending timers must be complete or canceled before the function exits.
            timeoutTask.cancel();
        }
    
        return outputs;
    });
    

    Para que este ejercicio sea breve, si la función Approval no responde en 20 segundos, se llama a la función Escalation. El código también cambia la llamada a Approval (Aprobación) para esperar una entrada externa. De este modo, es posible controlar el momento en que la respuesta vuelve por motivos de prueba.

  7. En la barra de menús superior, seleccione Guardar.

Comprobación del inicio del flujo de trabajo de Durable Functions

  1. En el menú de Azure Portal o desde la página Inicio, en Servicios de Azure, seleccione Todos los recursos y luego la aplicación de funciones. Aparece el panel Aplicación de funciones.

  2. En la barra de menús superior del panel Información general, seleccione Reiniciar y, luego, cuando se le pida que reinicie. Antes de continuar, espere a que se complete el reinicio. Aparece el panel Aplicación de funciones.

  3. Seleccione la pestaña Funciones en el centro de la pantalla.

  4. Seleccione la función HttpStart. Aparece el panel HttpStart.

  5. En la barra de menús superior, seleccione Obtener la dirección URL de la función y copie la dirección URL. La dirección URL debería ser similar al ejemplo siguiente:

    https://example.azurewebsites.net/api/orchestrators/{functionName}?code=AbCdEfGhIjKlMnOpQrStUvWxYz==
    

    Usará esta dirección URL para ejecutar las funciones.

  6. Abra una ventana nueva del explorador y vaya a la dirección URL que copió. En la dirección URL, reemplace el marcador de posición {functionName} por OrchFunction, que se parecerá al ejemplo siguiente:

    https://example.azurewebsites.net/api/orchestrators/OrchFunction?code=AbCdEfGhIjKlMnOpQrStUvWxYz==
    

    El mensaje de respuesta contiene un conjunto de puntos de conexión URI que puede usar para supervisar y administrar la ejecución, que debería ser similar al ejemplo siguiente:

    {
      "id": "f0e1d2c3b4a5968778695a4b3c2d1e0f",
      "statusQueryGetUri": "https://example.azurewebsites.net/...",
      "sendEventPostUri": "https://example.azurewebsites.net/...",
      "terminatePostUri": "https://example.azurewebsites.net/...",
      "rewindPostUri": "https://example.azurewebsites.net/...",
      "purgeHistoryDeleteUri": "https://example.azurewebsites.net/..."
    }
    
  7. Copie el valor statusQueryGetUri y use el explorador web para ir a esa dirección URL. Debería ver un mensaje de respuesta con el estado En ejecución mientras espera a que el temporizador haga la cuenta regresiva a 20 segundos. Será similar al ejemplo siguiente:

    {
      "name": "OrchFunction",
      "instanceId": "f0e1d2c3b4a5968778695a4b3c2d1e0f",
      "runtimeStatus": "Running",
      "input": null,
      "customStatus": null,
      "output": null,
      "createdTime": "2019-04-14T13:17:26Z",
      "lastUpdatedTime": "2019-04-14T13:17:27Z"
    }
    
  8. Espere 20 segundos y actualice la ventana del explorador. Se habrá alcanzado el tiempo de espera y el flujo de trabajo llamará a la actividad de escalación. Verá una respuesta similar al ejemplo siguiente:

    {
        "name": "OrchFunction",
        "instanceId": "f0e1d2c3b4a5968778695a4b3c2d1e0f",
        "runtimeStatus": "Completed",
        "input": null,
        "customStatus": null,
        "output": [
            "ESCALATION : You have not approved the project design proposal - reassigning to your Manager!  Head of department!"
        ],
        "createdTime": "2019-04-14T13:43:09Z",
        "lastUpdatedTime": "2019-04-14T13:43:31Z"
    }