Delen via


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 snelstartgids maakt en test u een Durable Functions-app "hallo wereld" in Java.

De meest eenvoudige Durable Functions-app heeft drie functies:

  • Orchestratorfunctie: een werkstroom die andere functies organiseert.
  • Activiteitsfunctie: Een functie die wordt aangeroepen door de orchestratorfunctie, voert werk uit en retourneert eventueel een waarde.
  • Client, functie: Een normale functie in Azure waarmee een orchestratorfunctie wordt gestart. In dit voorbeeld wordt een door HTTP geactiveerde functie gebruikt.

In deze quickstart worden verschillende manieren beschreven om deze 'hallo wereld'-app te maken. Gebruik de selector boven aan de pagina om uw voorkeursbenadering in te stellen.

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.

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

<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

Het is belangrijk te weten dat alleen de Azure Functions v4-extensiebundel momenteel de benodigde ondersteuning heeft voor Durable Functions voor Java. Durable Functions voor Java wordt niet ondersteund in v3- en vroege uitbreidingsbundels. Zie de documentatie voor uitbreidingsbundels voor meer informatie over uitbreidingsbundels.

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

Uw functies 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 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.

Controleer of deze com.microsoft:durabletask-azure-functions is ingesteld als een afhankelijkheid in uw pom.xml-bestand .

De opslagprovider voor de back-end configureren

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

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 Nieuw functions-project maken.

  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 deze functie desgewenst verwijderen, omdat u in de volgende stap de basisfuncties van een Durable Functions-app 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

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 :

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

De functie lokaal testen

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

Opmerking

Durable Functions voor Java vereist Azure Functions Core Tools versie 4.0.4915 of hoger. U kunt zien welke versie is geïnstalleerd door de func --version opdracht uit te voeren in de terminal.

  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 Azure lokale uitvoer.

  3. Gebruik een HTTP-testhulpprogramma 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"
    }