Inicio rápido: Creación de una aplicación de Java Durable Functions

Use Durable Functions, una característica de Azure Functions, para escribir funciones con estado en un entorno sin servidor. Durable Functions administra el estado, los puntos de control y los reinicios en la aplicación.

En este inicio rápido, creará y probará una aplicación Durable Functions en Java.

Una aplicación de Durable Functions básica tiene tres funciones:

  • Función de orquestador (Cities): flujo de trabajo que organiza otras funciones.
  • Función de actividad (Capitalize): función a la que llama el orquestador para realizar el trabajo y devolver un valor.
  • Función de cliente (StartOrchestration): función desencadenada por HTTP que inicia el orquestador.

En este inicio rápido se ofrecen tres rutas de configuración. Use el selector en la parte superior de la página para elegir su enfoque preferido:

  • Configuración manual: cree cada archivo manualmente para el control total sobre la estructura del proyecto.
  • Comando de Maven: Use un arquetipo de Maven para generar la estructura del proyecto en un solo comando.
  • Visual Studio Code: Usa la extensión de Azure Functions de VS Code para generar el proyecto a través de una interfaz de usuario guiada.

Prerrequisitos

Para completar este inicio rápido necesita instalar:

Si no tiene una cuenta de Azure, cree una cuenta gratuita antes de comenzar.

Adición de dependencias y complementos necesarios al proyecto

Agregue el código siguiente al archivo pom.xml . Antes de copiarlo, reemplace your-unique-app-name con un nombre único global para la aplicación de funciones. Ajuste region, javaVersiony resourceGroup para que coincida con el entorno.

<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 los archivos JSON necesarios

Agregue un archivo host.json al directorio del proyecto. Debe tener un aspecto similar al siguiente ejemplo:

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

Durable Functions para Java requiere el paquete de extensiones v4. No se admiten paquetes anteriores. Para obtener más información, consulte la documentación de paquetes 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"
  }
}

Importante

El archivo local.settings.json puede contener secretos. Asegúrese de agregarlo al archivo .gitignore para evitar confirmarlo en el control de código fuente.

Cree sus funciones de orquestador, actividad y cliente de Durable Functions

El código de ejemplo siguiente muestra un ejemplo básico de cada tipo de función:

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

Creación de un proyecto de Durable Functions local mediante el comando Maven

Ejecute el siguiente comando para generar un proyecto que contenga las funciones básicas de una aplicación de Durable Functions:

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

Escriba la siguiente información cuando se le indique:

Pronto Acción
groupId Escriba com.function.
artifactId Escriba myDurableFunction.
version Seleccione 1.0-SNAPSHOT.
paquete Escriba com.function.
Y Escriba Y y seleccione Entrar para confirmar.

Ahora tiene un proyecto local que tiene las tres funciones que se encuentran en una aplicación básica de Durable Functions. El arquetipo incluye com.microsoft:durabletask-azure-functions como dependencia en el archivo pom.xml automáticamente.

Configuración del proveedor de almacenamiento back-end para Durable Functions

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

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

Importante

El archivo local.settings.json puede contener secretos. Asegúrese de agregarlo al archivo .gitignore para evitar publicarlo en el repositorio de control de código fuente.

Creación del proyecto local

  1. En Visual Studio Code, seleccione F1 (o presione Ctrl/Cmd+Mayús+P) para abrir la paleta de comandos. En el símbolo del sistema (>), escriba y luego seleccione Azure Functions: Crear nuevo proyecto.

    Captura de pantalla del comando 'Crear nuevo proyecto' de Azure Functions en la paleta de comandos de Visual Studio Code.

  2. Haga clic en Examinar. En el cuadro de diálogo Seleccionar carpeta, vaya a una carpeta que se vaya a usar para el proyecto y, a continuación, elija Seleccionar.

  3. Escriba la siguiente información cuando se le indique:

    Pronto Acción
    Seleccione un lenguaje Seleccione Java.
    Seleccionar una versión de Java Seleccione Java 8 o posterior. Seleccione la versión de Java en la que se ejecutan las funciones en Azure y una que haya comprobado localmente.
    Proporcione un id. de grupo Escriba com.function.
    Proporcione un id. de artefacto Escriba myDurableFunction.
    Proporcione una versión Escriba 1.0-SNAPSHOT.
    Proporcione un nombre de paquete Escriba com.function.
    Proporcione un nombre de aplicación Escriba myDurableFunction.
    Seleccione la herramienta de compilación para el proyecto Java Seleccione Maven.
    Seleccionar cómo desea abrir el proyecto Seleccione Abrir en la nueva ventana.

Ahora tiene un proyecto que tiene una función HTTP de ejemplo. Puede quitar la función HTTP generada, ya que agrega el Durable Functions en el paso siguiente.

Adición de funciones al proyecto

  1. En la paleta de comandos, escriba y seleccione Azure Functions: Crear función.

  2. Para filtro Cambiar plantilla, seleccione Todas las.

  3. Escriba la siguiente información cuando se le indique:

    Pronto Acción
    Seleccione una plantilla para la función Seleccione DurableFunctionsOrchestration.
    Proporcione un nombre de paquete Escriba com.function.
    Proporcionar un nombre de función Escriba DurableFunctionsOrchestrator.
  4. En el cuadro de diálogo, elija Seleccione la cuenta de almacenamiento para configurar una cuenta de almacenamiento y, a continuación, siga las indicaciones.

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

Configuración de pom.xml y host.json para Durable Functions

Agregue la siguiente dependencia al archivo pom.xml:

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

Agregue la extensions propiedad al archivo host.json . Si el archivo ya tiene otras propiedades, combine el extensions bloque en el JSON existente:

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

Prueba local de la función

Azure Functions Core Tools le ofrece la capacidad de ejecutar un proyecto de Azure Functions en el equipo de desarrollo local.

  1. Si usa Visual Studio Code, abra una nueva ventana de terminal y ejecute los comandos siguientes 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.

    Captura de pantalla de la salida del terminal que muestra la dirección URL del punto de conexión HTTP para el entorno de ejecución de Azure Functions local.

  3. Use la herramienta de prueba HTTP para enviar una solicitud HTTP POST al punto de conexión de la dirección URL.

    La respuesta debe ser similar a la del siguiente ejemplo:

    {
        "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 respuesta es el resultado inicial de la función HTTP. Le permite saber que la orquestación duradera se inició correctamente. Todavía no muestra el resultado final de la orquestación. La respuesta incluye algunas direcciones URL útiles. Por ahora, consulte el estado de la orquestación.

  4. Copie el valor de dirección URL de statusQueryGetUri, péguelo en la barra de direcciones del explorador y ejecute la solicitud. Como alternativa, puede seguir usando la herramienta de prueba HTTP para emitir la solicitud GET.

    La solicitud consultará la instancia de orquestación sobre el estado. Debería ver que la instancia finalizó y que incluye las salidas o los resultados de la función durable, como en este ejemplo:

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