Executar ações com base no status do grupo usando os escopos nos Aplicativos Lógicos do Azure
Aplica-se a: Aplicativos Lógicos do Azure (Consumo)
Para executar ações somente após um outro grupo de ações ter êxito ou falhar, agrupe essas ações em um escopo. Essa estrutura é útil quando deseja organizar ações como um grupo lógico, avaliar o status desse grupo e executar ações baseadas no status do escopo. Depois que todas as ações em um escopo concluem a execução, o escopo também obtém seu próprio status. Por exemplo, é possível usar escopos quando você quiser implementar tratamento de erro e exceção.
Para verificar o status de um escopo, é possível usar os mesmos critérios utilizados para determinar um status de execução de aplicativos lógicos, como Bem-sucedido, Com falha, Cancelado, e assim por diante. Por padrão, quando todas as ações do escopo são bem-sucedidas, o status do escopo é marcado como Bem-sucedido. Mas, quando qualquer ação no escopo apresenta falha ou é cancelada, o status do escopo é marcado como Com falha. Para limites nos escopos, consulte Limites e configurações.
Por exemplo, aqui é um aplicativo lógico de alto nível que usa um escopo para executar ações específicas e uma condição para verificar o status do escopo. Se uma ação no escopo falhar ou for encerrada inesperadamente, o escopo é marcado como Com falha ou Anulado, respectivamente, e o aplicativo lógico envia uma mensagem "Falha de escopo". Se todas as ações de escopo tiverem êxito, o aplicativo lógico envia uma mensagem "Escopo com êxito".
Pré-requisitos
Para seguir o exemplo neste artigo, é necessário estes itens:
Uma assinatura do Azure. Se você não tem uma assinatura, inscreva-se em uma conta gratuita do Azure.
Uma conta de email de qualquer provedor de email com suporte de Aplicativos Lógicos. Este exemplo usa Outlook.com. Se você utiliza um provedor diferente, o fluxo geral permanece o mesmo, mas sua interface do usuário aparece diferente.
Uma chave do Bing Mapas. Para obter essa chave, consulte Obter uma chave do Bing Mapas.
Conhecimento básico sobre aplicativos lógicos
Criar aplicativo lógico de exemplo
Primeiro, crie esse aplicativo lógico de exemplo para que seja possível adicionar um escopo posteriormente:
- Um gatilho Agenda - Recorrência que verifica o serviço Bing Mapas em um intervalo especificado
- Uma ação do Bing Mapas - Obter rota que verifica o tempo de viagem entre dois locais
- Uma ação condicional que verifica se o tempo de viagem excede o tempo de viagem especificado
- Uma ação que envia o email de que o tempo de viagem atual excede o tempo especificado
É possível salvar o aplicativo lógico a qualquer momento, portanto, salve seu trabalho frequentemente.
Entre no Portal do Azure, se você ainda não fez isso. Criar um aplicativo lógico em branco.
Adicione o gatilho Agenda - Recorrência com estas configurações: Intervalo = "1" e Frequência = "Minuto"
Dica
Para simplificar visualmente a exibição e ocultar os detalhes de cada ação no designer, recolha a forma de cada ação na medida em que você progride através dessas etapas.
Adicione a ação Bing Mapas - Obter rota.
Se você ainda não tiver uma conexão do Bing Mapas, a criação será solicitada.
Configuração Valor Descrição Nome da conexão BingMapsConnection Forneça um nome para a conexão. Chave de API <your-Bing-Maps-key> Insira a chave do Bing Mapas que você recebeu anteriormente. Configure a ação Obter rota, conforme mostrado na tabela abaixo da imagem:
Para saber mais sobre esses parâmetros, consulte Calcular uma rota.
Configuração Valor Descrição Localizador 1 <iniciar> Insira a origem da rota. Localizador 2 <finalizar> Insira o destino da rota. Evitar Nenhum Insira os itens a serem evitados na rota, como rodovias, pedágios, e assim por diante. Para possíveis valores, consulte Calcular uma rota. Otimizar timeWithTraffic Selecione um parâmetro para otimizar a rota, como distância, tempo com informações de trânsito atuais, e assim por diante. Esse exemplo usa este valor: "timeWithTraffic" Unidades de distância <your-preference> Insira a unidade de distância para calcular a rota. Esse exemplo usa o seguinte valor: "Milha" Modo de navegação Automóvel Insira o modo de viagem para a rota. Esse exemplo usa este valor "Automóvel" Data /Hora de trânsito Nenhum Aplica-se apenas ao modo de trânsito. Tipo de data de trânsito Nenhum Aplica-se apenas ao modo de trânsito.
Adicione uma condição que verifique se o tempo de viagem atual com tráfego excede um tempo especificado. Neste exemplo, siga estas etapas:
Renomeie a condição com esta descrição: Se o tempo de tráfego for maior do que o tempo especificado
Na coluna mais à esquerda, selecione dentro da caixa Escolher um valor para que a lista de conteúdo dinâmico seja exibida. A partir dessa lista, selecione o campo Tráfego de Duração de Viagem, que está em segundos.
Na caixa do meio, selecione este operador: é maior que
Na coluna mais à direita, insira esse valor de comparação, que é em segundos e equivalente a 10 minutos: 600
Ao concluir, a sua condição será semelhante a este exemplo:
Na ramificação Verdadeiro, adicione uma ação de "enviar email" para seu provedor de email. Configure esta ação seguindo as etapas abaixo desta imagem:
No campo Para, insira seu endereço de e-mail para fins de teste.
No assunto, insira este texto:
Time to leave: Traffic more than 10 minutes
- No corpo, insira este texto com um espaço à direita:
Travel time:
Enquanto o cursor aparecer no campo Corpo, a lista de conteúdo dinâmico permanecerá aberta para que você possa selecionar os parâmetros disponíveis neste ponto.
Na lista de conteúdo dinâmico, selecione Expressão.
Localizar e selecionar a função div( ) . Coloque o cursor no dentro dos parênteses da função.
Enquanto o cursor estiver dentro dos parênteses da função, selecione Conteúdo dinâmico para que a lista de conteúdo dinâmico seja exibida.
Na seção Obter rota, selecione o campo Traffic Duration Traffic.
Depois que o campo resolver o formato JSON, adicione uma vírgula (
,
) seguida do número60
para converter o valor no Tráfego de Duração do Tráfego de segundos para minutos.div(body('Get_route')?['travelDurationTraffic'],60)
A expressão agora é semelhante a este exemplo:
Quando terminar, selecione OK.
Depois que a expressão for resolvida, adicione este texto com um espaço à esquerda:
minutes
O campo Corpo agora é semelhante a este exemplo:
Salve seu aplicativo lógico.
Em seguida, adicione um escopo para que seja possível agrupar ações específicas e avaliar os respectivos status.
Adicionar um escopo
Caso ainda não tenha feito isso, abra seu aplicativo lógico no Designer de Fluxo de Trabalho.
Adicione um escopo na localização do fluxo de trabalho desejado. Por exemplo, para adicionar um escopo entre etapas existentes no fluxo de trabalho de aplicativo lógico, siga estas etapas:
Mova o ponteiro sobre a seta onde você deseja adicionar o escopo. Selecione o sinal de adição (+) >Adicionar uma ação.
Na caixa de pesquisa, insira "escopo" como filtro. Selecione a ação escopo.
Adicionar etapas ao escopo
Agora, adicione as etapas ou arraste as etapas existentes que deseja executar dentro do escopo. Para esse exemplo, arraste estas ações para o escopo:
- Obter rota
- Se o tempo de tráfego for maior que o tempo especificado, o que inclui os ramos verdadeiro e falso
O aplicativo lógico agora é semelhante a este exemplo:
No escopo, adicione uma condição que verifica o status do escopo. Renomeie a condição com esta descrição: Se o escopo falhou
Na condição, adicione essas expressões que verificam se o status do osciloscópio é igual a "Falhou" ou "Anulado".
Para adicionar outra linha, selecione Adicionar.
Em cada linha, selecione dentro da caixa à esquerda para que apareça a lista de conteúdo dinâmica. Na lista de conteúdo dinâmico, selecione Expressão. Na caixa de edição, digite esta expressão e, em seguida, selecione OK:
action('Scope')
Para ambas as linhas, selecione é igual a como o operador.
Para os valores de comparação, na primeira linha, insira
Failed
. Na segunda linha, digiteAborted
.Ao concluir, a sua condição será semelhante a este exemplo:
Agora, defina a propriedade
runAfter
da condição para que a condição verifique o status do escopo e execute a ação correspondente que você define nas etapas posteriores.Na condição Se o escopo falhar, selecione o botão reticências (...) e, em seguida, selecione Configurar execução após.
Selecione todos esses status do escopo: for bem-sucedida, falhou, será ignorado, e foi atingido
Quando tiver terminado, selecione Concluído. A condição agora mostra um ícone de "informações".
Nas ramificaçõesVerdadeiro e Falso, adicione as ações que você deseja executar com base em cada status do escopo, por exemplo, enviar um email ou uma mensagem.
Salve seu aplicativo lógico.
Seu aplicativo lógico concluído agora se parece com este exemplo:
Teste o trabalho
Na barra de ferramentas do designer, selecione Executar>Executar. Se todas as ações com escopo tiverem êxito, você receberá uma mensagem "Escopo com êxito". Se alguma ação de escopo não tiver êxito, você receberá uma mensagem "Escopo com falha".
Definição JSON
Se você estiver trabalhando na exibição de código, será possível definir uma estrutura de escopo na definição JSON do aplicativo lógico. Por exemplo, aqui é a definição JSON para gatilho e ações no aplicativo lógico anterior:
"triggers": {
"Recurrence": {
"type": "Recurrence",
"recurrence": {
"frequency": "Minute",
"interval": 1
}
}
}
"actions": {
"If_scope_failed": {
"type": "If",
"actions": {
"Scope_failed": {
"type": "ApiConnection",
"inputs": {
"body": {
"Body": "Scope failed. Scope status: @{action('Scope')}",
"Subject": "Scope failed",
"To": "<your-email@domain.com>"
},
"host": {
"connection": {
"name": "@parameters('$connections')['outlook']['connectionId']"
}
},
"method": "post",
"path": "/Mail"
},
"runAfter": {}
}
},
"else": {
"actions": {
"Scope_succeded": {
"type": "ApiConnection",
"inputs": {
"body": {
"Body": "Scope succeeded. Scope status: @{action('Scope')}",
"Subject": "Scope succeeded",
"To": "<your-email@domain.com>"
},
"host": {
"connection": {
"name": "@parameters('$connections')['outlook']['connectionId']"
}
},
"method": "post",
"path": "/Mail"
},
"runAfter": {}
}
}
},
"expression": {
"or": [
{
"equals": [
"@action('Scope')",
"Failed"
]
},
{
"equals": [
"@action('Scope')",
"Aborted"
]
}
]
},
"runAfter": {
"Scope": [
"Failed",
"Skipped",
"Succeeded",
"TimedOut"
]
}
},
"Scope": {
"type": "Scope",
"actions": {
"Get_route": {
"type": "ApiConnection",
"inputs": {
"host": {
"connection": {
"name": "@parameters('$connections')['bingmaps']['connectionId']"
}
},
"method": "get",
"path": "/REST/V1/Routes/Driving",
"queries": {
"distanceUnit": "Mile",
"optimize": "timeWithTraffic",
"travelMode": "Driving",
"wp.0": "<start>",
"wp.1": "<end>"
}
},
"runAfter": {}
},
"If_traffic_time_is_more_than_specified_time": {
"type": "If",
"actions": {
"Send_mail_when_traffic_exceeds_10_minutes": {
"type": "ApiConnection",
"inputs": {
"body": {
"Body": "Travel time:@{div(body('Get_route')?['travelDurationTraffic'],60)} minutes",
"Subject": "Time to leave: Traffic more than 10 minutes",
"To": "<your-email@domain.com>"
},
"host": {
"connection": {
"name": "@parameters('$connections')['outlook']['connectionId']"
}
},
"method": "post",
"path": "/Mail"
},
"runAfter": {}
}
},
"expression": {
"and" : [
{
"greater": [
"@body('Get_route')?['travelDurationTraffic']",
600
]
}
]
},
"runAfter": {
"Get_route": [
"Succeeded"
]
}
}
},
"runAfter": {}
}
},