Rychlý start: Vytvoření aplikace Java Durable Functions

Pomocí Durable Functions, funkce Azure Functions, můžete psát stavové funkce v bezserverovém prostředí. Funkce Durable Functions spravují stav, kontrolní body a restarty ve vaší aplikaci.

V tomto rychlém startu vytvoříte a otestujete aplikaci Durable Functions v Java.

Základní Durable Functions aplikace má tři funkce:

  • Funkce orchestratoru (Cities): Pracovní postup, který orchestruje další funkce.
  • Funkce aktivity (Capitalize): Funkce, kterou orchestrátor volá k provádění práce a vrací hodnotu.
  • Klientská funkce (StartOrchestration): Funkce aktivovaná protokolem HTTP, která spouští orchestrátor.

Tento rychlý start nabízí tři instalační cesty. Pomocí selektoru v horní části stránky zvolte preferovaný přístup:

  • Ruční nastavení: Každý soubor můžete vytvořit ručně pro úplnou kontrolu nad strukturou projektu.
  • Příkaz Maven: Pomocí archetypu Maven vygenerujte projekt v jednom příkazu.
  • Visual Studio Code: Pomocí rozšíření VS Code Azure Functions vygenerujte projekt pomocí uživatelského rozhraní s asistencí.

Předpoklady

K dokončení tohoto rychlého startu potřebujete:

  • Nainstalovaná sada Java Developer Kit verze 8 nebo novější.

  • Nainstalovaný Apache Maven verze 3.0 nebo novější

  • Nejnovější verze nástrojů Azure Functions Core Tools.

    Pro Azure Functions 4.x se vyžaduje Core Tools verze 4.0.4915 nebo novější.

  • Testovací nástroj HTTP, který udržuje vaše data v bezpečí. Další informace najdete v tématu Nástroje pro testování HTTP.

  • Visual Studio Code s nainstalovaným rozšířením Azure Functions (vyžaduje se pouze pro instalační cestu Visual Studio Code).

  • Předplatné služby Azure. Pokud chcete použít Durable Functions, musíte mít účet Azure Storage.

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

Přidejte požadované závislosti a pluginy do vašeho projektu

Do souboru pom.xml přidejte následující kód. Než ho zkopírujete, nahraďte your-unique-app-name globálně jedinečným názvem aplikace funkcí. Upravte region, javaVersion a resourceGroup tak, aby odpovídaly vašemu prostředí.

<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

Přidejte soubor host.json do adresáře projektu. Měl by vypadat podobně jako v následujícím příkladu:

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

Durable Functions pro Java vyžaduje sadu rozšíření v4. Dřívější sady nejsou podporované. Další informace najdete v dokumentaci k sadám rozšíření.

Durable Functions potřebuje zprostředkovatele úložiště k uložení stavu modulu runtime. Přidejte do adresáře projektu soubor local.settings.json 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"
  }
}

Important

Soubor local.settings.json může obsahovat tajné kódy. Nezapomeňte ho přidat do souboru .gitignore, abyste se vyhnuli jeho zanesení do verzovacího systému.

Vytvořte své funkce orchestrátoru, aktivity a klienta pro Durable Functions

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

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

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

Spuštěním následujícího příkazu vygenerujte projekt, který obsahuje základní funkce aplikace Durable Functions:

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

Na příkazovém řádku zadejte následující informace:

Výzva Action
groupId Zadejte com.function.
artifactId Zadejte myDurableFunction.
version Vyberte 1.0-SNAPSHOT.
balíček Zadejte com.function.
Y Zadejte Y a potvrďte výběr klávesy Enter.

Teď máte místní projekt, který má tři funkce, které jsou v základní aplikaci Durable Functions. Archetyp automaticky obsahuje com.microsoft:durabletask-azure-functions jako závislost ve vašem souboru pom.xml.

Konfigurace poskytovatele back-endového úložiště pro Durable Functions

Durable Functions potřebuje zprostředkovatele úložiště k uložení stavu modulu runtime. Azure Storage můžete nastavit jako poskytovatele úložiště v local.settings.json. Jako hodnotu jako v AzureWebJobsStorage tomto příkladu použijte připojovací řetězec vašeho účtu úložiště Azure:

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

Important

Soubor local.settings.json může obsahovat tajné kódy. Nezapomeňte ho přidat do souboru .gitignore, abyste se vyhnuli commitování do systému správy verzí.

Vytvoření místního projektu

  1. V Visual Studio Code vyberte klávesu F1 (nebo stisknutím kombinace kláves Ctrl/Cmd+Shift+P) otevřete paletu příkazů. Na příkazovém řádku (>) zadejte a pak vyberte Azure Functions: Create New Project.

    Snímek obrazovky příkazu Azure Functions Vytvořit nový projekt v nabídce příkazů Visual Studio Code.

  2. Vyberte Procházet. V dialogovém okně Vybrat složku přejděte do složky, která se má použít pro váš projekt, a pak zvolte Vybrat.

  3. Na příkazovém řádku zadejte následující informace:

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

Teď máte projekt, který má ukázkovou funkci HTTP. Vygenerovanou funkci HTTP můžete odebrat, protože v dalším kroku přidáte Durable Functions.

Přidání funkcí do projektu

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

  2. V části Změnit filtr šablony vyberte Vše.

  3. Na příkazovém řádku zadejte následující informace:

    Výzva Action
    Výběr šablony pro funkci Vyberte DurableFunctionsOrchestration.
    Zadejte název balíčku. Zadejte com.function.
    Zadejte název funkce. Zadejte DurableFunctionsOrchestrator.
  4. V dialogovém okně zvolte Vybrat účet úložiště, aby se nastavil účet úložiště, a pak postupujte podle pokynů.

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

Konfigurace souborů pom.xml a host.json pro Durable Functions

Do souboru pom.xml přidejte následující závislost:

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

extensions Přidejte vlastnost do souboru host.json. Pokud už soubor obsahuje další vlastnosti, sloučte extensions blok do existujícího FORMÁTU JSON:

{
  "version": "2.0",
  "extensions": {
    "durableTask": {
      "hubName": "JavaTestHub"
    }
  },
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[4.*, 5.0.0)"
  }
}

Místní testování funkce

Azure Functions Core Tools vám umožní spustit projekt Azure Functions na místním vývojovém počítači.

  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álu zkopírujte koncový bod adresy URL funkce aktivované protokolem HTTP.

    Screenshot výstupu terminálu zobrazující adresu URL koncového bodu HTTP pro místní Azure Functions runtime.

  3. Pomocí testovacího nástroje HTTP odešlete požadavek HTTP POST do koncového bodu adresy URL.

    Odpověď by měla vypadat podobně jako v následujícím příkladu:

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

    Odpověď je počáteční výsledek funkce HTTP. Dá vám vědět, že trvalá orchestrace byla úspěšně spuštěna. Zatím nezobrazuje konečný výsledek orchestrace. Odpověď obsahuje několik užitečných adres URL. Prozatím zadejte dotaz na stav orchestrace.

  4. Zkopírujte hodnotu adresy URL , statusQueryGetUrivložte ji do adresního řádku prohlížeče a spusťte požadavek. Alternativně můžete k vydání požadavku GET dál používat testovací nástroj HTTP.

    Požadavek se dotazuje na stav instance orchestrace. Měli byste vidět, že instance byla dokončena a že obsahuje výstupy nebo výsledky odolné funkce, například v tomto příkladu:

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