Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Użyj funkcji Durable w ramach Azure Functions do pisania funkcji stanowych w środowisku bezserwerowym. Durable Functions zarządza stanem, punktami kontrolnymi i ponownymi uruchomieniami w aplikacji.
W tym przewodniku szybkiego startu utworzysz i przetestujesz aplikację Durable Functions w języku Java.
Podstawowa aplikacja Durable Functions ma trzy funkcje:
-
Funkcja orkiestratora (
Cities): przepływ pracy, który organizuje inne funkcje. -
Funkcja działania (
Capitalize): funkcja, którą orkiestrator wywołuje w celu wykonywania pracy i zwraca wartość. -
Funkcja klienta (
StartOrchestration): funkcja wyzwalana przez protokół HTTP, która uruchamia orkiestrator.
Ten szybki start oferuje trzy ścieżki konfiguracji. Użyj selektora w górnej części strony, aby wybrać preferowane podejście:
- Konfiguracja ręczna: utwórz każdy plik ręcznie, aby uzyskać pełną kontrolę nad strukturą projektu.
- Polecenie Maven: użyj archetypu narzędzia Maven, aby utworzyć szkielet projektu w jednym poleceniu.
- Visual Studio Code: użyj rozszerzenia Azure Functions programu VS Code, aby wygenerować projekt za pomocą interfejsu użytkownika z przewodnikiem.
Wymagania wstępne
Aby ukończyć tę instrukcję szybkiego startu, potrzebujesz:
Zainstalowany pakiet Java Developer Kit w wersji 8 lub nowszej.
Zainstalowano oprogramowanie Apache Maven w wersji 3.0 lub nowszej.
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.
Narzędzie do testowania HTTP, które zapewnia bezpieczeństwo danych. Aby uzyskać więcej informacji, zobacz Narzędzia do testowania HTTP.
Visual Studio Code z rozszerzeniem Azure Functions zainstalowane (wymagane tylko dla ścieżki konfiguracji Visual Studio Code).
Subskrypcja platformy Azure. Aby użyć Durable Functions, musisz mieć konto Azure Storage.
Jeśli nie masz jeszcze konta platformy Azure, przed rozpoczęciem utwórz bezpłatne konto.
Dodawanie wymaganych zależności i wtyczek do projektu
Dodaj następujący kod do pliku pom.xml . Przed skopiowaniem zastąp your-unique-app-name unikalną nazwą funkcji aplikacji na światowym poziomie. Dostosuj region, javaVersion i resourceGroup do środowiska.
<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
Dodaj plik host.json do katalogu projektu. Powinien on wyglądać podobnie do poniższego przykładu:
{
"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 / Notatka
Durable Functions dla Java wymaga pakietu rozszerzeń w wersji 4. Wcześniejsze pakiety nie są obsługiwane. Aby uzyskać więcej informacji, zobacz dokumentację pakietów rozszerzeń.
Rozszerzenie Durable Functions wymaga dostawcy magazynu do przechowywania stanu środowiska uruchomieniowego.
Dodaj plik local.settings.json 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"
}
}
Ważna
Plik local.settings.json może zawierać wpisy tajne. Upewnij się, że dodasz go do pliku .gitignore, aby uniknąć jego zatwierdzania do repozytorium kontroli wersji.
Twórz funkcje orkiestratora, funkcje działania i funkcje klienta Durable Functions
Poniższy przykładowy kod przedstawia podstawowy przykład poszczególnych typów funkcji:
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 is 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 lokalnego projektu Durable Functions przy użyciu polecenia Maven
Uruchom następujące polecenie, aby wygenerować projekt zawierający podstawowe funkcje aplikacji Durable Functions:
mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DarchetypeVersion=1.62 -Dtrigger=durablefunctions
Po wyświetleniu monitów podaj następujące informacje:
| Podpowiedź | Action |
|---|---|
| groupId | Wprowadź com.function. |
| artifactId | Wprowadź myDurableFunction. |
| version | Wybierz pozycję 1.0-SNAPSHOT. |
| pakiet | Wprowadź com.function. |
| Y | Wprowadź wartość Y i wybierz Enter, aby potwierdzić. |
Teraz masz projekt lokalny z trzema funkcjami, które znajdują się w podstawowej aplikacji Durable Functions. Archetyp zawiera com.microsoft:durabletask-azure-functions jako zależność w pliku pom.xml automatycznie.
Konfigurowanie dostawcy przechowywania w tle dla Durable Functions
Rozszerzenie Durable Functions wymaga dostawcy magazynu do przechowywania stanu środowiska uruchomieniowego. Usługę Azure Storage można ustawić jako dostawcę magazynu w local.settings.json. Użyj ciągu połączenia swojego konta Azure Storage jako wartości dla AzureWebJobsStorage, jak w tym przykładzie:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "<your storage account connection string>",
"FUNCTIONS_WORKER_RUNTIME": "java"
}
}
Ważna
Plik local.settings.json może zawierać wpisy tajne. Upewnij się, że dodaj go do pliku .gitignore, aby uniknąć zatwierdzania go do kontroli wersji.
Tworzenie projektu lokalnego
W Visual Studio Code wybierz klawisz F1 (lub naciśnij klawisze Ctrl/Cmd+Shift+P), aby otworzyć paletę poleceń. Po pojawieniu się monitu (
>), wybierz Azure Functions: Utwórz nowy projekt.
Wybierz przycisk Przeglądaj. W oknie dialogowym Wybieranie folderu przejdź do folderu, który ma być używany dla projektu, a następnie wybierz pozycję Wybierz.
Po wyświetleniu monitów podaj następujące informacje:
Podpowiedź Action Wybieranie języka Wybierz pozycję Java. Wybierz wersję Java Wybierz pozycję Java 8 lub nowszą. Wybierz wersję języka Java, na której działają funkcje na platformie Azure, i wersję zweryfikowaną lokalnie. Podaj identyfikator grupy Wprowadź com.function. Podaj identyfikator artefaktu Wprowadź myDurableFunction. Podaj wersję Wprowadź 1.0-SNAPSHOT. Podaj nazwę pakietu Wprowadź com.function. Podaj nazwę aplikacji Wprowadź myDurableFunction. Wybierz narzędzie kompilacji dla projektu Java Wybierz pozycję Maven. Wybierz sposób otwierania projektu Wybierz pozycję Otwórz w nowym oknie.
Masz teraz projekt, który ma przykładową funkcję HTTP. Wygenerowaną funkcję HTTP można usunąć, ponieważ w następnym kroku dodasz Durable Functions.
Dodawanie funkcji do projektu
W palecie poleceń wprowadź , a następnie wybierz pozycję Azure Functions: Create Function.
W obszarze Zmień filtr szablonu wybierz pozycję Wszystkie.
Po wyświetleniu monitów podaj następujące informacje:
Podpowiedź Action Wybieranie szablonu dla funkcji Wybierz pozycję DurableFunctionsOrchestration. Podaj nazwę pakietu Wprowadź com.function. Podaj nazwę funkcji Wprowadź DurableFunctionsOrchestrator. W oknie dialogowym wybierz pozycję Wybierz konto magazynu, aby skonfigurować konto magazynu, a następnie postępuj zgodnie z monitami.
Teraz powinny istnieć trzy podstawowe funkcje wygenerowane dla aplikacji Durable Functions.
Konfigurowanie pom.xml i host.json dla Durable Functions
Dodaj następującą zależność do pliku pom.xml:
<dependency>
<groupId>com.microsoft</groupId>
<artifactId>durabletask-azure-functions</artifactId>
<version>1.0.0</version>
</dependency>
extensions Dodaj właściwość do pliku host.json. Jeśli plik ma już inne właściwości, połącz extensions blok z istniejącym JSON.
{
"version": "2.0",
"extensions": {
"durableTask": {
"hubName": "JavaTestHub"
}
},
"extensionBundle": {
"id": "Microsoft.Azure.Functions.ExtensionBundle",
"version": "[4.*, 5.0.0)"
}
}
Lokalne testowanie funkcji
narzędzia Azure Functions Core Tools umożliwiają uruchamianie projektu Azure Functions na lokalnym komputerze programistycznym.
Jeśli używasz programu Visual Studio Code, otwórz nowe okno terminalu i uruchom następujące polecenia, aby skompilować projekt:
mvn clean packageNastępnie uruchom funkcję trwałą:
mvn azure-functions:runNa panelu terminalu skopiuj punkt końcowy adresu URL funkcji wyzwalanej przez protokół HTTP.
Użyj narzędzia testowego HTTP , aby wysłać żądanie HTTP POST do punktu końcowego adresu URL.
Odpowiedź powinna wyglądać podobnie do poniższego przykładu:
{ "id": "d1b33a60-333f-4d6e-9ade-17a7020562a9", "purgeHistoryDeleteUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d1b33a60-333f-4d6e-9ade-17a7020562a9?code=ACCupah_QfGKo...", "sendEventPostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d1b33a60-333f-4d6e-9ade-17a7020562a9/raiseEvent/{eventName}?code=ACCupah_QfGKo...", "statusQueryGetUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d1b33a60-333f-4d6e-9ade-17a7020562a9?code=ACCupah_QfGKo...", "terminatePostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d1b33a60-333f-4d6e-9ade-17a7020562a9/terminate?reason={text}&code=ACCupah_QfGKo..." }Odpowiedź to początkowy wynik funkcji HTTP. Powiadamia Cię, że trwała orkiestracja została pomyślnie uruchomiona. Nie wyświetla jeszcze wyniku końcowego aranżacji. Odpowiedź zawiera kilka przydatnych adresów URL. Na razie zapytaj o stan orkiestracji.
Skopiuj wartość adresu URL dla
statusQueryGetUri, wklej ją na pasku adresu przeglądarki i wykonaj żądanie. Alternatywnie możesz nadal używać narzędzia do testowania HTTP w celu wystawienia żądania GET.Zapytanie kierowane jest do instancji orkiestracji, aby uzyskać status. Powinno zostać wyświetlone, że wystąpienie zostało zakończone i że zawiera dane wyjściowe lub wyniki funkcji trwałej, tak jak w tym przykładzie:
{ "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" }