Démarrage rapide : Créer une application Durable Functions Java

Utilisez Durable Functions, une fonctionnalité de Azure Functions, pour écrire des fonctions avec état dans un environnement serverless. Durable Functions gère l’état, les points de contrôle et les redémarrages dans votre application.

Dans ce guide de démarrage rapide, vous allez créer et tester une application Durable Functions dans Java.

Une application de base Durable Functions a trois fonctions :

  • Fonction d’orchestration (Cities) : un flux de travail qui orchestre d'autres fonctions.
  • Fonction d’activité (Capitalize) : fonction que l’orchestrateur appelle pour effectuer le travail et retourner une valeur.
  • Fonction cliente (StartOrchestration) : fonction déclenchée par HTTP qui démarre l’orchestrateur.

Ce guide de démarrage rapide offre trois chemins d’installation. Utilisez le sélecteur en haut de la page pour choisir votre approche préférée :

  • Configuration manuelle : créez chaque fichier à la main pour un contrôle total sur la structure du projet.
  • Commande Maven : Utilisez un archétype Maven pour générer la structure du projet en une seule commande.
  • Visual Studio Code : utilisez l’extension vs Code Azure Functions pour générer le projet via une interface utilisateur guidée.

Prerequisites

Pour effectuer ce démarrage rapide, les éléments suivants sont requis :

Si vous n’avez pas de compte Azure, créez un compte gratuit avant de commencer.

Ajouter les dépendances et plug-ins requis à votre projet

Ajoutez le code suivant à votre fichier pom.xml . Avant de le copier, remplacez your-unique-app-name par un nom d’application de fonction globalement unique. Ajustez region, javaVersionet resourceGroup pour correspondre à votre environnement.

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

Ajouter les fichiers JSON requis

Ajoutez un fichier host.json au répertoire de votre projet. Le résultat doit ressembler à l’exemple suivant :

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

Note

Durable Functions pour Java nécessite un bundle d’extensions v4. Les offres groupées antérieures ne sont pas prises en charge. Pour plus d’informations, consultez la documentation sur les bundles d’extensions.

Durable Functions a besoin d’un fournisseur de stockage pour stocker l’état d’exécution. Ajoutez un fichier local.settings.json au répertoire de votre projet pour configurer le fournisseur de stockage. Pour utiliser Stockage Azure comme fournisseur, définissez la valeur de AzureWebJobsStorage sur la chaîne de connexion de votre compte Stockage Azure :

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

Important

Le fichier local.settings.json peut contenir des secrets. Veillez à l’ajouter à votre fichier .gitignore pour éviter de le valider dans le contrôle de code source.

Créer vos fonctions d’orchestrateur, d’activité et de client Durable Functions

L’exemple de code suivant montre un exemple de base de chaque type de fonction :

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

Créer un projet Durable Functions local à l’aide de la commande Maven

Exécutez la commande suivante pour générer un projet qui contient les fonctions de base d’une application Durable Functions :

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

En suivant les invites, saisissez les informations suivantes :

Prompt Action
groupId Entrez com.function.
artifactId Entrez myDurableFunction.
version Sélectionnez 1.0-SNAPSHOT.
paquet Entrez com.function.
Oui Entrez O, puis sélectionnez Entrée pour confirmer.

Vous disposez maintenant d’un projet local avec les trois fonctions dans une application Durable Functions de base. L’archétype inclut com.microsoft:durabletask-azure-functions automatiquement comme dépendance dans votre fichier pom.xml .

Configurer le fournisseur de stockage principal pour Durable Functions

Durable Functions a besoin d’un fournisseur de stockage pour stocker l’état d’exécution. Vous pouvez définir Stockage Azure comme fournisseur de stockage dans local.settings.json. Utilisez la chaîne de connexion de votre compte de stockage Azure comme valeur pour AzureWebJobsStorage, comme dans cet exemple :

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

Important

Le fichier local.settings.json peut contenir des secrets. Veillez à l’ajouter à votre fichier .gitignore pour éviter de le valider dans le contrôle de code source.

Créer votre projet local

  1. Dans Visual Studio Code, sélectionnez F1 (ou Ctrl/Cmd+Maj+P) pour ouvrir la palette de commandes. À l’invite (>), entrez, puis sélectionnez Azure Functions : Créer un projet.

    Screenshot de la commande Azure Functions Create New Project dans la palette de commandes Visual Studio Code.

  2. Cliquez sur Parcourir. Dans la boîte de dialogue Sélectionner un dossier, accédez à un dossier à utiliser pour votre projet, puis choisissez Sélectionner.

  3. En suivant les invites, saisissez les informations suivantes :

    Prompt Action
    Sélectionner un langage Sélectionnez Java.
    Sélectionnez une version de Java Sélectionnez Java 8 ou ultérieur. Sélectionnez la version de Java sur laquelle vos fonctions s’exécutent dans Azure et une que vous avez vérifiée localement.
    Fournir un ID de groupe Entrez com.function.
    Fournir un ID d’artefact Entrez myDurableFunction.
    Fournir une version Entrez 1.0-SNAPSHOT.
    Fournir un nom de package Entrez com.function.
    Fournir un nom d’application Entrez myDurableFunction.
    Sélectionnez l'outil de construction pour le projet Java Sélectionnez Maven.
    Sélectionnez la façon dont vous souhaitez ouvrir votre projet Sélectionnez Ouvrir dans une nouvelle fenêtre.

Vous disposez maintenant d’un projet avec un exemple de fonction HTTP. Vous pouvez supprimer la fonction HTTP générée, car vous ajoutez la Durable Functions à l’étape suivante.

Ajouter des fonctions au projet

  1. Dans la palette de commandes, entrez, puis sélectionnez Azure Functions : Créer une fonction.

  2. Pour Modifier le filtre de modèle, sélectionnez Tous.

  3. En suivant les invites, saisissez les informations suivantes :

    Prompt Action
    Sélectionner un modèle pour votre fonction Sélectionnez DurableFunctionsOrchestration.
    Fournir un nom de package Entrez com.function.
    Fournir un nom de fonction Entrez DurableFunctionsOrchestrator.
  4. Dans la boîte de dialogue, choisissez Sélectionner un compte de stockage pour configurer un compte de stockage, puis suivez les invites.

Les trois fonctions de base d’une application Durable Functions doivent maintenant être générées.

Configurer pom.xml et host.json pour Durable Functions

Ajoutez la dépendance suivante à votre fichier pom.xml :

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

Ajoutez la extensions propriété à votre fichier host.json . Si le fichier possède déjà d’autres propriétés, fusionnez le extensions bloc dans le json existant :

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

Tester la fonction en local

Azure Functions Core Tools vous permet d’exécuter un projet Azure Functions sur votre ordinateur de développement local.

  1. Si vous utilisez Visual Studio Code, ouvrez une nouvelle fenêtre de terminal et exécutez les commandes suivantes pour générer le projet :

    mvn clean package
    

    Exécutez ensuite la fonction durable :

    mvn azure-functions:run
    
  2. Dans le panneau Terminal, copiez le point de terminaison de l’URL de votre fonction déclenchée par HTTP.

    Screenshot de la sortie du terminal affichant l’URL du point de terminaison HTTP pour le runtime local Azure Functions runtime.

  3. Utilisez votre outil de test HTTP pour envoyer une requête HTTP POST au point de terminaison d’URL.

    La réponse doit être similaire à l’exemple suivant :

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

    La réponse est le résultat initial de la fonction HTTP. Elle vous permet de savoir que l’orchestration durable a démarré correctement. Elle n’affiche pas encore le résultat final de l’orchestration. La réponse contient plusieurs URL utiles. Pour le moment, interrogez l’état de l’orchestration.

  4. Copiez la valeur de l’URL pour statusQueryGetUri, collez-la dans la barre d’adresse de votre navigateur, puis exécutez la requête. Autrement, vous pouvez continuer à utiliser l’outil de test HTTP pour émettre la requête GET.

    La requête interroge l’instance d’orchestration pour obtenir l’état. Vous devez voir que l’instance s’est terminée, et qu’elle inclut les sorties ou les résultats de la fonction durable, comme dans cet exemple :

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