Exécuter des actions en fonction de l’état du groupe à l’aide d’étendues dans Azure Logic Apps

S’applique à : Azure Logic Apps (Consommation)

Pour exécuter des actions uniquement après l’échec ou la réussite d’un groupe d’actions, placez ce groupe dans une étendue. Cette structure est utile lorsque vous souhaitez organiser les actions en tant que groupe logique, évaluer l’état de ce groupe et effectuer des actions qui sont basées sur l’état de l’étendue. Une fois que toutes les actions d’une étendue ont été exécutées, l’étendue récupère également son propre état. Par exemple, vous pouvez utiliser des étendues lorsque vous souhaitez implémenter la gestion des erreurs et des exceptions.

Pour vérifier l’état d’une étendue, vous pouvez utiliser les mêmes critères que ceux utilisés pour déterminer l’état d’exécution des applications logiques, tels que Réussi, Échec, Annulé, etc. Par défaut, quand toutes les actions de l’étendue réussissent, l’état de l’étendue est marqué comme Réussi. Mais quand une action dans l’étendue échoue ou est annulée, l’état de l’étendue est défini sur Échec. Pour les limites sur les étendues, consultez Limites et configuration.

Par exemple, voici une application logique de haut niveau qui utilise une étendue pour exécuter des actions spécifiques et une condition pour vérifier l’état de l’étendue. Si des actions de l’étendue échouent ou se ferment de façon inattendue, l’étendue est définie sur Échec ou Abandonné, respectivement ; l’application logique envoie un message « Scope failed » (Échec de l’étendue). Si toutes les actions de l’étendue réussissent, l’application logique envoie un message « Scope succeeded » (Réussite de l’étendue).

Diagramme montrant le flux de l’étendue de l’application logique avec des exemples d’échec et de réussite de l’étendue

Prérequis

Pour suivre l’exemple de cet article, vous avez besoin de ces éléments :

  • Un abonnement Azure. Si vous n’avez pas encore d’abonnement, vous pouvez vous inscrire pour obtenir un compte Azure gratuitement.

  • Un compte de messagerie de n’importe quel fournisseur de messagerie pris en charge par Logic Apps. Cet exemple utilise Outlook.com. Si vous utilisez un autre fournisseur, le flux général reste le même, mais votre interface utilisateur peut s’afficher différemment.

  • Une clé Bing Maps. Pour obtenir cette clé, consultez Getting a Bing Maps Key (Obtention d’une clé Bing Maps).

  • Connaissances de base sur les applications logiques

Créer un exemple d’application logique

Commencez par créer cet exemple d’application logique pour que vous puissiez ajouter une étendue plus tard :

Créer un exemple d’application logique

  • Un déclencheur Planification - Périodicité qui vérifie le service Bing Maps à un intervalle que vous spécifiez
  • Une action Bing Maps - Obtenir un itinéraire qui vérifie le temps de trajet entre deux emplacements
  • Une action conditionnelle qui vérifie si le temps de trajet dépasse le temps de trajet spécifié
  • Une action qui vous envoie un e-mail indiquant que ce temps de trajet actuel dépasse celui que vous avez spécifié

Vous pouvez enregistrer votre application logique à tout moment, par conséquent, enregistrez votre travail souvent.

  1. Si ce n’est pas déjà fait, connectez-vous au portail Azure. Créez une application logique vide.

  2. Ajoutez le déclencheur Planification - Périodicité avec ces paramètres : Intervalle = « 1 » et Fréquence = « Minute »

    Configurer le déclencheur « Planification - Périodicité »

    Conseil

    Pour simplifier l’affichage et masquer les détails de chaque action dans le concepteur, réduisez la forme de chaque action au cours de ces étapes.

  3. Ajoutez l’action Bing Maps - Obtenir un itinéraire.

    1. Si vous ne disposez pas d’une connexion à Bing Maps, vous êtes invité à en créer une.

      Paramètre valeur Description
      Nom de connexion BingMapsConnection Donnez un nom à votre connexion.
      Clé API <your-Bing-Maps-key> Entrez la clé Bing Cartes que vous avez reçue précédemment.
    2. Configurez votre action Obtenir un itinéraire, comme le montre le tableau sous cette image :

      Configurer l’action « Bing Maps - Obtenir un itinéraire »

      Pour plus d’informations sur ces paramètres, voir Calculate a route (Calculer un itinéraire).

      Paramètre valeur Description
      Étape 1 <start> Entrez l’origine de votre itinéraire.
      Étape 2 <end> Entrez la destination de votre itinéraire.
      Avoid None Entrez les éléments à éviter sur votre itinéraire, par exemple les autoroutes, les péages, etc. Pour les valeurs possibles, consultez Calculate a route (Calculer un itinéraire).
      Optimize timeWithTraffic Sélectionnez un paramètre permettant d’optimiser votre itinéraire, par exemple la distance, la durée du trajet avec les informations de circulation actuelle, etc. Cet exemple utilise cette valeur : « timeWithTraffic »
      Unité de distance <your-preference> Entrez l’unité de distance pour calculer votre itinéraire. Cet exemple utilise cette valeur : « Mile »
      Mode de déplacement Conduite Entrez le mode de déplacement pour votre itinéraire. Cet exemple utilise cette valeur : « Driving »
      Date et heure de transit None S’applique au mode transit uniquement.
      Type de date et heure de transit None S’applique au mode transit uniquement.
  4. Ajoutez une condition qui vérifie si le temps de trajet actuel dépasse une durée spécifiée. Pour cet exemple, suivez ces étapes :

    1. Renommez la condition avec cette description : Si le temps de trafic est supérieur à la durée spécifiée

    2. Dans la colonne de gauche, sélectionnez dans la boite Choisir une valeur pour afficher la liste de contenu dynamique. Dans cette liste, sélectionnez le champ Travel Duration Traffic (Trafic correspondant à la durée du trajet), qui est exprimé en secondes.

      Créer une condition

    3. Dans la zone du milieu, sélectionnez cet opérateur : est supérieur à.

    4. Dans la colonne la plus à droite, entrez cette valeur de comparaison, équivalente à 10 minutes en secondes : 600

      Une fois que vous avez terminé, votre condition ressemble à cet exemple :

      Condition terminée

  5. Dans la branche Vrai, ajoutez une action « Envoyer e-mail » pour votre fournisseur d’e-mail. Définissez cette action en suivant les étapes décrites sous cette image :

    Ajouter une action « Envoyer e-mail » à la branche « Vrai »

    1. Dans le champ À, entrez votre adresse e-mail à des fins de test.

    2. Dans le champ Sujet, entrez ce texte :

    Time to leave: Traffic more than 10 minutes

    1. Dans le champ Corps, entrez ce texte avec un espace de fin :

    Travel time:

    Alors que le curseur s’affiche dans le champ Corps, la liste de contenu dynamique reste ouverte afin que vous puissiez sélectionner tous les paramètres qui sont disponibles à ce stade.

    1. Dans la liste à contenu dynamique, sélectionnez Expression.

    2. Recherchez et sélectionnez la fonction div() . Placez votre curseur dans les parenthèses de la fonction.

    3. Alors que votre curseur se trouve dans les parenthèses de la fonction, sélectionnez Contenu dynamique pour afficher la liste de contenu dynamique.

    4. À partir de la section Obtenir un itinéraire, sélectionnez le champ Travel Duration Traffic (Trafic correspondant à la durée du trajet).

      Sélectionner « Travel Duration Traffic » (Trafic correspondant à la durée du trajet)

    5. Une fois que le champ correspond au format JSON, ajoutez une virgule (,) suivie du nombre 60 afin de convertir la valeur dans Travel Duration Traffic (Trafic correspondant à la durée du trajet) exprimée en secondes en minutes.

      div(body('Get_route')?['travelDurationTraffic'],60)
      

      Votre expression ressemble maintenant à cet exemple :

      Expression finale

    6. Quand vous avez terminé, sélectionnez OK.

    1. Une fois l’expression résolue, ajoutez ce texte avec un espace de début : minutes

      Votre champ Corps ressemble maintenant à cet exemple :

      Champ « Corps » final

  6. Enregistrez votre application logique.

Ensuite, ajoutez une étendue afin que vous puissiez regrouper des actions spécifiques et évaluer leur état.

Ajouter une étendue

  1. Si ce n’est pas déjà le cas, ouvrez votre application logique dans le concepteur de workflow.

  2. Ajoutez une étendue à l’emplacement du flux de travail que vous souhaitez. Par exemple, pour ajouter une étendue entre des étapes existantes dans le workflow de l’application logique, effectuez les étapes suivantes :

    1. Déplacez votre pointeur sur la flèche où vous souhaitez ajouter l’étendue. Sélectionnez le signe plus (+) >Ajouter une action.

      Ajouter une étendue

    2. Dans la zone de recherche, entrez « étendue » comme filtre. Sélectionnez l’action Étendue.

Ajouter des étapes à l’étendue

  1. Ajoutez maintenant les étapes ou faites glisser les étapes que vous souhaitez exécuter dans l’étendue. Pour cet exemple, faites glisser ces actions dans l’étendue :

    • Obtenir un itinéraire
    • Si le temps de trajet est supérieur au temps spécifié, qui comprend les branches true et false

    Votre application logique ressemble maintenant à cet exemple :

    Étendue ajoutée

  2. Sous l’étendue, ajoutez une condition qui vérifie l’état de l’étendue. Renommez la condition avec cette description : En cas d’échec de l’étendue

    Ajouter une condition pour vérifier l’état de l’étendue

  3. Dans la condition, ajoutez ces expressions qui vérifient si l’état de l’étendue est égal à « Échec » ou « Abandonné ».

    1. Pour ajouter une autre ligne, sélectionnez Ajouter.

    2. Dans chaque ligne, sélectionnez dans la zone de gauche pour afficher la liste de contenu dynamique. Depuis la liste à contenu dynamique, sélectionnez Expression. Dans la zone d’édition, entrez cette expression, puis sélectionnez OK :

      action('Scope')

      Capture d’écran montrant la zone « Expression » avec mise en évidence de l’expression de résultat

    3. Pour les deux lignes, sélectionnez est égal à comme opérateur.

    4. Pour les valeurs de comparaison, dans la première ligne, entrez Failed. Dans la deuxième ligne, entrez Aborted.

      Une fois que vous avez terminé, votre condition ressemble à cet exemple :

      Ajouter l’expression qui vérifie l’état de l’étendue

      Maintenant, définissez la propriété runAfter de la condition afin que celle-ci vérifie l’état de l’étendue et exécute l’action correspondante que vous définissez dans les étapes ultérieures.

    5. Sur la condition Si l’étendue a échoué, sélectionnez le bouton points de suspension (...), puis Configurer l’exécution après.

      Configurer la propriété runAfter

    6. Sélectionnez tous ces états d’étendue : a réussi, a échoué, est ignorée et a expiré

      Sélectionner les états de l’étendue

    7. Quand vous avez terminé, cliquez sur Terminé. La condition affiche maintenant une icône « informations ».

  4. Dans les branches Vrai et Faux, ajoutez les actions que vous souhaitez effectuer en fonction de chaque état de l’étendue, par exemple, envoyer un e-mail ou un message.

    Ajouter les actions à effectuer en fonction de l’état de l’étendue

  5. Enregistrez votre application logique.

Votre application logique terminée ressemble maintenant à cet exemple :

Application logique finale avec étendue

Tester votre travail

Dans la barre d’outils du concepteur, sélectionnez Exécuter>Exécuter. Si toutes les actions de l’étendue réussissent, vous recevez un message « Scope succeeded » (Réussite de l’étendue). Si des actions de l’étendue échouent, vous recevez un message « Scope failed » (Échec de l’étendue).

Définition JSON

Si vous travaillez en mode code, vous pouvez définir une structure d’étendue dans la définition JSON de votre application logique à la place. Par exemple, voici la définition JSON du déclencheur et des actions dans l’application logique précédente :

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

Étapes suivantes