Vytvoření první odolné funkce v Javě

Durable Functions je rozšíření Azure Functions, které umožňuje psát stavové funkce v bezserverovém prostředí. Toto rozšíření za vás spravuje stav, kontrolní body a restartování.

V tomto rychlém startu se dozvíte, jak vytvořit a otestovat aplikaci Durable Functions Hello World v Javě. Nejzásadnější aplikace Durable Functions obsahuje následující tři funkce:

  • Funkce orchestratoru – popisuje pracovní postup, který orchestruje další funkce.
  • Funkce aktivity – volaná funkcí orchestrátoru, provádí práci a volitelně vrací hodnotu.
  • Klientská funkce – běžná funkce Azure, která spouští funkci orchestrátoru. Tento příklad používá funkci aktivovanou protokolem HTTP.

V tomto rychlém startu se dozvíte, jak vytvořit tuto aplikaci Hello World, kterou můžete provádět různými způsoby. Pomocí výše uvedeného selektoru zvolte preferovaný přístup.

Předpoklady

Pro absolvování tohoto kurzu potřebujete:

Pokud ještě nemáte předplatné Azure, vytvořte si bezplatný účet Azure před tím, než začnete.

Přidání požadovaných závislostí a modulů plug-in do projektu

Přidejte do svého 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>

Přidání požadovaných souborů JSON

host.json Přidejte soubor do adresáře projektu. Mělo by to vypadat nějak takto:

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

Poznámka:

Je důležité si uvědomit, že pro Durable Functions pro Javu má aktuálně potřebnou podporu pouze sada rozšíření Azure Functions v4. Durable Functions pro Javu není podporován v 3 a raných sadách rozšíření. Další informace o sadách rozšíření najdete v dokumentaci k sadám rozšíření.

Durable Functions potřebuje zprostředkovatele úložiště k uložení stavu modulu runtime. local.settings.json Přidejte soubor do adresáře projektu a nakonfigurujte zprostředkovatele úložiště. Pokud chcete jako zprostředkovatele použít Azure Storage, nastavte hodnotu AzureWebJobsStorage na připojovací řetězec účtu Azure Storage:

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

Vytvoření funkcí

Následující ukázkový kód ukazuje jednoduchý příklad každého z nich:

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

Vytvoření místního projektu pomocí příkazu Maven

  1. Spuštěním následujícího příkazu vygenerujte projekt se základními funkcemi aplikace Durable Functions:
mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DarchetypeVersion=1.51 -Dtrigger=durablefunctions
  1. Postupujte podle pokynů a zadejte následující informace:
Výzva Hodnota
Groupid com.function
artifactId myDurableFunction
version 1.0-SNAPSHOT
Balíček com.function
Y Potvrďte stisknutím klávesy Enter .

Teď máte místní projekt vygenerovaný se třemi funkcemi potřebnými pro základní aplikaci Durable Functions.

Zkontrolujte, jestli máte com.microsoft:durabletask-azure-functions ve své pom.xmlzávislosti jako závislost .

Konfigurace zprostředkovatele back-endu úložiště

Durable Functions potřebuje zprostředkovatele úložiště k uložení stavu modulu runtime. Službu Azure Storage můžete nakonfigurovat tak, že jako poskytovatele local.settings.json úložiště poskytnete připojovací řetězec vašeho účtu Azure Storage jako hodnotu:AzureWebJobsStorage

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

Vytvoření místního projektu

  1. V editoru Visual Studio Code stisknutím klávesY F1 (nebo Ctrl/Cmd+Shift+P) otevřete paletu příkazů. Na paletě příkazů vyhledejte a vyberte Azure Functions: Create New Project....

    Screenshot of create new functions project.

  2. Zvolte prázdné umístění složky pro váš projekt a zvolte Vybrat.

  3. Postupujte podle pokynů a zadejte následující informace:

    Výzva Hodnota
    Výběr jazyka Zvolte Java.
    Výběr verze Javy Zvolte Java 8 nebo novější verzi Javy, na které běží vaše funkce v Azure. Zvolte verzi Javy, kterou jste ověřili místně.
    Zadejte ID skupiny. com.function.
    Zadejte ID artefaktu. myDurableFunction.
    Zadejte verzi. 1.0-SNAPSHOT.
    Zadejte název balíčku. com.function.
    Zadejte název aplikace. myDurableFunction.
    Výběr nástroje pro sestavení pro projekt Java Zvolte Maven.
    Vyberte, jak chcete projekt otevřít. Zvolte Open in new window.

Teď máte projekt s ukázkovou funkcí HTTP. Tuto funkci můžete odebrat, pokud chcete, protože v dalším kroku přidáme základní funkce aplikace Durable Functions.

Přidání funkcí do projektu

  1. Na paletě příkazů vyhledejte a vyberte Azure Functions: Create Function....

  2. Vyberte Change template filter možnost All.

  3. Postupujte podle pokynů a zadejte následující informace:

    Výzva Hodnota
    Výběr šablony pro funkci DurableFunctionsOrchestration
    Zadejte název balíčku. com.function
    Zadejte název funkce. DurableFunctionsOrchestrator
  4. Zvolte Select storage account v automaticky otevíraných oknech s žádostí o nastavení informací o účtu úložiště a postupujte podle pokynů.

Teď byste měli mít tři základní funkce pro aplikaci Durable Functions vygenerovanou.

Konfigurace pom.xml a host.json

Přidejte do svého pom.xmlpočítače následující závislost:

<dependency>
  <groupId>com.microsoft</groupId>
  <artifactId>durabletask-azure-functions</artifactId>
  <version>1.0.0</version>
</dependency>

Přidejte vlastnost do objektu extensionshost.json:

"extensions": { "durableTask": { "hubName": "JavaTestHub" }}

Místní testování funkce

Nástroje Azure Functions Core umožňují spouštět projekt Azure Functions na místním počítači pro vývoj.

Poznámka:

Durable Functions pro Javu vyžaduje Nástroje Azure Functions Core Tools verze 4.0.4915 nebo novější. Verzi nainstalovanou můžete zobrazit spuštěním func --version příkazu z terminálu.

  1. Pokud používáte Visual Studio Code, otevřete nové okno terminálu a spuštěním následujících příkazů sestavte projekt:

    mvn clean package
    

    Pak spusťte odolnou funkci:

    mvn azure-functions:run
    
  2. Na panelu Terminál zkopírujte adresu URL koncového bodu vaší funkce aktivované protokolem HTTP.

    Screenshot of Azure local output.

  3. Pomocí nástroje, jako je Postman nebo cURL, odešlete požadavek HTTP POST do koncového bodu adresy URL. Měla by se zobrazit odpověď podobná této:

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

    Odpověď je počáteční výsledek funkce HTTP s informacemi o úspěšném spuštění odolné orchestrace. Zatím není konečným výsledkem orchestrace. Odpověď obsahuje několik užitečných adres URL. Prozatím se dotazujme na stav orchestrace.

  4. Zkopírujte hodnotu adresy URL a statusQueryGetUri vložte ji do adresního řádku prohlížeče a spusťte požadavek. Případně můžete k vydání požadavku GET dál používat Postman nebo cURL.

    Požadavek odešle dotaz na instanci orchestrace pro stav. Měli byste získat konečnou odpověď, která ukazuje, že se instance dokončila, a obsahuje výstupy nebo výsledky odolné funkce. Vypadá takto:

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