Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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 z adnotacjami .@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 zwracanie ich z funkcji 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 w ramach następującej grupy 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 element odpowiadający function.jsonwtyczki 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 narzędzia Maven domyślnie ma 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.
os Użyj elementu , 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 programowania lub testowania możesz bezpłatnie pobrać kompilację microsoft openJDK lub plików binarnych Adoptium Temurin . pomoc techniczna platformy Azure w przypadku problemów z zestawami JDK i aplikacjami funkcji jest dostępny z kwalifikowanym planem pomocy technicznej.
Jeśli chcesz nadal używać aplikacji Zulu dla plików binarnych platformy Azure w aplikacji funkcji, skonfiguruj odpowiednio aplikację. 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 zimny czas uruchamiania funkcji Języka Java uruchomionych w planie Zużycie. |
|
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 witrynie Azure Portal użyj karty Ustawienia aplikacji, aby dodać languageWorkers__java__arguments ustawienie lub JAVA_OPTS .
Interfejs wiersza polecenia platformy Azure
Możesz użyć polecenia az functionapp config appsettings set , aby dodać te ustawienia, jak pokazano w poniższym przykładzie -Djava.awt.headless=true dla opcji:
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. Zastąp <APP_NAME> ciąg nazwą aplikacji funkcji i <RESOURCE_GROUP> 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 dołączane podczas mvn package celu. 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 są dodawane do modułu lib ładującego klasy systemowej 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ąż dane wejściowe lub wyjściowe binarne z byte[]dataType elementem , ustawiając pole w function.json na binarywartość :
@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 SDKtrue. -
azure-functions-maven-plugin(lub wtyczka narzędzia Gradle)1.38.0lub 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
dataTypena@BlobTriggerjest 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.
- Ładunek żądania HTTP jest przekazywany jako element
StringargumentuinputReq. - Jeden wpis jest pobierany z usługi Table Storage i jest przekazywany jako
TestInputDataargumentinputData.
Aby otrzymać partię danych wejściowych, można powiązać z String[]elementami , 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.
cardinality Ponieważ parametr jest ustawiony na MANYwartość , 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> wartości zdefiniowanych 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;
}
Ta funkcja jest wywoływana HttpRequest na obiekcie. 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 |
Powiązanie danych wyjściowych 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ć z metadanymi 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ł executionContext reference (Dokumentacja wykonaniacontextu).
Rejestratora
Użyj polecenia getLogger, zdefiniowanego w pliku ExecutionContext, aby napisać dzienniki 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 dzienników stdout i stderr języka Java oraz innych rejestrowania aplikacji.
Oto jak skonfigurować aplikację funkcji do zapisywania rejestrowania aplikacji przy użyciu interfejsu wiersza polecenia platformy Azure:
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:
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 usłudze Java Functions
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. Usługa Azure Functions w języku Java umożliwia integrację z popularnymi strukturami wstrzykiwania zależności w aplikacjach usługi 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 platformy takie jak Spring, Quarkus, Google Guice, Dagger itp. możliwość tworzenia wystąpienia funkcji i rejestrowania go w 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.
Iniekcja wystąpienia 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, które używają klasy FunctionInstanceInjector do integracji z strukturami 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:
- Najlepsze rozwiązania dotyczące usługi Azure Functions
- Dokumentacja usługi Azure Functions dla deweloperów
- Wyzwalacze i powiązania usługi Azure Functions
- Lokalne programowanie i debugowanie za pomocą programu Visual Studio Code, intelliJ i środowiska Eclipse
- Zdalne debugowanie funkcji Języka Java przy użyciu programu Visual Studio Code
- Wtyczka Maven dla usługi Azure Functions
- Usprawnij tworzenie funkcji za pomocą
azure-functions:addcelu i przygotuj katalog przejściowy do wdrożenia pliku ZIP.