Java-ontwikkelaarshandleiding voor Azure Functions
Deze handleiding bevat gedetailleerde informatie om u te helpen bij het ontwikkelen van Azure Functions java.
Als Java-ontwikkelaar kunt u, als u geen Azure Functions, een van de volgende artikelen lezen:
| Aan de slag | Concepten |
|---|---|
Basisbeginselen van Java-functies
Een Java-functie is public een methode, voorzien van de aantekening @FunctionName . Met deze methode definieert u de vermelding voor een Java-functie en moet deze uniek zijn in een bepaald pakket. Het pakket kan meerdere klassen hebben met meerdere openbare methoden met @FunctionName aantekeningen. Er wordt één pakket geïmplementeerd in een functie-app in Azure. Wanneer de functie-app wordt uitgevoerd in Azure, biedt deze de context voor implementatie, uitvoering en beheer voor uw afzonderlijke Java-functies.
Programmeermodel
De concepten van triggers en bindingen zijn essentieel voor Azure Functions. Triggers starten de uitvoering van uw code. Met bindingen kunt u gegevens doorgeven aan en retourneren vanuit een functie, zonder dat u aangepaste code voor gegevenstoegang moet schrijven.
Java-functies maken
Om het eenvoudiger te maken om Java-functies te maken, zijn er op Maven gebaseerde hulpprogramma's en archetypen die gebruikmaken van vooraf gedefinieerde Java-sjablonen om u te helpen bij het maken van projecten met een specifieke functietrigger.
Hulpprogramma's op basis van Maven
De volgende ontwikkelomgevingen hebben Azure Functions hulpprogramma's waarmee u Java-functieprojecten kunt maken:
De bovenstaande artikelkoppelingen laten zien hoe u uw eerste functies kunt maken met behulp van uw IDE van uw keuze.
Project Steigers
Als u liever vanaf de Terminal opdrachtregelontwikkeling wilt uitvoeren, is het gebruik van archetypen de eenvoudigste manier om op Java gebaseerde functieprojecten Apache Maven te maken. Het Java Maven-archetype voor Azure Functions wordt gepubliceerd onder de volgende _groupId:_artifactId: com.microsoft.azure:azure-functions-archetype.
Met de volgende opdracht wordt een nieuw Java-functieproject gegenereerd met behulp van dit archetype:
mvn archetype:generate \
-DarchetypeGroupId=com.microsoft.azure \
-DarchetypeArtifactId=azure-functions-archetype
Zie de Java-quickstartom aan de slag te gaan met dit archetype.
Mapstructuur
Hier is de mapstructuur van een 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
U kunt een gedeeld host.json-bestand gebruiken om de functie-app te configureren. Elke functie heeft een eigen codebestand (.java) en een bindingsconfiguratiebestand (function.json).
U kunt meer dan één functie in een project zetten. Vermijd het plaatsen van uw functies in afzonderlijke JAR's. De FunctionApp in de doelmap is wat wordt geïmplementeerd in uw functie-app in Azure.
Triggers en aantekeningen
Functies worden aangeroepen door een trigger, zoals een HTTP-aanvraag, een timer of een update van gegevens. Uw functie moet die trigger en andere invoer verwerken om een of meer uitvoer te produceren.
Gebruik de Java-aantekeningen die zijn opgenomen in het pakket com.microsoft.azure.functions.annotation.* om invoer en uitvoer te binden aan uw methoden. Zie de Java-referentie docs voor meer informatie.
Belangrijk
U moet een Azure Storage-account in uw local.settings.json configureren om Azure Blob Storage-, Azure Queue Storage- of Azure Table Storage-triggers lokaal uit te voeren.
Voorbeeld:
public class Function {
public String echo(@HttpTrigger(name = "req",
methods = {HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS)
String req, ExecutionContext context) {
return String.format(req);
}
}
Dit is de gegenereerde die function.json overeenkomt met de 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"
}
]
}
Java-versies
De versie van Java die wordt gebruikt bij het maken van de functie-app waarop functies worden uitgevoerd in Azure, wordt opgegeven in het pom.xml bestand. Het Maven-archetype genereert momenteel een pom.xml voor Java 8, die u kunt wijzigen voordat u publiceert. De Java-versie in pom.xml moet overeenkomen met de versie waarin u uw app lokaal hebt ontwikkeld en getest.
Ondersteunde versies
In de volgende tabel ziet u de huidige ondersteunde Java-versies voor elke belangrijke versie van de Functions-runtime, per besturingssysteem:
| Functions-versie | Java-versies (Windows) | Java-versies (Linux) |
|---|---|---|
| 4.x | 11 8 |
11 8 |
| 3.x | 11 8 |
11 8 |
| 2.x | 8 | n.v.t. |
Tenzij u een Java-versie voor uw implementatie opgeeft, wordt het Maven-archetype standaard ingesteld op Java 8 tijdens de implementatie in Azure.
De implementatieversie opgeven
U kunt de java-versie van het Maven-archetype bepalen met behulp van de -DjavaVersion parameter . De waarde van deze parameter kan of 8 11 zijn.
Het Maven-archetype genereert een pom.xml die is gericht op de opgegeven Java-versie. De volgende elementen in pom.xml geven aan welke Java-versie moet worden gebruikt:
| Element | Java 8-waarde | Java 11-waarde | Description |
|---|---|---|---|
Java.version |
1.8 | 11 | Versie van Java die wordt gebruikt door de maven-compiler-plugin. |
JavaVersion |
8 | 11 | Java-versie die wordt gehost door de functie-app in Azure. |
In de volgende voorbeelden worden de instellingen voor Java 8 in de relevante secties van pom.xml bestand:
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>
Belangrijk
U moet de omgevingsvariabele JAVA_HOME de JDK-map die wordt gebruikt tijdens het compileren van code met Behulp van Maven, correct laten instellen. Zorg ervoor dat de versie van de JDK ten minste even hoog is als de Java.version instelling.
Het besturingssysteem van de implementatie opgeven
Met Maven kunt u ook het besturingssysteem opgeven waarop uw functie-app wordt uitgevoerd in Azure. Gebruik het os -element om het besturingssysteem te kiezen.
| Element | Windows | Linux | Docker |
|---|---|---|---|
os |
windows |
linux |
docker |
In het volgende voorbeeld ziet u de instelling van het besturingssysteem in runtime de sectie van pom.xml bestand:
<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>
Beschikbaarheid en ondersteuning van JDK-runtime
Download en gebruik de juiste Azul Zulu Enterprise voor Azure Java JDK's van Azul Systems voor lokale ontwikkeling van Java-functie-apps. Azure Functions gebruikt een Azul Java JDK-runtime wanneer u uw functie-app in de cloud implementeert.
ondersteuning voor Azure voor problemen met de JDK's en functie-apps is beschikbaar met een gekwalificeerd ondersteuningsplan.
JVM aanpassen
Met Functions kunt u de virtuele Java-machine (JVM) aanpassen die wordt gebruikt om uw Java-functies uit te voeren. De volgende JVM-opties worden standaard gebruikt:
-XX:+TieredCompilation-XX:TieredStopAtLevel=1-noverify-Djava.net.preferIPv4Stack=true-jar
U kunt aanvullende argumenten verstrekken in een app-instelling met de naam JAVA_OPTS . U kunt app-instellingen toevoegen aan uw functie-app die is geïmplementeerd in Azure in de Azure Portal of de Azure CLI.
Belangrijk
In het verbruiksplan moet u ook de instelling WEBSITE_USE_PLACEHOLDER toevoegen met een waarde van 0 om de aanpassing te laten werken. Deze instelling verhoogt de koude starttijden voor Java-functies.
Azure Portal
Gebruik in Azure Portalhet tabblad Toepassingstoepassing Instellingen de instelling toe te JAVA_OPTS voegen.
Azure CLI
U kunt de opdracht az functionapp config appsettings set gebruiken om in te JAVA_OPTS stellen, zoals in het volgende voorbeeld:
az functionapp config appsettings set \
--settings "JAVA_OPTS=-Djava.awt.headless=true" \
"WEBSITE_USE_PLACEHOLDER=0" \
--name <APP_NAME> --resource-group <RESOURCE_GROUP>
In dit voorbeeld wordt de headless-modus inschakelen. Vervang <APP_NAME> door de naam van uw functie-app en door de <RESOURCE_GROUP> resourcegroep.
Bibliotheken van derden
Azure Functions ondersteunt het gebruik van bibliotheken van derden. Standaard worden alle afhankelijkheden die zijn opgegeven in uw projectbestand automatisch pom.xml gebundeld tijdens het mvn package doel. Voor bibliotheken die niet zijn opgegeven als afhankelijkheden in het bestand, moet u deze in een map in de hoofdmap van de pom.xml lib functie plaatsen. Afhankelijkheden die in de map worden geplaatst, worden tijdens runtime toegevoegd aan het lib systeemklasse loader.
De afhankelijkheid wordt standaard opgegeven op het klassepad en hoeft com.microsoft.azure.functions:azure-functions-java-library niet te worden opgenomen in de lib map. Bovendien voegt azure-functions-java-worker hier vermelde afhankelijkheden toe aan het klassepad.
Ondersteuning voor gegevenstype
U kunt gewone oude Java-objecten (POJO's) gebruiken, typen die zijn gedefinieerd in , of primitieve gegevenstypen zoals Tekenreeks en Geheel getal gebruiken om bindingen te maken met invoer- of azure-functions-java-library uitvoerbindingen.
POJO's
Voor het converteren van invoergegevens naar POJO maakt azure-functions-java-worker gebruik van de gson-bibliotheek. POJO-typen die worden gebruikt als invoer voor functies, moeten public zijn.
Binaire gegevens
Bind binaire invoer of uitvoer aan byte[] door het veld in uw dataType function.json in te stellen op 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");
}
Als u null-waarden verwacht, gebruikt u Optional<T> .
Bindingen
Invoer- en uitvoerbindingen bieden een declaratieve manier om vanuit uw code verbinding te maken met gegevens. Een functie kan meerdere invoer- en uitvoerbindingen hebben.
Voorbeeld van invoerbinding
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;
}
}
}
U roept deze functie aan met een HTTP-aanvraag.
- De nettolading van de HTTP-aanvraag wordt doorgegeven
Stringals een voor het argumentinputReq. - Er wordt één vermelding opgehaald uit Table Storage en wordt doorgegeven als
TestInputDataaan het argumentinputData.
Als u een batch met invoer wilt ontvangen, kunt u verbinden String[] met , , of POJO[] List<String> 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;
}
Deze functie wordt geactiveerd wanneer er nieuwe gegevens in de geconfigureerde Event Hub zijn. Omdat is cardinality ingesteld op , ontvangt de functie een batch berichten van de Event MANY Hub. EventData van event hub wordt geconverteerd TestEventData naar voor de uitvoering van de functie.
Voorbeeld van uitvoerbinding
U kunt een uitvoerbinding binden aan de retourwaarde met behulp van $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;
}
}
Als er meerdere uitvoerbindingen zijn, gebruikt u de retourwaarde voor slechts één ervan.
Als u meerdere uitvoerwaarden wilt verzenden, gebruikt OutputBinding<T> u gedefinieerd in het azure-functions-java-library pakket.
@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;
}
U roept deze functie aan op een HttpRequest. Er worden meerdere waarden naar Queue Storage weggeslagen.
HttpRequestMessage en HttpResponseMessage
Deze zijn gedefinieerd in azure-functions-java-library . Dit zijn helpertypen om te werken met HttpTrigger-functies.
| Speciaal type | Doel | Typisch gebruik |
|---|---|---|
HttpRequestMessage<T> |
HTTP-trigger | Haalt methode, headers of query's op |
HttpResponseMessage |
HTTP-uitvoerbinding | Retourneert een andere status dan 200 |
Metagegevens
Enkele triggers verzenden triggermetagegevens samen met invoergegevens. U kunt aantekeningen gebruiken om te binden @BindingName aan triggermetagegevens.
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);
}
}
In het voorgaande voorbeeld is de queryValue gebonden aan de queryreeksparameter name in de HTTP-aanvraag-URL, http://{example.host}/api/metadata?name=test . Hier is nog een voorbeeld, waarin wordt getoond hoe u een binding kunt maken met vanuit metagegevens Id van de wachtrijtrigger.
@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);
}
Notitie
De naam die is opgegeven in de aantekening moet overeenkomen met de eigenschap metadata.
Context voor uitvoering
ExecutionContext, gedefinieerd in azure-functions-java-library de , bevat helpermethoden om te communiceren met de functieruntime. Zie het naslagartikel ExecutionContext voor meer informatie.
Logger
Gebruik getLogger , gedefinieerd in , om ExecutionContext logboeken te schrijven vanuit functiecode.
Voorbeeld:
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);
}
}
Logboeken en traceer weergeven
U kunt de Azure CLI gebruiken om logboekregistratie van Java stdout en stderr te streamen, evenals andere toepassingslogregistratie.
U kunt als volgende uw functie-app configureren voor het schrijven van toepassingslogregistratie met behulp van de Azure CLI:
az webapp log config --name functionname --resource-group myResourceGroup --application-logging true
Als u logboekuitvoer voor uw functie-app wilt streamen met behulp van de Azure CLI, opent u een nieuwe opdrachtprompt, Bash of Terminal-sessie, en voert u de volgende opdracht in:
De opdracht az webapp log tail heeft opties om uitvoer te filteren met behulp van de optie --provider .
Als u de logboekbestanden als één ZIP-bestand wilt downloaden met behulp van de Azure CLI, opent u een nieuwe opdrachtprompt, Bash- of Terminal-sessie, en voert u de volgende opdracht in:
az webapp log download --resource-group resourcegroupname --name functionappname
U moet logboekregistratie van bestandssysteem in de Azure Portal of de Azure CLI hebben ingeschakeld voordat u deze opdracht kunt uitvoeren.
Omgevingsvariabelen
In Functions worden app-instellingen,zoals serviceverbindingsreeksen, tijdens de uitvoering beschikbaar gemaakt als omgevingsvariabelen. U hebt toegang tot deze instellingen met behulp van System.getenv("AzureWebJobsStorage") .
In het volgende voorbeeld wordt de toepassingsinstelling, met de sleutel met de naam 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);
}
}
Notitie
De waarde van AppSetting FUNCTIONS_EXTENSION_VERSION moet ~2 of ~3 zijn voor een geoptimaliseerde koude startervaring.
Volgende stappen
Zie de volgende bronnen Azure Functions informatie over java-ontwikkeling:
- Aanbevolen procedures voor Azure Functions
- Naslaginformatie over Azure Functions voor ontwikkelaars
- Azure Functions-triggers en -bindingen
- Lokale ontwikkeling en foutopsporing met Visual Studio Code, IntelliJen Eclipse
- Java-functies voor foutopsporing op afstand met behulp Visual Studio Code
- Maven-invoeging voor Azure Functions
- Stroomlijn het maken van functies via
azure-functions:addhet doel en bereid een faseringsmap voor op de implementatie van ZIP-bestanden.