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
- 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
- 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
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...
.Wybierz pustą lokalizację folderu dla projektu i wybierz pozycję Wybierz.
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
W palecie poleceń wyszukaj i wybierz pozycję
Azure Functions: Create Function...
.Wybierz
Change template filter
pozycję naAll
.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
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.
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
W panelu terminalu skopiuj punkt końcowy adresu URL funkcji wyzwalanej przez protokół HTTP.
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.
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" }