Compartir vía


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 "hola mundo" en Java.

La aplicación Durable Functions más básica tiene tres funciones:

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

En este inicio rápido se describen diferentes formas de crear esta aplicación "hola mundo". Use el selector en la parte superior de la página para establecer su enfoque preferido.

Requisitos previos

Para completar este inicio rápido necesita instalar:

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 el código siguiente al archivo 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 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:

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 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 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.51 -Dtrigger=durablefunctions

Escriba la siguiente información cuando se le indique:

Prompt Action
groupId Escriba com.function.
artifactId Escriba myDurableFunction.
version Seleccione 1.0-SNAPSHOT.
package 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.

Compruebe que com.microsoft:durabletask-azure-functions esté establecido como una dependencia en el archivo pom.xml.

Configuración del proveedor de almacenamiento back-end

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

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 la solicitud (>), escriba y seleccione Azure Functions: Crear nuevo proyecto.

    Captura de pantalla del comando Crear nuevo proyecto de funciones.

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

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

    Prompt Acción
    Selección de un idioma Seleccione Java.
    Seleccione 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 de Java Seleccione Maven.
    Seleccionar cómo desea que se abra el proyecto Seleccione Abrir en la nueva ventana.

Ahora tiene un proyecto que tiene una función HTTP de ejemplo. Puede quitar esta función si quiere, ya que agrega 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, escriba y seleccione Azure Functions: Create Function.

  2. Para filtro Cambiar plantilla, seleccione Todas las.

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

    Prompt Action
    Seleccionar 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

Agregue la dependencia siguiente al archivo pom.xml :

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

Agregue la propiedad extensions al archivo host.json:

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

Prueba local de la función

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

Nota:

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

  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 de terminal, copie el punto de conexión de dirección URL de la función desencadenada por HTTP.

    Captura de pantalla de salida local de Azure.

  3. Use una 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 de Durable 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"
    }