Создание циклов для повторения действий в рабочих процессах с помощью Azure Logic Apps

Область применения: Azure Logic Apps (Потребление + Стандартный)

Azure Logic Apps включает следующие действия цикла, которые можно использовать в рабочем процессе:

  • Чтобы повторить одно или несколько действий по элементам в массиве, добавьте каждое действие в рабочий процесс.

    Кроме того, если у вас есть триггер, который получает массив и требуется выполнить итерацию для каждого элемента массива, можно распутать этот массив с помощью свойства триггера SplitOn.

  • Чтобы повторить одно или несколько действий до тех пор, пока условие не будет выполнено или не изменится состояние, добавьте действие "Пока" в рабочий процесс.

    Рабочий процесс сначала выполняет все действия внутри цикла, а затем проверка условие или состояние. Если условие выполнено, цикл прекращается. В противном случае он повторяется. Ограничения по умолчанию и максимальное количество циклов до тех пор, которые может иметь рабочий процесс, см. в разделе "Параллелизм", "Циклирование" и "Обсуждение".

Необходимые компоненты

Для каждого

Каждое действие работает только на массивах и повторяет одно или несколько действий для каждого элемента в массиве. В следующем списке содержатся некоторые рекомендации по использованию каждого действия:

  • Каждое действие может обрабатывать ограниченное количество элементов массива. Сведения об этом ограничении см. в статье Ограничения параллелизма, зацикливания и индивидуальной обработки.

  • По умолчанию циклы или итерации в каждом действии выполняются одновременно параллельно.

    Этим данный цикл отличается от цикла Power Automate Применить к каждому, где итерации выполняются поодиночке (последовательно). Однако вы можете настроить последовательные итерации для каждой итерации. Например, если вы хотите приостановить следующую итерацию в каждом действии с помощью действия "Задержка", необходимо настроить каждую итерацию для последовательного выполнения.

    В качестве исключения для поведения по умолчанию вложенные итерации каждого действия всегда выполняются последовательно, а не параллельно. Для параллельного выполнения операций для элементов в вложенном цикле создайте и вызовите рабочий процесс дочернего приложения логики.

  • Чтобы получить прогнозируемые результаты из операций с переменными во время каждой итерации, выполните итерации последовательно. Например, когда параллельно выполняется итерация, переменная добавочного увеличения, переменная декремента и добавление к операциям с переменными возвращают прогнозируемые результаты. Однако во время каждой итерации в параллельно выполняющемся цикле эти операции могут возвращать непредсказуемые результаты.

  • Действия в каждом цикле используют item() функцию для ссылки и обработки каждого элемента в массиве. Если указать данные, которые не в массиве, рабочий процесс завершается сбоем.

В следующем примере рабочий процесс отправляет ежедневную сводку по RSS-каналу веб-сайта. Рабочий процесс использует для каждого действия, которое отправляет сообщение электронной почты для каждого нового элемента.

В зависимости от того, есть ли у вас рабочий процесс "Потребление" или "Стандартный", выполните соответствующие действия.

  1. В портал Azure создайте пример рабочего процесса приложения логики потребления, выполнив следующие действия в указанном порядке:

  2. Выполните те же общие действия , чтобы добавить каждое действие между триггером RSS и отправкой действия электронной почты в рабочем процессе.

  3. Теперь создайте цикл:

    1. Выберите внутри поля "Выбор выходных данных" из предыдущего шага , чтобы открыть динамический список содержимого.

    2. В списке "Добавление динамического содержимого" в разделе "Когда элемент веб-канала опубликован" выберите ссылки веб-канала, которые являются выходными данными массива из триггера RSS.

      Примечание.

      Если выходные данные канала не отображаются, рядом с меткой раздела триггера нажмите кнопку "Дополнительные сведения". В списке динамического содержимого можно выбрать только выходные данные из предыдущих шагов.

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

      После завершения выводятся выходные данные выбранного массива, как показано в следующем примере:

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

    3. Чтобы выполнить существующее действие для каждого элемента массива, перетащите действие "Отправить сообщение электронной почты" в каждый цикл.

      Теперь рабочий процесс выглядит следующим образом:

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

  4. Закончив работу, сохраните свой рабочий процесс.

  5. Чтобы вручную протестировать рабочий процесс, на панели инструментов конструктора нажмите кнопку "Запустить триггер>".

Для каждого определения действия (JSON)

Если вы работаете в представлении кода, можно определить For_each действие в определении JSON рабочего процесса, например:

"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"
   }
},

Для каждого: последовательное выполнение

По умолчанию итерации в каждом цикле выполняются одновременно параллельно. Однако при наличии вложенных циклов или переменных внутри циклов, в которых ожидаются прогнозируемые результаты, необходимо выполнять эти циклы одновременно или последовательно.

  1. В правом верхнем углу каждого действия выберите многоточие (...) >Параметры.

  2. В разделе "Элемент управления параллелизмом" измените параметр " Выкл ." на "Вкл.

  3. Переместите ползунок "Степень параллелизма" на 1 и нажмите кнопку "Готово".

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

Для каждого определения действия (JSON): последовательное выполнение

Если вы работаете в представлении кода с For_each действием в определении JSON рабочего процесса, можно использовать Sequential этот параметр operationOptions , например:

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

До условия

Действие "Пока " выполняется и повторяет одно или несколько действий до тех пор, пока не будет выполнено требуемое условие. Если условие выполнено, цикл прекращается. В противном случае он повторяется. Значения по умолчанию и максимальные ограничения на количество действий или итераций, которые может иметь рабочий процесс, см. в разделе "Параллелизм", "Циклирование" и "Обсуждение".

В следующем списке содержатся некоторые распространенные сценарии, в которых можно использовать действие "До" :

  • Вызов конечной точки до получения нужного ответа.

  • Создание записи в базе данных. Подождите, пока определенное поле этой записи не будет утверждено. Продолжайте обработку.

В следующем примере рабочего процесса, начиная с 8:00 утра каждый день, действие "Пока " увеличивает переменную, пока значение переменной не равно 10. Затем рабочий процесс отправляет сообщение электронной почты, которое подтверждает текущее значение.

Примечание.

В этом примере используется Office 365 Outlook, но вы можете использовать любой поставщик электронной почты, поддерживаемый Azure Logic Apps. Если используется другая учетная запись электронной почты, общие шаги остаются неизменными, однако интерфейс может выглядеть несколько иначе.

  1. В портал Azure создайте ресурс приложения логики потребления с пустым рабочим процессом.

  2. В конструкторе выполните следующие общие действия, чтобы добавить встроенный триггер повторения с именем Schedule в рабочий процесс.

  3. В триггере повторения укажите интервал, частоту и час дня для срабатывания триггера.

    Свойство Значение
    Интервал 1
    Периодичность Day
    В эти часы 8

    Чтобы добавить параметр "В эти часы", откройте список "Добавить новый параметр" и выберите "В эти часы", которое отображается только после заданиячастоты в день.

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

    После завершения триггер повторения выглядит следующим образом:

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

  4. В триггере выполните следующие общие действия, чтобы добавить встроенные действия переменных с именем Initialize переменной в рабочий процесс.

  5. В действии инициализации переменной укажите следующие значения:

    Свойство Значение Описание
    Имя Лимит Имя переменной
    Тип Целое число Тип данных переменной
    Value 0 Начальное значение переменной

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

  6. В действии инициализации переменной выполните следующие общие действия, чтобы добавить встроенное действие Control с именем "Пока" в рабочий процесс.

  7. В действии "Пока" укажите следующие значения, чтобы настроить условие остановки для цикла.

    1. Выберите в левом поле " Выбрать значение", которое автоматически открывает список динамического содержимого.

    2. В списке в разделе "Переменные" выберите переменную с именем Limit.

    3. В списке средних операторов выберите оператор равным .

    4. В правом поле с именем "Выбор значения" введите 10 в качестве значения сравнения.

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

  8. В действии "Пока" выберите " Добавить действие".

  9. В поле поиска по выбору операции выполните следующие общие действия, чтобы добавить встроенные действия переменных с именем Increment в действие "До".

  10. В действии добавочной переменной укажите следующие значения, чтобы увеличить значение переменнойLimit на 1:

    Свойство Значение
    Имя Выберите переменную Limit.
    Value 1

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

  11. Вне и в разделе "Пока " выполните следующие общие действия, чтобы добавить действие, которое отправляет сообщение электронной почты.

    В этом примере продолжается действие Office 365 Outlook с именем "Отправить сообщение электронной почты".

  12. В действии электронной почты укажите следующие значения:

    Свойство Значение Описание
    Кому <email-address@domain> Адрес электронной почты получателя. Для тестировании используйте свой адрес электронной почты.
    Тема Текущее значение переменной "Limit" равно:Limit Тема электронной почты. В этом примере убедитесь, что вы включили переменную Limit , чтобы убедиться, что текущее значение соответствует указанному условию:

    1. Выберите внутри поля "Тема", чтобы появится список динамического содержимого.

    2. В списке динамического содержимого рядом с заголовком раздела "Переменные " выберите "Дополнительные сведения".

    3. Выберите предел.
    Текст <email-content> Содержимое сообщения электронной почты, которое вы хотите отправить. В этом примере введите любой нужный текст.

    Когда вы закончите, действие электронной почты выглядит примерно так:

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

  13. Сохраните результаты своих действий.

Тестирование рабочего процесса

Чтобы вручную протестировать рабочий процесс приложения логики, выполните действия, основанные на наличии приложения логики "Потребление" или "Стандартный".

На панели инструментов конструктора выберите запуск триггера>.

После запуска рабочего процесса вы получите сообщение электронной почты с указанным содержимым:

Screenshot shows sample email received from example workflow.

Предотвращение бесконечных циклов

Действие "Пока не остановится" на основе следующих свойств, которые можно просмотреть, выбрав "Изменить ограничения " в действии. Убедитесь, что эти значения свойств заданы соответствующим образом:

Свойство Описание
Численность Максимальное количество итерации, выполняемых перед выходом цикла.

Ограничения по умолчанию и максимальное количество действий до тех пор, которые может иметь рабочий процесс, см. в разделе "Параллелизм", "Циклирование" и "Обсуждение".
Время ожидания Максимальное время выполнения действия "Пока ", включая все итерации, выполняется перед выходом цикла. Это значение указывается в формате ISO 8601 и вычисляется для каждой итерации.

Если любое действие в цикле занимает больше времени ожидания, текущая итерация не останавливается. Однако следующая итерация не запускается, так как выполняется условие ограничения времени ожидания.

Заданные по умолчанию и максимальные ограничения для значения Время ожидания см. в статье Ограничения параллелизма, зацикливания и индивидуальной обработки.

Определение цикла until (JSON)

Если вы работаете в представлении кода, можно определить Until действие в определении JSON рабочего процесса, например:

"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"
         ]
      }
   }
}

В этом примере цикл "Пока" вызывает конечную точку HTTP, которая создает ресурс. Цикл останавливается, когда HTTP-ответ возвращается с состоянием Completed в тексте. Чтобы предотвратить бесконечные циклы, цикл также останавливается, если произойдет любое из следующих условий:

  • Цикл выполнялся 10 раз, как указано в атрибуте count. Значение по умолчанию — 60 раз.

  • Цикл выполнялся в течение двух часов, как указано в атрибуте timeout в формате ISO 8601. Значение по умолчанию — один час.

"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": {}
   }
}

Следующие шаги