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:
Kit para desarrolladores de Java, versión 8 o posterior.
Apache Maven, versión 3.0 o posterior.
La versión más reciente de Azure Functions Core Tools.
- Para Azure Functions 4.x, se requiere Core Tools v4.0.4915 o posterior.
Una cuenta de Azure Storage, que requiere que tenga una suscripción de Azure.
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
- 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
- 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
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...
.Elija una ubicación de carpeta vacía para el proyecto y elija Seleccionar.
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
En la paleta de comandos, busque y seleccione
Azure Functions: Create Function...
.Seleccione
Change template filter
enAll
.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
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.
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
En el panel Terminal, copie el punto de conexión de la dirección URL de la función desencadenada por HTTP.
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.
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" }