Поделиться через


Краткое руководство: Создание приложения Durable Functions на Java

Используйте Durable Functions, функцию Azure Functions для записи функций с отслеживанием состояния в бессерверной среде. Durable Functions управляет состоянием, контрольными точками и перезапусками в приложении.

В этом кратком руководстве вы создадите и протестируете приложение hello world Устойчивые функции в Java.

Самое базовое приложение 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 Storage.

Если у вас нет аккаунта 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 в настоящее время имеет необходимую поддержку для Durable Functions для Java. Устойчивые функции для Java не поддерживаются в пакетах расширений версии 3 и ранних версиях. Дополнительные сведения о пакетах расширений см. в документации по пакетам расширений.

Для 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

Выполните следующую команду, чтобы создать проект, содержащий основные функции приложения Устойчивые функции:

mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DarchetypeVersion=1.62 -Dtrigger=durablefunctions

В подсказках укажите следующие сведения:

Подсказка Действие
groupId Введите com.function.
artifactId Введите myDurableFunction.
version Выберите 1.0-SNAPSHOT.
пакета Введите com.function.
Y Введите Y и нажмите клавишу ВВОД, чтобы подтвердить.

Теперь у вас есть локальный проект с тремя функциями, которые входят в состав приложения на базе Durable Functions.

Убедитесь, что com.microsoft:durabletask-azure-functions настроен как зависимость в pom.xml.

Настройка внутреннего поставщика хранилища

Устойчивым функциям требуется поставщик хранилища для сохранения состояния среды выполнения. Вы можете задать Azure Storage в качестве поставщика хранилища в 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 или более поздней версии. Выберите версию Java, в которую работают функции в Azure, и ту, которую вы проверили локально.
    Укажите идентификатор группы Введите com.function.
    Укажите идентификатор артефакта Введите myDurableFunction.
    Укажите версию Введите 1.0-SNAPSHOT.
    Укажите имя пакета Введите com.function.
    Укажите имя приложения Введите myDurableFunction.
    Выберите инструмент сборки для проекта Java Выберите Maven.
    Выбор способа открытия проекта Выберите "Открыть" в новом окне.

Теперь у вас есть проект с примером функции HTTP. Эту функцию можно удалить, если вы хотите, так как вы добавите основные функции приложения Устойчивые функции на следующем шаге.

Добавление функций в проект

  1. В палитре команд введите и выберите Azure Functions: Create Function.

  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 требуется версия Azure Functions Core Tools 4.0.4915 или более поздняя. Вы можете увидеть, какая версия установлена, выполнив func --version команду в терминале.

  1. Если вы используете Visual Studio Code, откройте новое окно терминала и выполните следующие команды, чтобы создать проект:

    mvn clean package
    

    Затем запустите устойчивую функцию:

    mvn azure-functions:run
    
  2. На панели терминала скопируйте конечную точку URL-адреса функции, активируемой HTTP.

    Скриншот локального вывода 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. Скопируйте значение statusQueryGetUriURL-адреса, вставьте его в адресную строку браузера и выполните запрос. Кроме того, можно продолжать использовать средство тестирования HTTP для выдачи запроса 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"
    }