Udostępnij przez


Przewodnik dla deweloperów języka Java usługi Azure Functions

Ten przewodnik zawiera szczegółowe informacje ułatwiające pomyślne opracowywanie usługi Azure Functions przy użyciu języka Java.

Jako deweloper języka Java, jeśli dopiero zaczynasz korzystać z usługi Azure Functions, rozważ najpierw przeczytanie jednego z następujących artykułów:

Wprowadzenie Pojęcia Scenariusze/przykłady

Podstawy funkcji Języka Java

Funkcja Języka Java jest public metodą ozdobioną adnotacją @FunctionName. Ta metoda definiuje wpis dla funkcji Języka Java i musi być unikatowy w określonym pakiecie. Pakiet może mieć wiele klas z wieloma metodami publicznymi oznaczonymi za pomocą @FunctionName. Pojedynczy pakiet jest wdrażany w aplikacji funkcji na platformie Azure. Na platformie Azure aplikacja funkcji udostępnia kontekst wdrażania, wykonywania i zarządzania dla poszczególnych funkcji Java.

Model programowania

Pojęcia wyzwalaczy i powiązań są podstawowe dla usługi Azure Functions. Wyzwalacze rozpoczynają wykonywanie kodu. Powiązania umożliwiają przekazywanie danych do funkcji i ich zwracanie, bez konieczności pisania niestandardowego kodu dostępu do danych.

Tworzenie funkcji Języka Java

Aby ułatwić tworzenie funkcji Języka Java, istnieją narzędzia oparte na narzędziu Maven i archetypy, które używają wstępnie zdefiniowanych szablonów języka Java, aby ułatwić tworzenie projektów za pomocą określonego wyzwalacza funkcji.

Narzędzia oparte na narzędziu maven

Następujące środowiska deweloperskie zawierają narzędzia usługi Azure Functions, które umożliwiają tworzenie projektów funkcji Języka Java:

W tych artykułach pokazano, jak utworzyć swoje pierwsze funkcje przy użyciu wybranego środowiska IDE.

Tworzenie szkieletu projektu

Jeśli wolisz tworzenie wierszy polecenia z poziomu terminalu, najprostszym sposobem tworzenia szkieletu projektów funkcji opartych na języku Java jest użycie Apache Maven archetypów. Archetyp narzędzia Java Maven dla usługi Azure Functions jest publikowany pod następującym groupId:artifactId: com.microsoft.azure:azure-functions-archetype.

Następujące polecenie generuje nowy projekt funkcji Java przy użyciu tego archetypu:

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

Aby rozpocząć korzystanie z tego archetypu , zobacz przewodnik Szybki start dla języka Java.

Struktura folderów

Oto struktura folderów projektu Java usługi Azure Functions:

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

Aby skonfigurować aplikację funkcji, możesz użyć udostępnionego pliku host.json . Każda funkcja ma własny plik kodu (.java) i plik konfiguracji powiązania (function.json).

W projekcie może znajdować się więcej niż jedna funkcja. Nie umieszczaj jednak funkcji w oddzielnych plikach jar. Używanie wielu plików JAR w jednej aplikacji funkcji nie jest obsługiwane. Element FunctionApp w katalogu docelowym jest wdrażany w aplikacji funkcji na platformie Azure.

Wyzwalacze i adnotacje

Funkcje są wywoływane przez wyzwalacz, taki jak żądanie HTTP, czasomierz lub aktualizacja danych. Funkcja musi przetworzyć ten wyzwalacz i inne dane wejściowe, aby wygenerować co najmniej jedno wyjście.

Użyj adnotacji Języka Java zawartych w pakiecie com.microsoft.azure.functions.annotation.* w celu powiązania danych wejściowych i wyjściowych z metodami. Aby uzyskać więcej informacji, zobacz dokumentację referencyjną języka Java.

Ważne

Musisz skonfigurować konto usługi Azure Storage w local.settings.json , aby uruchamiać wyzwalacze usługi Azure Blob Storage, Azure Queue Storage lub Azure Table Storage lokalnie.

Przykład:

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

Oto wygenerowany odpowiednik function.json przez wtyczkę azure-functions-maven-plugin:

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

Wersje języka Java

Wersja języka Java, w której aplikacja działa na platformie Azure, jest określona w pliku pom.xml. Archetyp narzędzia Maven generuje obecnie pom.xml dla języka Java 8, który można zmienić przed opublikowaniem. Wersja języka Java w pom.xml powinna być zgodna z wersją języka Java, na której tworzysz i testujesz aplikację lokalnie.

Obsługiwane wersje

W poniższej tabeli przedstawiono bieżące obsługiwane wersje języka Java dla każdej wersji głównej środowiska uruchomieniowego usługi Functions według systemu operacyjnego:

Wersja usługi Functions Wersje języka Java (Windows) Wersje języka Java (Linux)
4.x 21
17
11
8
21
17
11
8
3.x 11
8
11
8
2.x 8 nie dotyczy

Jeśli nie określisz wersji języka Java dla danego wdrożenia, archetyp Maven domyślnie używa Java 8 podczas wdrażania na platformie Azure.

Określanie wersji wdrożenia

Możesz kontrolować wersję języka Java przeznaczoną dla archetypu narzędzia Maven przy użyciu parametru -DjavaVersion . Ten parametr musi być zgodny z obsługiwanymi wersjami języka Java.

Archetyp narzędzia Maven generuje pom.xml, który jest przeznaczony dla określonej wersji języka Java. Następujące elementy w pom.xml wskazują wersję języka Java do użycia:

Składnik Wartość języka Java 8 Wartość języka Java 11 Wartość języka Java 17 Wartość języka Java 21 opis
Java.version 1.8 11 17 dwadzieścia jeden Wersja języka Java używana przez wtyczkę maven-compiler-plugin.
JavaVersion 8 11 17 dwadzieścia jeden Wersja języka Java hostowana przez aplikację funkcji na platformie Azure.

W poniższych przykładach przedstawiono ustawienia języka Java 8 w odpowiednich sekcjach pliku pom.xml:

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>

Ważne

Zmienna środowiskowa JAVA_HOME musi być poprawnie ustawiona na katalog JDK używany podczas kompilowania kodu przy użyciu narzędzia Maven. Upewnij się, że wersja zestawu JDK jest co najmniej tak wysoka, jak ustawienie Java.version .

Określanie systemu operacyjnego wdrożenia

Narzędzie Maven umożliwia również określenie systemu operacyjnego, na którym działa aplikacja funkcji na platformie Azure. Użyj elementu os, aby wybrać system operacyjny.

Składnik Windows Linux Docker
os windows linux docker

Poniższy przykład przedstawia ustawienie systemu operacyjnego w runtime sekcji pliku pom.xml:

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

Dostępność i obsługa środowiska uruchomieniowego zestawu JDK

Wersje zestawu OpenJDK firmy Microsoft i adoptium są udostępniane i obsługiwane w usługach Functions dla języka Java 8 (Adoptium), Java 11, 17 i 21 (MSFT). Te pliki binarne są udostępniane jako bezpłatna, wieloplatformowa, gotowa do produkcji dystrybucja zestawu OpenJDK dla platformy Azure. Zawierają one wszystkie składniki do kompilowania i uruchamiania aplikacji Java SE.

W przypadku lokalnego rozwoju lub testowania możesz bezpłatnie pobrać kompilację Microsoft OpenJDK lub binaria Adoptium Temurin. Wsparcie techniczne platformy Azure w przypadku problemów z zestawami JDK i aplikacjami funkcji jest dostępne w ramach kwalifikowanego planu pomocy technicznej.

Jeśli chcesz nadal używać plików binarnych Zulu dla Azure w swojej aplikacji funkcji, skonfiguruj aplikację odpowiednio. Możesz nadal używać plików binarnych Azul dla swojej witryny. Jednak wszelkie poprawki lub ulepszenia zabezpieczeń są dostępne tylko w nowych wersjach zestawu OpenJDK. W związku z tym należy ostatecznie usunąć tę konfigurację, aby aplikacje korzystały z najnowszej dostępnej wersji języka Java.

Dostosowywanie maszyny wirtualnej JVM

Usługa Functions umożliwia dostosowanie maszyny wirtualnej Java (JVM) używanej do uruchamiania funkcji Języka Java. Domyślnie są używane następujące opcje JVM:

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

Inne argumenty dla maszyny JVM można podać przy użyciu jednego z następujących ustawień aplikacji, w zależności od typu planu:

Typ planu Nazwa ustawienia Komentarz
Plan zużycia languageWorkers__java__arguments To ustawienie zwiększa czasy zimnego startu funkcji języka Java działających w planie konsumpcyjnym.
Plan Premium
Dedykowany plan
JAVA_OPTS

W poniższych sekcjach pokazano, jak dodać te ustawienia. Aby dowiedzieć się więcej na temat pracy z ustawieniami aplikacji, zobacz sekcję Praca z ustawieniami aplikacji.

Azure Portal

W portalu Azure użyj karty Ustawienia aplikacji, aby dodać ustawienie languageWorkers__java__arguments lub JAVA_OPTS.

Azure CLI

Możesz użyć polecenia az functionapp config appsettings set, aby dodać te ustawienia, co pokazano na poniższym przykładzie dla opcji -Djava.awt.headless=true.

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

W tym przykładzie włączono tryb bezgłowy. Zamień <APP_NAME> na nazwę swojej aplikacji funkcji, a <RESOURCE_GROUP> na grupę zasobów.

Biblioteki innych firm

Usługa Azure Functions obsługuje korzystanie z bibliotek innych firm. Domyślnie wszystkie zależności określone w pliku projektu pom.xml są automatycznie grupowane w trakcie wykonywania celu mvn package. W przypadku bibliotek, które nie są określone jako zależności w pom.xml pliku, umieść je w lib katalogu głównym funkcji. Zależności umieszczone w katalogu lib są dodawane do systemowego ładownika klas w czasie wykonywania.

Zależność com.microsoft.azure.functions:azure-functions-java-library jest domyślnie udostępniana na ścieżce klasy i nie musi być uwzględniona w lib katalogu. Ponadto usługa azure-functions-java-worker dodaje zależności wymienione tutaj do ścieżki klasy.

Obsługa typów danych

Można użyć zwykłych obiektów Java (POJO), typów zdefiniowanych w azure-functions-java-library, lub typów pierwotnych, takich jak String i Integer, aby powiązać je z wiązaniami wejściowymi lub wyjściowymi.

Uwaga

Obsługa powiązania z typami zestawu SDK jest obecnie dostępna w wersji zapoznawczej i ograniczona do zestawu AZURE Blob Storage SDK. Aby uzyskać więcej informacji, zobacz Typy zestawów SDK w artykule dokumentacji języka Java.

Obiekty POJO

W przypadku konwertowania danych wejściowych na POJO, usługa azure-functions-java-worker używa biblioteki gson. Typy POJO używane jako dane wejściowe do funkcji powinny mieć wartość public.

Dane binarne

Powiąż binarne dane wejściowe lub wyjściowe z byte[], ustawiając pole dataType w function.json na wartość 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");
    }

Jeśli oczekujesz wartości null, użyj polecenia Optional<T>.

Typy zestawów SDK (wersja zapoznawcza)

Obecnie można używać tych typów zestawu SDK usługi Blob Storage w powiązaniach: BlobClient i BlobContainerClient.

Po włączeniu obsługi typów Azure SDK, funkcje mogą używać typów klienta Azure SDK do uzyskiwania dostępu do obiektów blob jako strumieni bezpośrednio z magazynu, co zapewnia następujące korzyści w porównaniu z obiektami POJO lub typami binarnymi:

  • Mniejsze opóźnienia
  • Wymagania dotyczące mniejszej ilości pamięci
  • Usuwa limity rozmiaru oparte na żądaniach (używa wartości domyślnych usługi)
  • Zapewnia dostęp do pełnego zakresu funkcji SDK: metadanych, list ACL, blokad prawnych i innych danych specyficznych dla SDK.

Wymagania

  • Ustaw ustawienie aplikacji na JAVA_ENABLE_SDK_TYPES, aby włączyć typy SDK true.
  • azure-functions-maven-plugin (lub wtyczka narzędzia Gradle) 1.38.0 lub nowsza wersja.

Przykłady

Wyzwalacz obiektu blob, który używa BlobClient do dostępu do jego właściwości.

@FunctionName("processBlob")
public void run(
        @BlobTrigger(
                name = "content",
                path = "images/{name}",
                connection = "AzureWebJobsStorage") BlobClient blob,
        @BindingName("name") String file,
        ExecutionContext ctx)
{
    ctx.getLogger().info("Size = " + blob.getProperties().getBlobSize());
}

Wyzwalacz obiektów blob, który wykorzystuje BlobContainerClient do uzyskiwania dostępu do informacji o obiektach blob w kontenerze.

@FunctionName("containerOps")
public void run(
        @BlobTrigger(
                name = "content",
                path = "images/{name}",
                connection = "AzureWebJobsStorage") BlobContainerClient container,
        ExecutionContext ctx)
{
    container.listBlobs()
            .forEach(b -> ctx.getLogger().info(b.getName()));
}

Powiązanie wejściowe blob, które używa BlobClient, aby uzyskać informacje o blobie, który wyzwolił wykonanie.

@FunctionName("checkAgainstInputBlob")
public void run(
        @BlobInput(
                name = "inputBlob",
                path = "inputContainer/input.txt") BlobClient inputBlob,
        @BlobTrigger(
                name = "content",
                path = "images/{name}",
                connection = "AzureWebJobsStorage",
                dataType = "string") String triggerBlob,
        ExecutionContext ctx)
{
    ctx.getLogger().info("Size = " + inputBlob.getProperties().getBlobSize());
}

Rozważania

  • Ustawienie dataType na @BlobTrigger jest ignorowane podczas wiązania z typem SDK.
  • Obecnie w danej definicji funkcji można używać tylko jednego typu zestawu SDK. Jeśli funkcja ma zarówno wyzwalacz obiektu blob lub powiązanie wejściowe, jak i powiązanie wyjściowe obiektu blob, jedno powiązanie może używać typu zestawu SDK (takiego jak BlobClient), a pozostałe muszą używać typu natywnego lub POJO.
  • Możesz używać tożsamości zarządzanych z typami zestawu SDK.

Rozwiązywanie problemów

Są to potencjalne błędy, które mogą wystąpić podczas korzystania z typów zestawu SDK:

Wyjątek Znaczenie
SdkAnalysisException Wtyczka kompilacji nie może utworzyć metadanych. Może to być spowodowane zduplikowanymi typami zestawu SDK w jednej definicji funkcji, nieobsługiwanym typem parametru lub inną błędną konfiguracją.
SdkRegistryException Środowisko uruchomieniowe nie rozpoznaje przechowywanej nazwy FQCN, która może być spowodowana niezgodnością wersji biblioteki.
SdkHydrationException Oprogramowanie pośredniczące nie mogło skompilować klienta zestawu SDK, które może wystąpić z powodu brakujących zmiennych środowiskowych, błędów odbicia, błędów poświadczeń i podobnych problemów ze środowiskiem uruchomieniowym.
SdkTypeCreationException Usługa Factory nie może przekształcić metadanych w ostateczny typ zestawu SDK, który jest zwykle spowodowany problemami z rzutowaniem.

Sprawdź wewnętrzny komunikat, aby uzyskać więcej szczegółów na temat dokładnej przyczyny. Większość problemów z typami zestawu SDK jest spowodowana błędnie napisanymi nazwami zmiennych środowiskowych lub brakującymi zależnościami.

Powiązania

Powiązania wejściowe i wyjściowe zapewniają deklaratywny sposób nawiązywania połączenia z danymi z poziomu kodu. Funkcja może mieć wiele powiązań wejściowych i wyjściowych.

Przykład powiązania wejściowego

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

Ta funkcja jest wywoływana z żądaniem HTTP.

  • Treść żądania HTTP jest przekazywana jako String dla argumentu inputReq.
  • Jeden wpis jest pobierany z usługi Table Storage i jest przekazywany jako TestInputData argument inputData.

Aby otrzymać partię danych wejściowych, można powiązać z elementami String[], POJO[], List<String> lub 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;
}

Ta funkcja jest wyzwalana za każdym razem, gdy w skonfigurowanym centrum zdarzeń znajdują się nowe dane. Ponieważ parametr jest ustawiony na wartość MANY, funkcja odbiera partię komunikatów z centrum zdarzeń. EventData z centrum zdarzeń jest konwertowany na TestEventData w celu wykonania funkcji.

Przykład powiązania wyjściowego

Powiązanie danych wyjściowych z wartością zwracaną można powiązać przy użyciu polecenia $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;
    }
}

Jeśli istnieje wiele powiązań wyjściowych, użyj wartości zwracanej tylko dla jednego z nich.

Aby wysłać wiele wartości wyjściowych, użyj OutputBinding<T> zdefiniowanego w pakiecie azure-functions-java-library.

@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;
    }

Wywołujesz tę funkcję na obiekcie HttpRequest. Zapisuje wiele wartości w usłudze Queue Storage.

HttpRequestMessage i HttpResponseMessage

Te typy pomocnika, które są przeznaczone do pracy z funkcjami wyzwalacza HTTP, są zdefiniowane w pliku azure-functions-java-library:

Wyspecjalizowany typ Obiekt docelowy Typowe użycie
HttpRequestMessage<T> Wyzwalacz HTTP Pobiera metodę, nagłówki lub zapytania
HttpResponseMessage Wiązanie wyjściowe HTTP Zwraca stan inny niż 200

Metadane

Kilka wyzwalaczy wysyła metadane wyzwalacza wraz z danymi wejściowymi. Możesz użyć adnotacji @BindingName, aby powiązać metadane wyzwalacza.

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

W poprzednim przykładzie parametr queryValue jest powiązany z parametrem name ciągu zapytania w adresie URL żądania HTTP. http://{example.host}/api/metadata?name=test Oto kolejny przykład przedstawiający sposób powiązania z Id metadanymi wyzwalacza kolejki.

 @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 metadataId:" + metadataId );
        TestData testData = new TestData();
        testData.id = metadataId;
        output.setValue(testData);
    }

Uwaga

Nazwa podana w adnotacji musi być zgodna z właściwością metadanych.

Kontekst wykonywania

ExecutionContext, zdefiniowany w pliku azure-functions-java-library, zawiera metody pomocnicze, które są używane do komunikowania się ze środowiskiem uruchomieniowym funkcji. Aby uzyskać więcej informacji, zobacz artykuł referencyjny dokumentacji kontekstu wykonania.

Rejestrator

Użyj getLogger, zdefiniowanego w ExecutionContext, aby zapisać logi z kodu funkcji.

Przykład:


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

Wyświetlanie dzienników i śladów

Interfejs wiersza polecenia platformy Azure umożliwia przesyłanie strumieniowe logów stdout i stderr dla języka Java oraz inne dzienniki aplikacji.

Oto jak skonfigurować aplikację funkcyjną do zapisywania logowania aplikacji przy użyciu Azure CLI:

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

Aby przesłać strumieniowo dane wyjściowe rejestrowania dla aplikacji funkcji przy użyciu interfejsu wiersza polecenia platformy Azure, otwórz nowy wiersz polecenia, powłokę Bash lub sesję terminalu i wprowadź następujące polecenie:

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

Polecenie az webapp log tail ma opcje filtrowania danych wyjściowych przy użyciu --provider opcji .

Aby pobrać pliki dziennika jako pojedynczy plik ZIP przy użyciu interfejsu wiersza polecenia platformy Azure, otwórz nowy wiersz polecenia, powłokę Bash lub sesję terminalu i wprowadź następujące polecenie:

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

Przed uruchomieniem tego polecenia należy włączyć rejestrowanie systemu plików w witrynie Azure Portal lub interfejsie wiersza polecenia platformy Azure.

Zmienne środowiskowe

W usłudze Functions ustawienia aplikacji, takie jak parametry połączenia usługi, są widoczne jako zmienne środowiskowe podczas wykonywania. Dostęp do tych ustawień można uzyskać za pomocą polecenia System.getenv("AzureWebJobsStorage").

Poniższy przykład pobiera ustawienie aplikacji z kluczem o nazwie 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);
    }
}

Używanie wstrzykiwania zależności w funkcjach Javy

Język Java usługi Azure Functions obsługuje wzorzec projektowania oprogramowania iniekcji zależności (DI), który jest techniką umożliwiającą osiągnięcie inwersji kontroli (IoC) między klasami i ich zależnościami. Platforma Azure Functions w Java udostępnia interfejs do integracji z popularnymi frameworkami wstrzykiwania zależności w aplikacjach Functions. Azure Functions Java SPI zawiera interfejs FunctionInstanceInjector. Implementując ten interfejs, można zwrócić wystąpienie swojej klasy funkcji, a funkcje tej klasy są wywoływane w tym wystąpieniu. Zapewnia to ramom takim jak Spring, Quarkus, Google Guice, Dagger itp. możliwość tworzenia wystąpienia funkcji i rejestrowania go w ich kontenerze IOC. Oznacza to, że możesz użyć tych struktur iniekcji zależności do zarządzania funkcjami naturalnie.

Uwaga

Microsoft Azure Functions Java SPI Types (azure-function-java-spi) to pakiet zawierający wszystkie interfejsy SPI dla innych firm do interakcji ze środowiskiem uruchomieniowym usługi Microsoft Azure Functions.

Moduł instancji funkcji do wstrzykiwania zależności

azure-function-java-spi zawiera interfejs FunctionInstanceInjector

package com.microsoft.azure.functions.spi.inject; 

/** 

 * The instance factory used by DI framework to initialize function instance. 

 * 

 * @since 1.0.0 

 */ 

public interface FunctionInstanceInjector { 

    /** 

     * This method is used by DI framework to initialize the function instance. This method takes in the customer class and returns 

     * an instance create by the DI framework, later customer functions will be invoked on this instance. 

     * @param functionClass the class that contains customer functions 

     * @param <T> customer functions class type 

     * @return the instance that will be invoked on by azure functions java worker 

     * @throws Exception any exception that is thrown by the DI framework during instance creation 

     */ 

    <T> T getInstance(Class<T> functionClass) throws Exception; 

} 

Aby uzyskać więcej przykładów użycia FunctionInstanceInjector do integracji z frameworkami wstrzykiwania zależności, zapoznaj się z tym repozytorium.

Następne kroki

Aby uzyskać więcej informacji na temat programowania w języku Java usługi Azure Functions, zobacz następujące zasoby: