Descrever um fluxo de trabalho dos Aplicativos Lógicos do Azure usando a linguagem de definição de fluxo de trabalho

Concluído

Você define a estrutura e o fluxo de trabalho de um Aplicativo Lógico do Azure usando um documento JSON. Este documento contém uma descrição JSON dos elementos que compõem o fluxo de trabalho de aplicativo lógico e é validado pelo esquema da Linguagem de Definição de Fluxo de Trabalho. A maneira mais fácil de explicar o esquema é examinar um fluxo de trabalho existente criado usando o designer de fluxo de trabalho no portal do Azure e depois exibir a descrição JSON desse aplicativo lógico.

No cenário de exemplo, é recomendável fornecer aos seus consultores fluxos de trabalho comuns, que eles podem adaptar às necessidades especificas das universidades com as quais eles trabalham. Convém facilitar o máximo possível a personalização e a implantação de cada fluxo de trabalho. Portanto, examine o código por trás do fluxo de trabalho, ou seja, o JSON da definição de fluxo de trabalho.

Designer de fluxo de trabalho

O designer de fluxo de trabalho permite criar e depurar o fluxo de trabalho de um aplicativo lógico graficamente. O designer também permite que os desenvolvedores examinem os bastidores de um fluxo de trabalho para ver como ele é implementado. A imagem a seguir mostra um exemplo de um fluxo de trabalho simples, que é disparado enviando uma solicitação HTTP GET a uma URL especificada. O resultado é retornado na resposta HTTP. Neste exemplo, o fluxo de trabalho está enviando de volta uma mensagem Olá, modelo de Aplicativos Lógicos!.

Diagram showing workflow designer overview.

Agora vamos examinar a linguagem da definição de fluxo de trabalho conforme usada pelo modelo JSON.

Visualização do código

A janela Modo de exibição de código mostra o documento JSON que descreve o fluxo de trabalho. No aplicativo de exemplo, o JSON tem a seguinte aparência:

{
    "definition": {
        "$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
        "actions": {
            "Response": {
                "inputs": {
                    "body": "Hello Azure Logic Apps Template!",
                    "statusCode": 200
                },
                "kind": "Http",
                "runAfter": {},
                "type": "Response"
            }
        },
        "contentVersion": "1.0.0.0",
        "outputs": {},
        "parameters": {},
        "triggers": {
            "manual": {
                "inputs": {
                    "method": "GET",
                    "schema": {}
                },
                "kind": "Http",
                "type": "Request"
            }
        }
    }
}

Observe as seções no escopo definition que estão relacionadas às ações e aos gatilhos mostrados no designer. Você pode editar o código JSON neste documento para refletir as alterações necessárias na funcionalidade do fluxo de trabalho de aplicativo lógico. Também é possível adicionar mais ações e especificar como a lógica no fluxo de trabalho é executada de uma ação para a próxima.

Seção de gatilhos

A seção de gatilhos contém a descrição do tipo de gatilho e como ele pode ser invocado. Neste exemplo, ele é um gatilho HTTP simples executado em resposta a uma solicitação HTTP GET.

"triggers": {
    "manual": {
        "inputs": {
            "method": "GET",
            "schema": {}
        },
        "kind": "Http",
        "type": "Request"
    }
}

Um gatilho deve incluir os seguintes elementos:

  • um nome exclusivo dentro do fluxo de trabalho. No exemplo anterior, o nome padrão do gatilho é manual, mas você pode substituir o nome padrão por um identificador mais significativo.

  • o tipo de gatilho. O tipo indica o evento que faz o gatilho ser executado. Um gatilho Solicitação é executado em resposta a uma solicitação HTTP. Outros tipos de gatilho disponíveis incluem:

    • Recurrence para criar um gatilho executado de acordo com um agendamento recorrente.

    • HttpWebhook para escutar eventos em um ponto de extremidade.

    • ApiConnection para responder a eventos disparados por outros serviços do Azure, como uma mensagem que chega em uma fila de mensagens, um email e assim por diante. O tipo de gatilho ApiConnection é generalizado, e você especifica mais detalhes que indicam o tipo do serviço e quaisquer informações de conexão necessárias.

  • A seção de entradas. Essa seção especifica os dados que definem o comportamento do gatilho. Para um gatilho Request, o método indica o tipo de solicitação HTTP que faz o gatilho ser executado. Para um gatilho ApiConnection, a seção de entradas contém informações sobre como conectar-se ao recurso que dispara o evento (uma cadeia de conexão da fila de mensagens, por exemplo). Se ele for um gatilho Request, a seção de esquema da definição de entrada especificará o esquema com o qual o conteúdo do corpo da solicitação deve estar em conformidade. As solicitações HTTP GET não têm um corpo da solicitação; portanto, o esquema está vazio no exemplo anterior.

O exemplo a seguir mostra a definição de outro gatilho Request que inicia um fluxo de trabalho e recebe solicitações HTTP POST. Normalmente, uma solicitação POST fornece um corpo da solicitação, que contém os dados a serem postados. O corpo da solicitação neste exemplo contém o nome e o endereço de um cliente, o que abrange a rua e a cidade.

"mypostrequest": {
   "type": "Request",
   "kind": "Http",
   "inputs": {
      "method": "POST",
      "schema": {
         "type": "object",
         "properties": {
            "customerName": {
               "type": "String"
            },
            "customerAddress": { 
               "type": "Object",
               "properties": {
                  "streetAddress": {
                     "type": "string"
                  },
                  "city": {
                     "type": "string"
                  }
               }
            }
         }
      }
   }
}

Um gatilho também pode especificar condições. O gatilho só será disparado se essas condições forem atendidas. Você define condições em uma seção de condições opcional. Por exemplo, será conveniente executar o gatilho mypostrequest (mostrado no exemplo anterior) apenas se o corpo da solicitação especificar uma cidade de Nova York:

"mypostrequest": {
   "type": "Request",
   "kind": "Http",
   "inputs": {
      ...
   }
   "conditions": [
      {
        "expression": "@equals(triggerOutputs()['body']['customerAddress']['city'], 'New York')"
      }
   ]
}

Seção de ações

A seção de ações de um Aplicativo Lógico define a lógica e a estrutura do fluxo de trabalho. Ela contém uma série de itens de ação. Um item de ação é um bloco de construção básico para construir fluxos de trabalho. Os itens de ação aceitam entradas e produzem saídas, que são passadas para o próximo item de ação no fluxo de trabalho. A seguinte tabela lista diferentes tipos de ação disponíveis:

Item de ação Descrição
ApiConnection Envia uma solicitação HTTP a um serviço específico. Esse tipo de ação permite integrar um fluxo de trabalho de aplicativo lógico a recursos do Azure, como o Barramento de Serviço do Azure e a Grade de Eventos do Azure, entre outras. A ação requer entradas que incluem uma cadeia de conexão para acessar o serviço e quaisquer informações e parâmetros adicionais necessários para invocá-lo.
Redigir Combina várias entradas e expressões em uma única saída.
Função Permite que você chame uma Função do Azure.
HTTP Envia uma solicitação HTTP a um ponto de extremidade HTTP, não a um serviço do Azure.
Unir Usa uma matriz de itens de dados como entrada e gera uma cadeia de caracteres que contém esses itens separados por um delimitador especificado.
Analisar Analisa um documento JSON em um conjunto de tokens, usando um esquema especificado.
Consulta Filtra os itens em uma matriz de entrada usando uma condição especificada.
Resposta Cria uma resposta para uma solicitação HTTP.
Tabela Gera uma tabela HTML com base em uma matriz de objetos JSON.
Encerrar Cancela um fluxo de trabalho imediatamente.
Aguardar Pausa o fluxo de trabalho durante um intervalo especificado ou até atingir o tempo limite.
Fluxo de trabalho Executa outro fluxo de trabalho de aplicativo lógico.
Condição Um conjunto de tipos de ação (Foreach, If, Switch e Until) que permite implementar o fluxo de controle programático em um fluxo de trabalho. É possível iterar por meio dos itens em uma coleção, tomar decisões com base nos valores de parâmetros de entrada e fazer um loop até que algumas condições sejam atendidas.
InitializeVariable,
IncrementVariable,
DecrementVariable,
e SetVariable
Define, inicializa, atribui e modifica variáveis que podem ser passadas entre itens de ação em um fluxo de trabalho.

Como um gatilho, cada ação deve ter um nome exclusivo no fluxo de trabalho. No exemplo a seguir, o nome da ação padrão é Response, mas você pode usar um identificador válido e mais significativo. Uma ação deve ter uma seção de entradas que especifica os dados no qual a ação funciona. Na ação Response, você pode especificar os dados para que uma expressão seja retornada na mensagem de resposta, juntamente com um código de status HTTP.

Em nossa definição de fluxo de trabalho básico, a ação gera uma resposta HTTP em que o corpo é uma mensagem curta.

"actions": {
    "Response": {
        "inputs": {
            "body": "Hello Azure Logic Apps Template!",
            "statusCode": 200
        },
        "kind": "Http",
        "runAfter": {},
        "type": "Response"
    }
}

A seção runAfter indica o local em que a ação é executada na sequência de fluxo de trabalho. No exemplo anterior, há apenas uma ação individual; portanto, ela sempre é executada quando o gatilho é disparado. Se o fluxo de trabalho tivesse várias ações, você poderia especificar o nome de uma ação e um status para essa ação nesta seção. A ação será executada se a ação runAfter for concluída com o status especificado. O código a seguir mostra um exemplo. A ação mySecondAction será executada após myFirstAction, mas somente se myFirstAction terminar com um status de "Êxito":

"actions": {
    "mySecondAction": {
        "inputs": {
            ...
        },
        "runAfter": {
            "myFirstAction": [
                "Succeeded"
            ]
        },
        "type": ...
    },
    "myFirstAction": {
        "inputs": {
            ...
        },
        "runAfter": {},
        "type": ...
    }
}

Seção de saídas

Use a seção de saídas para definir os dados que seu fluxo de trabalho pode retornar quando ele concluir sua execução. Você pode acompanhar um status ou dados específicos para cada execução do fluxo de trabalho. É possível examinar a saída de cada execução de um fluxo de trabalho usando o histórico de execuções dos Aplicativos Lógicos do Azure, disponível no portal do Azure ou na API REST do fluxo de trabalho.

O formato da seção de saídas tem a seguinte aparência:

"outputs": {
  "<key-name>": {
    "type": "<key-type>",
    "value": "<key-value>"
  }
}

Expressões de fluxo de trabalho

É possível usar uma expressão de fluxo de trabalho em vez de um valor, uma variável ou uma constante fixa. Também é possível colocar uma expressão em qualquer lugar em um valor de cadeia de caracteres JSON, inserindo um prefixo na expressão com o sinal de @ (arroba). Por exemplo, é possível usar a função @parameters em uma expressão para recuperar o valor de um parâmetro nomeado (os parâmetros são descritos na próxima seção).

"customerFullName": "Bill Frost",
"accountName": "@parameters('customerName')"

Os Aplicativos Lógicos do Azure fornecem um funções internas que podem ser usadas para criar expressões complexas:

  • Funções da cadeia de caracteres: Para concatenar ou dividir cadeias de caracteres, converter caracteres entre minúsculas e maiúsculas e pesquisar subcadeias de caracteres.
  • Funções de coleção: Para detectar se uma coleção contém itens que correspondem a um padrão específico, recuperar itens de uma coleção e combinar coleções.
  • Funções de comparação lógica: Para detectar se os operandos são iguais, diferentes, numericamente maiores ou numericamente menores do que os outros.
  • Funções de conversão: Para alterar o tipo ou o formato dos dados.
  • Funções matemáticas: Tais como add, sub, dive mul, além de várias outras.
  • Funções de data e hora: Para analisar e processar datas e horas.
  • Função do fluxo de trabalho: Para recuperar informações sobre os dados passados para uma ação de fluxo de trabalho. Por exemplo, a função de parâmetro (mostrada anteriormente) efetua fetch do valor de um parâmetro nomeado, e a função de corpo (mostrada anteriormente) retorna os dados que estão sendo gerados por uma ação.
  • Funções de manipulação JSON e XML: Para analisar e processar documentos JSON e XML.

É possível definir variáveis na seção de entradas de uma ação InitializeVariable e manipular essas variáveis usando expressões. Você lê o valor de uma variável usando a função de variáveis. O exemplo a seguir usa uma ação InitializeVariable para criar uma variável de inteiro chamada myIntegerVariable e inicializá-la em 99. Este exemplo também mostra uma ação Condition com o tipo If. A condição usa uma expressão para testar o valor da variável myIntegerVariable e, se corresponder ao valor 100, a condição usará uma ação HTTP para realizar uma solicitação GET.

"actions": {
    "Condition": {
        "actions": {
            "HTTP": {
                "inputs": {
                    "method": "GET",
                    "uri": "http://dummyurl.com"
                },
                "runAfter": {},
                "type": "Http"
            }
        },
        "expression": {
            "equals": [
                "@variables('myIntegerVariable')",
                100
            ]
        }        ,
        "runAfter": {
            "Initialize": [
                "Succeeded"
            ]
        },
        "type": "If"
    },
    "Initialize": {
        "inputs": {
            "variables": [
                {
                    "name": "myIntegerVariable",
                    "type": "Integer",
                    "value": 99
                }
            ]
        },
        "runAfter": {},
        "type": "InitializeVariable"
    }
}

Seção Parâmetros

A seção de parâmetros permite que você parametrize um fluxo de trabalho. Em runtime, é possível fornecer valores para cada um desses parâmetros. Você pode referenciar os parâmetros em qualquer lugar no fluxo de trabalho em que você possa usar uma constante ou uma expressão.

Adicione uma definição de parâmetros com um valor padrão. O valor padrão é usado se você não fornece um valor para o parâmetro em runtime. O exemplo a seguir mostra como definir um parâmetro chamado cityParam. O parâmetro é usado dentro da condição para a ação mypostrequest. Ele executará a ação somente se o documento de solicitação contiver uma cidade que corresponda ao valor do parâmetro. O valor de parâmetro padrão é Nova York:


    "definition": {
        "$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
        "actions": {
            ...
        },
        "contentVersion": "1.0.0.0",
        "outputs": {},
        "parameters": {
            "cityParam": {
                "defaultValue": "New York",
                "type": "String"
            }
        },
        "triggers": {
            "mypostrequest": {
                "conditions": [
                    {
                        "expression": "@equals(triggerOutputs()['body']['customerAddress']['city'], parameters('cityParam'))"
                    }
                ],
                "inputs": {
                    ...
                },
                "kind": "Http",
                "type": "Request"
            }
        }
    }
}

Verificar seus conhecimentos

1.

Você deseja que o fluxo de trabalho dos Aplicativos Lógicos do Azure seja executado a cada três minutos. Em qual das seguintes seções da definição de fluxo de trabalho você definiria esse comportamento recorrente?

2.

Em qual seção de uma definição de fluxo de trabalho você pode enviar uma resposta para uma solicitação HTTP que retorna o corpo da mensagem, o código de status e os cabeçalhos da mensagem?

3.

Em qual seção da definição de fluxo de trabalho você especifica um valor a ser retornado após a conclusão de um fluxo de trabalho?