Creación de su primera función durable en Java

Durable Functions es una extensión de Azure Functions que le permite escribir funciones con estado en un entorno sin servidor. La extensión administra el estado, establece puntos de control y reinicia en su nombre.

En este inicio rápido, aprenderá a crear y probar una aplicación "Hola mundo" de Durable Functions en Java. La aplicación de Durable Functions más básica contiene las siguientes tres funciones:

  • Función de orquestador: describe un flujo de trabajo que organiza otras funciones.
  • Función de actividad: a la cual llama la función de orquestador, realiza el trabajo y, opcionalmente, devuelve un valor.
  • Función de cliente: una función de Azure normal que inicia una función de orquestador. En este ejemplo se usa una función desencadenada por HTTP.

En este inicio rápido se muestra cómo crear esta aplicación de "Hola mundo", que puede hacer de maneras diferentes. Use el selector anterior para elegir su enfoque preferido.

Prerrequisitos

Para completar este tutorial, necesita:

Si no tiene una suscripción a Azure, cree una cuenta gratuita de Azure antes de empezar.

Adición de dependencias y complementos necesarios al proyecto

Agregue lo siguiente al pom.xml:

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

Adición de archivos JSON necesarios

Agregue un archivo host.json al directorio de su proyecto. Debería tener un aspecto similar al siguiente:

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

Nota

Es importante tener en cuenta que solo el conjunto de extensiones de Azure Functions v4 tiene actualmente la compatibilidad necesaria para Durable Functions para Java. Durable Functions para Java no es compatible con v3 ni los paquetes de extensiones anteriores. Para obtener más información sobre los grupos de extensiones, consulte la documentación sobre grupos de extensiones.

Durable Functions necesita un proveedor de almacenamiento para almacenar el estado del entorno de ejecución. Agregue un archivo local.settings.json al directorio del proyecto para configurar el proveedor de almacenamiento. Para usar Azure Storage como proveedor, establezca el valor de AzureWebJobsStorage en la cadena de conexión de la cuenta de Azure Storage:

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

Creación de las funciones

El código de ejemplo siguiente muestra un ejemplo sencillo de cada uno:

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

Creación de un proyecto local con el comando Maven

  1. Ejecute el siguiente comando para generar un proyecto con las funciones básicas de una aplicación de Durable Functions:
mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DarchetypeVersion=1.51 -Dtrigger=durablefunctions
  1. Siga las solicitudes y proporcione la siguiente información:
Prompt Value
groupId com.function
artifactId myDurableFunction
version 1.0-SNAPSHOT
package com.function
S Presione Entrar para confirmar

Ahora tiene un proyecto local generado con las tres funciones necesarias para una aplicación de Durable Functions básica.

Compruebe que tiene com.microsoft:durabletask-azure-functions como dependencia en pom.xml.

Configuración del proveedor de almacenamiento de back-end

Durable Functions necesita un proveedor de almacenamiento para almacenar el estado del entorno de ejecución. Puede establecer la configuración para usar Azure Storage como proveedor de almacenamiento en local.settings.json proporcionando la cadena de conexión de la cuenta de Azure Storage como valor en AzureWebJobsStorage:

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

Creación del proyecto local

  1. En Visual Studio Code, presione F1 (o Ctrl/Cmd+Mayús+P) para abrir la paleta de comandos. En la paleta de comandos, busque y seleccione Azure Functions: Create New Project....

    Screenshot of create new functions project.

  2. Elija una ubicación de carpeta vacía para el proyecto y elija Seleccionar.

  3. Siga las solicitudes y proporcione la siguiente información:

    Prompt Value
    Selección de un idioma Elija Java.
    Seleccione una versión de Java Elija Java 8 o posterior, la versión de Java en la que se ejecutan las funciones en Azure. Elija una versión de Java que haya comprobado localmente.
    Proporcione un id. de grupo com.function.
    Proporcione un id. de artefacto myDurableFunction.
    Proporcione una versión 1.0-SNAPSHOT.
    Proporcione un nombre de paquete com.function.
    Proporcione un nombre de aplicación myDurableFunction.
    Seleccione la herramienta de compilación para el proyecto de Java Elija Maven.
    Seleccionar cómo desea que se abra el proyecto Elija Open in new window.

Ahora tiene un proyecto con una función HTTP de ejemplo. Puede quitar esta función si quiere porque vamos a agregar las funciones básicas de una aplicación de Durable Functions en el paso siguiente.

Adición de funciones al proyecto

  1. En la paleta de comandos, busque y seleccione Azure Functions: Create Function....

  2. Seleccione Change template filter en All.

  3. Siga las solicitudes y proporcione la siguiente información:

    Prompt Value
    Seleccionar una plantilla para la función DurableFunctionsOrchestration
    Proporcione un nombre de paquete com.function
    Proporcionar un nombre de función DurableFunctionsOrchestrator
  4. Elija Select storage account en la ventana emergente que le pide que configure la información de la cuenta de almacenamiento y siga las indicaciones.

Ahora debería tener las tres funciones básicas para una aplicación de Durable Functions generada.

Configuración de pom.xml y host.json

Agregue la siguiente dependencia en su pom.xml:

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

Agregue la propiedad extensions a su host.json:

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

Prueba local de la función

Azure Functions Core Tools le permite ejecutar un proyecto de Azure Functions en el equipo de desarrollo local.

Nota

Durable Functions para Java requiere Azure Functions Core Tools v4.0.4915 o posterior. Para ver qué versión está instalada, ejecute el comando func --version desde el terminal.

  1. Si usa Visual Studio Code, abra una nueva ventana de terminal y ejecute los siguientes comandos para compilar el proyecto:

    mvn clean package
    

    A continuación, ejecute la función durable:

    mvn azure-functions:run
    
  2. En el panel Terminal, copie el punto de conexión de la dirección URL de la función desencadenada por HTTP.

    Screenshot of Azure local output.

  3. Mediante una herramienta como Postman o cURL, envíe una solicitud HTTP POST al punto de conexión de la dirección URL. Debe obtener una respuesta similar a la siguiente:

    {
        "id": "d1b33a60-333f-4d6e-9ade-17a7020562a9",
        "purgeHistoryDeleteUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d1b33a60-333f-4d6e-9ade-17a7020562a9?code=ACCupah_QfGKoFXydcOHH9ffcnYPqjkddSawzRjpp1PQAzFueJ2tDw==",
        "sendEventPostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d1b33a60-333f-4d6e-9ade-17a7020562a9/raiseEvent/{eventName}?code=ACCupah_QfGKoFXydcOHH9ffcnYPqjkddSawzRjpp1PQAzFueJ2tDw==",
        "statusQueryGetUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d1b33a60-333f-4d6e-9ade-17a7020562a9?code=ACCupah_QfGKoFXydcOHH9ffcnYPqjkddSawzRjpp1PQAzFueJ2tDw==",
        "terminatePostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d1b33a60-333f-4d6e-9ade-17a7020562a9/terminate?reason={text}&code=ACCupah_QfGKoFXydcOHH9ffcnYPqjkddSawzRjpp1PQAzFueJ2tDw=="
    }
    

    La respuesta es el resultado inicial de la función HTTP que le informa de que la orquestación perdurable se ha iniciado correctamente. No es aún el resultado final de la orquestación. La respuesta incluye algunas direcciones URL útiles. De momento, vamos a consultar el estado de la orquestación.

  4. Copie el valor de la URL para statusQueryGetUri y péguelo en la barra de direcciones del explorador y ejecute la solicitud. Como alternativa también puede usar Postman o URL para emitir la solicitud GET.

    La solicitud consultará la instancia de orquestación sobre el estado. Debe obtener una respuesta eventual que muestre que la instancia se ha completado, e incluye las salidas o resultados de la función durable. Su aspecto es similar a:

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