Guía de Azure Functions para desarrolladores de JavaAzure Functions Java developer guide

Esta guía contiene información detallada para ayudarle a desarrollar correctamente Azure Functions con Java.This guide contains detailed information to help you succeed developing Azure Functions using Java.

Como desarrollador Java, si no está familiarizado con Azure Functions, considere la posibilidad de leer primero uno de los siguientes artículos:As a Java developer, if you're new to Azure Functions, please consider first reading one of the following articles:

IntroducciónGetting started ConceptosConcepts

Fundamentos de las funciones de JavaJava function basics

Una función Java es un método public decorado con la anotación @FunctionName.A Java function is a public method, decorated with the annotation @FunctionName. Este método define la entrada de una función Java, y debe ser única en un paquete determinado.This method defines the entry for a Java function, and must be unique in a particular package. El paquete puede tener varias clases con varios métodos públicos anotados con @FunctionName.The package can have multiple classes with multiple public methods annotated with @FunctionName. Se implementa un único paquete en una aplicación de funciones en Azure.A single package is deployed to a function app in Azure. Cuando se ejecuta en Azure, la aplicación de funciones proporciona el contexto de implementación, ejecución y administración de las funciones individuales de Java.When running in Azure, the function app provides the deployment, execution, and management context for your individual Java functions.

Modelo de programaciónProgramming model

Los conceptos de desencadenadores y enlaces son fundamentales en Azure Functions.The concepts of triggers and bindings are fundamental to Azure Functions. Los desencadenadores inician la ejecución del código.Triggers start the execution of your code. Los enlaces, por otro lado, proporcionan una manera de pasar y devolver datos de una función, sin tener que escribir un código de acceso a datos personalizados.Bindings give you a way to pass data to and return data from a function, without having to write custom data access code.

Creación de funciones de JavaCreate Java functions

Para facilitar la creación de funciones de Java, hay herramientas y arquetipos basados en Maven que usan plantillas de Java predefinidas para ayudarle a crear proyectos con un desencadenador de funciones específico.To make it easier to create Java functions, there are Maven-based tooling and archetypes that use predefined Java templates to help you create projects with a specific function trigger.

Herramientas basadas en MavenMaven-based tooling

Los siguientes entornos del desarrollador tienen herramientas de Azure Functions que le permiten crear proyectos de aplicación de una función de Java:The following developer environments have Azure Functions tooling that lets you create Java function projects:

Los vínculos de artículo anteriores muestran cómo crear sus primeras funciones mediante el IDE que prefiera.The article links above show you how to create your first functions using your IDE of choice.

Creación del scaffolding del proyectoProject Scaffolding

Si prefiere el desarrollo de la línea de comandos del terminal, la forma más sencilla de crear el scaffolding de los proyectos de aplicación de una función basados en Java es usar arquetipos Apache Maven.If you prefer command line development from the Terminal, the simplest way to scaffold Java-based function projects is to use Apache Maven archetypes. El arquetipo Maven de Java para Azure Functions está publicado en groupId:artifactId: com.microsoft.azure:azure-functions-archetype.The Java Maven archetype for Azure Functions is published under the following groupId:artifactId: com.microsoft.azure:azure-functions-archetype.

El siguiente comando genera un nuevo proyecto de función de Java con este arquetipo:The following command generates a new Java function project using this archetype:

mvn archetype:generate \
    -DarchetypeGroupId=com.microsoft.azure \
    -DarchetypeArtifactId=azure-functions-archetype

Para empezar a usar este arquetipo, consulte el inicio rápido de Java.To get started using this archetype, see the Java quickstart.

Estructura de carpetasFolder structure

Esta es la estructura de carpetas de un proyecto de Java de Azure Functions:Here is the folder structure of an Azure Functions Java project:

FunctionsProject
 | - src
 | | - main
 | | | - java
 | | | | - FunctionApp
 | | | | | - MyFirstFunction.java
 | | | | | - MySecondFunction.java
 | - target
 | | - azure-functions
 | | | - FunctionApp
 | | | | - FunctionApp.jar
 | | | | - host.json
 | | | | - MyFirstFunction
 | | | | | - function.json
 | | | | - MySecondFunction
 | | | | | - function.json
 | | | | - bin
 | | | | - lib
 | - pom.xml

Puede usar un archivo host.json compartido para configurar la aplicación de funciones.You can use a shared host.json file to configure the function app. Cada función tiene su propio archivo de código (.java) y archivo de configuración de enlace (function.json).Each function has its own code file (.java) and binding configuration file (function.json).

Puede colocar más de una función en un proyecto.You can put more than one function in a project. Evite colocar las funciones en archivos JAR independientes.Avoid putting your functions into separate jars. FunctionApp en el directorio de destino es lo que se implementa en la aplicación de funciones en Azure.The FunctionApp in the target directory is what gets deployed to your function app in Azure.

Desencadenadores y anotacionesTriggers and annotations

Las funciones se invocan mediante un desencadenador, como una solicitud HTTP, un temporizador o una actualización de datos.Functions are invoked by a trigger, such as an HTTP request, a timer, or an update to data. La función debe procesar ese desencadenador y las demás entradas para generar una o más salidas.Your function needs to process that trigger, and any other inputs, to produce one or more outputs.

Utilice las anotaciones de Java incluidas en el paquete com.microsoft.azure.functions.annotation.* para enlazar las entradas y salidas a los métodos.Use the Java annotations included in the com.microsoft.azure.functions.annotation.* package to bind input and outputs to your methods. Para más información, vea los documentos de referencia de Java.For more information, see the Java reference docs.

Importante

Debe configurar una cuenta de Azure Storage en local.settings.json para ejecutar de manera local los desencadenadores de Azure Blob Storage, Azure Queue Storage o Azure Table Storage.You must configure an Azure Storage account in your local.settings.json to run Azure Blob storage, Azure Queue storage, or Azure Table storage triggers locally.

Ejemplo:Example:

public class Function {
    public String echo(@HttpTrigger(name = "req", 
      methods = {HttpMethod.POST},  authLevel = AuthorizationLevel.ANONYMOUS) 
        String req, ExecutionContext context) {
        return String.format(req);
    }
}

Aquí está el elemento function.json correspondiente que generó azure-functions-maven-plugin:Here is the generated corresponding function.json by the azure-functions-maven-plugin:

{
  "scriptFile": "azure-functions-example.jar",
  "entryPoint": "com.example.Function.echo",
  "bindings": [
    {
      "type": "httpTrigger",
      "name": "req",
      "direction": "in",
      "authLevel": "anonymous",
      "methods": [ "post" ]
    },
    {
      "type": "http",
      "name": "$return",
      "direction": "out"
    }
  ]
}

Versiones de JavaJava versions

La versión de Java que se usa al crear la aplicación de funciones en la que se ejecutan las funciones en Azure se especifica en el archivo pom.xml.The version of Java used when creating the function app on which functions runs in Azure is specified in the pom.xml file. En la actualidad, el arquetipo de Maven genera un archivo pom.xml para Java 8, que se puede cambiar antes de publicar.The Maven archetype currently generates a pom.xml for Java 8, which you can change before publishing. La versión de Java en el archivo pom.xml debe coincidir con la versión en la que ha desarrollado y probado localmente la aplicación.The Java version in pom.xml should match the version on which you have locally developed and tested your app.

Versiones compatiblesSupported versions

En la tabla siguiente se muestran las versiones actuales de Java compatibles para cada versión principal del runtime de Functions, por sistema operativo:The following table shows current supported Java versions for each major version of the Functions runtime, by operating system:

Versión de FunctionsFunctions version Versiones de Java (Windows)Java versions (Windows) Versiones de Java (Linux)Java versions (Linux)
3.x3.x 1111
88
1111
88
2.x2.x 88 N/Dn/a

A menos que especifique una versión de Java para la implementación, el arquetipo de Maven usa como valor predeterminado Java 8 durante la implementación en Azure.Unless you specify a Java version for your deployment, the Maven archetype defaults to Java 8 during deployment to Azure.

Especificación de la versión de implementaciónSpecify the deployment version

Puede controlar la versión de Java de destino del arquetipo de Maven mediante el parámetro -DjavaVersion.You can control the version of Java targeted by the Maven archetype by using the -DjavaVersion parameter. El valor de este parámetro puede ser 8 o 11.The value of this parameter can be either 8 or 11.

El arquetipo de Maven genera un archivo pom.xml que tiene como destino la versión de Java especificada.The Maven archetype generates a pom.xml that targets the specified Java version. Los siguientes elementos del archivo pom.xml indican la versión de Java que se va a usar:The following elements in pom.xml indicate the Java version to use:

ElementoElement Valor de Java 8Java 8 value Valor de Java 11Java 11 value DescripciónDescription
Java.version 1.81.8 1111 Versión de Java que usa el complemento maven-compiler-plugin.Version of Java used by the maven-compiler-plugin.
JavaVersion 88 1111 Versión de Java hospedada por la aplicación de funciones en Azure.Java version hosted by the function app in Azure.

En los siguientes ejemplos se muestra la configuración de Java 8 en las secciones correspondientes del archivo pom.xml:The following examples show the settings for Java 8 in the relevant sections of the pom.xml file:

Java.version

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>1.8</java.version>
    <azure.functions.maven.plugin.version>1.6.0</azure.functions.maven.plugin.version>
    <azure.functions.java.library.version>1.3.1</azure.functions.java.library.version>
    <functionAppName>fabrikam-functions-20200718015742191</functionAppName>
    <stagingDirectory>${project.build.directory}/azure-functions/${functionAppName}</stagingDirectory>
</properties>

JavaVersion

<runtime>
    <!-- runtime os, could be windows, linux or docker-->
    <os>windows</os>
    <javaVersion>8</javaVersion>
    <!-- for docker function, please set the following parameters -->
    <!-- <image>[hub-user/]repo-name[:tag]</image> -->
    <!-- <serverId></serverId> -->
    <!-- <registryUrl></registryUrl>  -->
</runtime>

Importante

Debe tener la variable de entorno JAVA_HOME establecida correctamente en el directorio JDK que se usa durante la compilación de código mediante Maven.You must have the JAVA_HOME environment variable set correctly to the JDK directory that is used during code compiling using Maven. Asegúrese de que la versión del JDK sea al menos tan alta como la configuración de Java.version.Make sure that the version of the JDK is at least as high as the Java.version setting.

Especificación del sistema operativo de implementaciónSpecify the deployment OS

Maven también le permite especificar el sistema operativo en el que se ejecuta la aplicación de funciones en Azure.Maven also lets you specify the operating system on which your function app runs in Azure. Use el elemento os para elegir el sistema operativo.Use the os element to choose the operating system.

ElementoElement WindowsWindows LinuxLinux DockerDocker
os Windowswindows Linuxlinux dockerdocker

En el ejemplo siguiente se muestra la configuración del sistema operativo en la sección runtime del archivo pom.xml:The following example shows the operating system setting in the runtime section of the pom.xml file:

<runtime>
    <!-- runtime os, could be windows, linux or docker-->
    <os>windows</os>
    <javaVersion>8</javaVersion>
    <!-- for docker function, please set the following parameters -->
    <!-- <image>[hub-user/]repo-name[:tag]</image> -->
    <!-- <serverId></serverId> -->
    <!-- <registryUrl></registryUrl>  -->
</runtime>

Disponibilidad y soporte técnico del entorno de ejecución de JDKJDK runtime availability and support

Para el desarrollo local de aplicaciones de funciones Java, descargue y utilice los JDK adecuados de Java de Azul Zulu Enterprise for Azure de Azul Systems.For local development of Java function apps, download and use the appropriate Azul Zulu Enterprise for Azure Java JDKs from Azul Systems. Azure Functions usa un runtime del JDK de Java de Azul al implementar las aplicaciones de funciones en la nube.Azure Functions uses an Azul Java JDK runtime when you deploy your function app to the cloud.

El soporte técnico de Azure para problemas con los JDK y las aplicaciones de funciones está disponible con un plan de soporte técnico cualificado.Azure support for issues with the JDKs and function apps is available with a qualified support plan.

Personalización de JVMCustomize JVM

Functions permite personalizar la Máquina virtual Java (JVM) utilizada para ejecutar funciones Java.Functions lets you customize the Java virtual machine (JVM) used to run your Java functions. Las siguientes opciones de JVM se usan de forma predeterminada:The following JVM options are used by default:

  • -XX:+TieredCompilation
  • -XX:TieredStopAtLevel=1
  • -noverify
  • -Djava.net.preferIPv4Stack=true
  • -jar

Puede proporcionar argumentos adicionales en una configuración de la aplicación denominada JAVA_OPTS.You can provide additional arguments in an app setting named JAVA_OPTS. Puede agregar la configuración de la aplicación a la aplicación de funciones implementada en Azure en Azure Portal o la CLI de Azure.You can add app settings to your function app deployed to Azure in the Azure portal or the Azure CLI.

Importante

En el plan de consumo, también debe agregar el valor WEBSITE_USE_PLACEHOLDER con un valor de 0 para que funcione la personalización.In the Consumption plan, you must also add the WEBSITE_USE_PLACEHOLDER setting with a value of 0 for the customization to work. Esta configuración aumenta los tiempos de arranque en frío de las funciones Java.This setting does increase the cold start times for Java functions.

Azure portalAzure portal

En Azure Portal, utilice la pestaña Configuración de la aplicación para agregar la configuración JAVA_OPTS.In the Azure portal, use the Application Settings tab to add the JAVA_OPTS setting.

Azure CLIAzure CLI

Puede usar el comando az functionapp config appsettings set para establecer JAVA_OPTS, como en el siguiente ejemplo:You can use the az functionapp config appsettings set command to set JAVA_OPTS, as in the following example:

az functionapp config appsettings set \
    --settings "JAVA_OPTS=-Djava.awt.headless=true" \
    "WEBSITE_USE_PLACEHOLDER=0" \
    --name <APP_NAME> --resource-group <RESOURCE_GROUP>

En este ejemplo se habilita el modo "desatendido".This example enables headless mode. Reemplace <APP_NAME> por el nombre de su aplicación de funciones y <RESOURCE_GROUP>, por el grupo de recursos.Replace <APP_NAME> with the name of your function app, and <RESOURCE_GROUP> with the resource group.

Bibliotecas de tercerosThird-party libraries

Azure Functions admite el uso de bibliotecas de terceros.Azure Functions supports the use of third-party libraries. De forma predeterminada, todas las dependencias especificadas en el archivo pom.xml del proyecto se incluyen automáticamente durante el objetivo de mvn package.By default, all dependencies specified in your project pom.xml file are automatically bundled during the mvn package goal. Para las bibliotecas no especificadas como dependencias en el archivo pom.xml, colóquelas en un directorio lib del directorio raíz de la función.For libraries not specified as dependencies in the pom.xml file, place them in a lib directory in the function's root directory. Las dependencias colocadas en el directorio lib se agregan al cargador de clases del sistema en tiempo de ejecución.Dependencies placed in the lib directory are added to the system class loader at runtime.

La dependencia com.microsoft.azure.functions:azure-functions-java-library se proporciona en la ruta de acceso de la clase de forma predeterminada y no debe incluirse en el directorio lib.The com.microsoft.azure.functions:azure-functions-java-library dependency is provided on the classpath by default, and doesn't need to be included in the lib directory. Asimismo, azure-functions-java-worker agrega a la ruta de clase las dependencias que figuran aquí.Also, azure-functions-java-worker adds dependencies listed here to the classpath.

Compatibilidad con tipos de datosData type support

Puede usar objetos de Java POJO (Plain Old Java Object), tipos definidos en azure-functions-java-library o tipos de datos primitivos como String e Integer para enlazar con enlaces de entrada o salida.You can use Plain old Java objects (POJOs), types defined in azure-functions-java-library, or primitive data types such as String and Integer to bind to input or output bindings.

POJOPOJOs

Para convertir los datos de entrada a POJO, azure-functions-java-worker usa la biblioteca gson.For converting input data to POJO, azure-functions-java-worker uses the gson library. Los tipos de POJO que se usan como entradas para las funciones deben ser public.POJO types used as inputs to functions should be public.

Datos binariosBinary data

Enlace entradas o salidas binarias a byte[]; para ello, establezca el campo dataType en function.json como binary:Bind binary inputs or outputs to byte[], by setting the dataType field in your function.json to binary:

   @FunctionName("BlobTrigger")
    @StorageAccount("AzureWebJobsStorage")
     public void blobTrigger(
        @BlobTrigger(name = "content", path = "myblob/{fileName}", dataType = "binary") byte[] content,
        @BindingName("fileName") String fileName,
        final ExecutionContext context
    ) {
        context.getLogger().info("Java Blob trigger function processed a blob.\n Name: " + fileName + "\n Size: " + content.length + " Bytes");
    }

Si espera valores null, use Optional<T>.If you expect null values, use Optional<T>.

EnlacesBindings

Los enlaces de entrada y de salida permiten conectarse de manera declarativa a los datos desde el código.Input and output bindings provide a declarative way to connect to data from within your code. Cada función puede tener varios enlaces de entrada y de salida.A function can have multiple input and output bindings.

Ejemplo de enlace de entradaInput binding example

package com.example;

import com.microsoft.azure.functions.annotation.*;

public class Function {
    @FunctionName("echo")
    public static String echo(
        @HttpTrigger(name = "req", methods = { HttpMethod.PUT }, authLevel = AuthorizationLevel.ANONYMOUS, route = "items/{id}") String inputReq,
        @TableInput(name = "item", tableName = "items", partitionKey = "Example", rowKey = "{id}", connection = "AzureWebJobsStorage") TestInputData inputData,
        @TableOutput(name = "myOutputTable", tableName = "Person", connection = "AzureWebJobsStorage") OutputBinding<Person> testOutputData
    ) {
        testOutputData.setValue(new Person(httpbody + "Partition", httpbody + "Row", httpbody + "Name"));
        return "Hello, " + inputReq + " and " + inputData.getKey() + ".";
    }

    public static class TestInputData {
        public String getKey() { return this.RowKey; }
        private String RowKey;
    }
    public static class Person {
        public String PartitionKey;
        public String RowKey;
        public String Name;

        public Person(String p, String r, String n) {
            this.PartitionKey = p;
            this.RowKey = r;
            this.Name = n;
        }
    }
}

Esta función se invoca con una solicitud HTTP.You invoke this function with an HTTP request.

  • La carga útil de la solicitud HTTP se pasa como String para el argumento inputReq.HTTP request payload is passed as a String for the argument inputReq.
  • Una entrada se recupera de Table Storage y se pasa como TestInputData al argumento inputData.One entry is retrieved from Table storage, and is passed as TestInputData to the argument inputData.

Para recibir un lote de entradas, puede enlazarse a String[], POJO[], List<String> o List<POJO>.To receive a batch of inputs, you can bind to String[], POJO[], List<String>, or List<POJO>.

@FunctionName("ProcessIotMessages")
    public void processIotMessages(
        @EventHubTrigger(name = "message", eventHubName = "%AzureWebJobsEventHubPath%", connection = "AzureWebJobsEventHubSender", cardinality = Cardinality.MANY) List<TestEventData> messages,
        final ExecutionContext context)
    {
        context.getLogger().info("Java Event Hub trigger received messages. Batch size: " + messages.size());
    }
    
    public class TestEventData {
    public String id;
}

Esta función se desencadena cuando hay nuevos datos en el centro de eventos configurado.This function gets triggered whenever there is new data in the configured event hub. Como cardinality se establece en MANY, la función recibe un lote de mensajes desde el centro de eventos.Because the cardinality is set to MANY, the function receives a batch of messages from the event hub. El elemento EventData del centro de eventos se convierte a TestEventData para la ejecución de la función.EventData from event hub gets converted to TestEventData for the function execution.

Ejemplo de enlace de salidaOutput binding example

Puede enlazar un enlace de salida al valor de retorno con $return.You can bind an output binding to the return value by using $return.

package com.example;

import com.microsoft.azure.functions.annotation.*;

public class Function {
    @FunctionName("copy")
    @StorageAccount("AzureWebJobsStorage")
    @BlobOutput(name = "$return", path = "samples-output-java/{name}")
    public static String copy(@BlobTrigger(name = "blob", path = "samples-input-java/{name}") String content) {
        return content;
    }
}

Si hay varios enlaces de salida, use el valor devuelto para solo uno de ellos.If there are multiple output bindings, use the return value for only one of them.

Para enviar varios valores de salida, use el tipo OutputBinding<T> que se define en el paquete azure-functions-java-library.To send multiple output values, use OutputBinding<T> defined in the azure-functions-java-library package.

@FunctionName("QueueOutputPOJOList")
    public HttpResponseMessage QueueOutputPOJOList(@HttpTrigger(name = "req", methods = { HttpMethod.GET,
            HttpMethod.POST }, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> request,
            @QueueOutput(name = "itemsOut", queueName = "test-output-java-pojo", connection = "AzureWebJobsStorage") OutputBinding<List<TestData>> itemsOut, 
            final ExecutionContext context) {
        context.getLogger().info("Java HTTP trigger processed a request.");
       
        String query = request.getQueryParameters().get("queueMessageId");
        String queueMessageId = request.getBody().orElse(query);
        itemsOut.setValue(new ArrayList<TestData>());
        if (queueMessageId != null) {
            TestData testData1 = new TestData();
            testData1.id = "msg1"+queueMessageId;
            TestData testData2 = new TestData();
            testData2.id = "msg2"+queueMessageId;

            itemsOut.getValue().add(testData1);
            itemsOut.getValue().add(testData2);

            return request.createResponseBuilder(HttpStatus.OK).body("Hello, " + queueMessageId).build();
        } else {
            return request.createResponseBuilder(HttpStatus.INTERNAL_SERVER_ERROR)
                    .body("Did not find expected items in CosmosDB input list").build();
        }
    }

     public static class TestData {
        public String id;
    }

Esta función se invoca en una solicitud HttpRequest.You invoke this function on an HttpRequest. Escribe varios valores en Queue Storage.It writes multiple values to Queue storage.

HttpRequestMessage y HttpResponseMessageHttpRequestMessage and HttpResponseMessage

Se definen en azure-functions-java-library.These are defined in azure-functions-java-library. Son tipos de aplicación auxiliar que funcionan con funciones HttpTrigger.They are helper types to work with HttpTrigger functions.

Tipo especializadoSpecialized type DestinoTarget Uso típicoTypical usage
HttpRequestMessage<T> Desencadenador HTTPHTTP Trigger Obtiene el método, encabezados o consultas.Gets method, headers, or queries
HttpResponseMessage Enlace de salida HTTPHTTP Output Binding Devuelve un estado distinto de 200.Returns status other than 200

MetadatosMetadata

Algunos desencadenadores envían metadatos de desencadenador junto con datos de entrada.Few triggers send trigger metadata along with input data. Puede usar la anotación @BindingName para enlazarla a metadatos de desencadenador.You can use annotation @BindingName to bind to trigger metadata.

package com.example;

import java.util.Optional;
import com.microsoft.azure.functions.annotation.*;


public class Function {
    @FunctionName("metadata")
    public static String metadata(
        @HttpTrigger(name = "req", methods = { HttpMethod.GET, HttpMethod.POST }, authLevel = AuthorizationLevel.ANONYMOUS) Optional<String> body,
        @BindingName("name") String queryValue
    ) {
        return body.orElse(queryValue);
    }
}

En el ejemplo anterior, el elemento queryValue está enlazado al parámetro de cadena de consulta name de la dirección URL de solicitud HTTP http://{example.host}/api/metadata?name=test.In the preceding example, the queryValue is bound to the query string parameter name in the HTTP request URL, http://{example.host}/api/metadata?name=test. Este es otro ejemplo que muestra cómo enlazar a Id desde los metadatos de desencadenador de la cola.Here's another example, showing how to bind to Id from queue trigger metadata.

 @FunctionName("QueueTriggerMetadata")
    public void QueueTriggerMetadata(
        @QueueTrigger(name = "message", queueName = "test-input-java-metadata", connection = "AzureWebJobsStorage") String message,@BindingName("Id") String metadataId,
        @QueueOutput(name = "output", queueName = "test-output-java-metadata", connection = "AzureWebJobsStorage") OutputBinding<TestData> output,
        final ExecutionContext context
    ) {
        context.getLogger().info("Java Queue trigger function processed a message: " + message + " with metadaId:" + metadataId );
        TestData testData = new TestData();
        testData.id = metadataId;
        output.setValue(testData);
    }

Nota

El nombre que se proporciona en la anotación debe coincidir con la propiedad de metadatos.The name provided in the annotation needs to match the metadata property.

Contexto de ejecuciónExecution context

El elemento ExecutionContext definido en azure-functions-java-library contiene métodos de ayuda que le permitirán comunicarse con las funciones en tiempo de ejecución.ExecutionContext, defined in the azure-functions-java-library, contains helper methods to communicate with the functions runtime. Para obtener más información, consulte el artículo de referencia sobre ExecutionContext.For more information, see the ExecutionContext reference article.

RegistradorLogger

Use el elemento getLogger definido en ExecutionContext para escribir registros desde el código de función.Use getLogger, defined in ExecutionContext, to write logs from function code.

Ejemplo:Example:


import com.microsoft.azure.functions.*;
import com.microsoft.azure.functions.annotation.*;

public class Function {
    public String echo(@HttpTrigger(name = "req", methods = {HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) String req, ExecutionContext context) {
        if (req.isEmpty()) {
            context.getLogger().warning("Empty request body received by function " + context.getFunctionName() + " with invocation " + context.getInvocationId());
        }
        return String.format(req);
    }
}

Ver registros y seguimientoView logs and trace

Puede usar la CLI de Azure para hacer streaming del registro stdout y stderr de Java, así como de otros registros de la aplicación.You can use the Azure CLI to stream Java stdout and stderr logging, as well as other application logging.

Aquí se explica cómo configurar la aplicación de funciones para escribir el registro de aplicación con la CLI de Azure:Here's how to configure your function app to write application logging by using the Azure CLI:

az webapp log config --name functionname --resource-group myResourceGroup --application-logging true

Para transmitir en secuencias la salida para la aplicación de funciones con la CLI de Azure, abra una nueva sesión del símbolo del sistema, Bash o Terminal y escriba el siguiente comando:To stream logging output for your function app by using the Azure CLI, open a new command prompt, Bash, or Terminal session, and enter the following command:

az webapp log tail --name webappname --resource-group myResourceGroup

El comando az webapp log tail tiene opciones para filtrar la salida usando la opción --provider.The az webapp log tail command has options to filter output by using the --provider option.

Para descargar los archivos de registro como un solo archivo ZIP mediante la CLI de Azure, abra una sesión nueva del símbolo del sistema, Bash o Terminal y escriba el siguiente comando:To download the log files as a single ZIP file by using the Azure CLI, open a new command prompt, Bash, or Terminal session, and enter the following command:

az webapp log download --resource-group resourcegroupname --name functionappname

Debe haber habilitado el registro del sistema de archivos en Azure Portal o la CLI de Azure antes de ejecutar este comando.You must have enabled file system logging in the Azure portal or the Azure CLI before running this command.

Variables de entornoEnvironment variables

En Functions, la configuración de la aplicación, como las cadenas de conexión del servicio, se exponen como variables de entorno durante la ejecución.In Functions, app settings, such as service connection strings, are exposed as environment variables during execution. Puede obtener acceso a estas opciones mediante System.getenv("AzureWebJobsStorage").You can access these settings by using, System.getenv("AzureWebJobsStorage").

En el siguiente ejemplo se obtiene la configuración de la aplicación, con la clave denominada myAppSetting:The following example gets the application setting, with the key named myAppSetting:


public class Function {
    public String echo(@HttpTrigger(name = "req", methods = {HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) String req, ExecutionContext context) {
        context.getLogger().info("My app setting value: "+ System.getenv("myAppSetting"));
        return String.format(req);
    }
}

Nota

El valor de AppSetting FUNCTIONS_EXTENSION_VERSION debería ser ~2 o ~3 para una experiencia de arranque en frío optimizada.The value of AppSetting FUNCTIONS_EXTENSION_VERSION should be ~2 or ~3 for an optimized cold start experience.

Pasos siguientesNext steps

Para más información sobre el desarrollo de Java de Azure Functions, vea los siguientes recursos:For more information about Azure Functions Java development, see the following resources: