Esercizio: aggiungere un timer permanente per la gestione di un'attività a esecuzione prolungata

Completato

L'azienda ha chiesto di modificare il nuovo flusso di lavoro in modo da incorporare un passaggio di escalation per eseguire un'azione nel caso in cui una proposta di progetto non venga approvata tempestivamente.

In questo esercizio si aggiungerà un timer per il controllo del timeout durante l'esecuzione del flusso di lavoro. Verrà inoltre descritto come usare il timeout per controllare il percorso di esecuzione seguito dal flusso di lavoro.

Aggiungere il pacchetto npm moment all'app per le funzioni

Prima di modificare il flusso di lavoro, si aggiungerà il pacchetto npm moment all'app per le funzioni usando la console.

  1. Accedere al portale di Azure con lo stesso account usato per attivare la sandbox.

  2. Nel menu del portale di Azure o nella home page, in Servizi di Azure selezionare Tutte le risorse e quindi l'app per le funzioni creata nell'esercizio precedente. Viene visualizzato il riquadro App per le funzioni.

  3. Nella barra dei menu a sinistra, in Strumenti di sviluppo selezionare Console. Verrà visualizzato il riquadro Console relativo all'app per le funzioni.

  4. Verificare che la finestra della console si apra nella cartella C:\home\site\wwwroot, quindi eseguire i comandi seguenti per installare le librerie necessarie per questa app per le funzioni di esempio.

    1. Esegui il comando seguente per installare la libreria TypeScript, che è una dipendenza obbligatoria per la tipizzazione statica.

      npm install typescript
      
    2. Eseguire il comando seguentei per installare la libreria moment, che contiene funzioni di data/ora che è possibile usare con Durable Functions.

      npm install moment
      

      Il completamento di questi comandi potrebbe richiedere alcuni secondi, durante i quali npm può visualizzare alcuni avvisi, che possono essere ignorati.

  5. Attendere il completamento dell'installazione di tutti i pacchetti, quindi chiudere la finestra della console.

Aggiungere un'attività di escalation all'app per le funzioni

  1. Nel menu del portale di Azure o nella home page, in Servizi di Azure selezionare Tutte le risorse e quindi selezionare l'app per le funzioni. Viene visualizzato il riquadro App per le funzioni.

  2. Selezionare la scheda Funzioni al centro della schermata.

  3. Nulla barra del menu Funzioni, seleziona Crea. Viene visualizzato il riquadro Crea funzione.

  4. In Seleziona un modello, nella casella Filtro, immetti Durable Functions Activity e seleziona il modello dall'elenco. Questo modello crea una funzione di Durable Functions che viene eseguita quando un'attività viene chiamata da una funzione dell'agente di orchestrazione.

  5. In Dettagli modello, nel campo Nuova funzione immettere Escalation come nome della funzione e quindi selezionare Crea. Viene visualizzato il riquadro Escalation relativo alla funzione.

  6. Nel riquadro del menu a sinistra, in Developer selezionare Codice + Test. Viene visualizzato il riquadro Codice e test per la funzione.

    Nell'editor compare il codice del file index.js.

  7. Sostituire il codice esistente con quello riportato di seguito:

    module.exports = async function (context) {
        return `ESCALATION : You have not approved the project design proposal - reassigning to your Manager!  ${context.bindings.name}!`;
    };
    

    Questo codice restituisce un messaggio che indica che è stata eseguita l'escalation del flusso di lavoro. In un sistema di produzione, questa funzione conterrebbe la logica per inviare un promemoria al destinatario o riassegnare l'attività.

  8. Nella barra dei menu in alto selezionare Salva per salvare le modifiche.

Aggiornare la funzione di orchestrazione per l'uso della funzione di escalation

  1. Nel menu del portale di Azure o nella home page, in Servizi di Azure selezionare Tutte le risorse e quindi selezionare l'app per le funzioni. Viene visualizzato il riquadro App per le funzioni.

  2. Selezionare la scheda Funzioni al centro della schermata.

  3. Selezionare la funzione OrchFunction creata nell'esercizio precedente. Viene visualizzato il riquadro della funzione OrchFunction.

  4. Nel riquadro del menu a sinistra, in Developer selezionare Codice + Test. Viene visualizzato il riquadro Codice e test per la funzione.

    Nell'editor compare il codice del file index.js.

  5. Aggiungere il riferimento seguente alla libreria moment.

    const moment = require("moment");
    
  6. Sostituire il corpo della funzione con il codice seguente, che verificherà se la data di scadenza per l'approvazione è passata.

    module.exports = df.orchestrator(function* (context) {
        const outputs = [];
        const deadline = moment.utc(context.df.currentUtcDateTime).add(20, "s");
        const activityTask = context.df.waitForExternalEvent("Approval");
        const timeoutTask = context.df.createTimer(deadline.toDate());
    
        const winner = yield context.df.Task.any([activityTask, timeoutTask]);
        if (winner === activityTask) {
            outputs.push(yield context.df.callActivity("Approval", "Approved"));
        }
        else
        {
            outputs.push(yield context.df.callActivity("Escalation", "Head of department"));
        }
    
        if (!timeoutTask.isCompleted) {
            // All pending timers must be complete or canceled before the function exits.
            timeoutTask.cancel();
        }
    
        return outputs;
    });
    

    Per semplicità, ai fini di questo esercizio, se la funzione Approval non risponde entro 20 secondi, viene chiamata la funzione Escalation. Il codice cambia anche la chiamata ad Approval per l'attesa di un input esterno. In questo modo è possibile controllare quando viene restituita la risposta a scopo di test.

  7. Nella barra dei menu in alto selezionare Salva.

Verificare che il flusso di lavoro di Durable Functions venga avviato

  1. Nel menu del portale di Azure o nella home page, in Servizi di Azure selezionare Tutte le risorse e quindi selezionare l'app per le funzioni. Viene visualizzato il riquadro App per le funzioni.

  2. Nel riquadro Panoramica, nella barra dei menu in alto selezionare Riavvia e quindi selezionare alla richiesta di riavvio. Attendere il completamento del processo di riavvio prima di continuare. Viene visualizzato di nuovo il riquadro App per le funzioni.

  3. Selezionare la scheda Funzioni al centro della schermata.

  4. Selezionare la funzione HttpStart. Viene visualizzato il riquadro HttpStart.

  5. Nella barra dei menu in alto selezionare Recupera URL della funzione e copiare l'URL. L'URL dovrebbe essere simile all'esempio seguente:

    https://example.azurewebsites.net/api/orchestrators/{functionName}?code=AbCdEfGhIjKlMnOpQrStUvWxYz==
    

    Questo URL verrà usato per eseguire le funzioni.

  6. Aprire una nuova finestra del browser e passare all'URL copiato. Nell'URL sostituire il segnaposto {functionName} con OrchFunction, che dovrebbe essere simile all'esempio seguente:

    https://example.azurewebsites.net/api/orchestrators/OrchFunction?code=AbCdEfGhIjKlMnOpQrStUvWxYz==
    

    Il messaggio di risposta contiene un set di endpoint URI che è possibile usare per monitorare e gestire l'esecuzione e dovrebbe avere un aspetto simile al seguente:

    {
      "id": "f0e1d2c3b4a5968778695a4b3c2d1e0f",
      "statusQueryGetUri": "https://example.azurewebsites.net/...",
      "sendEventPostUri": "https://example.azurewebsites.net/...",
      "terminatePostUri": "https://example.azurewebsites.net/...",
      "rewindPostUri": "https://example.azurewebsites.net/...",
      "purgeHistoryDeleteUri": "https://example.azurewebsites.net/..."
    }
    
  7. Copia il valore statusQueryGetUri e usa il Web browser per passare a quell'URL. Viene visualizzato un messaggio di risposta simile all'esempio seguente che indica che lo stato è In esecuzione mentre è in attesa del conto alla rovescia di 20 secondi del timer:

    {
      "name": "OrchFunction",
      "instanceId": "f0e1d2c3b4a5968778695a4b3c2d1e0f",
      "runtimeStatus": "Running",
      "input": null,
      "customStatus": null,
      "output": null,
      "createdTime": "2019-04-14T13:17:26Z",
      "lastUpdatedTime": "2019-04-14T13:17:27Z"
    }
    
  8. Attendere 20 secondi e aggiornare la finestra del browser. Il timeout sarà stato raggiunto e il flusso di lavoro chiamerà l'attività Escalate (Escalation). Verrà visualizzata una risposta simile all'esempio seguente:

    {
        "name": "OrchFunction",
        "instanceId": "f0e1d2c3b4a5968778695a4b3c2d1e0f",
        "runtimeStatus": "Completed",
        "input": null,
        "customStatus": null,
        "output": [
            "ESCALATION : You have not approved the project design proposal - reassigning to your Manager!  Head of department!"
        ],
        "createdTime": "2019-04-14T13:43:09Z",
        "lastUpdatedTime": "2019-04-14T13:43:31Z"
    }