Ejecución de acciones basadas en el estado del grupo mediante ámbitos en Azure Logic Apps
Se aplica a: Azure Logic Apps (consumo)
Para ejecutar acciones solo después de que otro grupo de acciones se haya realizado correctamente o con errores, ponga esas acciones en un ámbito. Esta estructura es útil cuando desea organizar acciones como un grupo lógico, evaluar el estado del grupo y realizar acciones basadas en el estado del ámbito. Una vez que todas las acciones de un ámbito acaben de ejecutarse, el ámbito obtiene también su propio estado. Por ejemplo, puede usar ámbitos cuando desea implementar el control de errores y excepciones.
Para comprobar el estado del ámbito, puede usar los mismos criterios que para determinar el estado de ejecución de una aplicación lógica, por ejemplo, Correcto, Error, Cancelado, etc. De forma predeterminada, cuando las acciones del ámbito se ejecutan correctamente, el estado del ámbito se marca como Correcto. Sin embargo, si cualquier acción en el ámbito genera un error o se cancela, el estado del ámbito se marca como Error. Para conocer los límites en los ámbitos, consulte Límites y configuración.
Por ejemplo, aquí hay una aplicación lógica de alto nivel que utiliza un ámbito para ejecutar acciones específicas y una condición para comprobar el estado del ámbito. Si una acción del ámbito genera un error o finaliza inesperadamente, el ámbito se marca como Error o Anulado respectivamente, y la aplicación lógica envía un mensaje de error de ámbito. Si todas las acciones del ámbito se realizan correctamente, la aplicación lógica enviará un mensaje de "Scope succeeded" (El ámbito se realizó correctamente).
Requisitos previos
Para seguir el ejemplo de este artículo, necesita estos elementos:
Suscripción a Azure. Si aún no tiene una, regístrese para obtener una cuenta de Azure gratuita.
Una cuenta de correo electrónico de cualquier proveedor de correo electrónico compatible con Logic Apps. Este ejemplo utiliza Outlook.com. Si utiliza un proveedor diferente, el flujo general sigue siendo el mismo, pero la interfaz de usuario es diferente.
Una clave de Mapas de Bing. Para obtener esta clave, consulte cómo obtener una clave de Mapas de Bing.
Conocimientos básicos sobre aplicaciones lógicas.
Creación de una aplicación lógica de ejemplo
En primer lugar, cree esta aplicación lógica de ejemplo para que pueda agregar un ámbito después:
- Un desencadenador Programación: Periodicidad que comprueba el servicio Mapas de Bing en un intervalo que puede especificar
- Una acción Bing Maps - Get route (Mapas de Bing: Obtener ruta) que comprueba el tiempo de viaje entre dos ubicaciones
- Una acción de condición que comprueba si el tiempo de viaje supera el tiempo de viaje especificado
- Una acción que le envía un correo electrónico indicando que el tiempo de viaje actual supera el tiempo especificado
Puede guardar la aplicación lógica en cualquier momento, así que guarde su trabajo con frecuencia.
Inicie sesión en Azure Portal si aún no lo ha hecho. Crear una aplicación lógica en blanco.
Agregue el desencadenador Programación: Periodicidad con estos valores: Intervalo = "1" y Frecuencia = "Minuto"
Sugerencia
Para simplificar visualmente la vista y ocultar los detalles de cada acción en el diseñador, contraiga la forma de cada acción a medida que recorre estos pasos.
Agregue la acción Bing Maps - Get route (Mapas de Bing: Obtener ruta).
Si no tiene una conexión de Mapas de Bing, se le solicitará que cree una.
Configuración valor Descripción Nombre de la conexión BingMapsConnection Proporcione un nombre para la conexión. Clave de API <su-clave-de-Mapas-de-Bing> Escriba la clave de Mapas de Bing recibida previamente. Configure la acción Get route (Obtener ruta) tal como se muestra en la tabla que aparece a continuación de esta imagen:
Para más información acerca de estos parámetros, consulte Calculate a route (Cálculo de una ruta).
Configuración valor Descripción Waypoint 1 (Punto de referencia 1) <inicio> Escriba el origen de la ruta. Waypoint 2 (Punto de referencia 2) <fin> Escriba el destino de la ruta. Avoid (Evitar) None Escriba los elemento a evitar en la ruta, como autopistas, peajes, etc. Para los valores posibles, consulte Calculate a route (Calcular una ruta). Optimize (Optimizar) timeWithTraffic Seleccione un parámetro para optimizar la ruta, como distancia, información sobre el tiempo de trayecto con el tráfico actual, etc. Este ejemplo utiliza este valor: "timeWithTraffic" Distance unit (Unidad de distancia) <su preferencia> Especifique la unidad de distancia para calcular la ruta. Este ejemplo utiliza este valor: "Mile" (Milla) Travel mode (Modo de desplazamiento) Conducción Escriba el modo de desplazamiento para la ruta. Este ejemplo utiliza este valor: "Driving" (Conducción) Transit Date-Time (Fecha y hora de tránsito) None Se aplica solo al modo de tránsito. Transit Date-Type Type (Fecha y tipo de tránsito) None Se aplica solo al modo de tránsito.
Agregue una condición que compruebe si el tiempo de trayecto con el tráfico actual supera el tiempo especificado. Para este ejemplo, siga estos pasos:
Cambie el nombre de la condición por esta descripción: Si la hora de tráfico es posterior a la hora especificada
En la columna más a la izquierda, seleccione dentro del cuadro Elegir un valor para que aparezca la lista de contenido dinámico. En la lista, seleccione el campo Travel Duration Traffic (Tráfico de duración del desplazamiento), que está en segundos.
En el cuadro del medio, seleccione este operador: es mayor que
En la columna más a la derecha, escriba este valor de comparación, que está en segundos y equivale a 10 minutos: 600
Una vez que haya terminado, la condición debe ser parecida a la de este ejemplo:
En la rama True, agregue una acción "send email" (enviar correo electrónico) para su proveedor de correo electrónico. Para configurar esta acción, siga los pasos descritos en esta imagen:
En el campo Para, escriba su dirección de correo electrónico con fines de prueba.
En el campo Asunto, escriba este texto:
Time to leave: Traffic more than 10 minutes
- En el campo Cuerpo, escriba este texto con un espacio final:
Travel time:
Mientras el cursor aparece en el campo Cuerpo, la lista de contenido dinámica permanece abierta para que pueda seleccionar los parámetros que estén disponibles en este momento.
En la lista de contenido dinámico, seleccione Expresión.
Busque y seleccione la función div() . Coloque el cursor dentro de los paréntesis de la función.
Mientras el cursor se encuentre dentro de los paréntesis de la función, seleccione Contenido dinámico para que aparezca la lista de contenido dinámico.
Desde la sección Get route, seleccione el campo Travel Duration Traffic.
Una vez que el campo se resuelve en formato JSON, agregue una coma (
,
) seguida del número60
para que convierta el valor de Travel Duration Traffic (Tráfico de duración del desplazamiento) de segundos a minutos.div(body('Get_route')?['travelDurationTraffic'],60)
Ahora, la expresión es similar a este ejemplo:
Cuando termine, elija Aceptar.
Una vez que la expresión se resuelve, agregue este texto con un espacio inicial:
minutes
Ahora, el campo Cuerpo es similar a este ejemplo:
Guarde la aplicación lógica.
A continuación, agregue un ámbito para que pueda agrupar acciones específicas y evaluar su estado.
Agregar un ámbito
Si aún no lo ha hecho, abra la aplicación lógica en el diseñador de flujos de trabajo.
Agregue un ámbito a la ubicación del flujo de trabajo que quiera. Por ejemplo, para agregar un ámbito entre pasos existentes en el flujo de trabajo de la aplicación lógica, siga estos pasos:
Mueva el puntero sobre la flecha donde quiere agregar el ámbito. Seleccione el signo más (+) >Agregar una acción.
En el cuadro de búsqueda, escriba "ámbito" como filtro. Seleccione la acción Ámbito.
Agregar pasos al ámbito
Ahora agregue los pasos o arrastre los pasos existentes que desea ejecutar dentro del ámbito. En este ejemplo, arrastre estas acciones al ámbito:
- Get route (Obtener ruta)
- If traffic time is more than specified time (Si el tiempo de trayecto es mayor que el tiempo especificado), que incluye las dos ramas: true y false
Ahora, la aplicación lógica es similar a este ejemplo:
En el ámbito, agregue una condición que compruebe el estado del ámbito. Cambie el nombre de la condición por esta descripción: Si el ámbito dio error
En la condición, agregue estas expresiones que comprueban si el estado del ámbito es igual a "Erróneo" o "Anulado".
Para agregar otra fila, seleccione Agregar.
En cada fila, seleccione el cuadro de la izquierda para que aparezca la lista de contenido dinámico. En la lista de contenido dinámico, seleccione Expresión. En el cuadro de edición, escriba esta expresión y, luego, seleccione Aceptar:
action('Scope')
Para ambas filas, seleccione es igual a como operador.
Para los valores de comparación, en la primera fila, escriba
Failed
. En la segunda fila, escribaAborted
.Una vez que haya terminado, la condición debe ser parecida a la de este ejemplo:
Ahora, establezca la propiedad
runAfter
de la condición, para que esta compruebe el estado del ámbito y ejecute la acción correspondiente que definirá en pasos posteriores.En la condición Si el ámbito fue erróneo, seleccione el botón de puntos suspensivos (...) y, luego, seleccione Configurar ejecución posterior.
Seleccione todos estos estados de ámbito: Correcto, con errores, se omitió y se superó el tiempo de espera
Cuando haya finalizado, seleccione Listo. La condición ahora muestra un icono de "información".
En las ramas True y False, agregue las acciones que quiere realizar en función de cada estado de ámbito, por ejemplo, enviar correo electrónico o un mensaje.
Guarde la aplicación lógica.
Ahora, la aplicación lógica finalizada es similar a este ejemplo:
Comprobación del trabajo
En la barra de herramientas del diseñador, seleccione Ejecutar>Ejecutar. Si todas las acciones del ámbito se realizan correctamente, recibirá un mensaje de "Scope succeeded" (El ámbito se realizó correctamente). Si alguna de las acciones del ámbito no se realiza correctamente, recibirá un mensaje de "Scope failed" (El ámbito produjo error).
Definición JSON
Si está trabajando en la vista de código, puede definir la estructura de un ámbito en la definición JSON de la aplicación lógica en su lugar. Por ejemplo, aquí está la definición JSON para el desencadenador y las acciones de la aplicación lógica 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_succeeded": {
"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": {}
}
},