Aracılığıyla paylaş


Azure İşlevleri Java geliştirici kılavuzu

Bu kılavuz, Java kullanarak Azure İşlevleri geliştirmeyi başarmanıza yardımcı olacak ayrıntılı bilgiler içerir.

Java geliştiricisi olarak Azure İşlevleri yeniyseniz önce aşağıdaki makalelerden birini okumayı göz önünde bulundurun:

** Başlarken Kavramlar Senaryolar/örnekler

Java işlevinin temelleri

Java işlevi, ek açıklamasıyla @FunctionName olarak işaretlenmiş bir public yöntemdir. Bu yöntem bir Java işlevinin girişini tanımlar ve belirli bir pakette benzersiz olmalıdır. Paket, @FunctionName ile açıklama eklenmiş birden çok genel yönteme sahip birden çok sınıfa sahip olabilir. Azure'daki bir işlev uygulamasına tek bir paket dağıtılır. Azure'da işlev uygulaması, java işlevlerinizin dağıtım, yürütme ve yönetim bağlamını sağlar.

Programlama modeli

Tetikleyici ve bağlama kavramları Azure İşlevleri için temeldir. Tetikleyiciler kodunuzun yürütülmesini başlatır. Bağlamalar, özel veri erişim kodu yazmak zorunda kalmadan bir işleve veri geçirmenizi ve işlevden veri döndürmenizi sağlar.

Java işlevleri oluşturma

Java işlevleri oluşturmayı kolaylaştırmak için, belirli bir işlev tetikleyicisine sahip projeler oluşturmanıza yardımcı olmak için önceden tanımlanmış Java şablonlarını kullanan Maven tabanlı araçlar ve arketipler vardır.

Maven tabanlı araç seti

Aşağıdaki geliştirici ortamlarında Java işlev projeleri oluşturmanıza olanak tanıyan Azure İşlevleri araçları vardır:

Bu makaleler, tercih ettiğiniz IDE'yi kullanarak ilk işlevlerinizi nasıl oluşturabileceğinizi gösterir.

Proje iskelesi

Terminalden komut satırı geliştirmeyi tercih ediyorsanız, Java tabanlı işlev projelerini iskeleye eklemenin en basit yolu arketipleri kullanmaktır Apache Maven . Azure İşlevleri için Java Maven arketipi şu groupId:artifactId: com.microsoft.azure:azure-functions-archetype altında yayımlanır.

Aşağıdaki komut, bu arketipi kullanarak yeni bir Java işlev projesi oluşturur:

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

Bu arketipi kullanmaya başlamak için Java hızlı başlangıç kısmına bakın.

Klasör yapısı

Azure İşlevleri Java projesinin klasör yapısı aşağıdadır:

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

İşlev uygulamasını yapılandırmak için paylaşılan bir host.json dosyası kullanabilirsiniz. Her işlevin kendi kod dosyası (.java) ve bağlama yapılandırma dosyası (function.json) vardır.

Bir projede birden fazla işleviniz olabilir. Ancak işlevlerinizi ayrı jarlara koymayın. Tek bir işlev uygulamasında birden çok jar kullanılması desteklenmez. Azure'daki işlev uygulamanıza dağıtılan şey, hedef dizindeki FunctionApp bileşenidir.

Tetikleyiciler ve ek açıklamalar

İşlevler HTTP isteği, zamanlayıcı veya veri güncelleştirmesi gibi bir tetikleyici tarafından çağrılır. İşlevinizin bir veya daha fazla çıkış üretmek için bu tetikleyiciyi ve diğer girişleri işlemesi gerekir.

Giriş ve çıkışları yöntemlerinize bağlamak için com.microsoft.azure.functions.annotation.* paketinde yer alan Java ek açıklamalarını kullanın. Daha fazla bilgi için bkz . Java başvuru belgeleri.

Önemli

Azure Blob depolama, Azure Kuyruk depolama veya Azure Tablo depolama tetikleyicilerini yerel olarak çalıştırmak için local.settings.json bir Azure Depolama hesabı yapılandırmanız gerekir.

Örnek:

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

function.json işte azure-functions-maven-plugin tarafından oluşturulan:

{
  "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 sürümleri

Uygulamanızın Azure'da çalıştığı Java sürümü pom.xml dosyasında belirtilir. Maven arketipi şu anda Java 8 için yayımlamadan önce değiştirebileceğiniz bir pom.xml oluşturur. pom.xml'daki Java sürümü, uygulamanızı geliştirip yerel olarak test ettiğiniz Java sürümüyle eşleşmelidir.

Desteklenen sürümler

Aşağıdaki tabloda, işletim sistemine göre İşlevler çalışma zamanının her ana sürümü için desteklenen geçerli Java sürümleri gösterilmektedir:

İşlevler sürümü Java sürümleri (Windows) Java sürümleri (Linux)
4.x 21
17
11
8
21
17
11
8
3.x 11
8
11
8
2.x 8 yok

Dağıtımınız için bir Java sürümü belirtmediğiniz sürece Maven arketipi, Azure'a dağıtım sırasında varsayılan olarak Java 8 olarak belirlenir.

Dağıtım sürümünü belirtme

Maven arketipi tarafından hedeflenen Java sürümünü parametresini -DjavaVersion kullanarak denetleyebilirsiniz. Bu parametre desteklenen Java sürümleriyle eşleşmelidir.

Maven arketipi, belirtilen Java sürümünü hedefleyen bir pom.xml oluşturur. pom.xml'daki aşağıdaki öğeler kullanılacak Java sürümünü gösterir:

Öğe Java 8 değeri Java 11 değeri Java 17 değeri Java 21 değeri Açıklama
Java.version 1.8 11 17 21 Maven-compiler-plugin tarafından kullanılan Java sürümü.
JavaVersion 8 11 17 21 Azure'da işlev uygulaması tarafından barındırılan Java sürümü.

Aşağıdaki örnekler, pom.xml dosyasının ilgili bölümlerinde Java 8 ayarlarını gösterir:

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>

Önemli

maven kullanarak kod derleme sırasında kullanılan JDK dizinine doğru ayarlanmış JAVA_HOME ortam değişkenine sahip olmanız gerekir. JDK sürümünün en az Java.version ayarı kadar yüksek olduğundan emin olun.

Dağıtım işletim sistemini belirtme

Maven, işlev uygulamanızın Azure'da çalıştığı işletim sistemini de belirtmenize olanak tanır. os öğesini kullanarak işletim sistemini seçin.

Öğe Windows Linux işletim sistemi Docker
os windows linux docker

Aşağıdaki örnekte, pom.xml dosyasının runtime bölümündeki işletim sistemi ayarı gösterilmektedir:

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

JDK çalışma zamanı kullanılabilirliği ve desteği

OpenJDK'nin Microsoft ve Adoptium derlemeleri Java 8 (Adoptium), Java 11, 17 ve 21 (MSFT) için İşlevler'de sağlanır ve desteklenir. Bu ikili dosyalar, Azure için OpenJDK'nin maliyetsiz, çok platformlu, üretime hazır dağıtımı olarak sağlanır. Java SE uygulamalarını oluşturmak ve çalıştırmak için gereken tüm bileşenleri içerir.

Yerel geliştirme veya test için OpenJDK veya Adoptium Temurin ikili dosyalarının Microsoft derlemesini ücretsiz olarak indirebilirsiniz. JDK'ler ve işlev uygulamalarıyla ilgili sorunlar için Azure desteği uygun bir destek planıyla sağlanır.

İşlev uygulamanızda Azure için Zulu ikili dosyalarını kullanmaya devam etmek istiyorsanız uygulamanızı uygun şekilde yapılandırın. Siteniz için Azul ikili dosyalarını kullanmaya devam edebilirsiniz. Ancak tüm güvenlik düzeltme ekleri veya iyileştirmeler yalnızca OpenJDK'nin yeni sürümlerinde kullanılabilir. Bu nedenle, uygulamalarınızın java'nın en son kullanılabilir sürümünü kullanması için bu yapılandırmayı kaldırmanız gerekir.

JVM'i özelleştirme

İşlevler, Java işlevlerinizi çalıştırmak için kullanılan Java sanal makinesini (JVM) özelleştirmenize olanak tanır. Aşağıdaki JVM seçenekleri varsayılan olarak kullanılır:

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

Plan türüne bağlı olarak aşağıdaki uygulama ayarlarından birini kullanarak JVM'ye başka bağımsız değişkenler de sağlayabilirsiniz:

Plan türü Ayar adı Yorum
Tüketim planı languageWorkers__java__arguments Bu ayar, Tüketim planında çalışan Java işlevlerinin soğuk başlangıç sürelerini artırır.
Premium plan
Özel plan
JAVA_OPTS

Aşağıdaki bölümlerde bu ayarların nasıl ekleneceği gösterilmektedir. Uygulama ayarlarıyla çalışma hakkında daha fazla bilgi edinmek için Uygulama ayarlarıyla çalışma bölümüne bakın.

Azure portal

Azure portalında, languageWorkers__java__arguments veya JAVA_OPTS ayarını eklemek için Uygulama Ayarları sekmesini kullanın.

Azure CLI

Aşağıdaki -Djava.awt.headless=true seçeneği örneğinde bu ayarları eklemek için az functionapp config appsettings set komutunu kullanabilirsiniz.

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

Bu örnek, başsız modu etkinleştirir. <APP_NAME> değerini işlev uygulamanızın adıyla ve <RESOURCE_GROUP> değerini kaynak grubuyla değiştirin.

Üçüncü taraf kitaplıkları

Azure İşlevleri üçüncü taraf kitaplıklarının kullanımını destekler. Varsayılan olarak, proje pom.xml dosyanızda belirtilen tüm bağımlılıklar, mvn package amacı sırasında otomatik olarak paketlenir. Dosyada pom.xml bağımlılık olarak belirtilmeyen kitaplıklar için, bunları işlevin kök dizinindeki bir lib dizine yerleştirin. Dizine lib yerleştirilen bağımlılıklar çalışma zamanında sistem sınıfı yükleyicisine eklenir.

com.microsoft.azure.functions:azure-functions-java-library Bağımlılık varsayılan olarak sınıf yoluna dahil edilmiştir ve lib dizinine eklenmesine gerek yoktur. Ayrıca, azure-functions-java-worker burada listelenen bağımlılıkları classpath'e ekler.

Veri türü desteği

Giriş veya çıkış bağlamalarına bağlanmak için düz eski Java nesnelerini (POJO'lar), azure-functions-java-library içinde tanımlanan türleri veya String ve Integer gibi temel veri türlerini kullanabilirsiniz.

Not

SDK türlerine bağlama desteği şu anda önizleme aşamasındadır ve Azure Blob Depolama SDK'sı ile sınırlıdır. Daha fazla bilgi için Java başvuru makalesindeki SDK türleri bölümüne bakın.

POJO'lar

Giriş verilerini POJO'ya dönüştürmek için azure-functions-java-worker gson kitaplığını kullanır. İşlevler için giriş olarak kullanılan POJO türleri public olmalıdır.

İkili veri

function.json alanını binary olarak ayarlayarak, byte[] ikili girişleri veya çıkışları dataType öğesine bağlayın.

   @FunctionName("BlobTrigger")
    @StorageAccount("AzureWebJobsStorage")
     public void blobTrigger(
        @BlobTrigger(name = "content", path = "myblob/{fileName}", dataType = "binary") byte[] content,
        @BindingName("fileName") String fileName,
        final ExecutionContext context
    ) {
        context.getLogger().info("Java Blob trigger function processed a blob.\n Name: " + fileName + "\n Size: " + content.length + " Bytes");
    }

Null değerler bekliyorsanız kullanın Optional<T>.

SDK türleri (önizleme)

Şu anda bağlamalarınızda şu Blob Depolama SDK'sı türlerini kullanabilirsiniz: BlobClient ve BlobContainerClient.

SDK türleri desteği etkinleştirildiğinde, işlevleriniz bloblara doğrudan depolamadan akışlar olarak erişmek için Azure SDK istemci türlerini kullanabilir ve bu da POCO'lara veya ikili türlere göre şu avantajları sağlar:

  • Daha düşük gecikme süresi
  • Azaltılmış bellek gereksinimleri
  • İstek tabanlı boyut sınırlarını kaldırır (hizmet varsayılanlarını kullanır)
  • Tam SDK yüzeyine erişim sağlar: meta veriler, ACL'ler, yasal tutmalar ve SDK'ya özgü diğer veriler.

Gereksinimler

  • JAVA_ENABLE_SDK_TYPES SDK türlerini etkinleştirmek için uygulama ayarını true olarak ayarlayın.
  • azure-functions-maven-plugin (veya Gradle eklentisi) veya 1.38.0 daha yüksek bir sürüm.

Örnekler

BlobClient kullanarak blobun özelliklerine erişen blob tetikleyicisi.

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

BlobContainerClient kullanarak kapsayıcıdaki bloblar hakkındaki bilgilere erişen blob tetikleyicisi.

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

Yürütmeyi tetikleyen blob hakkında bilgi almak için BlobClient kullanan blob giriş bağlaması.

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

Değerlendirmeler

  • SDK türüne bağlanırken dataType ayarı @BlobTrigger üzerinde dikkate alınmaz.
  • Şu anda, belirli bir işlev tanımında aynı anda yalnızca bir SDK türü kullanılabilir. Bir işlevin hem Blob tetikleyicisi veya giriş bağlaması hem de Blob çıkış bağlaması olduğunda, bir bağlama bir SDK türü (örneğin BlobClient) kullanabilir ve diğerleri yerel bir tür veya POJO kullanmalıdır.
  • Yönetilen kimlikleri SDK türleriyle kullanabilirsiniz.

Sorun giderme

Sdk türleri kullanılırken oluşabilecek olası hatalar şunlardır:

İstisna Anlamı
SdkAnalysisException Derleme eklentisi meta veri oluşturamadı. Bunun nedeni tek bir işlev tanımındaki yinelenen SDK türleri, desteklenmeyen bir parametre türü veya başka bir yanlış yapılandırma olabilir.
SdkRegistryException Çalışma zamanı, uyumsuz kitaplık sürümlerinden kaynaklanabilen depolanan FQCN'yi tanımaz.
SdkHydrationException Ara yazılım, eksik ortam değişkenleri, yansıma hataları, kimlik bilgileri hataları ve benzer çalışma zamanı sorunları nedeniyle oluşabilecek SDK istemcisini oluşturamadı.
SdkTypeCreationException Fabrika meta verileri son SDK türüne dönüştüremedi ve bunun nedeni genellikle atama sorunlarıdır.

Tam neden hakkında daha fazla ayrıntı için iç iletiye bakın. ÇOĞU SDK türü sorunu yanlış yazılmış ortam değişkeni adlarına veya eksik bağımlılıklara neden olur.

Bağlamalar

Giriş ve çıkış bağlamaları, kodunuzun içinden verilere bağlanmak için bildirim temelli bir yol sağlar. bir işlevin birden çok giriş ve çıkış bağlaması olabilir.

Giriş bağlama örneği

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

Bu işlevi bir HTTP isteğiyle çağırırsınız.

  • HTTP isteği yükü, String olarak inputReq bağımsız değişkenine geçirilir.
  • Tablo depolama alanından bir girdi alınır ve TestInputData olarak, inputData bağımsız değişkenine geçirilir.

Bir dizi girdiyi almak için String[], POJO[], List<String>, veya List<POJO> ile bağlanabilirsiniz.

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

Yapılandırılan olay hub'ında yeni veriler olduğunda bu işlev tetiklenir. cardinality olarak ayarlandığındanMANY, işlev olay hub'ından bir toplu ileti alır. EventData olay hub'ından işlevin yürütülmesi için öğesine TestEventData dönüştürülür.

Çıkış bağlama örneği

Kullanarak $return dönüş değerine bir çıkış bağlaması bağlayabilirsiniz.

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

Birden çok çıkış bağlaması varsa, yalnızca biri için dönüş değerini kullanın.

Birden çok çıkış değeri göndermek için, OutputBinding<T>’yı azure-functions-java-library paketinde tanımlı olarak kullanın.

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

Bu işlevi bir HttpRequest nesnede çağırırsınız. Kuyruk depolama alanına birden çok değer yazar.

HttpRequestMessage ve HttpResponseMessage

HTTP Tetikleyicisi işlevleriyle çalışacak şekilde tasarlanan bu yardımcı türler içinde azure-functions-java-librarytanımlanır:

Özelleştirilmiş tür Hedef Tipik kullanım
HttpRequestMessage<T> HTTP Tetikleyicisi Yöntemi, üst bilgileri veya sorguları alır
HttpResponseMessage HTTP Çıkış Bağlaması 200 dışında bir durum döndürür

Meta veri

Az sayıda tetikleyici, giriş verileriyle birlikte tetikleyici meta verilerini gönderir. Tetikleyici meta verilerine bağlanmak için ek açıklama @BindingName kullanabilirsiniz.

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

Yukarıdaki örnekte , queryValue HTTP isteği URL'sindeki namesorgu dizesi parametresine http://{example.host}/api/metadata?name=test bağlıdır. Örneğin, kuyruk tetikleyicisi meta verilerinden Id'e nasıl bağlanabileceğini gösteren başka bir örnek:

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

Not

Ek açıklamada sağlanan adın meta veri özelliğiyle eşleşmesi gerekir.

Yürütme bağlamı

ExecutionContext içinde tanımlanan azure-functions-java-library, işlev çalışma zamanıyla iletişim kurmak için kullanılan yardımcı yöntemleri içerir. Daha fazla bilgi için ExecutionContext başvuru makalesine bakın.

Günlükleyici

İşlev kodundan günlük yazmak için, ExecutionContext içinde tanımlanan getLogger'yi kullanın.

Örnek:


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

Günlük kayıtlarını ve izleri görüntüle

Java stdout ve stderr günlüğünün ve diğer uygulama günlüklerinin akışını yapmak için Azure CLI'yi kullanabilirsiniz.

İşlev uygulamanızı Azure CLI kullanarak uygulama günlüğü yazacak şekilde yapılandırma burada açıklanmaktadır:

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

İşlev uygulamanızın günlük çıktısını Azure CLI kullanarak akış olarak izlemek için yeni bir komut istemi, Bash veya Terminal oturumu açın ve aşağıdaki komutu girmeniz gerekiyor:

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

az webapp log tail komutu, --provider seçeneğini kullanarak çıkışı filtreleme imkanı sunar.

Azure CLI kullanarak günlük dosyalarını tek bir ZIP dosyası olarak indirmek için yeni bir komut istemi olan Bash veya Terminal oturumu açın ve aşağıdaki komutu girin:

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

Bu komutu çalıştırmadan önce Azure portalında veya Azure CLI'da dosya sistemi günlüğünü etkinleştirmeniz gerekir.

Ortam değişkenleri

İşlevler'de, hizmet bağlantı dizesi gibi uygulama ayarları yürütme sırasında ortam değişkenleri olarak sunulur. kullanarak bu ayarlara System.getenv("AzureWebJobsStorage")erişebilirsiniz.

Aşağıdaki örnek, adı myAppSetting ile belirtilmiş olan uygulama ayarını alır:


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

Java İşlevlerinde bağımlılık ekleme özelliğini kullanma

Azure İşlevleri Java, sınıflar ve bağımlılıkları arasında Denetimin Ters Çevrilmesi (IoC) sağlamak için kullanılan bir teknik olan bağımlılık ekleme (DI) yazılım tasarım desenini destekler. Java Azure İşlevleri, İşlev Uygulamalarınızdaki popüler Bağımlılık Ekleme çerçeveleriyle tümleştirmeye yönelik bir kanca sağlar. Azure İşlevleri Java SPI, FunctionInstanceInjector arabirimini içerir. Bu arabirimi uygulayarak işlev sınıfınızın bir örneğini döndürebilirsiniz ve işlevleriniz bu örnekte çağrılır. Bu, Spring, Quarkus, Google Guice, Hançer gibi çerçevelere işlev örneği oluşturma ve IOC kapsayıcısına kaydetme olanağı sağlar. Bu, işlevlerinizi doğal olarak yönetmek için bu Bağımlılık Ekleme çerçevelerini kullanabileceğiniz anlamına gelir.

Not

Microsoft Azure İşlevleri Java SPI Türleri (azure-function-java-spi), üçüncü tarafların Microsoft Azure işlevleri çalışma zamanıyla etkileşim kurması için tüm SPI arabirimlerini içeren bir pakettir.

Bağımlılık enjeksiyonu için fonksiyon örneği enjektörü

azure-function-java-spi functionInstanceInjector arabirimi içeriyor

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; 

} 

Bağımlılık enjeksiyon çerçeveleriyle tümleştirmek için FunctionInstanceInjector kullanan diğer örnekler için şu depoya bakın.

Sonraki adımlar

Java geliştirme Azure İşlevleri hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın: