Creación de bucles para repetir acciones en flujos de trabajo con Azure Logic Apps

Se aplica a: Azure Logic Apps (consumo + estándar)

Azure Logic Apps incluye las siguientes acciones de bucle que puede usar en el flujo de trabajo:

  • Para repetir una o varias acciones en elementos de una matriz, agregue la acción Para cada acción al flujo de trabajo.

    Como alternativa, si tiene un desencadenador que recibe una matriz y desea ejecutar una iteración para cada elemento de matriz, puede desagrupar esa matriz con la propiedad de desencadenador SplitOn.

  • Para repetir una o varias acciones hasta que se cumpla una condición o cambie un estado, agregue la acción Hasta al flujo de trabajo.

    El flujo de trabajo ejecuta primero todas las acciones dentro del bucle y luego comprueba la condición o el estado. Si se cumple la condición, se detiene el bucle. En caso contrario, se repite el bucle. Para conocer los límites predeterminados y máximos del número de bucles Until que puede tener la ejecución de un flujo de trabajo, consulteLímites de simultaneidad, bucle y anulación de procesamiento por lotes.

Requisitos previos

For each

La acción Para cada acción solo funciona en matrices y repite una o varias acciones en cada elemento de una matriz. La lista siguiente contiene algunas consideraciones para cuando desea usar una acción For each:

  • La acción For each puede procesar un número limitado de elementos de matriz. Para conocer los límites, consulte Límites de simultaneidad, bucle y anulación de procesamiento por lotes.

  • De forma predeterminada, los ciclos o iteraciones de una acción For each se ejecutan al mismo tiempo en paralelo.

    Este comportamiento difiere del del bucle Aplicar a cada uno de Power Automate, donde las iteraciones ejecutan uno a la vez o secuencialmente. Sin embargo, puede configurar iteraciones For each secuenciales. Por ejemplo, si desea pausar la siguiente iteración en una acción For each mediante la acción Delay, debe establecer el bucle para que se ejecute secuencialmente.

    Como excepción al comportamiento predeterminado, las iteraciones de una acción For each anidada siempre se ejecutan de forma secuencial, no en paralelo. Para ejecutar operaciones en paralelo en elementos de un bucle anidado, cree y llame a un flujo de trabajo secundario.

  • Para obtener resultados predecibles de operaciones en variables durante cada iteración, ejecútelas secuencialmente. Por ejemplo, cuando finaliza una iteración que se ejecuta simultáneamente, las operaciones Incrementar variable, Reducir variable y Anexar a variable devuelven resultados predecibles. Sin embargo, durante cada iteración del bucle de ejecución simultánea, es posible que estas operaciones devuelvan resultados imprevisibles.

  • Las acciones de un bucle For each usan la función item() para hacer referencia y procesar cada elemento de la matriz. Si especifica datos que no están en una matriz, se producirá un error en el flujo de trabajo.

Este ejemplo de flujo de trabajo envía un resumen diario de una fuente RSS de sitio web. El flujo de trabajo utiliza una acción For each que envía un correo electrónico por cada nuevo elemento.

En función de si tiene un flujo de trabajo de Consumo o Estándar, siga los pasos correspondientes:

  1. En el Azure Portal, cree un flujo de trabajo de aplicación lógica de consumo de ejemplo con los pasos siguientes en el orden especificado:

  2. Siga los mismos pasos generales para agregar la acción For each entre el desencadenador RSS y la acción Send an email en el flujo de trabajo.

  3. Ahora, compile el bucle:

    1. Seleccione el cuadro Seleccionar una salida de los pasos anteriores para que se abra la lista de contenido dinámico.

    2. En la lista Agregar contenido dinámico de la sección Cuando se publica un elemento de fuente, seleccione Vínculos de fuente, que es una salida de matriz del desencadenador RSS.

      Nota:

      Si la salida de vínculos de fuente no aparece, junto a la etiqueta de sección del desencadenador, seleccione Ver más. En la lista de contenido dinámico, solo puede seleccionar salidas de los pasos anteriores.

      Screenshot shows Azure portal, Consumption workflow designer, action named For each, and opened dynamic content list.

      Cuando haya terminado, la salida de la matriz seleccionada aparece como en el ejemplo siguiente:

      Screenshot shows Consumption workflow, action named For each, and selected array output.

    3. Para ejecutar una acción en cada elemento de matriz, arrastre la acción Enviar un correo electrónico al bucle For each.

      El flujo de trabajo tiene un aspecto similar al del ejemplo siguiente:

      Screenshot shows Consumption workflow, action named For each, and action named Send an email, now inside For each loop.

  4. Cuando haya terminado, guarde el flujo de trabajo.

  5. Para probar manualmente el flujo de trabajo, en la barra de herramientas del diseñador seleccione Run Trigger>Run.

Para cada definición de acción (JSON)

Si está trabajando en la vista de código, defina la acción For_each en la definición JSON de su flujo de trabajo, por ejemplo:

"actions": {
   "For_each": {
      "actions": {
         "Send_an_email_(V2)": {
            "type": "ApiConnection",
            "inputs": {
               "body": {
                  "Body": "@{item()}",
                  "Subject": "New CNN post @{triggerBody()?['publishDate']}",
                  "To": "me@contoso.com"
               },
               "host": {
                  "connection": {
                     "name": "@parameters('$connections')['office365']['connectionId']"
                  }
               },
               "method": "post",
               "path": "/v2/Mail"
            },
            "runAfter": {}
         }
      },
      "foreach": "@triggerBody()?['links']",
      "runAfter": {},
      "type": "Foreach"
   }
},

For each: Ejecutar secuencialmente

De forma predeterminada, las iteraciones de un bucle For each se ejecutan al mismo tiempo o en paralelo. Sin embargo, cuando tenga bucles anidados o variables dentro de los bucles en los que se esperan resultados predecibles, debe ejecutar esos bucles uno a uno o secuencialmente.

  1. En la esquina superior derecha de la acción For each, seleccione los puntos suspensivos (...) >Configuración.

  2. En Control de simultaneidad cambie la configuración de Desactivado a Activado.

  3. Arrastre el control deslizante Grado de paralelismo a 1 y elija Listo.

    Screenshot shows Consumption workflow, action named For each, concurrency control setting turned on, and degree of parallelism slider set to 1.

Para cada definición de acción (JSON): ejecutar secuencialmente

Si está trabajando con la vista de código con la acción For_each en la definición JSON de su flujo de trabajo, puede usar la opción Sequential agregando el parámetro operationOptions, por ejemplo:

"actions": {
   "For_each": {
      "actions": {
         "Send_an_email_(V2)": { }
      },
      "foreach": "@triggerBody()?['links']",
      "runAfter": {},
      "type": "Foreach",
      "operationOptions": "Sequential"
   }
}

Until

La acción Until se ejecuta y repite una o varias acciones hasta que se cumpla la condición especificada necesaria. Si se cumple la condición, se detiene el bucle. En caso contrario, se repite el bucle. Para conocer los límites predeterminados y máximos del número de acciones o iteraciones de Until que puede tener un flujo de trabajo, consulte Límites de simultaneidad, bucle y anulación de procesamiento por lotes.

La lista siguiente contiene algunos escenarios comunes en los que puede usar una acción Until:

  • Llamada a un punto de conexión hasta obtener la respuesta que quiere.

  • Creación de un registro en una base de datos. Espere hasta que un campo específico de ese registro sea aprobado. Continúe el procesamiento.

En el siguiente flujo de trabajo de ejemplo, a partir de las 8:00 a.m. cada día, la acción Until incrementa una variable hasta que el valor de la variable es igual a 10. El flujo de trabajo envía después un correo electrónico que confirma el valor actual.

Nota:

En estos pasos se usa Office 365 Outlook, pero puede usarse cualquier proveedor de correo electrónico que Azure Logic Apps admita. Si utiliza otra cuenta de correo electrónico, los pasos generales siguen siendo los mismos pero la interfaz de usuario podría ser ligeramente distinta.

  1. En Azure portal, cree el recurso de aplicación lógica Consumo con un flujo de trabajo en blanco.

  2. En el diseñador, siga estos pasos generales para agregar el activador incorporado de Periodicidad denominado Programación a su flujo de trabajo.

  3. En el desencadenador Periodicidad , especifique el intervalo, la frecuencia y la hora del día para que se active el desencadenador.

    Propiedad Value
    Intervalo 1
    Frecuencia Día
    A estas horas 8

    Para agregar el parámetro A estas horas, abra la lista Agregar nuevo parámetro y seleccione A estas horas, que solo aparece después de establecer Frecuencia en Día.

    Screenshot shows Azure portal, Consumption workflow designer, and Recurrence trigger parameters with selected option for At these hours.

    Cuando haya terminado, el desencadenador Periodicidad tendrá un aspecto similar al del ejemplo siguiente:

    Screenshot shows Azure portal, Consumption workflow, and Recurrence trigger parameters set up.

  4. En el desencadenador, siga estos pasos generales para agregar la acción integrada de Variables denominada Inicializar variable al flujo de trabajo.

  5. En la acción Inicializar variable, proporcione los valores siguientes:

    Propiedad Valor Descripción
    Nombre Límite El nombre de la variable
    Tipo Entero El tipo de datos de la variable
    Valor 0 El valor de inicio de la variable

    Screenshot shows Azure portal, Consumption workflow, and parameters for built-in action named Initialize variable.

  6. En la acción Inicializar variable , siga estos pasos generales para agregar la acción integrada Control denominada Until al flujo de trabajo.

  7. En la acción Until , proporcione los valores siguientes para configurar la condición de detención del bucle.

    1. Seleccione dentro del cuadro situado más a la izquierda denominado Elegir un valor, que abre automáticamente la lista de contenido dinámico.

    2. En la lista, en Variables, seleccione la variable denominada Limit.

    3. En la lista de operadores intermedios, seleccione el operador es igual a.

    4. En el cuadro situado más a la derecha denominado Elegir un valor, escriba 10 como valor de comparación.

    Screenshot shows Consumption workflow and built-in action named Until with finished stop condition.

  8. Dentro de la acción Until, seleccione Agregar una acción.

  9. En el cuadro de búsqueda Elegir una operación, siga estos pasos generales para agregar la acción integrada Variables denominada Incrementar variable a la acción Until.

  10. En la acción Incrementar variable, proporcione los siguientes valores para incrementar el valor de la variable Limit 1 punto:

    Propiedad Valor
    Nombre Seleccione la variable Limit.
    Valor 1

    Screenshot shows Consumption workflow and built-in action named Until with Name set to the Limit variable and Value set to 1.

  11. Fuera y en la acción Until, siga estos pasos generales para agregar una acción que envía correo electrónico.

    Este ejemplo continúa con la acción de Office 365 Outlook denominada Enviar correo electrónico.

  12. En la acción de correo electrónico, proporcione los valores siguientes:

    Propiedad Valor Descripción
    To <email-address@domain> La dirección de correo electrónico del destinatario. Para las pruebas, use su propia dirección de correo electrónico.
    Asunto El valor actual de la variable "Limit" es:Limit El asunto del correo electrónico. En este ejemplo, asegúrese de incluir la variable Limit para confirmar que el valor actual cumple la condición especificada:

    1. Seleccione dentro del cuadro Asunto para que aparezca la lista de contenido dinámico.

    2. En la lista de contenido dinámico, junto al encabezado de sección Variables , seleccione Ver más.

    3. Seleccione Límite.
    Cuerpo <email-content> El contenido del mensaje de correo electrónico que quiere enviar. En este ejemplo, escriba cualquier texto que desee.

    Cuando haya terminado, la acción de correo electrónico tendrá un aspecto parecido al siguiente ejemplo:

    Screenshot shows Consumption workflow and action named Send an email with property values.

  13. Guarde el flujo de trabajo.

Prueba del flujo de trabajo

Para probar manualmente el flujo de trabajo de su aplicación lógica, siga los pasos según si tiene una aplicación lógica de consumo o estándar.

En la barra de herramientas del diseñador, seleccione Ejecutar desencadenador>Ejecutar.

Después de que el flujo de trabajo empiece a ejecutarse, recibirá un correo electrónico con el contenido que haya especificado:

Screenshot shows sample email received from example workflow.

Impedir bucles sin fin

La acción Until detiene la ejecución en función de las siguientes propiedades, que puede ver seleccionando Cambiar límites en la acción. Asegúrese de establecer estos valores de propiedad en consecuencia:

Propiedad Descripción
Recuento El número máximo de iteraciones que se ejecutan antes de salir del bucle.

Para conocer los límites predeterminados y máximos del número de acciones Until que puede tener la ejecución de un flujo de trabajo, consulte Límites de simultaneidad, bucle y anulación de procesamiento por lotes.
Tiempo de espera Cantidad máxima de tiempo que la acción Until , incluidas todas las iteraciones, se ejecuta antes de que se cierre el bucle. Este valor se especifica en formato ISO 8601 y se evalúa para cada iteración.

Si cualquier acción en el bucle tarda más que el límite de tiempo de expiración, la iteración actual no se detiene. Sin embargo, la siguiente iteración no comienza porque se cumple la condición de límite de tiempo de espera.

Para obtener los límites predeterminados y máximos en el valor Timeout, consulteLímites de simultaneidad, bucle y anulación de procesamiento por lotes.

Definición "Until" (JSON)

Si está trabajando en la vista de código, defina la acción Until en la definición JSON de su flujo de trabajo, por ejemplo:

"actions": {
   "Initialize_variable": {
      // Definition for initialize variable action
   },
   "Send_an_email": {
      // Definition for send email action
   },
   "Until": {
      "type": "Until",
      "actions": {
         "Increment_variable": {
            "type": "IncrementVariable",
            "inputs": {
               "name": "Limit",
               "value": 1
            },
            "runAfter": {}
         }
      },
      "expression": "@equals(variables('Limit'), 10)",
      // To prevent endless loops, an "Until" loop 
      // includes these default limits that stop the loop. 
      "limit": { 
         "count": 60,
         "timeout": "PT1H"
      },
      "runAfter": {
         "Initialize_variable": [
            "Succeeded"
         ]
      }
   }
}

El bucle "Until" de este ejemplo llama a un punto de conexión HTTP, que crea un recurso. El bucle se detiene cuando se devuelve el cuerpo de la respuesta HTTP con el estado Completed. Para impedir bucles sin fin, el bucle también se detendrá si se produce alguna de estas condiciones:

  • El bucle se ha ejecutado 10 veces según lo especificado por el atributo count. El valor predeterminado es 60 veces.

  • El bucle se ejecutó durante dos horas según lo especificado por el atributo timeout en formato ISO 8601. El valor predeterminado es de una hora.

"actions": {
   "myUntilLoopName": {
      "type": "Until",
      "actions": {
         "Create_new_resource": {
            "type": "Http",
            "inputs": {
               "body": {
                  "resourceId": "@triggerBody()"
               },
               "url": "https://domain.com/provisionResource/create-resource",
               "body": {
                  "resourceId": "@triggerBody()"
               }
            },
            "runAfter": {},
            "type": "ApiConnection"
         }
      },
      "expression": "@equals(triggerBody(), 'Completed')",
      "limit": {
         "count": 10,
         "timeout": "PT2H"
      },
      "runAfter": {}
   }
}

Pasos siguientes