Tworzenie pierwszej funkcji trwałej w języku Java

Durable Functions to rozszerzenie usługi Azure Functions umożliwiające zapisywanie funkcji stanowych w środowisku bezserwerowym. Rozszerzenie zarządza stanem, punktami kontrolnymi i ponownym uruchamianiem.

W tym przewodniku Szybki start dowiesz się, jak utworzyć i przetestować aplikację Durable Functions "Hello World" w języku Java. Najbardziej podstawowa aplikacja Durable Functions zawiera następujące trzy funkcje:

  • Funkcja orchestrator — opisuje przepływ pracy, który organizuje inne funkcje.
  • Funkcja Activity — wywoływana przez funkcję orkiestratora, wykonuje pracę i opcjonalnie zwraca wartość.
  • Funkcja klienta — zwykła funkcja platformy Azure, która uruchamia funkcję orkiestratora. W tym przykładzie użyto funkcji wyzwalanej przez protokół HTTP.

W tym przewodniku Szybki start pokazano, jak utworzyć tę aplikację "Hello World", którą można wykonać na różne sposoby. Użyj selektora powyżej, aby wybrać preferowane podejście.

Wymagania wstępne

Do ukończenia tego samouczka niezbędne są następujące elementy:

  • Zestaw Java Developer Kit, wersja 8 lub nowsza.

  • Apache Maven, wersja 3.0 lub nowsza.

  • Najnowsza wersja narzędzi Azure Functions Core Tools.

    • W przypadku usługi Azure Functions 4.x wymagane są narzędzia Core Tools w wersji 4.0.4915 lub nowszej.
  • Konto usługi Azure Storage, które wymaga subskrypcji platformy Azure.

Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto platformy Azure.

Dodawanie wymaganych zależności i wtyczek do projektu

Dodaj następujące elementy do elementu pom.xml:

<properties>
  <azure.functions.maven.plugin.version>1.18.0</azure.functions.maven.plugin.version>
  <azure.functions.java.library.version>3.0.0</azure.functions.java.library.version>
  <durabletask.azure.functions>1.0.0</durabletask.azure.functions>
  <functionAppName>your-unique-app-name</functionAppName>
</properties>

<dependencies>
  <dependency>
    <groupId>com.microsoft.azure.functions</groupId>
    <artifactId>azure-functions-java-library</artifactId>
    <version>${azure.functions.java.library.version}</version>
  </dependency>
  <dependency>
    <groupId>com.microsoft</groupId>
    <artifactId>durabletask-azure-functions</artifactId>
    <version>${durabletask.azure.functions}</version>
  </dependency>
</dependencies>

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.8.1</version>
    </plugin>
    <plugin>
      <groupId>com.microsoft.azure</groupId>
      <artifactId>azure-functions-maven-plugin</artifactId>
      <version>${azure.functions.maven.plugin.version}</version>
      <configuration>
        <appName>${functionAppName}</appName>
        <resourceGroup>java-functions-group</resourceGroup>
        <appServicePlanName>java-functions-app-service-plan</appServicePlanName>
        <region>westus</region>
        <runtime>
          <os>windows</os>
          <javaVersion>11</javaVersion>
        </runtime>
        <appSettings>
          <property>
            <name>FUNCTIONS_EXTENSION_VERSION</name>
            <value>~4</value>
          </property>
        </appSettings>
      </configuration>
      <executions>
        <execution>
          <id>package-functions</id>
          <goals>
            <goal>package</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
    <plugin>
      <artifactId>maven-clean-plugin</artifactId>
      <version>3.1.0</version>
    </plugin>
  </plugins>
</build>

Dodawanie wymaganych plików JSON

host.json Dodaj plik do katalogu projektu. Zawartość powinna wyglądać mniej więcej tak:

{
  "version": "2.0",
  "logging": {
    "logLevel": {
      "DurableTask.AzureStorage": "Warning",
      "DurableTask.Core": "Warning"
    }
  },
  "extensions": {
    "durableTask": {
      "hubName": "JavaTestHub"
    }
  },
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[4.*, 5.0.0)"
  }
}

Uwaga

Należy pamiętać, że obecnie tylko pakiet rozszerzeń usługi Azure Functions w wersji 4 ma wymaganą obsługę rozszerzenia Durable Functions dla języka Java. Rozszerzenie Durable Functions dla języka Java nie jest obsługiwane w pakietach rozszerzeń w wersji 3 i wczesnych wersjach. Aby uzyskać więcej informacji na temat pakietów rozszerzeń, zobacz dokumentację pakietów rozszerzeń.

Rozszerzenie Durable Functions wymaga dostawcy magazynu do przechowywania stanu środowiska uruchomieniowego. local.settings.json Dodaj plik do katalogu projektu, aby skonfigurować dostawcę magazynu. Aby użyć usługi Azure Storage jako dostawcy, ustaw wartość AzureWebJobsStorage na parametry połączenia konta usługi Azure Storage:

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "<your storage account connection string>",
    "FUNCTIONS_WORKER_RUNTIME": "java"
  }
}

Tworzenie funkcji

Poniższy przykładowy kod przedstawia prosty przykład każdego z nich:

import com.microsoft.azure.functions.annotation.*;
import com.microsoft.azure.functions.*;
import java.util.*;

import com.microsoft.durabletask.*;
import com.microsoft.durabletask.azurefunctions.DurableActivityTrigger;
import com.microsoft.durabletask.azurefunctions.DurableClientContext;
import com.microsoft.durabletask.azurefunctions.DurableClientInput;
import com.microsoft.durabletask.azurefunctions.DurableOrchestrationTrigger;

public class DurableFunctionsSample {
    /**
     * This HTTP-triggered function starts the orchestration.
     */
    @FunctionName("StartOrchestration")
    public HttpResponseMessage startOrchestration(
            @HttpTrigger(name = "req", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> request,
            @DurableClientInput(name = "durableContext") DurableClientContext durableContext,
            final ExecutionContext context) {
        context.getLogger().info("Java HTTP trigger processed a request.");

        DurableTaskClient client = durableContext.getClient();
        String instanceId = client.scheduleNewOrchestrationInstance("Cities");
        context.getLogger().info("Created new Java orchestration with instance ID = " + instanceId);
        return durableContext.createCheckStatusResponse(request, instanceId);
    }

    /**
     * This is the orchestrator function, which can schedule activity functions, create durable timers,
     * or wait for external events in a way that's completely fault-tolerant.
     */
    @FunctionName("Cities")
    public String citiesOrchestrator(
            @DurableOrchestrationTrigger(name = "taskOrchestrationContext") TaskOrchestrationContext ctx) {
        String result = "";
        result += ctx.callActivity("Capitalize", "Tokyo", String.class).await() + ", ";
        result += ctx.callActivity("Capitalize", "London", String.class).await() + ", ";
        result += ctx.callActivity("Capitalize", "Seattle", String.class).await() + ", ";
        result += ctx.callActivity("Capitalize", "Austin", String.class).await();
        return result;
    }

    /**
     * This is the activity function that gets invoked by the orchestrator function.
     */
    @FunctionName("Capitalize")
    public String capitalize(@DurableActivityTrigger(name = "name") String name, final ExecutionContext context) {
        context.getLogger().info("Capitalizing: " + name);
        return name.toUpperCase();
    }
}

Tworzenie projektu lokalnego za pomocą polecenia Maven

  1. Uruchom następujące polecenie, aby wygenerować projekt przy użyciu podstawowych funkcji aplikacji Durable Functions:
mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DarchetypeVersion=1.51 -Dtrigger=durablefunctions
  1. Postępuj zgodnie z monitami i podaj następujące informacje:
Monit Wartość
Groupid com.function
artifactId myDurableFunction
version 1.0-SNAPSHOT
Pakiet com.function
Y Naciśnij klawisz Enter, aby potwierdzić

Teraz masz projekt lokalny wygenerowany z trzema funkcjami wymaganymi dla podstawowej aplikacji Durable Functions.

Sprawdź, czy masz com.microsoft:durabletask-azure-functions zależność w pliku pom.xml.

Konfigurowanie dostawcy magazynu zaplecza

Rozszerzenie Durable Functions wymaga dostawcy magazynu do przechowywania stanu środowiska uruchomieniowego. Usługę Azure Storage jako dostawcę local.settings.json magazynu można skonfigurować, podając parametry połączenia konta usługi Azure Storage jako wartość :AzureWebJobsStorage

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "<your storage account connection string>",
    "FUNCTIONS_WORKER_RUNTIME": "java"
  }
}

Tworzenie projektu lokalnego

  1. W programie Visual Studio Code naciśnij klawisz F1 (lub Ctrl/Cmd+Shift+P), aby otworzyć paletę poleceń. W palecie poleceń wyszukaj i wybierz pozycję Azure Functions: Create New Project....

    Screenshot of create new functions project.

  2. Wybierz pustą lokalizację folderu dla projektu i wybierz pozycję Wybierz.

  3. Postępuj zgodnie z monitami i podaj następujące informacje:

    Monit Wartość
    Wybieranie języka Wybierz plik Java.
    Wybieranie wersji języka Java Wybierz Java 8 lub nowszą wersję języka Java, na której działają funkcje na platformie Azure. Wybierz wersję języka Java zweryfikowaną lokalnie.
    Podaj identyfikator grupy com.function.
    Podaj identyfikator artefaktu myDurableFunction.
    Podaj wersję 1.0-SNAPSHOT.
    Podaj nazwę pakietu com.function.
    Podaj nazwę aplikacji myDurableFunction.
    Wybieranie narzędzia kompilacji dla projektu Java Wybierz plik Maven.
    Wybierz sposób otwierania projektu Wybierz plik Open in new window.

Masz teraz projekt z przykładową funkcją HTTP. Możesz usunąć tę funkcję, jeśli chcesz, ponieważ będziemy dodawać podstawowe funkcje aplikacji Durable Functions w następnym kroku.

Dodawanie funkcji do projektu

  1. W palecie poleceń wyszukaj i wybierz pozycję Azure Functions: Create Function....

  2. Wybierz Change template filter pozycję na All.

  3. Postępuj zgodnie z monitami i podaj następujące informacje:

    Monit Wartość
    Wybieranie szablonu dla funkcji DurableFunctionsOrchestration
    Podaj nazwę pakietu com.function
    Podaj nazwę funkcji DurableFunctionsOrchestrator
  4. Wybierz Select storage account okno podręczne z prośbą o skonfigurowanie informacji o koncie magazynu i postępuj zgodnie z monitami.

Teraz powinny istnieć trzy podstawowe funkcje dla wygenerowanej aplikacji Durable Functions.

Konfigurowanie pliku pom.xml i pliku host.json

Dodaj następującą zależność do elementu pom.xml:

<dependency>
  <groupId>com.microsoft</groupId>
  <artifactId>durabletask-azure-functions</artifactId>
  <version>1.0.0</version>
</dependency>

extensions Dodaj właściwość do elementu host.json:

"extensions": { "durableTask": { "hubName": "JavaTestHub" }}

Lokalne testowanie funkcji

Podstawowe narzędzia usługi Azure Functions umożliwiają uruchamianie projektu usługi Azure Functions na lokalnym komputerze deweloperskim.

Uwaga

Rozszerzenie Durable Functions dla języka Java wymaga narzędzi Azure Functions Core Tools w wersji 4.0.4915 lub nowszej. Możesz sprawdzić, która wersja jest zainstalowana, uruchamiając func --version polecenie z poziomu terminalu.

  1. Jeśli używasz programu Visual Studio Code, otwórz nowe okno terminalu i uruchom następujące polecenia, aby skompilować projekt:

    mvn clean package
    

    Następnie uruchom funkcję durable:

    mvn azure-functions:run
    
  2. W panelu terminalu skopiuj punkt końcowy adresu URL funkcji wyzwalanej przez protokół HTTP.

    Screenshot of Azure local output.

  3. Za pomocą narzędzia, takiego jak Postman lub cURL, wyślij żądanie HTTP POST do punktu końcowego adresu URL. Powinna zostać wyświetlona odpowiedź podobna do następującej:

    {
        "id": "d1b33a60-333f-4d6e-9ade-17a7020562a9",
        "purgeHistoryDeleteUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d1b33a60-333f-4d6e-9ade-17a7020562a9?code=ACCupah_QfGKoFXydcOHH9ffcnYPqjkddSawzRjpp1PQAzFueJ2tDw==",
        "sendEventPostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d1b33a60-333f-4d6e-9ade-17a7020562a9/raiseEvent/{eventName}?code=ACCupah_QfGKoFXydcOHH9ffcnYPqjkddSawzRjpp1PQAzFueJ2tDw==",
        "statusQueryGetUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d1b33a60-333f-4d6e-9ade-17a7020562a9?code=ACCupah_QfGKoFXydcOHH9ffcnYPqjkddSawzRjpp1PQAzFueJ2tDw==",
        "terminatePostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d1b33a60-333f-4d6e-9ade-17a7020562a9/terminate?reason={text}&code=ACCupah_QfGKoFXydcOHH9ffcnYPqjkddSawzRjpp1PQAzFueJ2tDw=="
    }
    

    Odpowiedź to początkowy wynik funkcji HTTP informujący o pomyślnym rozpoczęciu orkiestracji trwałej. Nie jest to jeszcze końcowy wynik aranżacji. Odpowiedź zawiera kilka przydatnych adresów URL. Na razie wykonajmy zapytanie o stan aranżacji.

  4. Skopiuj wartość adresu URL i statusQueryGetUri wklej ją na pasku adresu przeglądarki i wykonaj żądanie. Alternatywnie możesz również nadal używać narzędzia Postman lub cURL do wystawiania żądania GET.

    Żądanie wykona zapytanie o stan wystąpienia aranżacji. Otrzymasz ostateczną odpowiedź, która pokazuje, że wystąpienie zostało ukończone i zawiera dane wyjściowe lub wyniki funkcji trwałej. Wygląda na to:

    {
        "name": "Cities",
        "instanceId": "d1b33a60-333f-4d6e-9ade-17a7020562a9",
        "runtimeStatus": "Completed",
        "input": null,
        "customStatus": "",
        "output":"TOKYO, LONDON, SEATTLE, AUSTIN",
        "createdTime": "2022-12-12T05:00:02Z",
        "lastUpdatedTime": "2022-12-12T05:00:06Z"
    }