快速入門:建立 Java Durable Functions 應用程式
使用 Durable Functions (Azure Functions 的功能) 在無伺服器環境中撰寫具狀態函式。 Durable Functions 會管理應用程式中的狀態、檢查點和重新啟動。
在本快速入門中,您會使用 JAVA 來建立及測試 "Hello World" Durable Functions 應用程式。
最基本的 Durable Functions 應用程式有三個函式:
- 協調器函式:用於協調其他函式的工作流程。
- 活動函式:由協調器函式呼叫的函式,可執行工作並選擇性地傳回值。
- 用戶端函式:可啟動協調器函式的一般 Azure 函式。 此範例會使用 HTTP 觸發的函式。
本快速入門說明建立此 "hello world" 應用程式的不同方式。 使用頁面頂端的選取器來設定您慣用的方法。
必要條件
若要完成本快速入門,您需要:
已安裝 Java Developer Kit 第 8 版或更新版本。
已安裝 Apache Maven 3.0 版或更新版本。
最新版的 Azure Functions Core Tools。
針對 Azure Functions 4.x,需要 Core Tools 4.0.4915 版或更新版本。
HTTP 測試工具,可保護您的數據安全。 如需詳細資訊,請參閱 HTTP 測試工具。
Azure 訂用帳戶。 若要使用 Durable Functions,您必須擁有 Azure 儲存體帳戶。
如果您沒有 Azure 訂閱,請在開始之前,先建立 Azure 免費帳戶。
將必要的相依性和外掛程式新增至專案
將下列程式碼新增至 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>
新增必要的 JSON 檔案
將 host.json 檔案新增至專案目錄。 回應會類似於下列範例:
{
"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)"
}
}
注意
請務必注意,只有 Azure Functions v4 延伸模組套件組合目前針對適用於 Java 的 Durable Functions 提供必要支援。 v3 和早期延伸模組套件組合不支援適用於 Java 的 Durable Functions。 如需延伸模組套件組合的詳細資訊,請參閱延伸模組套件組合文件。
Durable Functions 需要儲存體提供者來儲存執行階段狀態。 將 local.settings.json 檔案新增至專案目錄,以設定儲存體提供者。 若要使用 Azure 儲存體作為提供者,請將 AzureWebJobsStorage
的值設定為 Azure 儲存體帳戶的連接字串:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "<your storage account connection string>",
"FUNCTIONS_WORKER_RUNTIME": "java"
}
}
建立您的函式
下列範例程式碼顯示每種函式類型的基本範例:
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();
}
}
使用 Maven 命令建立本機專案
執行下列命令來產生包含 Durable Functions 應用程式基本函式的專案:
mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DarchetypeVersion=1.51 -Dtrigger=durablefunctions
依照提示提供下列資訊:
提示 | 動作 |
---|---|
groupId | 輸入 com.function。 |
artifactId | 輸入 myDurableFunction。 |
version | 選取 1.0-SNAPSHOT。 |
套件 | 輸入 com.function。 |
Y | 輸入 Y,然後選取 Enter 以確認。 |
現在,您有一個本機專案,其中具有基本 Durable Functions 應用程式中的三個函式。
檢查以確定 com.microsoft:durabletask-azure-functions
已設定為 pom.xml 檔案中的相依性。
設定後端儲存體提供者
Durable Functions 需要儲存體提供者來儲存執行階段狀態。 您可以將 Azure 儲存體設定為 local.settings.json 中的儲存體提供者。 使用 Azure 儲存體帳戶的連接字串做為 AzureWebJobsStorage
值,如下列範例所示:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "<your storage account connection string>",
"FUNCTIONS_WORKER_RUNTIME": "java"
}
}
建立本機專案
在 Visual Studio Code 中選取 F1 (或選取 Ctrl/Cmd+Shift+P),以開啟命令選擇區。 在提示 (
>
) 中,輸入然後選取 [Azure Functions:建立新專案]。選取瀏覽。 在 [選取資料夾] 對話框中,移至要用於您專案的資料夾,然後選擇 [選取]。
依照提示提供下列資訊:
提示 動作 選取語言 選取 [Java]。 選取 JAVA 的版本 選取 [Java 8] 或更新版本。 選取函式在 Azure 中執行的 Java 版本,以及您在本機驗證的 Java 版本。 提供群組識別碼 輸入 com.function。 提供成品識別碼 輸入 myDurableFunction。 提供版本 輸入 1.0-SNAPSHOT。 提供套件名稱 輸入 com.function。 提供應用程式名稱 輸入 myDurableFunction。 選取 JAVA 專案的建置工具 選取 [Maven]。 選取您開啟專案的方式 選取 [在新視窗中開啟]。
您現在有一個具有範例 HTTP 函式的專案。 如果您想要移除此函式,則可逕行移除,因為您會在下一個步驟中新增 Durable Functions 應用程式的基本函式。
將函式新增至專案
在命令選擇區中,輸入而後選取 Azure Functions:建立函式。
針對 [變更範本篩選],選取 [全部]。
依照提示提供下列資訊:
提示 動作 選取函式的範本 選取 DurableFunctionsOrchestration。 提供套件名稱 輸入 com.function。 提供函式名稱 輸入 DurableFunctionsOrchestrator。 在對話方塊中,選擇 [選取儲存體帳戶] 來設定儲存體帳戶,然後遵循提示進行。
現在在產生的 Durable Functions 應用程式中應該有三個基本函式。
設定 pom.xml 和 host.json
將下列相依性新增至 pom.xml 檔案中:
<dependency>
<groupId>com.microsoft</groupId>
<artifactId>durabletask-azure-functions</artifactId>
<version>1.0.0</version>
</dependency>
將 extensions
屬性新增至 host.json 檔案:
"extensions": { "durableTask": { "hubName": "JavaTestHub" }}
在本機測試函式
Azure Functions Core Tools 提供您在本機開發電腦上執行 Azure Functions 專案的功能。
注意
適用於 Java 的 Durable Functions 需要 Azure Functions Core Tools 4.0.4915 版或更新版本。 您可以從終端機執行 func --version
命令,以查看安裝的版本。
如果您使用 Visual Studio Code,請開啟新的終端機視窗,然後執行下列命令來建置專案:
mvn clean package
然後,執行耐久函式:
mvn azure-functions:run
在終端機面板中,複製 HTTP 觸發函式的 URL 端點。
使用 HTTP 測試工具將 HTTP POST 要求傳送至 URL 端點。
回應看起來應該類似下列範例:
{ "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..." }
回應是 HTTP 函式的初始結果。 其可讓您知道長期協調流程已成功啟動。 其尚未顯示協調流程的最終結果。 回應包含一些實用的 URL。 現在,請查詢協調流程的狀態。
複製
statusQueryGetUri
的 URL 值,並將其貼在瀏覽器的網址列中,然後執行要求。 或者,您也可以繼續使用 HTTP 測試工具來發出 GET 要求。此要求會查詢協調流程執行個體的狀態。 您應該會看到執行個體已完成,而且其包含 Durable Functions 應用程式的輸出或結果,如下列範例所示:
{ "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" }