次の方法で共有


Java で最初の持続的関数を作成する

Durable Functions は、サーバーレス環境でステートフル関数を記述できる Azure Functions の拡張機能です。 この拡張機能は状態、チェックポイント、再起動を管理します。

このクイックスタートでは、Java で "Hello World" Durable Functions アプリを作成してテストする方法について説明します。 最も基本的な Durable Functions アプリには、次の 3 つの関数が含まれています。

  • "オーケストレーター関数" - 他の関数を調整するワークフローを記述します。
  • "アクティビティ関数" - オーケストレーター関数によって呼び出され、作業を実行し、必要に応じて値を返します。
  • クライアント関数 - オーケストレーター関数を開始する通常の Azure Functions。 この例では、HTTP によってトリガーされる関数を使用しています。

このクイック スタートでは、この "Hello World" アプリを作成する方法について説明します。これは、さまざまな方法で行えます。 上記のセレクターを使用して、好みの方法を選択します。

前提条件

このチュートリアルを完了するには、次のものが必要です。

  • Java Developer Kit、バージョン 8 以降。

  • Apache Maven、バージョン 3.0 以降。

  • Azure Functions Core Tools の最新バージョン。

    • Azure Functions 4.x の場合、Core Tools v4.0.4915 以降が必要です。
  • Azure Storage アカウント。これには、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)"
  }
}

注意

現時点で、Java 用の Durable Functions に対する必要なサポートがあるのは、Azure Functions v4 拡張機能バンドルのみであることに注意してください。 Java 用の Durable Functions は、v3 および初期の拡張機能バンドルではサポート "されていません"。 拡張機能バンドルの詳細については、拡張機能バンドルに関するドキュメントを参照してください。

Durable Functions には、ランタイム状態を格納するためのストレージ プロバイダーが必要です。 local.settings.json ファイルをプロジェクト ディレクトリに追加して、ストレージ プロバイダーを構成します。 プロバイダーとして Azure Storage を使用するには、AzureWebJobsStorage の値を Azure Storage アカウントの接続文字列に設定します。

{
  "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 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();
    }
}

Maven コマンドを使用してローカル プロジェクトを作成する

  1. 次のコマンドを実行して、Durable Functions アプリの基本的な機能を持つプロジェクトを生成します。
mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DarchetypeVersion=1.51 -Dtrigger=durablefunctions
  1. プロンプトに従って、次の情報を指定します。
Prompt
groupId com.function
artifactId myDurableFunction
version 1.0-SNAPSHOT
package com.function
Y 確認するには Enter キーを押します

これで、基本的な Durable Functions アプリに必要な 3 つの関数を持つローカル プロジェクトが生成されました。

pom.xmlcom.microsoft:durabletask-azure-functions が依存関係として含まれていることを確認してください。

バックエンド ストレージ プロバイダーを構成する

Durable Functions には、ランタイム状態を格納するためのストレージ プロバイダーが必要です。 AzureWebJobsStorage の値として Azure Storage アカウントの接続文字列を指定することで、local.settings.json でストレージ プロバイダーとして Azure Storage を使用するように構成できます。

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "<your storage account connection string>",
    "FUNCTIONS_WORKER_RUNTIME": "java"
  }
}

ローカル プロジェクトを作成する

  1. Visual Studio Code で、F1 (または Ctrl/Cmd + Shift + P) キーを押してコマンド パレットを開きます。 コマンド パレットで、Azure Functions: Create New Project... を検索して選択します。

    Screenshot of create new functions project.

  2. プロジェクト用に空のフォルダーの場所を選択し、 [選択] を選択します。

  3. プロンプトに従って、次の情報を指定します。

    Prompt
    言語を選択する Java を選択します。
    Select a version of Java (Java のバージョンを選択してください) Azure における関数の実行環境 (Java バージョン) として Java 8 以降を選択します。 ローカルで確認済みの Java バージョンを選択してください。
    Provide a group ID (グループ ID を指定してください) com.function
    Provide an artifact ID (成果物 ID を指定してください) myDurableFunction
    Provide a version (バージョンを指定してください) 1.0-SNAPSHOT
    Provide a package name (パッケージ名を指定してください) com.function
    Provide an app name (アプリ名を指定してください) myDurableFunction
    Select the build tool for Java project (Java プロジェクトのビルド ツールを選択してください) Maven を選択します。
    Select how you would like to open your project (プロジェクトを開く方法を選択してください) Open in new window を選択します。

HTTP 関数の例を含むプロジェクトが作成されました。 次の手順で Durable Functions アプリの基本的な機能を追加するため、この関数は必要に応じて削除できます。

プロジェクトへの関数の追加

  1. コマンド パレットで、Azure Functions: Create Function... を検索して選択します。

  2. Change template filterAll を選択します。

  3. プロンプトに従って、次の情報を指定します。

    Prompt
    Select a template for your function (関数のテンプレートを選択してください) DurableFunctionsOrchestration
    Provide a package name (パッケージ名を指定してください) com.function
    Provide a function name (関数名を指定してください) DurableFunctionsOrchestrator
  4. ストレージ アカウント情報の設定を求めるポップアップ ウィンドウで Select storage account を選択し、プロンプトに従います。

これで、Durable Functions アプリの 3 つの基本的な機能が生成されたはずです。

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 v4.0.4915 以降が必要です。 ターミナルから func --version コマンドを実行すると、インストールされているバージョンを確認できます。

  1. Visual Studio Code を使用している場合は、新しいターミナル ウィンドウを開き、次のコマンドを実行してプロジェクトをビルドします。

    mvn clean package
    

    次に、持続的関数を実行します。

    mvn azure-functions:run
    
  2. ターミナル パネルで、HTTP によってトリガーされる関数の URL エンドポイントをコピーします。

    Screenshot of Azure local output.

  3. Postman または cURL のようなツールを使用して、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 値をコピーし、ブラウザーのアドレス バーに貼り付け、要求を実行します。 また、引き続き Postman または cURL を使用して GET 要求を発行することもできます。

    この要求によって、オーケストレーション インスタンスの状態が照会されます。 インスタンスが完了したことを示し、持続的な関数の出力または結果を含む、最終的な応答を受け取ります。 次のように表示されます。

    {
        "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"
    }