Övning – Lägga till en hållbar timer för att hantera en långvarig uppgift

Slutförd

Företaget har bett dig att ändra ditt nya arbetsflöde genom att lägga till ett eskaleringssteg för att vidta en åtgärd om ett projektdesignförslag inte godkänns i tid.

I den här övningen lägger du till en timer för att styra tidsgränsen vid körning av arbetsflödet. Du får även lära dig hur du använder tidsgränsen för att styra vilken körningsväg som arbetsflödet använder.

Lägga till npm-paketet moment i funktionsappen

Innan vi ändrar arbetsflödet lägger vi till npm-paketet moment i funktionsappen via konsolen.

  1. Logga in på Azure-portalen med samma konto som du använde till att aktivera sandbox-miljön.

  2. På menyn i Azure-portalen eller på sidan Start väljer du Alla resurser under Azure-tjänster och sedan den funktionsapp som du skapade i föregående övning. Fönstret Funktionsapp visas.

  3. I den vänstra menyraden går du till Utvecklingsverktyg och väljer Konsol. Konsolfönstret visas för funktionsappen.

  4. Kontrollera att konsolfönstret öppnas i mappen C:\home\site\wwwroot och kör sedan följande kommandon för att installera de bibliotek som krävs för den här exempelfunktionsappen.

    1. Kör följande kommando för att installera TypeScript-biblioteket , som är ett obligatoriskt beroende för statisk typning.

      npm install typescript
      
    2. Kör följande kommando för att installera momentbiblioteket , som innehåller datum-/tidsfunktioner som du kan använda med varaktiga funktioner.

      npm install moment
      

      De här kommandona kan ta några sekunder att slutföra och nodpakethanteraren kan visa några varningar som du kan ignorera.

  5. Vänta tills alla paket har installerats, stäng sedan konsolfönstret.

Lägga till en eskaleringsaktivitet i funktionsappen

  1. På Menyn i Azure-portalen eller på sidan Start väljer du Alla resurser under Azure-tjänster och sedan din funktionsapp. Fönstret Funktionsapp visas.

  2. Välj fliken Funktioner i mitten av skärmen.

  3. I menyraden På fliken Funktioner väljer du Skapa. Fönstret Skapa funktion visas.

  4. Under Välj en mall i rutan Filter anger du Durable Functions-aktivitet och väljer mallen i listan. Den här mallen skapar en varaktig funktion som körs när en aktivitet anropas av en orchestrator-funktion.

  5. Under Mallinformation för fältet Ny funktion anger du Eskalering för namnet på funktionen och väljer Skapa. Eskaleringsfönstret visas för din funktion.

  6. I det vänstra menyfönstret, under Utvecklare, väljer du Kod + Test. Fönstret Kod + test visas för din funktion.

    Koden för filen index.js visas i redigeraren.

  7. Ersätt den befintliga koden med följande kod:

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

    Den här koden returnerar ett meddelande om att arbetsflödet har eskalerats. I ett produktionssystem skulle den här funktionen innehålla logik för att påminna mottagaren eller omtilldela uppgiften.

  8. I den översta menyraden väljer du Spara för att spara den nya funktionen.

Uppdatera orkestreringsfunktionen till att använda eskaleringsfunktionen

  1. På Menyn i Azure-portalen eller på sidan Start väljer du Alla resurser under Azure-tjänster och sedan din funktionsapp. Fönstret Funktionsapp visas.

  2. Välj fliken Funktioner i mitten av skärmen.

  3. Välj den OrchFunction-funktion som du skapade i föregående övning. Funktionsfönstret OrchFunction visas.

  4. I det vänstra menyfönstret, under Utvecklare, väljer du Kod + Test. Fönstret Kod + test visas för din funktion.

    Koden för filen index.js visas i redigeraren.

  5. Lägg till följande referens till ögonblicksbiblioteket.

    const moment = require("moment");
    
  6. Ersätt funktionens brödtext med följande kod, som testar om tidsgränsen för godkännande har passerat.

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

    För att hålla det kortfattat för den här övningen gäller att om funktionen Approval (Godkännande) inte svarar inom 20 sekunder så anropas funktionen Escalation (Eskalering). Koden ändrar även anropet till Approval så att den väntar på extern inmatning. På så sätt kan vi styra när svaret kommer tillbaka i testsyfte.

  7. I den översta menyraden väljer du Spara.

Kontrollera att Durable Functions-arbetsflödet startar

  1. På Menyn i Azure-portalen eller på sidan Start väljer du Alla resurser under Azure-tjänster och sedan din funktionsapp. Fönstret Funktionsapp visas.

  2. I fönstret Översikt går du till den översta menyraden och väljer Starta om och sedan Ja när du uppmanas att starta om. Vänta tills omstarten har slutförts innan du fortsätter. Fönstret Funktionsapp visas igen.

  3. Välj fliken Funktioner i mitten av skärmen.

  4. Välj din HttpStart-funktion . Fönstret HttpStart visas.

  5. På den översta menyraden väljer du Hämta funktions-URL och kopierar URL:en. URL:en bör likna följande exempel:

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

    Du använder den här URL:en för att köra funktionerna.

  6. Öppna ett nytt webbläsarfönster och navigera till den URL som du kopierade. I URL:en ersätter du platshållaren {functionName} med OrchFunction, vilket bör likna följande exempel:

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

    Svarsmeddelandet innehåller en uppsättning URI-slutpunkter som du kan använda för att övervaka och hantera körningen, som bör likna följande exempel:

    {
      "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. Kopiera värdet statusQueryGetUri och använd webbläsaren för att navigera till webbadressen. Du bör se ett svarsmeddelande som visar statusen Körs medan den väntar på att timern ska räknas ned till 20 sekunder, vilket bör likna följande exempel:

    {
      "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. Vänta i 20 sekunder och uppdatera webbläsarfönstret. Tidsgränsen har nåtts och arbetsflödet anropar aktiviteten Escalate . Ett svar som liknar följande exempel bör visas:

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