Ćwiczenie — dodawanie trwałego czasomierza do zarządzania długotrwałym zadaniem

Ukończone

Firma poprosiła Cię o poprawienie nowego przepływu pracy w celu dodania etapu eskalacji, którego zadaniem jest podjęcie działania, gdy propozycja architektury projektu nie została zatwierdzona w odpowiednim czasie.

W ramach tego ćwiczenia dodasz czasomierz do sterowania limitem czasu podczas wykonywania przepływu pracy. Nauczysz się również, jak za pomocą limitu czasu sterować wybieraniem ścieżki wykonywania przez przepływ pracy.

Dodawanie pakietu npm moment do aplikacji funkcji

Przed zmianą przepływu pracy dodamy pakiet npm moment do naszej aplikacji funkcji przy użyciu konsoli.

  1. Zaloguj się w witrynie Azure Portal przy użyciu tego samego konta, które zostało wykorzystane do aktywowania piaskownicy.

  2. W menu witryny Azure Portal lub na stronie głównej w obszarze Usługi platformy Azure wybierz pozycję Wszystkie zasoby, a następnie wybierz aplikację funkcji utworzoną w poprzednim ćwiczeniu. Pojawi się okienko Aplikacja funkcji.

  3. Na pasku menu po lewej stronie w obszarze Narzędzia programistyczne wybierz pozycję Konsola. Okienko Konsola zostanie wyświetlone dla aplikacji funkcji.

  4. Sprawdź, czy w folderze C:\home\site\wwwroot zostanie otwarte okno konsoli, a następnie uruchom następujące polecenia, aby zainstalować biblioteki wymagane dla tej przykładowej aplikacji funkcji.

    1. Uruchom następujące polecenie, aby zainstalować bibliotekę TypeScript , która jest wymaganą zależnością do wpisywania statycznego.

      npm install typescript
      
    2. Uruchom następujące polecenie, aby zainstalować bibliotekę moment , która zawiera funkcje daty/godziny, których można używać z funkcjami trwałymi.

      npm install moment
      

      Wykonanie tych poleceń może potrwać kilka sekund, a menedżer pakietów węzłów może wyświetlić kilka ostrzeżeń, które można zignorować.

  5. Zaczekaj na zakończenie instalacji wszystkich pakietów, a następnie zamknij okno konsoli.

Dodawanie działania eskalacji do aplikacji funkcji

  1. W menu witryny Azure Portal lub na stronie głównej w obszarze Usługi platformy Azure wybierz pozycję Wszystkie zasoby, a następnie wybierz aplikację funkcji. Pojawi się okienko Aplikacja funkcji.

  2. Wybierz kartę Funkcje w środku ekranu.

  3. Na pasku menu karty Funkcje wybierz pozycję Utwórz. Zostanie wyświetlone okienko Tworzenie funkcji .

  4. W obszarze Wybierz szablon w polu Filtr wprowadź działanie Durable Functions i wybierz ten szablon z listy. Ten szablon tworzy trwałą funkcję, która jest uruchamiana, gdy działanie jest wywoływane przez funkcję orkiestratora.

  5. W obszarze Szczegóły szablonu w polu Nowa funkcja wprowadź wartość Eskalacja dla nazwy funkcji, a następnie wybierz pozycję Utwórz. Zostanie wyświetlone okienko eskalacji dla funkcji.

  6. W okienku menu po lewej stronie w obszarze Deweloper wybierz pozycję Kod i testowanie. Zostanie wyświetlone okienko Kod i test dla funkcji.

    Kod pliku index.js zostanie wyświetlony w edytorze.

  7. Zastąp istniejący kod poniższym kodem:

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

    Ten kod zwraca komunikat wskazujący, że przepływ pracy został przekazany do eskalacji. W systemie produkcyjnym ta funkcja zawierałaby logikę umożliwiającą wysyłanie przypomnień do adresata lub ponowne przypisywanie zadania.

  8. Na górnym pasku menu wybierz pozycję Zapisz , aby zapisać nową funkcję.

Aktualizowanie funkcji orkiestracji w celu korzystania z funkcji eskalacji

  1. W menu witryny Azure Portal lub na stronie głównej w obszarze Usługi platformy Azure wybierz pozycję Wszystkie zasoby, a następnie wybierz aplikację funkcji. Pojawi się okienko Aplikacja funkcji.

  2. Wybierz kartę Funkcje w środku ekranu.

  3. Wybierz funkcję OrchFunction utworzoną w poprzednim ćwiczeniu. Zostanie wyświetlone okienko funkcji OrchFunction .

  4. W okienku menu po lewej stronie w obszarze Deweloper wybierz pozycję Kod i testowanie. Zostanie wyświetlone okienko Kod i test dla funkcji.

    Kod pliku index.js zostanie wyświetlony w edytorze.

  5. Dodaj następujące odwołanie do biblioteki momentów .

    const moment = require("moment");
    
  6. Zastąp treść funkcji następującym kodem, który sprawdzi, czy upłynął termin zatwierdzenia.

    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 nie tracić czasu, na potrzeby tego ćwiczenia ustalono, że jeśli funkcja Zatwierdzenie nie odpowie w ciągu 20 sekund, zostanie wywołana funkcja Eskalacja. Kod zmienia także wywołanie funkcji Zatwierdzenie, aby oczekiwało na dane wejściowe z zewnątrz. W ten sposób możemy kontrolować, kiedy odpowiedź wróci do celów testowych.

  7. Na górnym pasku menu wybierz pozycję Zapisz.

Sprawdzanie, czy przepływ pracy rozszerzenia Durable Functions się uruchamia

  1. W menu witryny Azure Portal lub na stronie głównej w obszarze Usługi platformy Azure wybierz pozycję Wszystkie zasoby, a następnie wybierz aplikację funkcji. Pojawi się okienko Aplikacja funkcji.

  2. W okienku Przegląd na górnym pasku menu wybierz pozycję Uruchom ponownie, a następnie wybierz pozycję Tak po wyświetleniu monitu o ponowne uruchomienie. Przed kontynuowaniem zaczekaj na ukończenie ponownego uruchamiania. Okienko Aplikacja funkcji pojawia się ponownie.

  3. Wybierz kartę Funkcje w środku ekranu.

  4. Wybierz funkcję HttpStart . Zostanie wyświetlone okienko HttpStart .

  5. Na górnym pasku menu wybierz pozycję Pobierz adres URL funkcji i skopiuj adres URL. Adres URL powinien przypominać następujący przykład:

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

    Ten adres URL służy do uruchamiania Twoich funkcji.

  6. Otwórz nowe okno przeglądarki i przejdź do skopiowanego adresu URL. W adresie URL zamiast symbolu zastępczego {functionName} wpisz OrchFunction, aby otrzymać adres podobny do poniższego przykładu:

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

    Komunikat odpowiedzi zawiera zestaw punktów końcowych identyfikatora URI, które umożliwiają monitorowanie wykonywania i zarządzanie nim, co wygląda podobnie jak w poniższym przykładzie:

    {
      "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. Skopiuj wartość statusQueryGetUri i użyj przeglądarki internetowej, aby przejść do tego adresu URL. Powinien zostać wyświetlony komunikat odpowiedzi, który pokazuje stan Uruchomiono , czekając na odliczenie czasomierza do 20 sekund, co powinno przypominać następujący przykład:

    {
      "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. Poczekaj 20 sekund i odśwież okno przeglądarki. Osiągnięto limit czasu, a przepływ pracy wywoła działanie Eskalacja. Zobaczysz odpowiedź podobną do następującego przykładu:

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