Создание первой устойчивой функции в Java

Устойчивые функции — это расширение Функций Azure, которое позволяет писать функции с отслеживанием состояния в беcсерверной среде. Расширение автоматически управляет состоянием, создает контрольные точки и перезагружается.

В этом кратком руководстве вы узнаете, как создать и протестировать приложение Hello World Устойчивые функции в Java. Самое простое приложение Устойчивые функции содержит следующие три функции:

  • функция оркестратора — описывает рабочий процесс и координирует другие функции;
  • функция действия — вызывается функцией оркестратора, выполняет работу и при необходимости возвращает значение;
  • функция клиента — обычная функция Azure, которая запускает функцию оркестратора. В этом примере используется функция, активируемая по HTTP.

В этом кратком руководстве показано, как создать это приложение Hello World, которое можно сделать разными способами. Используйте селектор выше, чтобы выбрать предпочтительный подход.

Необходимые компоненты

Для работы с этим учебником необходимы указанные ниже компоненты.

  • Пакет разработчика Java версии 8 или более поздней версии.

  • Apache Maven версии 3.0 или более поздней.

  • Последняя версия Azure Functions Core Tools.

    • Для Функции Azure версии 4.x требуется Core Tools версии 4.0.4915 или более поздней версии.
  • Учетная запись хранения Azure, требующая наличия подписки 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 версии 4 в настоящее время имеет необходимую поддержку Устойчивые функции для Java. Устойчивые функции для Java не поддерживается в пакетах расширений версии 3 и ранних версий. Дополнительные сведения о пакетах расширений см. в документации по пакетам расширений.

Устойчивые функции требуется поставщик хранилища для хранения состояния среды выполнения. 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 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. Выполните следующую команду, чтобы создать проект с основными функциями приложения Устойчивые функции:
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 Нажмите клавишу ВВОД, чтобы подтвердить

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

Пожалуйста, проверка, чтобы убедиться, что у вас есть com.microsoft:durabletask-azure-functions зависимость.pom.xml

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

Устойчивые функции требуется поставщик хранилища для хранения состояния среды выполнения. Вы можете настроить использование служба хранилища 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: Create New Project....

    Screenshot of create new functions project.

  2. Выберите расположение пустой папки для проекта и нажмите кнопку Выбрать.

  3. Следуйте инструкциям и укажите следующее:

    Prompt Значение
    Выбор языка Выберите Java.
    Выберите версию Java Выберите Java 8 или более позднюю версию Java, в которой работают функции в Azure. Выберите версию Java, которую вы проверили локально.
    Укажите идентификатор группы com.function.
    Укажите идентификатор артефакта myDurableFunction.
    Укажите версию 1.0-SNAPSHOT.
    Укажите имя пакета com.function.
    Укажите имя приложения myDurableFunction.
    Выберите средство сборки для проекта Java Выберите Maven.
    Выбор способа открытия проекта Выберите Open in new window.

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

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

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

  2. Выберите Change template filter пункт All.

  3. Следуйте инструкциям и укажите следующее:

    Prompt Значение
    Выбор шаблона для функции DurableFunctionsOrchestration
    Укажите имя пакета com.function
    Укажите имя функции DurableFunctionsOrchestrator
  4. Выберите Select storage account всплывающее окно с просьбой настроить сведения о учетной записи хранения и следуйте инструкциям.

Теперь у вас должны быть три основных функции для созданного приложения Устойчивые функции.

Настройка 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" позволяют запускать проекты функций Azure на локальном компьютере разработчика.

Примечание.

Устойчивые функции для Java требуется Функции Azure Core Tools версии 4.0.4915 или более поздней версии. Вы можете увидеть, какая версия установлена, выполнив func --version команду из терминала.

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

    mvn clean package
    

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

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

    Screenshot of Azure local output.

  3. Отправьте запрос HTTP POST к конечной точке URL-адреса, используя средства наподобие Postman или cURL. Вы должны получить ответ, аналогичный показанному ниже:

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

    Полученный ответ является начальным результатом функции HTTP, который сообщает об успешном начале работы устойчивой оркестрации. Он еще не конечный результат оркестрации. Ответ включает несколько полезных URL-адреса. Теперь запросите состояние оркестрации.

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