Cvičení – přidání trvalého časovače ke správě dlouhotrvajícího úkolu

Dokončeno

Společnost vás požádala, abyste nový pracovní postup pozměnili tak, aby byl začleněn krok eskalace s provedením akce v případě, že návrh projektu nebude schválen včas.

V tomto cvičení přidáte časovač k řízení časového limitu během provádění pracovního postupu. Naučíte se také, jak používat časový limit k řízení toho, kterou cestu provedení pracovní postup zvolí.

Přidání balíčku moment npm do aplikace Function App

Před změnou pracovního postupu přidáme do naší aplikace Function App prostřednictvím konzoly balíček npm moment.

  1. Pomocí stejného účtu, kterým jste aktivovali sandbox, se přihlaste na Azure Portal.

  2. V nabídce webu Azure Portal nebo na domovské stránce v části Služby Azure vyberte Všechny prostředky a pak vyberte aplikaci funkcí, kterou jste vytvořili v předchozím cvičení. Zobrazí se podokno Aplikace funkcí.

  3. V levém řádku nabídek v části Vývojové nástroje vyberte Konzola. Zobrazí se podokno konzoly pro vaši aplikaci funkcí.

  4. Ověřte, že se okno konzoly otevře ve složce C:\home\site\wwwroot , a spuštěním následujících příkazů nainstalujte knihovny potřebné pro tuto ukázkovou aplikaci funkcí.

    1. Spuštěním následujícího příkazu nainstalujte knihovnu TypeScript , což je požadovaná závislost pro statické psaní.

      npm install typescript
      
    2. Spuštěním následujícího příkazu nainstalujte knihovnu momentů , která obsahuje funkce data a času, které můžete použít s trvalými funkcemi.

      npm install moment
      

      Dokončení těchto příkazů může trvat několik sekund a správce balíčků uzlů může zobrazit některá upozornění, která můžete ignorovat.

  5. Počkejte, až se dokončí instalace všech balíčků, a potom zavřete okno konzoly.

Přidání aktivity eskalace do aplikace funkcí

  1. V nabídce webu Azure Portal nebo na domovské stránce v části Služby Azure vyberte Všechny prostředky a pak vyberte svou aplikaci funkcí. Zobrazí se podokno Aplikace funkcí.

  2. Vyberte kartu Funkce uprostřed obrazovky.

  3. Na řádku nabídek na kartě Funkce vyberte Vytvořit. Zobrazí se podokno Vytvořit funkci .

  4. V části Vybrat šablonu zadejte do pole Filtr aktivitu Durable Functions a vyberte tuto šablonu ze seznamu. Tato šablona vytvoří odolnou funkci, která se spustí, když je aktivita volána funkcí orchestrátoru.

  5. V části Podrobnosti šablony zadejte pro pole Nová funkce eskalaci názvu funkce a vyberte Vytvořit. Pro vaši funkci se zobrazí podokno eskalace .

  6. V levém podokně nabídek v části Vývojář vyberte Kód + Test. Pro vaši funkci se zobrazí podokno Kód a testování .

    Kód souboru index.js se zobrazí v editoru.

  7. Existující kód nahraďte následujícím kódem:

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

    Tento kód vrátí zprávu s oznámením, že pracovní postup byl eskalován. V produkčním systému by tato funkce obsahovala logiku pro upozornění příjemce nebo změnu přiřazení úkolu.

  8. V horním řádku nabídek vyberte Uložit a uložte novou funkci.

Aktualizace funkce orchestrace pro použití funkce eskalace

  1. V nabídce webu Azure Portal nebo na domovské stránce v části Služby Azure vyberte Všechny prostředky a pak vyberte svou aplikaci funkcí. Zobrazí se podokno Aplikace funkcí.

  2. Vyberte kartu Funkce uprostřed obrazovky.

  3. Vyberte funkci OrchFunction , kterou jste vytvořili v předchozím cvičení. Zobrazí se podokno funkce OrchFunction .

  4. V levém podokně nabídek v části Vývojář vyberte Kód + Test. Pro vaši funkci se zobrazí podokno Kód a testování .

    Kód souboru index.js se zobrazí v editoru.

  5. Do knihovny momentů přidejte následující odkaz.

    const moment = require("moment");
    
  6. Tělo funkce nahraďte následujícím kódem, který otestuje, jestli uplynul konečný termín schválení.

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

    Aby byl průběh pro účely tohoto cvičení krátký, pokud funkce Approval (Schválení) nereaguje do 20 sekund, volá se funkce Escalation (Eskalace). Kód také změní volání funkce Approval (Schválení), aby čekalo na externí vstup. Tímto způsobem můžeme řídit, kdy se odpověď vrátí pro účely testování.

  7. V horním řádku nabídek vyberte Uložit.

Ověření spuštění pracovního postupu Durable Functions

  1. V nabídce webu Azure Portal nebo na domovské stránce v části Služby Azure vyberte Všechny prostředky a pak vyberte svou aplikaci funkcí. Zobrazí se podokno Aplikace funkcí.

  2. V podokně Přehled v horním řádku nabídek vyberte Restartovat a po zobrazení výzvy k restartování vyberte Ano. Než budete pokračovat, počkejte, dokud restartování neskončí. Znovu se zobrazí podokno Aplikace funkcí.

  3. Vyberte kartu Funkce uprostřed obrazovky.

  4. Vyberte funkci HttpStart . Zobrazí se podokno HttpStart .

  5. V horním řádku nabídek vyberte Získat adresu URL funkce a zkopírujte adresu URL. Konkrétní adresa URL by měla vypadat jako na následujícím příkladu:

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

    Tuto adresu URL použijete pro spouštění funkcí.

  6. Otevřete nové okno prohlížeče a přejděte na adresu URL, kterou jste zkopírovali. V adrese URL nahraďte zástupný text {functionName} výrazem OrchFunction podobně jako v následujícím příkladu:

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

    Zpráva odpovědi obsahuje sadu koncových bodů URI, které můžete použít k monitorování a správě spouštění. Měl by vypadat jako v následujícím příkladu:

    {
      "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. Zkopírujte hodnotu statusQueryGetUri a pomocí webového prohlížeče přejděte na tuto adresu URL. Měla by se zobrazit zpráva s odpovědí, která zobrazuje stav Spuštěno , zatímco čeká na odpočítání časovače na 20 sekund, což by mělo vypadat podobně jako v následujícím příkladu:

    {
      "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. Počkejte 20 sekund a aktualizujte okno prohlížeče. Došlo k dosažení časového limitu a pracovní postup bude volat aktivitu Eskalace . Zobrazí se odpověď, která by se měla podobat následujícímu příkladu:

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