Azure Functions příručka pro vývojáře v Javě

Tato příručka obsahuje podrobné informace, které vám pomůžou úspěšně vyvíjet Azure Functions pomocí Javy.

Pokud jako vývojář v jazyce Java ještě Azure Functions, zvažte nejprve přečtení jednoho z následujících článků:

Začínáme Koncepty

Základy funkcí v Javě

Funkce Jazyka Java je public metoda dekorovaná anotací @FunctionName . Tato metoda definuje položku pro funkci Java a musí být v konkrétním balíčku jedinečná. Balíček může mít více tříd s více veřejnými metodami anotovaných pomocí @FunctionName . Do aplikace funkcí v Azure se nasadí jeden balíček. Při spuštění v Azure poskytuje aplikace funkcí kontext nasazení, spuštění a správy pro jednotlivé funkce Jazyka Java.

Programovací model

Koncepty triggerů a vazeb jsou pro Azure Functions. Triggery spustí provádění kódu. Vazby poskytují způsob, jak předávat data do funkce a vracet je z ní, aniž byste museli psát vlastní přístupový kód k datům.

Vytváření funkcí v Javě

Pro usnadnění vytváření funkcí v Javě existují nástroje a archetypy založené na Mavenu, které používají předdefinované šablony Jazyka Java, které vám pomůžou vytvářet projekty s konkrétním triggerem funkce.

Nástroje založené na Mavenu

Následující vývojářská prostředí mají Azure Functions, které umožňují vytvářet projekty funkcí v jazyce Java:

Odkazy na výše uvedené články ukazují, jak vytvořit první funkce pomocí vašeho integrovaného vývojového prostředí (IDE).

Project Lešení

Pokud dáváte přednost vývoji příkazového řádku z terminálu, nejjednodušším způsobem, jak projekty funkcí založených na jazyce Java vylepšovat, je použít Apache Maven archetypy. Archetyp Java Maven pro Azure Functions je publikovaný pod následujícím ID skupiny:artifactId: com.microsoft.azure:azure-functions-archetype.

Následující příkaz vygeneruje nový projekt funkcí Java pomocí tohoto archetypu:

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

Pokud chcete začít používat tento archetyp, podívejte se na rychlý start pro Javu.

Struktura složek

Tady je struktura složek projektu Azure Functions Java:

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

Ke konfiguraci aplikace funkcí můžete použít sdílený soubor host.json. Každá funkce má svůj vlastní soubor kódu (.java) a konfigurační soubor vazby (function.json).

Do projektu můžete umístit více než jednu funkci. Vyhněte se umístění funkcí do samostatných souborů JAR. V FunctionApp cílovém adresáři se nasadí do vaší aplikace funkcí v Azure.

Aktivační události a poznámky

Funkce jsou vyvolány triggerem, jako je požadavek HTTP, časovač nebo aktualizace dat. Aby vaše funkce vyprodukuje jeden nebo více výstupů, musí tuto aktivační událost a všechny další vstupy zpracovat.

Pomocí poznámek Java, které jsou součástí balíčku com.microsoft.azure.functions.annotation.*, vytvořte vazbu vstupu a výstupů k vašim metodám. Další informace najdete v referenčních dokumentech k Javě.

Důležité

Musíte nakonfigurovat účet úložiště Azure Storage souboru local.settings.json tak, aby se v místním prostředí spouštěly triggery Azure Blob Storage, Azure Queue Storage nebo Azure Table Storage.

Příklad:

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

Tady je vygenerovaný odpovídající function.json modul plug-in 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"
    }
  ]
}

Verze Javy

Verze Javy použitá při vytváření aplikace funkcí, na které běží funkce v Azure, je určená v pom.xml souboru. Archetyp Maven v současné době vygeneruje pom.xml pro Javu 8, kterou můžete před publikováním změnit. Verze Javy v pom.xml by měla odpovídat verzi, na které jste aplikaci místně vyvinuli a otestovali.

Podporované verze

Následující tabulka uvádí aktuální podporované verze Javy pro každou hlavní verzi modulu runtime služby Functions podle operačního systému:

Verze služby Functions Verze Javy (Windows) Verze Javy (Linux)
4.x 11
8
11
8
3.x 11
8
11
8
2.x 8 Není k dispozici

Pokud pro vaše nasazení nezadáte verzi Javy, bude archetyp Mavenu během nasazování do Azure standardně nastaven na Javu 8.

Určení verze nasazení

Verzi Javy, na kterou cílí archetyp Maven, můžete řídit pomocí -DjavaVersion parametru . Hodnota tohoto parametru může být nebo 8 11 .

Archetyp Maven vygeneruje pom.xml která cílí na zadanou verzi Javy. Následující prvky v pom.xml označují verzi Jazyka Java, která se má použít:

Prvek Hodnota Java 8 Hodnota Java 11 Description
Java.version 1.8 11 Verze Javy používaná modulem plug-in maven-compiler-plugin.
JavaVersion 8 11 Verze Javy hostovaná aplikací funkcí v Azure.

Následující příklady ukazují nastavení pro Javu 8 v příslušných částech pom.xml souboru:

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>

Důležité

Musíte mít proměnnou JAVA_HOME prostředí správně nastavenou na adresář JDK, který se používá při kompilaci kódu pomocí Mavenu. Ujistěte se, že je verze sady JDK alespoň tak vysoká jako Java.version nastavení.

Určení operačního systému nasazení

Maven také umožňuje určit operační systém, ve kterém vaše aplikace funkcí běží v Azure. Pomocí os elementu zvolte operační systém.

Prvek Windows Linux Docker
os windows linux docker

Následující příklad ukazuje nastavení operačního systému v runtime části souboru pom.xml systému:

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

Dostupnost a podpora modulu runtime JDK

Pro místní vývoj aplikací funkcí v Javě si stáhněte a použijte odpovídající azul Zulu Enterprise pro azure java JDK od společnosti Azul Systems. Azure Functions aplikace funkcí do cloudu používá modul runtime Azul Java JDK.

podpora Azure problémů se JDK a aplikacemi funkcí je k dispozici s kvalifikovaným plánem podpory.

Přizpůsobení prostředí JVM

Funkce umožňují přizpůsobit prostředí Java Virtual Machine (JVM) používané ke spouštění funkcí Jazyka Java. Ve výchozím nastavení se používají následující možnosti prostředí JVM:

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

V nastavení aplikace s názvem můžete zadat další JAVA_OPTS argumenty. Nastavení aplikace můžete přidat do aplikace funkcí nasazené do Azure v Azure Portal nebo Azure CLI.

Důležité

V plánu Consumption musíte také přidat nastavení WEBSITE_USE_PLACEHOLDER s hodnotou 0, aby přizpůsobení fungovalo. Toto nastavení zvětšuje dobu studeného startu pro funkce Jazyka Java.

portál Azure

V Azure Portalpřidejte nastavení pomocí Nastavení Application JAVA_OPTS Nastavení.

Azure CLI

K nastavení můžete použít příkaz az functionapp config appsettings set jako v následujícím JAVA_OPTS příkladu:

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

Tento příklad povolí bezvýcový režim. Nahraďte <APP_NAME> názvem vaší aplikace funkcí a názvem skupiny <RESOURCE_GROUP> prostředků.

Knihovny třetích stran

Azure Functions podporuje použití knihoven třetích stran. Ve výchozím nastavení se během cíle automaticky zabalí všechny závislosti zadané v souboru pom.xml mvn package projektu. V případě knihoven nezadáte jako závislosti v souboru je umístěte do adresáře v pom.xml lib kořenovém adresáři funkce. Závislosti umístěné v adresáři se za běhu lib přidávají do zavaděče systémové třídy.

Závislost se ve výchozím nastavení poskytuje pro cesty ke třídě a nemusí být součástí com.microsoft.azure.functions:azure-functions-java-library lib adresáře . Azure-functions-java-worker také přidá závislosti uvedené tady do cesty ke třídě.

Podpora datových typů

K vytvoření vazby na vstupní nebo výstupní vazby můžete použít prosté staré objekty Java (POJOS), typy definované v , nebo primitivní datové typy, jako jsou String a azure-functions-java-library Integer.

POJOS

K převodu vstupních dat na POJO používá azure-functions-java-worker knihovnu gson. Typy POJO používané jako vstupy funkcí by měly být public .

Binární data

Vytvořte vazbu binárních vstupů nebo výstupů na byte[] nastavením pole v souboru dataType function.json na 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");
    }

Pokud očekáváte hodnoty null, použijte Optional<T> .

Vazby

Vstupní a výstupní vazby poskytují deklarativní způsob připojení k datům z kódu. Funkce může mít více vstupních a výstupních vazeb.

Příklad vstupní vazby

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

Tuto funkci vyvoláte pomocí požadavku HTTP.

  • Datová část požadavku HTTP se předává String jako pro argument inputReq .
  • Jedna položka se načte ze služby Table Storage a předá se jako TestInputData argument inputData .

Pokud chcete přijmout dávku vstupů, můžete vytvořit vazbu String[] na , , nebo 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;
}

Tato funkce se aktivuje vždy, když v nakonfigurovaných centrech událostí budou nová data. Vzhledem k cardinality tomu, že je nastavená na , funkce MANY přijímá dávku zpráv z centra událostí. EventData z centra událostí se převede na TestEventData pro spuštění funkce.

Příklad výstupní vazby

Výstupní vazbu můžete svázat s návratovou hodnotou pomocí $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;
    }
}

Pokud existuje více výstupních vazeb, použijte návratovou hodnotu pouze pro jednu z nich.

Pokud chcete odeslat více výstupních hodnot, použijte OutputBinding<T> definované v azure-functions-java-library balíčku .

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

Tuto funkci vyvoláte na požadavek HttpRequest. Do queue storage zapisuje několik hodnot.

HttpRequestMessage a HttpResponseMessage

Ty jsou definovány v azure-functions-java-library souboru . Jsou to pomocné typy pro práci s funkcemi HttpTrigger.

Specializovaný typ Cíl Typické využití
HttpRequestMessage<T> Trigger HTTP Získá metodu, hlavičky nebo dotazy.
HttpResponseMessage Výstupní vazba HTTP Vrátí jiný stav než 200.

Metadata

Metadata triggeru spolu se vstupními daty posílá několik triggerů. Poznámku můžete použít k vytvoření @BindingName vazby k aktivaci metadat.

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

V předchozím příkladu je objekt svázán s parametrem řetězce dotazu queryValue v adrese URL požadavku HTTP name http://{example.host}/api/metadata?name=test . Tady je další příklad znázorňující, jak vytvořit vazbu z Id metadat triggeru fronty.

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

Poznámka

Název poskytnutý v poznámce musí odpovídat vlastnosti metadat.

Kontext spuštění

ExecutionContext, definované v azure-functions-java-library , obsahuje pomocné metody pro komunikaci s modul runtime služby Functions. Další informace najdete v referenčním článku ExecutionContext.

Logger

K zápisu protokolů z kódu funkce použijte , definované v getLogger ExecutionContext .

Příklad:


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

Zobrazení protokolů a trasování

Azure CLI můžete použít ke streamování protokolování java stdout a stderr a také k dalšímu protokolování aplikace.

Tady je postup konfigurace aplikace funkcí pro zápis protokolování aplikace pomocí Azure CLI:

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

Pokud chcete streamovat výstup protokolování pro vaši aplikaci funkcí pomocí Azure CLI, otevřete nový příkazový řádek, Bash nebo terminálovou relaci a zadejte následující příkaz:

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

Příkaz az webapp log tail nabízí možnosti filtrování výstupu pomocí možnosti --provider .

Pokud chcete stáhnout soubory protokolu jako jeden soubor ZIP pomocí Azure CLI, otevřete nový příkazový řádek, Bash nebo terminálovou relaci a zadejte následující příkaz:

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

Před spuštěním tohoto příkazu musíte mít povolené protokolování systému souborů v Azure Portal nebo Azure CLI.

Proměnné prostředí

Ve služběFunctions se nastavení aplikace , jako jsou připojovací řetězce služby, během provádění zminí jako proměnné prostředí. K těmto nastavením můžete přistupovat pomocí System.getenv("AzureWebJobsStorage") .

Následující příklad získá nastavení aplikace sklíčem s názvem 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);
    }
}

Poznámka

Pro optimalizované prostředí studeného FUNCTIONS_EXTENSION_VERSION hodnota AppSetting by měla být ~2 nebo ~3.

Další kroky

Další informace o vývoji Azure Functions Javě najdete v následujících zdrojích informací: