Übung: Hinzufügen eines langlebigen Timers zur Verwaltung einer zeitintensiven Aufgabe

Abgeschlossen

Sie wurden von Ihrem Unternehmen gebeten, den neuen Workflow so zu erweitern, dass er einen Eskalationsschritt beinhaltet, der eine Aktion auslöst, wenn ein Projektentwurfsvorschlag nicht in einem angemessenen Zeitraum genehmigt wird.

In dieser Übung fügen Sie einen Timer hinzu, um den Timeout während der Ausführung des Workflows zu steuern. Sie lernen auch, wie Sie mit dem Timeout steuern, welchen Ausführungspfad der Workflow verwendet.

Hinzufügen des npm-Pakets „moment“ zur Funktions-App

Bevor Sie den Workflow ändern, fügen Sie das npm-Paket moment über die Konsole zur Funktions-App hinzu.

  1. Melden Sie sich beim Azure-Portal mit demselben Konto an, das Sie zum Aktivieren der Sandbox verwendet haben.

  2. Wählen Sie im Menü des Azure-Portals oder auf der Homepage unter Azure-Dienste die Option Alle Ressourcen aus, und wählen Sie dann die in der vorherigen Übung erstellte Funktions-App aus. Der Bereich Funktions-App wird angezeigt.

  3. Wählen Sie auf der linken Menüleiste unter Entwicklungstools die Option Konsole aus. Der Bereich Konsole wird für Ihre Funktions-App angezeigt.

  4. Vergewissern Sie sich, dass das Konsolenfenster im Ordner C:\home\site\wwwroot geöffnet wird, und führen Sie dann die folgenden Befehle aus, um die Bibliotheken zu installieren, die für diese Funktions-Beispiel-App erforderlich sind.

    1. Führen Sie den folgenden Befehl aus, um die Bibliothek TypeScript zu installieren, die eine erforderliche Abhängigkeit für die statische Typisierung ist.

      npm install typescript
      
    2. Führen Sie den folgenden Befehl aus, um die Bibliothek moment zu installieren, die Datums- und Uhrzeitfunktionen enthält, die Sie mit langlebigen Funktionen verwenden können.

      npm install moment
      

      Es kann einige Sekunden dauern, bis die Befehle ausgeführt werden, und im Knotenpaket-Manager werden möglicherweise einige Warnungen angezeigt, die Sie ignorieren können.

  5. Warten Sie, bis alle Pakete installiert wurden, und schließen Sie dann das Konsolenfenster.

Hinzufügen einer Eskalationsaktivität zur Funktions-App

  1. Wählen Sie im Menü des Azure-Portals oder auf der Startseite unter Azure-Dienste die Option Alle Ressourcen und dann Ihre Funktions-App aus. Der Bereich Funktions-App wird angezeigt.

  2. Wählen Sie die Registerkarte Funktionen in der Mitte des Bildschirms aus.

  3. Wählen Sie in der Menüleiste der Registerkarte Funktionen die Option Erstellen aus. Der Bereich Funktion erstellen wird angezeigt.

  4. Geben Sie unter Vorlage auswählen im Feld Filter den Text Aktivität für Durable Functions ein, und wählen Sie diese Vorlage aus der Liste aus. Diese Vorlage erstellt eine Durable Function, die ausgeführt wird, wenn eine Orchestratorfunktion eine Aktivität aufruft.

  5. Geben Sie unter Vorlagendetails im Feld Neue Funktion den Namen Escalation für die Funktion ein, und wählen Sie dann Erstellen aus. Der Bereich escalation für Ihre Funktion wird angezeigt.

  6. Klicken Sie auf der linken Seite des Menübereichs unter Developer (Entwickler) auf Programmieren und testen. Der Bereich Codieren und testen wird für Ihre Funktion angezeigt.

    Der Code für die Datei index.js wird im Editor angezeigt.

  7. Ersetzen Sie den vorhandenen Code durch folgenden Code:

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

    Dieser Code gibt die Nachricht zurück, dass der Workflow eskaliert wurde. In einem Produktionssystem würde diese Funktion die Logik enthalten, die den Empfänger daran erinnert, die Aufgabe neu zuzuweisen.

  8. Wählen Sie auf der oberen Menüleiste Speichern aus, um die neue Funktion zu speichern.

Aktualisieren der Orchestrierungsfunktion zur Verwendung der Eskalationsfunktion

  1. Wählen Sie im Menü des Azure-Portals oder auf der Startseite unter Azure-Dienste die Option Alle Ressourcen und dann Ihre Funktions-App aus. Der Bereich Funktions-App wird angezeigt.

  2. Wählen Sie die Registerkarte Funktionen in der Mitte des Bildschirms aus.

  3. Wählen Sie die Funktion OrchFunction aus, die Sie in der vorherigen Übung erstellt haben. Der Bereich OrchFunction für die Funktion wird angezeigt.

  4. Klicken Sie auf der linken Seite des Menübereichs unter Developer (Entwickler) auf Programmieren und testen. Der Bereich Codieren und testen wird für Ihre Funktion angezeigt.

    Der Code für die Datei index.js wird im Editor angezeigt.

  5. Fügen Sie den folgenden Verweis auf die Bibliothek moment hinzu.

    const moment = require("moment");
    
  6. Ersetzen Sie den Hauptteil der Funktion durch den folgenden Code. Dieser testet, ob die Genehmigungsfrist abgelaufen ist.

    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;
    });
    

    Fassen wir uns für diese Übung kurz: Wenn die Approval-Funktion nicht innerhalb von 20 Sekunden antwortet, wird die Escalation-Funktion aufgerufen. Der Code ändert auch den Aufruf von Approval so, dass auf eine externe Eingabe gewartet wird. Auf diese Weise können wir zu Testzwecken steuern, wann die Antwort eintrifft.

  7. Klicken Sie in der oberen Menüleiste auf Speichern.

Sicherstellen des Starts des Durable Functions-Workflows

  1. Wählen Sie im Menü des Azure-Portals oder auf der Startseite unter Azure-Dienste die Option Alle Ressourcen und dann Ihre Funktions-App aus. Der Bereich Funktions-App wird angezeigt.

  2. Wählen Sie im Bereich Übersicht auf der oberen Menüleiste Neu starten und dann in der Eingabeaufforderung für den Neustart Ja aus. Warten Sie, bis der Neustart abgeschlossen wurde, bevor Sie fortfahren. Der Bereich Funktions-App wird wieder angezeigt.

  3. Wählen Sie die Registerkarte Funktionen in der Mitte des Bildschirms aus.

  4. Wählen Sie die Funktion HttpStart aus. Der Bereich HttpStart wird angezeigt.

  5. Wählen Sie auf der oberen Menüleiste Funktions-URL abrufen aus, und kopieren Sie die URL. Die URL sollte folgendem Beispiel entsprechen:

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

    Sie verwenden diese URL zum Ausführen Ihrer Funktionen.

  6. Öffnen Sie ein neues Browserfenster, und navigieren Sie zur URL, die Sie kopiert haben. Ersetzen Sie in der URL den Platzhalter {functionName} durch OrchFunction. Die URL sollte in etwa wie das folgende Beispiel aussehen:

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

    Die Antwortnachricht enthält mehrere URI-Endpunkte, die Sie zum Überwachen und Verwalten der Ausführung verwenden können. Sie sollte folgendem Beispiel ähneln:

    {
      "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. Kopieren Sie den Wert statusQueryGetUri, und navigieren Sie im Webbrowser zu dieser URL. Hier sollten Sie eine Antwortnachricht sehen, die den Status als Wird ausgeführt anzeigt, während darauf gewartet wird, dass der Timer 20 Sekunden herunterzählt. Diese Antwortnachricht sollte dem folgenden Beispiel ähneln:

    {
      "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. Warten Sie 20 Sekunden, und aktualisieren Sie dann das Browserfenster. Der Timeout wurde erreicht, und der Workflow ruft die Aktivität Eskalieren auf. Die angezeigte Antwort sollte folgendem Beispiel ähneln:

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