Dela via


Snabbstart: Skapa en Java Durable Functions-app

Använd Durable Functions, en funktion i Azure Functions, för att skriva tillståndskänsliga funktioner i en serverlös miljö. Durable Functions hanterar tillstånd, kontrollpunkter och omstarter i ditt program.

I den här snabbstarten skapar och testar du en "hello world" Durable Functions-app i Java.

Den mest grundläggande Durable Functions-appen har tre funktioner:

  • Orchestrator-funktion: Ett arbetsflöde som samordnar andra funktioner.
  • Aktivitetsfunktion: En funktion som anropas av orkestreringsfunktionen, utför arbete och som eventuellt returnerar ett värde.
  • Klientfunktion: En vanlig funktion i Azure som startar en orchestrator-funktion. I det här exemplet används en HTTP-utlöst funktion.

Den här snabbstarten beskriver olika sätt att skapa den här "hello world"-appen. Använd väljaren överst på sidan för att ange önskad metod.

Förutsättningar

Följande krävs för att slutföra den här snabbstarten:

  • Java Developer Kit version 8 eller senare installerat.

  • Apache Maven version 3.0 eller senare installerat.

  • Den senaste versionen av Azure Functions Core Tools.

    För Azure Functions 4.x krävs Core Tools version 4.0.4915 eller senare.

  • Ett HTTP-testverktyg som skyddar dina data. Mer information finns i HTTP-testverktyg.

  • En Azure-prenumeration Om du vill använda Durable Functions måste du ha ett Azure Storage-konto.

Om du inte har en Azure-prenumeration skapar du ett kostnadsfritt Azure-konto innan du börjar.

Lägga till nödvändiga beroenden och plugin-program i projektet

Lägg till följande kod i din pom.xml-fil :

<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>

Lägg till nödvändiga JSON-filer

Lägg till en host.json fil i projektkatalogen. Det bör se ut ungefär som i följande exempel:

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

Kommentar

Observera att endast Azure Functions v4-tilläggspaketet för närvarande har det stöd som krävs för Durable Functions för Java. Durable Functions för Java stöds inte i v3- och tidiga tilläggspaket. Mer information om tilläggspaket finns i dokumentationen om tilläggspaket.

Durable Functions behöver en lagringsprovider för att lagra körningstillstånd. Lägg till en local.settings.json fil i projektkatalogen för att konfigurera lagringsprovidern. Om du vill använda Azure Storage som provider anger du värdet AzureWebJobsStorage för till niska veze för ditt Azure Storage-konto:

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

Skapa dina funktioner

Följande exempelkod visar ett grundläggande exempel på varje typ av funktion:

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

Skapa ett lokalt projekt med hjälp av Maven-kommandot

Kör följande kommando för att generera ett projekt som innehåller de grundläggande funktionerna i en Durable Functions-app:

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

Ange följande information vid anvisningarna:

Prompt Åtgärd
groupId Ange com.function.
artifactId Ange myDurableFunction.
version Välj 1.0-SNAPSHOT.
paket Ange com.function.
Y Ange Y och välj Retur för att bekräfta.

Nu har du ett lokalt projekt som har de tre funktionerna som finns i en grundläggande Durable Functions-app.

Kontrollera att com.microsoft:durabletask-azure-functions är inställt som ett beroende i din pom.xml-fil .

Konfigurera serverdelslagringsprovidern

Durable Functions behöver en lagringsprovider för att lagra körningstillstånd. Du kan ange Azure Storage som lagringsprovider i local.settings.json. Använd niska veze för ditt Azure Storage-konto som värde för AzureWebJobsStorage som i det här exemplet:

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

Skapa ditt lokala projekt

  1. I Visual Studio Code väljer du F1 (eller ctrl/cmd+Skift+P) för att öppna kommandopaletten. I kommandotolken (>) anger du och väljer sedan Azure Functions: Create New Project (Skapa nytt projekt).

    Skärmbild av projektkommandot skapa nya funktioner.

  2. Välj bläddra. I dialogrutan Välj mapp går du till en mapp som ska användas för projektet och väljer sedan Välj.

  3. Ange följande information vid anvisningarna:

    Prompt Åtgärd
    Välj ett språk Välj Java.
    Välj en version av Java Välj Java 8 eller senare. Välj den Java-version som funktionerna körs på i Azure och en som du har verifierat lokalt.
    Ange ett grupp-ID Ange com.function.
    Ange ett artefakt-ID Ange myDurableFunction.
    Ange en version Ange 1.0-SNAPSHOT.
    Ange ett paketnamn Ange com.function.
    Ange ett appnamn Ange myDurableFunction.
    Välj byggverktyget för Java-projektet Välj Maven.
    Välj hur du vill öppna projektet Välj Öppna i nytt fönster.

Nu har du ett projekt som har en HTTP-exempelfunktion. Du kan ta bort den här funktionen om du vill eftersom du lägger till de grundläggande funktionerna i en Durable Functions-app i nästa steg.

Lägga till funktioner i projektet

  1. I kommandopaletten anger du och väljer sedan Azure Functions: Create Function (Azure Functions: Create Function).

  2. För Ändra mallfilter väljer du Alla.

  3. Ange följande information vid anvisningarna:

    Prompt Åtgärd
    Välj en mall för din funktion Välj DurableFunctionsOrchestration.
    Ange ett paketnamn Ange com.function.
    Ange ett funktionsnamn Ange DurableFunctionsOrchestrator.
  4. I dialogrutan väljer du Välj lagringskonto för att konfigurera ett lagringskonto och följer sedan anvisningarna.

Nu bör du ha de tre grundläggande funktionerna som genererats för en Durable Functions-app.

Konfigurera pom.xml och host.json

Lägg till följande beroende i din pom.xml-fil :

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

Lägg till egenskapen i extensions din host.json-fil :

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

Testa funktionen lokalt

Med Azure Functions Core Tools kan du köra ett Azure Functions-projekt på din lokala utvecklingsdator.

Kommentar

Durable Functions för Java kräver Azure Functions Core Tools version 4.0.4915 eller senare. Du kan se vilken version som installeras genom att func --version köra kommandot i terminalen.

  1. Om du använder Visual Studio Code öppnar du ett nytt terminalfönster och kör följande kommandon för att skapa projektet:

    mvn clean package
    

    Kör sedan den hållbara funktionen:

    mvn azure-functions:run
    
  2. I terminalpanelen kopierar du URL-slutpunkten för din HTTP-utlösta funktion.

    Skärmbild av lokala Azure-utdata.

  3. Använd ett HTTP-testverktyg för att skicka en HTTP POST-begäran till URL-slutpunkten.

    Svaret bör se ut ungefär som i följande exempel:

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

    Svaret är HTTP-funktionens första resultat. Det låter dig veta att den varaktiga orkestreringen har startats. Det visar ännu inte slutresultatet av orkestreringen. Svaret innehåller några användbara URL:er. För tillfället frågar du orkestreringens status.

  4. Kopiera URL-värdet för statusQueryGetUri, klistra in det i webbläsarens adressfält och kör begäran. Du kan också fortsätta att använda HTTP-testverktyget för att utfärda GET-begäran.

    Begäran frågar orkestreringsinstansen om statusen. Du bör se att instansen har slutförts och att den innehåller utdata eller resultat från den varaktiga funktionen, som i det här exemplet:

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