Condividi tramite


Eseguire azioni in base allo stato del gruppo usando ambiti nelle App per la logica di Azure

Si applica a: App per la logica di Azure (A consumo)

Per eseguire azioni solo dopo che un altro gruppo di azioni ha avuto esito positivo o negativo, raggruppare tali azioni in un ambito. Questa struttura è utile quando si vuole organizzare le azioni come gruppo logico, valutare lo stato del gruppo ed eseguire le azioni in base allo stato dell'ambito. Al termine dell'esecuzione di tutte le azioni in un ambito, l'ambito ottiene anche il proprio stato. È ad esempio possibile usare gli ambiti quando si vuole implementare la gestione degli errori e delle eccezioni.

Per controllare lo stato di un ambito, è possibile usare gli stessi criteri usati per determinare lo stato di esecuzione di un’App per la logica, ad esempio Riuscito, Non riuscito, Annullatoe così via. Per impostazione predefinita, quando tutte le azioni dell’ambito hanno esito positivo, lo stato dell’ambito viene contrassegnato come Riuscito. Tuttavia, quando un’azione nell’ambito ha esito negativo o viene annullata, lo stato dell’ambito viene contrassegnato come Non riuscito. Per i limiti degli ambiti, vedere Limiti e configurazione.

La seguente, ad esempio è un'app per la logica generale che usa un ambito per eseguire azioni specifiche e una condizione per controllare lo stato dell'ambito. Se qualsiasi azione nell’ambito ha esito negativo o termina in modo imprevisto, l’ambito viene contrassegnato rispettivamente come Non riuscito o Interrotto e l’App per la logica invia un messaggio con “Ambito non riuscito”. Se tutte le azioni nell'ambito hanno esito positivo, l'app per la logica invia un messaggio "Scope succeeded".

Diagramma che mostra il flusso di ambito dell’App per la logica con esempi di “Ambito non riuscito” e “Ambito riuscito”.

Prerequisiti

Per eseguire l'esempio in questo articolo, sono necessari questi elementi:

  • Una sottoscrizione di Azure. Se non si ha una sottoscrizione, è possibile iscriversi per creare un account Azure gratuito.

  • Un account di posta elettronica di un provider di posta elettronica supportato da App per la logica. In questo esempio viene usato Outlook.com. Se si usa un provider diverso, il flusso generale rimane invariato, ma l'interfaccia utente ha un aspetto diverso.

  • Una chiave di Bing Maps. Per ottenere questa chiave, vedere Get a Bing Maps key (Ottenere una chiave di Bing Maps).

  • Conoscenza di base delle App per la logica

Creare un'app per la logica di esempio

Creare prima di tutto questa app per la logica di esempio per poter aggiungere un ambito in un secondo momento:

Creare un'app per la logica di esempio

  • Un trigger Pianificazione - Ricorrenza che controlla il servizio Bing Maps in base all'intervallo specificato
  • Un'azione Bing Maps - Get route (Bing Maps - Ottieni itinerario) che controlla il tempo di viaggio tra due località
  • Azione di condizione che controlla se il tempo di viaggio supera il tempo di viaggio specificato
  • Un'azione che invia un messaggio di posta elettronica per informare che il tempo di viaggio corrente supera il tempo specificato

È possibile salvare l'app per la logica in qualsiasi momento, quindi salvare spesso il lavoro.

  1. Accedere al portale di Azure, se questa operazione non è già stata eseguita. Creare un'app per la logica vuota.

  2. Aggiungere il trigger Pianificazione - Ricorrenza con queste impostazioni: Intervallo = "1" e Frequenza = "Minuto"

    Configurazione del trigger

    Suggerimento

    Per semplificare la visualizzazione e nascondere i dettagli di ogni azione nella finestra di progettazione, comprimere la forma di ogni azione mentre si procede con i passaggi.

  3. Aggiungere l'azione Bing Maps - Get route (Bing Maps - Ottieni itinerario).

    1. Se non si ha già una connessione esistente a Bing Maps, viene chiesto di crearne una.

      Impostazione valore Descrizione
      Nome connessione BingMapsConnection Specificare un nome per la connessione.
      Chiave API <chiave-Bing-Maps> Immettere la chiave di Bing Maps ricevuta in precedenza.
    2. Configurare l'azione Get route (Ottieni itinerario), come illustrato nella tabella sotto questa immagine:

      Configurare l'azione

      Per altre informazioni su questi parametri, vedere Calculate a route (Calcolare un itinerario).

      Impostazione valore Descrizione
      Punto di tragitto 1 <start> Immettere l'origine dell'itinerario.
      Punto di tragitto 2 <end> Immettere la destinazione dell'itinerario.
      Evitare None Immettere gli elementi da evitare lungo l'itinerario, ad esempio autostrade, strade a pedaggio e così via. Per i possibili valori, vedere Calculate a route (Calcolare un itinerario).
      Optimize (Ottimizza) timeWithTraffic Selezionare un parametro per ottimizzare l'itinerario, ad esempio distanza, tempo con le informazioni sul traffico corrente e così via. Questo esempio usa il valore "timeWithTraffic"
      Unità distanza <preferenza> Immettere l'unità di distanza per calcolare l'itinerario. Questo esempio usa il valore "Mile"
      Travel mode (Modalità di viaggio) Driving (Guida) Immettere la modalità di viaggio per l'itinerario. Questo esempio usa il valore "Driving"
      Transit Date-Time (Data e ora transito) None Si applica solo alla modalità di transito.
      Transit Date-Time Type (Tipo di data e ora transito) None Si applica solo alla modalità di transito.
  4. Aggiungere una condizione per verificare se il tempo di viaggio corrente con il traffico è superiore al tempo specificato. Per questo esempio, seguire questa procedura:

    1. Rinominare la condizione con questa descrizione: If traffic time is more than specified time (Se il tempo con il traffico è superiore al tempo specificato).

    2. Nella colonna più a sinistra, selezionare Scegli un valore all’interno della casella in modo che venga visualizzato l’elenco di contenuto dinamico. In questo elenco selezionare il campo Travel Duration Traffic (Durata viaggio con traffico), espresso in secondi.

      Creare una condizione

    3. Nella casella centrale selezionare l'operatore: è maggiore di.

    4. Nella colonna più a destra, immettere questo valore di confronto, espresso in secondi ed equivalente a 10 minuti: 600

      Al termine, la condizione avrà un aspetto simile a quello in questo esempio:

      Condizione completata

  5. Nel ramo True, aggiungere un’azione “invia messaggio di posta elettronica” per il provider di posta elettronica. Configurare questa azione seguendo i passaggi riportati sotto questa immagine:

    Aggiungere l’azione “Invia un messaggio di posta elettronica” al ramo “True”

    1. Nel campo A immettere l'indirizzo di posta elettronica a scopo di test.

    2. Nel campo Oggetto immettere il testo seguente:

    Time to leave: Traffic more than 10 minutes

    1. Nel campo Corpo immettere il testo seguente con uno spazio finale:

    Travel time:

    Mentre il cursore è visualizzato nel campo Corpo, l'elenco di contenuto dinamico rimane aperto per consentire di selezionare i parametri disponibili.

    1. Nell'elenco di contenuto dinamico selezionare Espressione.

    2. Trovare e selezionare la funzione div(). Posizionare il cursore tra le parentesi della funzione.

    3. Mentre il cursore si trova tra le parentesi della funzione, selezionare Contenuto dinamico in modo che venga visualizzato l’elenco di contenuto dinamico.

    4. Nella sezione Get route (Ottieni itinerario) selezionare il campo Travel Duration Traffic (Durata viaggio con traffico).

      Selezionare

    5. Dopo che il campo viene risolto nel formato JSON, aggiungere una virgola (,) seguita dal numero 60 per poter convertire il valore di Traffic Duration Traffic (Durata viaggio con traffico) da secondi a minuti.

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

      L'espressione dovrebbe avere ora un aspetto simile all'esempio seguente:

      Espressione finale

    6. Al termine, seleziona OK.

    1. Dopo la risoluzione dell'espressione, aggiungere il testo seguente con uno spazio iniziale: minutes

      Il campo Corpo dovrebbe avere ora un aspetto simile all'esempio seguente:

      Campo

  6. Salvare l'app per la logica.

Aggiungere successivamente un ambito per poter raggruppare azioni specifiche e valutarne lo stato.

Aggiungere un ambito

  1. Se non è già stato fatto, aprire l’App per la logica nella finestra di progettazione del flusso di lavoro.

  2. Aggiungere un ambito al percorso del flusso di lavoro da usare. Ad esempio, per aggiungere un ambito tra i passaggi esistenti nel flusso di lavoro dell'app per la logica, seguire questa procedura:

    1. Spostare il puntatore sulla freccia dove si vuole aggiungere l'ambito. Selezionare il segno più (+) >Aggiungi un’azione.

      Aggiungere un ambito

    2. Nella casella di ricerca immettere "ambito" come filtro. Selezionare l'azione Ambito.

Aggiungere passaggi all'ambito

  1. Aggiungere ora i passaggi o trascinare i passaggi esistenti che si vuole eseguire nell'ambito. Per questo esempio, trascinare le azioni seguenti nell'ambito:

    • Get route (Ottieni itinerario)
    • If traffic time is more than specified time (Se il tempo con il traffico è superiore al tempo specificato), che include entrambi i rami true e false

    L'app per la logica dovrebbe avere ora un aspetto simile all'esempio seguente:

    Ambito aggiunto

  2. Sotto l'ambito aggiungere una condizione che controlla lo stato dell'ambito. Rinominare la condizione con questa descrizione: If scope failed (Se l'ambito ha avuto esito negativo)

    Aggiungere la condizione per controllare lo stato dell'ambito

  3. Nella condizione aggiungere queste espressioni che consentono di controllare se lo stato dell'ambito è uguale a "Failed" o "Aborted".

    1. Per aggiungere un’altra riga, selezionare Aggiungi.

    2. In ogni riga, selezionare all’interno della casella sinistra in modo che venga visualizzato l’elenco di contenuto dinamico. Nell’elenco di contenuto dinamico, selezionare Espressione. Nella casella di modifica, immettere questa espressione e quindi selezionare OK:

      action('Scope')

      Screenshot che mostra la casella “Espressione” con l’espressione di risultato evidenziata.

    3. Per entrambe le righe, selezionare è uguale a come operatore.

    4. Per i valori di confronto, nella prima riga immettere Failed. Nella seconda riga immettere Aborted.

      Al termine, la condizione avrà un aspetto simile a quello in questo esempio:

      Aggiungere l'espressione che controlla lo stato dell'ambito

      A questo punto, impostare la proprietà runAfter della condizione in modo che la condizione controlli lo stato dell'ambito ed esegua l'azione corrispondente definita nei passaggi successivi.

    5. Nella condizione Se l’ambito non è riuscito, selezionare il pulsante dei puntini di sospensione (...) e quindi selezionare Configura esecuzione dopo.

      Configurare la proprietà runAfter

    6. Selezionare tutti questi stati dell'ambito: is successful (riuscito), has failed (non riuscito), is skipped (ignorato) e has timed out (scaduto).

      Selezionare gli stati dell'ambito

    7. Al termine selezionare Fine. La condizione visualizza ora un'icona "informazioni".

  4. Nei rami True e False, aggiungere le azioni da eseguire in base a ogni stato dell’ambito, ad esempio inviare un messaggio di posta elettronica o un messaggio.

    Aggiungere le azioni da eseguire in base allo stato dell'ambito

  5. Salvare l'app per la logica.

L'app per la logica completata dovrebbe avere ora un aspetto simile all'esempio seguente:

App per la logica completata con ambito

Testare il lavoro

Nella barra degli strumenti della finestra di progettazione, selezionare Esegui>Esegui. Se tutte le azioni nell'ambito hanno esito positivo, viene visualizzato un messaggio "Scope succeeded". Se nessuna azione nell'ambito hanno esito positivo, viene visualizzato un messaggio "Scope failed".

Definizione JSON

Se si usa la visualizzazione Codice, è invece possibile definire una struttura di ambito nella definizione JSON dell'app per la logica. La seguente, ad esempio, è la definizione JSON per il trigger e le azioni dell'app per la logica precedente:

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

Passaggi successivi