Ejercicio: Incorporación de un temporizador durable para administrar una tarea de larga duración
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, agregaremos el paquete de npm moment a nuestra aplicación de funciones a través de la consola.
Inicie sesión en el portal de Azure con la misma cuenta que usó para activar el entorno de pruebas.
En el menú de Azure Portal o en la página Inicio , en Servicios de Azure, seleccione Todos los recursos y, a continuación, seleccione la aplicación de funciones que creó en el ejercicio anterior. Aparece el panel Aplicación de funciones.
En la barra de menús de la izquierda, en Herramientas de desarrollo, seleccione Consola. Aparece el panel Consola de la aplicación de funciones.
Compruebe que la ventana de consola se abre en la carpeta C:\home\site\wwwroot y, a continuación, ejecute los comandos siguientes para instalar las bibliotecas necesarias para esta aplicación de funciones de ejemplo.
Ejecute el siguiente comando para instalar la biblioteca de TypeScript , que es una dependencia necesaria para la escritura estática.
npm install typescript
Ejecute el siguiente comando para instalar la biblioteca moment , que contiene funciones de fecha y hora que puede usar con funciones duraderas.
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.
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
En el menú de Azure Portal o en la página Inicio , en Servicios de Azure, seleccione Todos los recursos y, a continuación, seleccione la aplicación de funciones. Aparece el panel Aplicación de funciones.
Seleccione la pestaña Funciones en el centro de la pantalla.
En la barra de menús de la pestaña Funciones , seleccione Crear. Aparece el panel Crear función .
En Seleccionar una plantilla, en el cuadro Filtro, escriba actividad de Funciones Duraderas y seleccione esa plantilla en la lista. Esta plantilla crea una función duradera que se ejecuta cuando una función de orquestador llama a una actividad.
En Detalles de plantilla, en el campo Nueva función , escriba Escalación para el nombre de la función y seleccione Crear. Aparece el panel de escalación de la función.
En el panel de menús izquierdo, en Desarrollador, seleccione Código y prueba. Aparece el panel Código y prueba para la función.
El código del archivo index.js aparece en el editor.
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.
En la barra de menús superior, seleccione Guardar para guardar la nueva función.
Actualización de la función de orquestación para usar la función de escalación
En el menú de Azure Portal o en la página Inicio , en Servicios de Azure, seleccione Todos los recursos y, a continuación, seleccione la aplicación de funciones. Aparece el panel Function App.
Seleccione la pestaña Funciones en el centro de la pantalla.
Seleccione la función OrchFunction que creó en el ejercicio anterior. Aparece el panel de funciones OrchFunction.
En el panel de menús izquierdo, en Desarrollador, seleccione Código y prueba. Aparece el panel Código y prueba para la función.
El código del archivo index.js aparece en el editor.
Agregue la siguiente referencia a la biblioteca moment .
const moment = require("moment");
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 mantener las cosas breves para los fines de este ejercicio, si la función Approval no responde en un plazo de 20 segundos, se llama a la función Escalation . El código también cambia la llamada a Aprobación para esperar una entrada externa. De este modo, es posible controlar el momento en que la respuesta vuelve por motivos de prueba.
En la barra de menús superior, seleccione Guardar.
Comprobación del inicio del flujo de trabajo de Durable Functions
En el menú de Azure Portal o en la página Inicio , en Servicios de Azure, seleccione Todos los recursos y, a continuación, seleccione la aplicación de funciones. Aparece el panel Aplicación de funciones.
En el panel Información general , en la barra de menús superior, seleccione Reiniciar y, a continuación, seleccione Sí cuando se le pida que se reinicie. Antes de continuar, espere a que se complete el reinicio. Vuelve a aparecer el panel Function App.
Seleccione la pestaña Funciones en el centro de la pantalla.
Seleccione la función HttpStart . Aparece el panel HttpStart .
En la barra de menús superior, seleccione Obtener dirección URL de 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.
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 debería ser similar 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/..." }
Copie el valor statusQueryGetUri y use el explorador web para ir a esa dirección URL. Debería ver un mensaje de respuesta que muestra el estado como En ejecución mientras espera que el temporizador cuente hasta 20 segundos, que debería parecerse 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" }
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" }