分享方式:


快速入門:建立 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"
  }
}

建立本機專案

  1. 在 Visual Studio Code 中選取 F1 (或選取 Ctrl/Cmd+Shift+P),以開啟命令選擇區。 在提示 (>) 中,輸入然後選取 [Azure Functions:建立新專案]

    建立新函式專案命令的螢幕擷取畫面。

  2. 選取瀏覽。 在 [選取資料夾] 對話框中,移至要用於您專案的資料夾,然後選擇 [選取]

  3. 依照提示提供下列資訊:

    提示 動作
    選取語言 選取 [Java]
    選取 JAVA 的版本 選取 [Java 8] 或更新版本。 選取函式在 Azure 中執行的 Java 版本,以及您在本機驗證的 Java 版本。
    提供群組識別碼 輸入 com.function
    提供成品識別碼 輸入 myDurableFunction
    提供版本 輸入 1.0-SNAPSHOT
    提供套件名稱 輸入 com.function
    提供應用程式名稱 輸入 myDurableFunction
    選取 JAVA 專案的建置工具 選取 [Maven]
    選取您開啟專案的方式 選取 [在新視窗中開啟]

您現在有一個具有範例 HTTP 函式的專案。 如果您想要移除此函式,則可逕行移除,因為您會在下一個步驟中新增 Durable Functions 應用程式的基本函式。

將函式新增至專案

  1. 在命令選擇區中,輸入而後選取 Azure Functions:建立函式

  2. 針對 [變更範本篩選],選取 [全部]

  3. 依照提示提供下列資訊:

    提示 動作
    選取函式的範本 選取 DurableFunctionsOrchestration
    提供套件名稱 輸入 com.function
    提供函式名稱 輸入 DurableFunctionsOrchestrator
  4. 在對話方塊中,選擇 [選取儲存體帳戶] 來設定儲存體帳戶,然後遵循提示進行。

現在在產生的 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 命令,以查看安裝的版本。

  1. 如果您使用 Visual Studio Code,請開啟新的終端機視窗,然後執行下列命令來建置專案:

    mvn clean package
    

    然後,執行耐久函式:

    mvn azure-functions:run
    
  2. 在終端機面板中,複製 HTTP 觸發函式的 URL 端點。

    Azure 本地輸出的螢幕擷取畫面。

  3. 使用 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。 現在,請查詢協調流程的狀態。

  4. 複製 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"
    }