Руководство разработчика Java по Функциям AzureAzure Functions Java developer guide

Это краткое описание содержит подробные сведения, помогающие в разработке функций Azure с помощью Java.This guide contains detailed information to help you succeed developing Azure Functions using Java.

Если вы не знакомы с функциями Azure в качестве разработчика Java, сначала ознакомьтесь с одной из следующих статей:As a Java developer, if you're new to Azure Functions, please consider first reading one of the following articles:

Начало работыGetting started Основные понятияConcepts

Основы функций JavaJava function basics

Функцией в Java называется метод public, дополненный аннотацией @FunctionName.A Java function is a public method, decorated with the annotation @FunctionName. Такой метод определяет запись для функции Java и должен быть уникальным в пределах пакета.This method defines the entry for a Java function, and must be unique in a particular package. Пакет может иметь несколько классов с несколькими открытыми методами, заметками в @FunctionName .The package can have multiple classes with multiple public methods annotated with @FunctionName. Один пакет развертывается в приложении-функции в Azure.A single package is deployed to a function app in Azure. При работе в Azure приложение функции предоставляет контекст развертывания, выполнения и управления для отдельных функций Java.When running in Azure, the function app provides the deployment, execution, and management context for your individual Java functions.

Модель программированияProgramming model

Понятия триггеров и привязок играют решающую роль в Функциях Azure.The concepts of triggers and bindings are fundamental to Azure Functions. Триггеры запускают выполнение вашего кода.Triggers start the execution of your code. Привязки предоставляют возможность передавать данные, а также возвращать их из функции без необходимости написания кода доступа к ним.Bindings give you a way to pass data to and return data from a function, without having to write custom data access code.

Создание функций на JavaCreate Java functions

Чтобы упростить создание функций на Java, созданы специальные средства и архетипы на основе Maven, которые предоставляют готовые шаблоны Java для создания проектов с определенным триггером функции.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.

Инструментарий на основе MavenMaven-based tooling

В следующих средах разработки есть инструментарий Функций Azure, который позволяет создавать проекты для функций Java:The following developer environments have Azure Functions tooling that lets you create Java function projects:

В статьях, доступных по предложенным выше ссылкам, демонстрируется создание простых функций в удобной для вас интегрированной среде разработки.The article links above show you how to create your first functions using your IDE of choice.

Формирование шаблонов для проектаProject Scaffolding

Если вы предпочитаете выполнять разработку из командной строки терминала, сформировать шаблоны для проектов функций на основе Java вам проще всего будет с использованием архетипов 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. Архетип Maven для Функций Azure на Java опубликован со следующими идентификаторами 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.

Следующая команда создает новый проект функции Java на основе этого архетипа:The following command generates a new Java function project using this archetype:

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

Чтобы приступить к использованию архетипа, воспользуйтесь кратким руководством по Java.To get started using this archetype, see the Java quickstart.

Структура папокFolder structure

Ниже приведена структура папок в проекте Функций Azure на Java: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

Вы можете использовать общий файл host.json для настройки приложения-функции.You can use a shared host.json file to configure the function app. У каждой функции есть собственный файл кода (.java) и файл конфигурации привязки (function.json).Each function has its own code file (.java) and binding configuration file (function.json).

Вы можете добавить несколько функций в проект.You can put more than one function in a project. Не добавляйте функции в отдельные JAR-файлы.Avoid putting your functions into separate jars. Именно FunctionApp из целевого каталога будет развернут в виде приложения-функции в Azure.The FunctionApp in the target directory is what gets deployed to your function app in Azure.

Триггеры и заметкиTriggers and annotations

Функции вызываются триггером, таким как HTTP-запрос, таймер или обновление данных.Functions are invoked by a trigger, such as an HTTP request, a timer, or an update to data. Функция должна обработать такой триггер и связанные с ним входные данные, а также создать на их основе одно или несколько выходных значений.Your function needs to process that trigger, and any other inputs, to produce one or more outputs.

Используйте заметки Java, включенные в пакет com.microsoft.azure.functions.annotation.*, чтобы привязать входные и выходные данные к своим методам.Use the Java annotations included in the com.microsoft.azure.functions.annotation.* package to bind input and outputs to your methods. Дополнительные сведения см. в справочной документации по Java.For more information, see the Java reference docs.

Важно!

Чтобы локально обрабатывать триггеры хранилища BLOB-объектов, очередей или таблиц Azure, необходимо указать учетную запись хранения Azure в файле local.settings.json.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.

ПримерExample:

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

Ниже приведен соответствующий файл function.json, созданный с помощью 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"
    }
  ]
}

Версии JavaJava versions

Поддержка Java 11 сейчас доступна в предварительной версииSupport for Java 11 is currently in preview

Версия Java, используемая при создании приложения-функции, в которой выполняются функции в Azure, указывается в файле 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. Maven архетипа в настоящее время создает pom.xml для Java 8, который можно изменить перед публикацией.The Maven archetype currently generates a pom.xml for Java 8, which you can change before publishing. Версия Java в pom.xml должна соответствовать версии, на которой локально разрабатывается и протестировано приложение.The Java version in pom.xml should match the version on which you have locally developed and tested your app.

Поддерживаемые версииSupported versions

В следующей таблице показаны текущие поддерживаемые версии Java для каждой основной версии среды выполнения функций по операционной системе:The following table shows current supported Java versions for each major version of the Functions runtime, by operating system:

Версия службы "Функции"Functions version Версии Java (Windows)Java versions (Windows) Версии Java (Linux)Java versions (Linux)
3.x3.x 11 (Предварительная версия)11 (preview)
88
11 (Предварительная версия)11 (preview)
88
2.x2.x 88 н/дn/a

Если для развертывания не указана версия Java, Maven архетипа по умолчанию имеет значение Java 8 во время развертывания в Azure.Unless you specify a Java version for your deployment, the Maven archetype defaults to Java 8 during deployment to Azure.

Укажите версию развертыванияSpecify the deployment version

Вы можете управлять версией Java, целевой для Maven архетипа, с помощью -DjavaVersion параметра.You can control the version of Java targeted by the Maven archetype by using the -DjavaVersion parameter. Значение этого параметра может быть Ether 8 или 11 .The value of this parameter can be ether 8 or 11. Поддержка Java 11 сейчас доступна в предварительной версии.Java 11 support is currently in preview.

Maven архетипа создает pom.xml, предназначенную для указанной версии Java.The Maven archetype generates a pom.xml that targets the specified Java version. Следующие элементы в pom.xml указывают используемую версию Java:The following elements in pom.xml indicate the Java version to use:

ЭлементElement Значение Java 8Java 8 value Значение Java 11Java 11 value ОписаниеDescription
Java.version 1.81.8 1111 Версия Java, используемая подключаемым модулем Maven-компилятора.Version of Java used by the maven-compiler-plugin.
JavaVersion 88 1111 Версия Java, размещенная в приложении функции в Azure.Java version hosted by the function app in Azure.

В следующих примерах показаны параметры для Java 8 в соответствующих разделах файла 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>

Важно!

Необходимо правильно установить JAVA_HOME переменную среды в каталог JDK, используемый во время компиляции кода с помощью Maven.You must have the JAVA_HOME environment variable set correctly to the JDK directory that is used during code compiling using Maven. Убедитесь, что версия JDK не меньше максимальной, чем значение Java.version параметра.Make sure that the version of the JDK is at least as high as the Java.version setting.

Укажите ОС развертыванияSpecify the deployment OS

Maven также позволяет указать операционную систему, в которой выполняется приложение функции в Azure.Maven also lets you specify the operating system on which your function app runs in Azure. Используйте os элемент, чтобы выбрать операционную систему.Use the os element to choose the operating system.

ЭлементElement WindowsWindows LinuxLinux DockerDocker
os Windowswindows Linuxlinux dockerdocker

В следующем примере показан параметр операционной системы в runtime разделе файла 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>

Обеспечения доступности и предоставления поддержки времени выполнения пакета JDKJDK runtime availability and support

Для локальной разработки приложений функций Java Скачайте и используйте соответствующее Azul Zulu Enterprise для Azure Java JDK от 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 используется Azul Java JDK Runtime при развертывании приложения функции в облаке.Azure Functions uses an Azul Java JDK runtime when you deploy your function app to the cloud.

Поддержка Azure для устранения проблем с пакетами JDK и приложениями-функциями предоставляется, если у вас есть соответствующий план поддержки.Azure support for issues with the JDKs and function apps is available with a qualified support plan.

Настройка виртуальной машины JavaCustomize JVM

Функции Azure позволяют настраивать виртуальную машину Java, которая используется для выполнения функций Java.Functions lets you customize the Java virtual machine (JVM) used to run your Java functions. По умолчанию применяются следующие параметры виртуальной машины Java.The following JVM options are used by default:

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

Дополнительные аргументы можно указать в параметре приложения JAVA_OPTS.You can provide additional arguments in an app setting named JAVA_OPTS. Параметры приложения можно добавить в приложение-функцию, развернутое в Azure, с помощью портала Azure или Azure CLI.You can add app settings to your function app deployed to Azure in the Azure portal or the Azure CLI.

Важно!

В план потребления необходимо также добавить параметр WEBSITE_USE_PLACEHOLDER со значением 0, чтобы работала эта настройка.In the Consumption plan, you must also add the WEBSITE_USE_PLACEHOLDER setting with a value of 0 for the customization to work. Но этот параметр увеличивает время холодного запуска для функций Java.This setting does increase the cold start times for Java functions.

Портал AzureAzure portal

На портале Azure перейдите на вкладку Параметры приложения чтобы добавить параметр JAVA_OPTS.In the Azure portal, use the Application Settings tab to add the JAVA_OPTS setting.

Azure CLIAzure CLI

Используйте команду az functionapp config appsettings set, чтобы задать значение JAVA_OPTS, как показано далее.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>

В этом примере показано, как включить режим без монитора.This example enables headless mode. Замените в нем заполнитель <APP_NAME> именем приложения-функции, а <RESOURCE_GROUP> — именем группы ресурсов.Replace <APP_NAME> with the name of your function app, and <RESOURCE_GROUP> with the resource group.

Сторонние библиотекиThird-party libraries

Служба "Функции Azure" поддерживает использование сторонних библиотек.Azure Functions supports the use of third-party libraries. По умолчанию все зависимости, указанные в файле pom.xml для проекта, автоматически связываются при сборке с целью mvn package.By default, all dependencies specified in your project pom.xml file are automatically bundled during the mvn package goal. Зависимости библиотек, не указанных как зависимости в файле pom.xml, поместите в каталог lib в корневой папке функции.For libraries not specified as dependencies in the pom.xml file, place them in a lib directory in the function's root directory. Зависимости, размещенные в каталоге lib, добавляются в загрузчик системного класса во время выполнения.Dependencies placed in the lib directory are added to the system class loader at runtime.

Зависимость com.microsoft.azure.functions:azure-functions-java-library по умолчанию предоставляется в пути классов, и ее не нужно добавлять в каталог 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. Кроме того, azure-functions-java-worker добавляет в путь классов все перечисленные здесь зависимости.Also, azure-functions-java-worker adds dependencies listed here to the classpath.

Поддержка типов данныхData type support

Для входных и выходных привязок можно использовать объекты POJO, определенные в azure-functions-java-library типы, или примитивные типы данных, как например String или Integer.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

Для преобразования входных данных в формат POJO azure-functions-java-worker использует библиотеку gson.For converting input data to POJO, azure-functions-java-worker uses the gson library. Типам POJO, используемые как входные данные для функций, необходим такой же модификатор доступа public.POJO types used as inputs to functions should be public.

Двоичные данныеBinary data

Чтобы создать привязку для ввода и вывода к byte[], в файле function.json задайте для поля dataType значение 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");
    }

Если допускаются значения NULL, добавьте Optional<T>.If you expect null values, use Optional<T>.

ПривязкиBindings

Входные и выходные привязки реализуют декларативный способ подключения к данным из кода.Input and output bindings provide a declarative way to connect to data from within your code. У функции может быть несколько входных и выходных привязок.A function can have multiple input and output bindings.

Пример привязки входаInput 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;
        }
    }
}

Эта функция вызывается с помощью HTTP-запроса.You invoke this function with an HTTP request.

  • Полезные данные HTTP-запроса передаются в формате String через аргумент inputReq.HTTP request payload is passed as a String for the argument inputReq.
  • Из Хранилища таблиц извлекается одна запись, которая передается в формате TestInputData через аргумент inputData.One entry is retrieved from Table storage, and is passed as TestInputData to the argument inputData.

Чтобы получить пакет входных данных, выполните привязку к String[], POJO[], List<String> или 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;
}

Эта функция запускается всякий раз, когда в настроенном концентраторе событий появляются новые данные.This function gets triggered whenever there is new data in the configured event hub. Так как для cardinality установлено значение MANY, функция получает пакет сообщений от концентратора событий.Because the cardinality is set to MANY, the function receives a batch of messages from the event hub. Полученный от концентратора событий EventData преобразуется в TestEventData для выполнения функции.EventData from event hub gets converted to TestEventData for the function execution.

Пример выходной привязкиOutput binding example

Вы можете создать привязку для вывода к возвращаемому значению с помощью $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;
    }
}

При наличии нескольких выходных привязок используйте возвращаемое значение только для одной из них.If there are multiple output bindings, use the return value for only one of them.

Чтобы отправить несколько выходных значений, используйте тип OutputBinding<T>, который определен в пакете 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;
    }

Эта функция вызывается через HttpRequest.You invoke this function on an HttpRequest. Она записывает несколько значений в Хранилище очередей.It writes multiple values to Queue storage.

HttpRequestMessage и HttpResponseMessageHttpRequestMessage and HttpResponseMessage

Они определяются в azure-functions-java-library.These are defined in azure-functions-java-library. Это вспомогательные типы для работы с функциями типа HttpTrigger.They are helper types to work with HttpTrigger functions.

Специализированные типыSpecialized type НазначениеTarget Типичное применениеTypical usage
HttpRequestMessage<T> Триггер HTTPHTTP Trigger Получение метода, заголовков или запросовGets method, headers, or queries
HttpResponseMessage Привязка к выходным данным HTTPHTTP Output Binding Возврат кодов состояния, отличных от 200Returns status other than 200

МетаданныеMetadata

Несколько триггеров отправляют метаданные триггеров вместе с входными данными.Few triggers send trigger metadata along with input data. Вы можете использовать аннотацию @BindingName для привязки к метаданным триггера.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);
    }
}

В приведенном выше примере значение queryValue привязано к параметру строки запроса name в URL-адресе 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. Вот еще один пример привязки к Id из метаданных триггера очереди.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);
    }

Примечание

Предоставленное в заметке имя должно соответствовать свойству метаданных.The name provided in the annotation needs to match the metadata property.

Контекст выполненияExecution context

Контекст ExecutionContext, определенный в azure-functions-java-library, содержит вспомогательные методы для взаимодействия со средой выполнения функций.ExecutionContext, defined in the azure-functions-java-library, contains helper methods to communicate with the functions runtime. Дополнительные сведения см. в справочной статьепо параметру контексте.For more information, see the ExecutionContext reference article.

Средство ведения журналаLogger

Используйте средство getLogger, определенное в ExecutionContext, для записи журналов из кода функции.Use getLogger, defined in ExecutionContext, to write logs from function code.

Пример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);
    }
}

Просмотр журналов и трассировкиView logs and trace

Вы можете использовать интерфейс Azure CLI для потоковой передачи журналов со стандартными данными и журналов ошибок в формате Java, а также ведения других журналов приложений.You can use the Azure CLI to stream Java stdout and stderr logging, as well as other application logging.

Ниже показано, как настроить для приложения-функции запись журнала приложения с использованием Azure CLI.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

Чтобы выполнять потоковую передачу выходных данных журналов для приложения-функции через Azure CLI, откройте новое окно командной строки, сеанс Bash или терминала и введите следующую команду: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

Команда az webapp log tail позволяет фильтровать выходные данные с помощью параметра --provider.The az webapp log tail command has options to filter output by using the --provider option.

Чтобы скачать файлы журналов как единый ZIP-файл с помощью Azure CLI, откройте командную строку, Bash или сеанс терминала и введите следующую команду: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

Перед выполнением этой команды необходимо включить ведение журнала файловой системы с помощью портала Azure или Azure CLI.You must have enabled file system logging in the Azure portal or the Azure CLI before running this command.

Переменные средыEnvironment variables

В Функциях параметры приложения, такие как строки подключения службы, доступны в виде переменных среды во время выполнения.In Functions, app settings, such as service connection strings, are exposed as environment variables during execution. Доступ к этим параметрам можно получить с помощью System.getenv("AzureWebJobsStorage").You can access these settings by using, System.getenv("AzureWebJobsStorage").

В следующем примере, показано как получить параметр приложения по ключу с именем 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);
    }
}

Примечание

Значение параметра приложения FUNCTIONS_EXTENSION_VERSION должно быть ~2 или ~3, чтобы оптимизировать процесс холодного запуска.The value of AppSetting FUNCTIONS_EXTENSION_VERSION should be ~2 or ~3 for an optimized cold start experience.

Дальнейшие действияNext steps

Дополнительные сведения о разработке в службе "Функции Azure" на Java см. в следующих статьях.For more information about Azure Functions Java development, see the following resources: