Published on

August 1, 2023

Выполнение Logic Apps синхронно в Azure Data Factory

Проблема: У вас есть Logic App, созданный в портале Azure, и вам нужно вызвать его из конвейера Azure Data Factory. Однако, когда вы вызываете Logic App с помощью действия Web Activity, он выполняется асинхронно, что означает, что задача завершается немедленно. Вы хотели бы, чтобы задача ожидала завершения Logic App. Возможно ли это в Azure Data Factory?

Решение: В Azure Data Factory есть два метода запуска Logic App из конвейера: действие Web Activity или недавно введенное действие Webhook Activity. В этой статье мы рассмотрим, как использовать эти действия для выполнения Logic App синхронно.

Использование действия Web Activity

Чтобы действие Web Activity работало синхронно, нам нужно изменить Logic App. Мы должны добавить HTTP-ответ после отправки электронной почты. Это можно найти в разделе Request connector. По умолчанию ответ будет иметь код состояния 200, что означает OK. Мы также можем добавить другой ответ с другим кодом состояния, чтобы указать на ошибку. Если этот ответ возвращается в действие Web Activity, конвейер ADF завершится с ошибкой. С помощью настройки “run after” мы можем убедиться, что действие выполняется только в случае ошибки предыдущего действия.

Вот пример конфигурации Logic App:


{
  "triggers": {
    "recurrence": {
      "type": "recurrence",
      "recurrence": {
        "frequency": "Minute",
        "interval": 1
      }
    }
  },
  "actions": {
    "sendMail": {
      "type": "ApiConnection",
      "inputs": {
        "host": {
          "connection": {
            "name": "@parameters('$connections')['office365']['connectionId']"
          }
        },
        "method": "post",
        "body": {
          "to": "example@example.com",
          "subject": "Test email",
          "body": "This is a test email."
        },
        "path": "/v2/Mail"
      },
      "runAfter": {},
      "metadata": {
        "flowSystemMetadata": {
          "swaggerOperationId": "SendEmail"
        }
      }
    },
    "httpResponse": {
      "type": "Response",
      "inputs": {
        "statusCode": 200,
        "headers": {
          "Content-Type": "application/json"
        }
      },
      "runAfter": {
        "sendMail": [
          "Succeeded"
        ]
      }
    },
    "httpResponseFailed": {
      "type": "Response",
      "inputs": {
        "statusCode": 418,
        "headers": {
          "Content-Type": "application/json"
        }
      },
      "runAfter": {
        "sendMail": [
          "Failed"
        ]
      }
    }
  },
  "outputs": {}
}

Запустив конвейер, вы увидите, что действие Web Activity теперь выполняется синхронно. Если Logic App завершается с ошибкой, конвейер также завершится с ошибкой.

Использование действия Webhook Activity

Действие Webhook было недавно введено в качестве нового действия в конвейере ADF. Чтобы использовать его, нам нужно немного изменить исходный Logic App. Вместо использования запроса-ответа мы будем использовать сообщение HTTP POST на CallBackUri. После действия отправки почты мы добавляем новое действие HTTP с методом POST и URI, установленным на CallBackUri. Затем мы создаем конвейер с действием Webhook Activity и настраиваем его с URL-адресом триггера Logic App, методом POST и Content-Type, установленным на application/json в заголовках. Тело сообщения HTTP POST содержит параметры конвейера.

Вот пример конфигурации Logic App:


{
  "triggers": {
    "recurrence": {
      "type": "recurrence",
      "recurrence": {
        "frequency": "Minute",
        "interval": 1
      }
    }
  },
  "actions": {
    "sendMail": {
      "type": "ApiConnection",
      "inputs": {
        "host": {
          "connection": {
            "name": "@parameters('$connections')['office365']['connectionId']"
          }
        },
        "method": "post",
        "body": {
          "to": "example@example.com",
          "subject": "Test email",
          "body": "This is a test email."
        },
        "path": "/v2/Mail"
      },
      "runAfter": {},
      "metadata": {
        "flowSystemMetadata": {
          "swaggerOperationId": "SendEmail"
        }
      }
    },
    "httpPost": {
      "type": "Http",
      "inputs": {
        "method": "POST",
        "uri": "@triggerBody().callBackUri",
        "headers": {
          "Content-Type": "application/json"
        },
        "body": {
          "DataFactoryName": "@{pipeline().DataFactory}",
          "PipelineName": "@{pipeline().Pipeline}",
          "Subject": "@{pipeline().parameters.Subject}",
          "ErrorMessage": "@{pipeline().parameters.ErrorMessage}",
          "EmailTo": "@pipeline().parameters.EmailTo"
        }
      },
      "runAfter": {
        "sendMail": [
          "Succeeded"
        ]
      }
    }
  },
  "outputs": {}
}

Запустив конвейер, вы увидите, что действие Webhook Activity выполняется синхронно, и продолжительность отображается правильно в конвейере ADF.

Вывод

В этой статье мы рассмотрели два разных метода выполнения Logic App синхронно из Azure Data Factory: использование действия Web Activity и действия Webhook Activity соответственно. В обоих случаях Logic App должен быть немного адаптирован для поддержки этого поведения. Однако настройка webhook требует только одного дополнительного действия, и продолжительность отображается правильно в конвейере ADF. Эти методы также могут быть применены к другим службам, использующим веб-хуки, таким как Azure Automation Runbooks.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.