Oefening: Een duurzame timer toevoegen voor het beheren van een langlopende taak

Voltooid

Het bedrijf heeft u gevraagd om de nieuwe werkstroom zo aan te passen dat er een escalatiestap wordt opgenomen om actie te ondernemen als een voorstel voor een projectontwerp niet op tijd is goedgekeurd.

In deze oefening gaat u een timer toevoegen voor het beheren van een time-out tijdens het uitvoeren van uw werkstroom. U leert ook hoe u met de time-out kunt bepalen welk pad voor de uitvoering van de werkstroom wordt gebruikt.

Een npm-pakket toevoegen aan uw functie-app

Voordat we de werkstroom wijzigen, gaan we het knooppunt pakketbeheer moment aan onze functie-app toevoegen via de console.

  1. Meld u aan bij Azure Portal met het account waarmee u de sandbox hebt geactiveerd.

  2. Selecteer in het menu van Azure Portal of op de startpagina onder Azure-services alle resources en selecteer vervolgens de functie-app die u in de vorige oefening hebt gemaakt. Het deelvenster Functie-app wordt weergegeven.

  3. Selecteer Console in de linkermenubalk onder Ontwikkelhulpprogramma's. Het consolevenster wordt weergegeven voor uw functie-app.

  4. Controleer of het consolevenster wordt geopend in de map C:\home\site\wwwroot en voer vervolgens de volgende opdrachten uit om de bibliotheken te installeren die vereist zijn voor deze voorbeeldfunctie-app.

    1. Voer de volgende opdracht uit om de TypeScript-bibliotheek te installeren. Dit is een vereiste afhankelijkheid voor statisch typen.

      npm install typescript
      
    2. Voer de volgende opdracht uit om de momentbibliotheek te installeren, die datum-/tijdfuncties bevat die u met duurzame functies kunt gebruiken.

      npm install moment
      

      Het kan enkele seconden duren voordat deze opdrachten zijn voltooid en het knooppuntpakketbeheer kan enkele waarschuwingen weergeven, die u kunt negeren.

  5. Wacht totdat de installatie van alle pakketten is voltooid, en sluit het consolevenster.

Een escalatieactiviteit toevoegen aan uw functie-app

  1. Selecteer in het menu van Azure Portal of op de startpagina onder Azure-services alle resources en selecteer vervolgens uw functie-app. Het deelvenster Functie-app wordt weergegeven.

  2. Selecteer het tabblad Functies in het midden van het scherm.

  3. Selecteer Maken in de menubalk van het tabblad Functions. Het deelvenster Functie maken wordt weergegeven.

  4. Voer onder Selecteer een sjabloon in het vak Filter de activiteit Durable Functions in en selecteer die sjabloon in de lijst. Met deze sjabloon maakt u een duurzame functie die wordt uitgevoerd wanneer een activiteit wordt aangeroepen door een orchestratorfunctie.

  5. Voer onder Sjabloondetails voor het veld Nieuwe functie escalatie in voor de naam van de functie en selecteer Maken. Het escalatievenster wordt weergegeven voor uw functie.

  6. Selecteer code + test in het linkermenuvenster onder Ontwikkelaars. Het deelvenster Code en test wordt weergegeven voor uw functie.

    De code voor het bestand index.js wordt weergegeven in de editor.

  7. Vervang de huidige code door de volgende code:

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

    Met deze code wordt een bericht geretourneerd waarin wordt aangegeven dat de werkstroom is geëscaleerd. In een productiesysteem zou deze functie de logica bevatten om de ontvanger te herinneren of de taak opnieuw toe te wijzen.

  8. Selecteer Opslaan in de bovenste menubalk om de nieuwe functie op te slaan.

De indeling-functie bijwerken voor het gebruik van de escalatie-functie

  1. Selecteer in het menu van Azure Portal of op de startpagina onder Azure-services alle resources en selecteer vervolgens uw functie-app. Het deelvenster Functie-app wordt weergegeven.

  2. Selecteer het tabblad Functies in het midden van het scherm.

  3. Selecteer uw OrchFunction-functie die u in de vorige oefening hebt gemaakt. Het functievenster OrchFunction wordt weergegeven.

  4. Selecteer code + test in het linkermenuvenster onder Ontwikkelaars. Het deelvenster Code en test wordt weergegeven voor uw functie.

    De code voor het bestand index.js wordt weergegeven in de editor.

  5. Voeg de volgende verwijzing toe aan de momentbibliotheek .

    const moment = require("moment");
    
  6. Vervang de hoofdtekst van de functie door de volgende code, waarmee wordt getest of de deadline voor goedkeuring is verstreken.

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

    Om zaken bondig te houden voor het doel van deze oefening, wordt de escalatie-functie aangeroepen als de goedkeuring-functie niet binnen 20 seconden reageert. De code wijzigt tevens de aanroep van Goedkeuring, zodat wordt gewacht op een externe invoer. Op deze manier kunnen we bepalen wanneer het antwoord terugkomt voor testdoeleinden.

  7. Selecteer Opslaan in de bovenste menubalk.

Controleer of de Durable Functions-werkstroom wordt gestart

  1. Selecteer in het menu van Azure Portal of op de startpagina onder Azure-services alle resources en selecteer vervolgens uw functie-app. Het deelvenster Functie-app wordt weergegeven.

  2. Selecteer Opnieuw opstarten in het deelvenster Overzicht op de bovenste menubalk en selecteer Vervolgens Ja wanneer u wordt gevraagd opnieuw op te starten. Wacht tot opnieuw opstarten is voltooid voordat u doorgaat. Het deelvenster Functie-app wordt opnieuw weergegeven.

  3. Selecteer het tabblad Functies in het midden van het scherm.

  4. Selecteer uw HttpStart-functie . Het deelvenster HttpStart wordt weergegeven.

  5. Selecteer in de bovenste menubalk functie-URL ophalen en kopieer de URL. Uw URL moet eruit zien zoals in het volgende voorbeeld:

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

    U gebruikt deze URL om uw functies uit te voeren.

  6. Open een nieuw browservenster en navigeer naar de URL die u hebt gekopieerd. Vervang de tijdelijke aanduiding {functionName} in de URL door OrchFunction, zodat uw functie er ongeveer als volgt uitziet:

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

    Het antwoordbericht bevat een serie URI-eindpunten die u kunt gebruiken om de uitvoering te controleren en beheren. De uitvoering zou er moeten uitzien zoals in het volgende voorbeeld:

    {
      "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. Kopieer de waarde van statusQueryGetUri en gebruik uw webbrowser om naar die URL te navigeren. Als het goed is, ziet u een antwoordbericht waarin de status wordt weergegeven als Wordt uitgevoerd terwijl de timer wacht tot 20 seconden wordt geteld. Dit moet er ongeveer uitzien als in het volgende voorbeeld:

    {
      "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. Wacht 20 seconden en vernieuw het browservenster. De time-out is bereikt en de werkstroom roept de activiteit Escaleren aan. U ziet een antwoord zoals in het volgende voorbeeld:

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