Vytvoření první odolné funkce v Javě
Durable Functions je rozšíření Azure Functions, které umožňuje psát stavové funkce v bezserverovém prostředí. Toto rozšíření za vás spravuje stav, kontrolní body a restartování.
V tomto rychlém startu se dozvíte, jak vytvořit a otestovat aplikaci Durable Functions Hello World v Javě. Nejzásadnější aplikace Durable Functions obsahuje následující tři funkce:
- Funkce orchestratoru – popisuje pracovní postup, který orchestruje další funkce.
- Funkce aktivity – volaná funkcí orchestrátoru, provádí práci a volitelně vrací hodnotu.
- Klientská funkce – běžná funkce Azure, která spouští funkci orchestrátoru. Tento příklad používá funkci aktivovanou protokolem HTTP.
V tomto rychlém startu se dozvíte, jak vytvořit tuto aplikaci Hello World, kterou můžete provádět různými způsoby. Pomocí výše uvedeného selektoru zvolte preferovaný přístup.
Předpoklady
Pro absolvování tohoto kurzu potřebujete:
Sada Java Developer Kit, verze 8 nebo novější.
Apache Maven verze 3.0 nebo novější
Nejnovější verze nástrojů Azure Functions Core Tools
- Pro Azure Functions 4.x se vyžaduje Core Tools verze 4.0.4915 nebo novější.
Účet Azure Storage, který vyžaduje, abyste měli předplatné Azure.
Pokud ještě nemáte předplatné Azure, vytvořte si bezplatný účet Azure před tím, než začnete.
Přidání požadovaných závislostí a modulů plug-in do projektu
Přidejte do svého 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>
Přidání požadovaných souborů JSON
host.json
Přidejte soubor do adresáře projektu. Mělo by to vypadat nějak takto:
{
"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)"
}
}
Poznámka:
Je důležité si uvědomit, že pro Durable Functions pro Javu má aktuálně potřebnou podporu pouze sada rozšíření Azure Functions v4. Durable Functions pro Javu není podporován v 3 a raných sadách rozšíření. Další informace o sadách rozšíření najdete v dokumentaci k sadám rozšíření.
Durable Functions potřebuje zprostředkovatele úložiště k uložení stavu modulu runtime. local.settings.json
Přidejte soubor do adresáře projektu a nakonfigurujte zprostředkovatele úložiště. Pokud chcete jako zprostředkovatele použít Azure Storage, nastavte hodnotu AzureWebJobsStorage
na připojovací řetězec účtu Azure Storage:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "<your storage account connection string>",
"FUNCTIONS_WORKER_RUNTIME": "java"
}
}
Vytvoření funkcí
Následující ukázkový kód ukazuje jednoduchý příklad každého 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();
}
}
Vytvoření místního projektu pomocí příkazu Maven
- Spuštěním následujícího příkazu vygenerujte projekt se základními funkcemi aplikace Durable Functions:
mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DarchetypeVersion=1.51 -Dtrigger=durablefunctions
- Postupujte podle pokynů a zadejte následující informace:
Výzva | Hodnota |
---|---|
Groupid | com.function |
artifactId | myDurableFunction |
version | 1.0-SNAPSHOT |
Balíček | com.function |
Y | Potvrďte stisknutím klávesy Enter . |
Teď máte místní projekt vygenerovaný se třemi funkcemi potřebnými pro základní aplikaci Durable Functions.
Zkontrolujte, jestli máte com.microsoft:durabletask-azure-functions
ve své pom.xml
závislosti jako závislost .
Konfigurace zprostředkovatele back-endu úložiště
Durable Functions potřebuje zprostředkovatele úložiště k uložení stavu modulu runtime. Službu Azure Storage můžete nakonfigurovat tak, že jako poskytovatele local.settings.json
úložiště poskytnete připojovací řetězec vašeho účtu Azure Storage jako hodnotu:AzureWebJobsStorage
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "<your storage account connection string>",
"FUNCTIONS_WORKER_RUNTIME": "java"
}
}
Vytvoření místního projektu
V editoru Visual Studio Code stisknutím klávesY F1 (nebo Ctrl/Cmd+Shift+P) otevřete paletu příkazů. Na paletě příkazů vyhledejte a vyberte
Azure Functions: Create New Project...
.Zvolte prázdné umístění složky pro váš projekt a zvolte Vybrat.
Postupujte podle pokynů a zadejte následující informace:
Výzva Hodnota Výběr jazyka Zvolte Java
.Výběr verze Javy Zvolte Java 8
nebo novější verzi Javy, na které běží vaše funkce v Azure. Zvolte verzi Javy, kterou jste ověřili místně.Zadejte ID skupiny. com.function
.Zadejte ID artefaktu. myDurableFunction
.Zadejte verzi. 1.0-SNAPSHOT
.Zadejte název balíčku. com.function
.Zadejte název aplikace. myDurableFunction
.Výběr nástroje pro sestavení pro projekt Java Zvolte Maven
.Vyberte, jak chcete projekt otevřít. Zvolte Open in new window
.
Teď máte projekt s ukázkovou funkcí HTTP. Tuto funkci můžete odebrat, pokud chcete, protože v dalším kroku přidáme základní funkce aplikace Durable Functions.
Přidání funkcí do projektu
Na paletě příkazů vyhledejte a vyberte
Azure Functions: Create Function...
.Vyberte
Change template filter
možnostAll
.Postupujte podle pokynů a zadejte následující informace:
Výzva Hodnota Výběr šablony pro funkci DurableFunctionsOrchestration Zadejte název balíčku. com.function
Zadejte název funkce. DurableFunctionsOrchestrator
Zvolte
Select storage account
v automaticky otevíraných oknech s žádostí o nastavení informací o účtu úložiště a postupujte podle pokynů.
Teď byste měli mít tři základní funkce pro aplikaci Durable Functions vygenerovanou.
Konfigurace pom.xml a host.json
Přidejte do svého pom.xml
počítače následující závislost:
<dependency>
<groupId>com.microsoft</groupId>
<artifactId>durabletask-azure-functions</artifactId>
<version>1.0.0</version>
</dependency>
Přidejte vlastnost do objektu extensions
host.json
:
"extensions": { "durableTask": { "hubName": "JavaTestHub" }}
Místní testování funkce
Nástroje Azure Functions Core umožňují spouštět projekt Azure Functions na místním počítači pro vývoj.
Poznámka:
Durable Functions pro Javu vyžaduje Nástroje Azure Functions Core Tools verze 4.0.4915 nebo novější. Verzi nainstalovanou můžete zobrazit spuštěním func --version
příkazu z terminálu.
Pokud používáte Visual Studio Code, otevřete nové okno terminálu a spuštěním následujících příkazů sestavte projekt:
mvn clean package
Pak spusťte odolnou funkci:
mvn azure-functions:run
Na panelu Terminál zkopírujte adresu URL koncového bodu vaší funkce aktivované protokolem HTTP.
Pomocí nástroje, jako je Postman nebo cURL, odešlete požadavek HTTP POST do koncového bodu adresy URL. Měla by se zobrazit odpověď podobná této:
{ "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==" }
Odpověď je počáteční výsledek funkce HTTP s informacemi o úspěšném spuštění odolné orchestrace. Zatím není konečným výsledkem orchestrace. Odpověď obsahuje několik užitečných adres URL. Prozatím se dotazujme na stav orchestrace.
Zkopírujte hodnotu adresy URL a
statusQueryGetUri
vložte ji do adresního řádku prohlížeče a spusťte požadavek. Případně můžete k vydání požadavku GET dál používat Postman nebo cURL.Požadavek odešle dotaz na instanci orchestrace pro stav. Měli byste získat konečnou odpověď, která ukazuje, že se instance dokončila, a obsahuje výstupy nebo výsledky odolné funkce. Vypadá takto:
{ "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" }