Quickstart: Een Java Durable Functions-app maken

Gebruik Durable Functions, een functie van Azure Functions, om stateful functies te schrijven in een serverloze omgeving. Durable Functions de status, controlepunten en het opnieuw opstarten in uw toepassing beheert.

In deze quickstart maakt en test u een Durable Functions-app in Java.

Een eenvoudige Durable Functions-app heeft drie functies:

  • Orchestrator-functie (Cities): Een werkstroom die andere functies organiseert.
  • Activiteitsfunctie (Capitalize): Een functie die door de orchestrator wordt aangeroepen om werk uit te voeren en een waarde te retourneren.
  • Clientfunctie (StartOrchestration): Een door HTTP geactiveerde functie waarmee de orchestrator wordt gestart.

Deze quickstart biedt drie installatiepaden. Gebruik de selector boven aan de pagina om uw voorkeursbenadering te kiezen:

  • Handmatige installatie: maak elk bestand handmatig voor volledige controle over de projectstructuur.
  • Maven-opdracht: Gebruik een Maven-archetype om het project in één opdracht te maken.
  • Visual Studio Code: gebruik de extensie VS Code Azure Functions om het project te genereren via een begeleide gebruikersinterface.

Vereiste voorwaarden

U hebt het volgende nodig om deze quickstart te voltooien:

  • De Java Developer Kit versie 8 of hoger geïnstalleerd.

  • Apache Maven versie 3.0 of hoger geïnstalleerd.

  • De nieuwste versie van Azure Functions Core Tools.

    Voor Azure Functions 4.x is Core Tools versie 4.0.4915 of hoger vereist.

  • Een HTTP-testprogramma waarmee uw gegevens veilig blijven. Zie HTTP-testhulpprogramma's voor meer informatie.

  • Visual Studio Code met de extensie Azure Functions geïnstalleerd (alleen vereist voor het installatiepad Visual Studio Code).

  • Een Azure-abonnement. Als u Durable Functions wilt gebruiken, moet u een Azure Storage-account hebben.

Als u geen Azure-account hebt, maak dan een gratis account aan voordat u begint.

Vereiste afhankelijkheden en invoegtoepassingen toevoegen aan uw project

Voeg de volgende code toe aan uw pom.xml-bestand . Voordat u deze kopieert, vervangt u deze door your-unique-app-name de naam van een wereldwijd unieke functie-app. Pas region, javaVersion, en resourceGroup aan om aan je omgeving te passen.

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

De vereiste JSON-bestanden toevoegen

Voeg een host.json-bestand toe aan de projectmap. Het moet er ongeveer uitzien als in het volgende voorbeeld:

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

Opmerking

Durable Functions voor Java vereist uitbreidingsbundel v4. Eerdere bundels worden niet ondersteund. Zie de documentatie voor uitbreidingsbundels voor meer informatie.

Durable Functions heeft een opslagprovider nodig om runtimestatus op te slaan. Voeg een local.settings.json-bestand toe aan uw projectmap om de opslagprovider te configureren. Als u Azure Storage als provider wilt gebruiken, stelt u de waarde van AzureWebJobsStorage in op de verbindingsreeks van uw Azure Storage-account.

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

Belangrijk

Het bestandlocal.settings.json kan geheimen bevatten. Zorg ervoor dat u het toevoegt aan uw .gitignore-bestand om te voorkomen dat het wordt doorgevoerd in broncodebeheer.

Uw Durable Functions orchestrator-, activiteits- en clientfuncties maken

De volgende voorbeeldcode toont een basisvoorbeeld van elk type functie:

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

Een lokaal Durable Functions project maken met behulp van de Maven-opdracht

Voer de volgende opdracht uit om een project te genereren dat de basisfuncties van een Durable Functions-app bevat:

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

Geef bij de prompts de volgende informatie op:

Snel Action
groupId Voer com.function in.
artifactId Voer myDurableFunction in.
version Selecteer 1.0-SNAPSHOT.
package Voer com.function in.
Y Voer Y in en selecteer Enter om te bevestigen.

U hebt nu een lokaal project met de drie functies die zich in een eenvoudige Durable Functions-app bevinden. Het archetype voegt com.microsoft:durabletask-azure-functions automatisch toe als een afhankelijkheid in uw pom.xml-bestand.

De back-endopslagprovider configureren voor Durable Functions

Durable Functions heeft een opslagprovider nodig om runtimestatus op te slaan. U kunt Azure Storage instellen als de opslagprovider in local.settings.json. Gebruik de verbindingsreeks van uw Azure-opslagaccount als de waarde voor AzureWebJobsStorage zoals in dit voorbeeld:

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

Belangrijk

Het bestandlocal.settings.json kan geheimen bevatten. Zorg ervoor dat u het toevoegt aan uw .gitignore-bestand om te voorkomen dat het wordt doorgevoerd in broncodebeheer.

Uw lokale project maken

  1. Selecteer in Visual Studio Code F1 (of selecteer Ctrl/Cmd+Shift+P) om het opdrachtenpalet te openen. Voer bij de prompt (>) Azure Functions in en selecteer vervolgens: Nieuw project maken.

    Schermopname van de opdracht Azure Functions Nieuwe Project maken in het opdrachtenpalet Visual Studio Code.

  2. Kies Bladeren. In het dialoogvenster Map selecteren, navigeer naar een map die u voor uw project wilt gebruiken en kies Selecteren.

  3. Geef bij de prompts de volgende informatie op:

    Snel Action
    Een taal selecteren Selecteer Java.
    Selecteer een versie van Java Selecteer Java 8 of hoger. Selecteer de Java-versie waarop uw functies worden uitgevoerd in Azure en een versie die u lokaal hebt geverifieerd.
    Een groeps-id opgeven Voer com.function in.
    Geef een artefact-id op Voer myDurableFunction in.
    Geef een versie op Voer 1.0-SNAPSHOT in.
    Geef een pakketnaam op Voer com.function in.
    Geef een app-naam op Voer myDurableFunction in.
    Selecteer de buildtool voor het Java-project Selecteer Maven.
    Selecteer hoe u uw project wilt openen Selecteer Openen in nieuw venster.

U hebt nu een project met een voorbeeld van een HTTP-functie. U kunt de gegenereerde HTTP-functie verwijderen, omdat u de Durable Functions in de volgende stap toevoegt.

Functies toevoegen aan het project

  1. Voer in het opdrachtpalet Azure Functions: Functie maken in en selecteer deze.

  2. Selecteer voor Sjabloonfilter wijzigen de optie Alles.

  3. Geef bij de prompts de volgende informatie op:

    Snel Action
    Selecteer een sjabloon voor uw functie Selecteer DurableFunctionsOrchestration.
    Geef een pakketnaam op Voer com.function in.
    Geef een functienaam op Voer DurableFunctionsOrchestrator in.
  4. Kies in het dialoogvenster Opslagaccount selecteren om een opslagaccount in te stellen en volg de aanwijzingen.

U moet nu beschikken over de drie basisfuncties die zijn gegenereerd voor een Durable Functions-app.

pom.xml en host.json configureren voor Durable Functions

Voeg de volgende afhankelijkheid toe aan uw pom.xml-bestand:

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

Voeg de extensions eigenschap toe aan uw host.json-bestand . Als het bestand al andere eigenschappen heeft, voegt u het extensions blok samen in de bestaande JSON:

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

De functie lokaal testen

Azure Functions Core Tools biedt u de mogelijkheid om een Azure Functions project uit te voeren op uw lokale ontwikkelcomputer.

  1. Als u Visual Studio Code gebruikt, opent u een nieuw terminalvenster en voert u de volgende opdrachten uit om het project te bouwen:

    mvn clean package
    

    Voer vervolgens de duurzame functie uit:

    mvn azure-functions:run
    
  2. Kopieer in het terminalvenster het URL-eindpunt van uw door HTTP geactiveerde functie.

    Schermopname van de terminaluitvoer met de URL van het HTTP-eindpunt voor de lokale Azure Functions runtime.

  3. Gebruik uw HTTP-testprogramma om een HTTP POST-aanvraag naar het URL-eindpunt te verzenden.

    Het antwoord moet er ongeveer uitzien als in het volgende voorbeeld:

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

    Het antwoord is het eerste resultaat van de HTTP-functie. Het laat u weten dat de duurzame orkestratie succesvol is gestart. Het eindresultaat van de orkestratie wordt nog niet weergegeven. De reactie bevat enkele nuttige URL's. Vraag voor nu de status van de orchestratie op.

  4. Kopieer de URL-waarde voor statusQueryGetUri, plak deze in de adresbalk van uw browser en voer de aanvraag uit. U kunt ook het HTTP-testprogramma blijven gebruiken om de GET-aanvraag uit te voeren.

    Het verzoek vraagt de orchestratie-instantie om de status. U zou moeten zien dat de instance is voltooid en dat het de outputs of resultaten van de durable function bevat, zoals in dit voorbeeld:

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