مشاركة عبر


دليل مطور Java لـ Azure Functions

يحتوي هذا الدليل على معلومات مفصلة من شأنها مساعدتك على النجاح في تطوير Azure Functions باستخدام Java.

بصفتك مطور Java، إذا كنت جديدا على Azure Functions، ففكر في قراءة إحدى المقالات التالية أولا:

الشروع Concepts Scenarios/samples

أساسيات وظيفة Java

وظيفة Java هي أسلوب public، مزود بالتعليق التوضيحي @FunctionName. هذا الأسلوب يُعرّف الإدخال لوظيفة Java، وهو فريد في حزمة معينة. يمكن أن تحتوي الحزمة على فئات متعددة بأساليب عامة متعددة مزودة بتعليق توضيحي يشير إلى @FunctionName. يتم توزيع حزمة واحدة إلى تطبيق وظائف في Azure. في Azure، يوفر تطبيق الوظائف سياق النشر والتنفيذ والإدارة لوظائف Java الفردية.

نموذج البرمجة

مفاهيم المشغّلات والروابط من أساسيات Azure Functions. تبدأ المشغّلات تنفيذ التعليمة البرمجية. وتتيح لك الروابط إمكانية تمرير البيانات إلى أي وظيفة دون الحاجة إلى كتابة تعليمة برمجية مخصصة للوصول إلى البيانات.

إنشاء وظائف Java

لتسهيل إنشاء وظائف Java، توجد أدوات ونماذج أصلية تستخدم قوالب Java المعرّفة مسبقاً لمساعدتك في إنشاء مشاريع باستخدام مشغّل وظيفة محدد.

الأدوات القائمة على المخضرم

تحتوي بيئات المطور التالية على أداة Azure Functions التي تتيح لك إنشاء مشاريع وظائف Java:

توضح لك هذه المقالات كيفية إنشاء وظائفك الأولى باستخدام IDE الذي تختاره.

مشروع السقالات

إذا كنت تفضل تطوير سطر الأوامر من Terminal، فإن أبسط طريقة لدعم مشاريع الوظيفة المستندة إلى Java هي استخدام النماذج الأصلية Apache Maven. يتم نشر النموذج الأصلي ل Java Maven ل Azure Functions ضمن groupId:artifactId التالي: com.microsoft.azure:azure-functions-archetype.

يؤدي الأمر التالي إلى إنشاء مشروع وظيفة Java جديد باستخدام هذا النموذج الأصلي:

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

لبدء استخدام هذا النموذج الأصلي، راجع التشغيل السريع ل Java.

هيكل المجلد

فيما يلي بنية المجلد لمشروع 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

يمكنك استخدام ملف host.json مشترك لتكوين تطبيق الوظائف. كل وظيفة لها ملف التعليمات البرمجية الخاصة بها (.java) وملف تكوين الربط (function.json).

يمكنك الحصول على أكثر من دالة واحدة في مشروع. ومع ذلك، لا تضع وظائفك في جرار منفصلة. استخدام عدة jars في تطبيق وظائف واحد غير مدعوم. يتم توزيع FunctionApp الموجود في الدليل المستهدف إلى تطبيق الوظائف في Azure.

المشغّلات والتعليقات التوضيحية

يتم استدعاء Functions بواسطة مشغّل، مثل طلب HTTP أو مؤقت أو تحديث للبيانات. تحتاج الوظيفة إلى معالجة هذا المشغّل وأي مدخلات أخرى لإنتاج مخرج واحد أو أكثر.

استخدم التعليقات التوضيحية Java المضمنة في الحزمة com.microsoft.azure.functions.annotation.* لربط المدخلات والمخرجات بأساليبك. للحصول على مزيد من المعلومات، راجع ⁧⁩⁧الوثائق المرجعية لـ Java⁩.

Important

يجب تكوين حساب Azure Storage في local.settings.json لتشغيل تخزين Azure Blob أو تخزين قائمة انتظار Azure أو مشغلات تخزين Azure Table محليا.

Example:

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 التي تم إنشاؤها بواسطة المكون الإضافي azure-functions-maven:

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

يتم تحديد إصدار Java الذي يتم تشغيل تطبيقك عليه في Azure في ملف pom.xml. ينشئ النموذج الأصلي لـ Maven حالياً ملف pom.xml لـ Java 8، والذي يمكنك تغييره قبل النشر. يجب أن يتطابق إصدار Java في pom.xml مع إصدار Java الذي تقوم بتطوير تطبيقك واختباره محليا.

الإصدارات المدعومة

يعرض الجدول التالي إصدارات Java المدعمة الحالية لكل إصدار رئيسي من وقت تشغيل Functions، حسب نظام التشغيل:

إصدار الوظائف إصدارات Java (Windows) إصدارات Java (Linux)
4.x 21
17
11
8
21
17
11
8
3.x 11
8
11
8
2.x 8 n/a

إذا لم تحدد إصدار Java ليتم توزيعه، فإن النموذج الأصلي لـ Maven سيُعين بشكل افتراضي على Java 8 أثناء التوزيع إلى Azure.

تحديد إصدار التوزيع

يمكنك التحكم في إصدار Java المستهدف من قبل النموذج الأصلي لـ Maven باستخدام المعلّمة -DjavaVersion. يجب أن تتطابق هذه المعلمة مع إصدارات Java المدعومة.

ينشئ النموذج الأصلي لـ Maven ملف pom.xml يستهدف إصدار Java المحدد. تشير العناصر التالية في pom.xml إلى إصدار Java المطلوب استخدامه:

Element قيمة Java 8 قيمة Java 11 قيمة Java 17 قيمة Java 21 Description
Java.version 1.8 11 17 21 نسخة من Java المستخدم من قبل maven-compiler-plugin.
JavaVersion 8 11 17 21 إصدار Java المستضاف من قبل تطبيق الوظائف في Azure.

تعرض الأمثلة التالية إعدادات Java 8 في المقاطع ذات الصلة بملف 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>

Important

يجب أن يكون تكون متغيرات البيئة JAVA_HOME معينة بشكل صحيح على الدليل JDK المستخدم أثناء تجميع التعليمات البرمجية باستخدام Maven. تأكد من أن إصدار JDK على الأقل على نفس مستوى إعداد Java.version.

تحديد نظام تشغيل التوزيع

يسمح لك Maven أيضاً بتحديد نظام التشغيل الذي تريد تشغيل تطبيق الوظائف في Azure عليه. استخدم العنصر os لاختيار نظام التشغيل.

Element Windows Linux Docker
os windows linux docker

يوضح المثال التالي إعداد نظام التشغيل في مقطع runtime لملف 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>

توفر وقت تشغيل JDK والدعم

يتم توفير إصدارات Microsoft و Adoptium من OpenJDK ودعمها على وظائف Java 8 (Adoptium) و Java 11 و 17 و 21 (MSFT). يتم توفير هذه الثنائيات كتوزيع مجاني ومتعدد الأنظمة الأساسية وجاهز لإنتاج OpenJDK لنظام Azure. وهي تحتوي على جميع المكونات لبناء وتشغيل تطبيقات Java SE.

للتطوير المحلي أو الاختبار، يمكنك تنزيل إصدار Microsoft من ثنائيات OpenJDK أو Adoptium Temurin مجانًا. يتوفر دعم Azure للمشكلات المتعلقة ب JDKs وتطبيقات الوظائف مع خطة دعم مؤهلة.

إذا كنت ترغب في الاستمرار في استخدام ثنائيات Zulu ل Azure على تطبيق الوظائف، فكون تطبيقك وفقا لذلك. يمكنك الاستمرار في استخدام ثنائيات Azul لموقعك. ومع ذلك، لا تتوفر أي تصحيحات أو تحسينات أمان إلا في الإصدارات الجديدة من OpenJDK. ولهذا السبب، يجب عليك في النهاية إزالة هذا التكوين بحيث تستخدم تطبيقاتك أحدث إصدار متوفر من Java.

تخصيص JVM

تتيح لك Functions تخصيص جهاز Java الظاهري (JVM) المستخدم لتشغيل وظائف Java. يتم استخدام خيارات JVM التالية بشكل افتراضي:

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

يمكنك توفير وسيطات أخرى إلى JVM باستخدام أحد إعدادات التطبيق التالية، اعتمادا على نوع الخطة:

نوع الخطة اسم الإعداد Comment
خطة الاستهلاك languageWorkers__java__arguments يزيد هذا الإعداد من أوقات البدء الباردة لوظائف Java التي تعمل في خطة Consumption.
خطة بريميوم
خطة مخصصة
JAVA_OPTS

توضح لك الأقسام التالية كيفية إضافة هذه الإعدادات. لمعرفة المزيد حول العمل مع إعدادات التطبيق، راجع قسم العمل مع إعدادات التطبيق.

Azure portal

في مدخل Microsoft Azure، استخدم علامة التبويب إعدادات التطبيق لإضافة الإعداد languageWorkers__java__arguments أو JAVA_OPTS الإعداد.

Azure CLI

يمكنك استخدام الأمر az functionapp config appsettings set لإضافة هذه الإعدادات، كما هو موضح في المثال التالي للخيار -Djava.awt.headless=true :

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

هذا المثال يمكّن وضع بدون أجهزة ملحقة. اجعل اسم تطبيق الوظائف يحل محل <APP_NAME>، وضع اسم مجموعة الموارد محل <RESOURCE_GROUP>.

مكتبات الجهات الخارجية

تدعم Azure Functions استخدام مكتبات الجهات الخارجية. بشكل افتراضي، يتم تجميع كل التبعيات المحددة في ملف مشروع pom.xml تلقائياً أثناء هدف mvn package. بالنسبة إلى المكتبات غير المحددة كتبعيات في ملف pom.xml، فيمكن وضعها في دليل lib في الدليل الجذر للوظيفة. تُضاف التبعيات في دليل lib إلى أداة تحميل فئة النظام في وقت التشغيل.

تتوفر تبعية com.microsoft.azure.functions:azure-functions-java-libraryعلى classpath بشكل افتراضي، ولا تحتاج إلى تضمينها في دليل lib. أيضا، يضيف azure-functions-java-worker تبعيات مدرجة هنا إلى classpath.

دعم نوع البيانات

يمكنك استخدام كائنات Java (POJOs) القديمة العادية، أو الأنواع المعرفة في azure-functions-java-library، أو أنواع البيانات الأولية مثل String و Integer للربط بروابط الإدخال أو الإخراج.

Note

دعم الربط إلى أنواع SDK قيد المعاينة حاليا ويقتصر على Azure Blob Storage SDK. لمزيد من المعلومات، راجع أنواع SDK في المقالة المرجعية Java.

POJOs

لتحويل بيانات الإدخال إلى POJO، يستخدم azure-functions-java-worker مكتبة gson . يجب أن تكون أنواع POJO المستخدمة كإدخالات للوظائف public.

البيانات الثنائية

يمكنك ربط المدخلات أو المخرجات الثنائية بـ byte[]، عن طريق تعيين الحقل dataType في function.json على 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");
    }

إذا كنت تتوقع قيم فارغة، فاستخدم Optional<T>.

أنواع SDK (معاينة)

يمكنك حاليا استخدام أنواع Blob Storage SDK هذه في روابطك: BlobClient و BlobContainerClient.

مع تمكين دعم أنواع SDK، يمكن أن تستخدم وظائفك أنواع عملاء Azure SDK للوصول إلى الكائنات الثنائية كبيرة الحجم كتدفقات مباشرة من التخزين، ما يوفر هذه الفوائد عبر POJOs أو الأنواع الثنائية:

  • زمن انتقال أقل
  • متطلبات الذاكرة المنخفضة
  • إزالة حدود الحجم المستندة إلى الطلب (يستخدم الإعدادات الافتراضية للخدمة)
  • يوفر الوصول إلى سطح SDK الكامل: بيانات التعريف وقوائم التحكم في الوصول وقوائم الاحتجاز القانونية والبيانات الأخرى الخاصة ب SDK.

Requirements

  • JAVA_ENABLE_SDK_TYPES قم بتعيين إعداد التطبيق إلى true لتمكين أنواع SDK.
  • azure-functions-maven-plugin (أو إصدار 1.38.0 المكون الإضافي Gradle) أو إصدار أعلى.

Examples

مشغل Blob الذي يستخدم BlobClient للوصول إلى خصائص الكائن الثنائي كبير الحجم.

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

مشغل Blob الذي يستخدم BlobContainerClient للوصول إلى معلومات حول الكائنات الثنائية كبيرة الحجم في الحاوية.

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

ربط إدخال Blob الذي يستخدم BlobClient للحصول على معلومات حول الكائن الثنائي كبير الحجم الذي قام بتشغيل التنفيذ.

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

Considerations

  • dataType يتم تجاهل الإعداد قيد التشغيل @BlobTrigger عند الربط بنوع SDK.
  • حاليا، يمكن استخدام نوع SDK واحد فقط في كل مرة في تعريف دالة معين. عندما تحتوي الوظيفة على مشغل مدونة أو ربط إدخال وربط إخراج Blob، يمكن أن يستخدم ربط واحد نوع SDK (مثل BlobClient) ويجب أن يستخدم الآخر نوع أصلي أو POJO.
  • يمكنك استخدام الهويات المدارة مع أنواع SDK.

Troubleshooting

هذه هي الأخطاء المحتملة التي قد تحدث عند استخدام أنواع SDK:

Exception Meaning
SdkAnalysisException تعذر على المكون الإضافي إنشاء بيانات تعريف. قد يكون هذا بسبب تكرار أنواع SDK في تعريف دالة واحدة أو نوع معلمة غير معتمد أو بعض التكوينات الخاطئة الأخرى.
SdkRegistryException لا يتعرف وقت التشغيل على FQCN المخزن، والذي يمكن أن يحدث بسبب إصدارات المكتبة غير المتطابقة.
SdkHydrationException فشل برنامج الوسيط في إنشاء عميل SDK، والذي يمكن أن يحدث بسبب متغيرات البيئة المفقودة وأخطاء الانعكاس وفشل بيانات الاعتماد ومشكلات وقت التشغيل المماثلة.
SdkTypeCreationException تعذر على المصنع تحويل بيانات التعريف إلى نوع SDK النهائي، والذي يحدث عادة بسبب مشكلات التحويل.

تحقق من الرسالة الداخلية لمزيد من التفاصيل حول السبب الدقيق. تحدث معظم مشكلات أنواع SDK بسبب أسماء متغيرات البيئة التي بها أخطاء إملائية أو التبعيات المفقودة.

Bindings

توفر روابط الإدخال والإخراج طريقة توضيحية للاتصال بالبيانات من داخل التعليمات البرمجية. يمكن أن تحتوي الوظيفة على روابط إدخال وإخراج متعددة.

مثال ربط الإدخال

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

يمكنك استدعاء هذه الوظيفة بطلب HTTP.

  • يتم تمرير البيانات الأساسية لطلب HTTP باعتباره String للوسيطة inputReq.
  • يتم استرداد إدخال واحد من Table storage، ويتم تمريره باعتباره TestInputData إلى الوسيطة inputData.

لاستقبال مجموعة إدخالات، يمكنك ربطها بـ String[] أو 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;
}

يتم تشغيل هذه الدالة كلما كانت هناك بيانات جديدة في مركز الأحداث المكون. بما أن cardinality مُعيّناً على MANY، فستتلقى الوظيفة مجموعة من الرسائل من مركز الحدث. يتم تحويل EventData من مركز الأحداث إلى TestEventData لتنفيذ الوظيفة.

مثال ربط الإخراج

يمكنك ربط رابط إخراج بقيمة الإرجاع باستخدام $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;
    }
}

إذا كان هناك عدة روابط إخراج، فاستخدم قيمة الإرجاع لواحد منها فقط.

لإرسال قيم إخراج متعددة، استخدم OutputBinding<T> المعرّف في حزمة 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;
    }

يمكنك استدعاء هذه الدالة على كائن HttpRequest . إنه يكتب قيم متعددة على تخزين Queue storage.

HttpRequestMessage وHttpResponseMessage

يتم تعريف أنواع المساعد هذه، والتي تم تصميمها للعمل مع وظائف مشغل HTTP، في azure-functions-java-library:

النوع المتخصص Target الاستخدام النموذجي
HttpRequestMessage<T> مشغل HTTP إحضار الأسلوب أو العناوين أو الاستعلامات
HttpResponseMessage ربط إخراج HTTP إرجاع الحالة بخلاف 200

Metadata

ترسل بعض المشغلات بيانات تعريف المشغل جنبا إلى جنب مع بيانات الإدخال. يمكنك استخدام التعليق التوضيحي @BindingName لربطه وتشغيل بيانات التعريف.

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

في المثال السابق، يرتبط queryValue بمعلّمة سلسلة الاستعلام name في عنوان URL طلب HTTP، http://{example.host}/api/metadata?name=test. فيما يلي مثال آخر يوضح كيفية الربط بـ Id من بيانات تعريف مشغّل قائمة الانتظار.

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

Note

يجب أن يتطابق الاسم الموجود في التعليق التوضيحي مع خاصية بيانات التعريف.

سياق التنفيذ

ExecutionContext، المعرف في azure-functions-java-library، يحتوي على أساليب المساعد المستخدمة للاتصال بوقت تشغيل الوظائف. للحصول على مزيد من المعلومات، راجع المقالة المرجعية ExecutionContext.

Logger

استخدم getLogger، المُعرّف في ExecutionContext، لكتابة سجلات من التعليمة البرمجية للوظيفة.

Example:


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

عرض السجلات والتتبع

يمكنك استخدام Azure CLI لدفق Java stdout وتسجيل stderr وتسجيل التطبيقات الأخرى.

فيما يلي كيفية تكوين تطبيق الوظائف لكتابة سجل التطبيقات باستخدام Azure CLI:

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

لدفق السجل المخرج لتطبيق الوظائف باستخدام Azure CLI، افتح موجه أوامر جديد أوجلسة عمل Terminal أو Bash وأدخل الأمر التالي:

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

يتضمن الأمر az webapp log tail خيارات تصفية الإخراج باستخدام الخيار --provider.

لتنزيل ملفات السجل كملف ZIP واحد باستخدام Azure CLI افتح موجه أوامر جديد أو جلسة عمل Terminal أو Bash ثم أدخل الأمر التالي:

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

يجب تمكين تسجيل نظام الملفات في مدخل Microsoft Azure أو Azure CLI قبل تشغيل هذا الأمر.

متغيرات البيئة

في الوظائف، يتم عرض إعدادات التطبيق، مثل سلاسل اتصال الخدمة، كمتغيرات بيئة أثناء التنفيذ. يمكنك الوصول إلى هذه الإعدادات باستخدام System.getenv("AzureWebJobsStorage").

يحصل المثال التالي على إعداد التطبيق، مع المفتاح المسمى 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);
    }
}

استخدام إدخال التبعية في وظائف Java

تدعم Azure Functions Java نمط تصميم برنامج حقن التبعية (DI)، وهو أسلوب لتحقيق عكس التحكم (IoC) بين الفئات وتبعياتها. توفر وظائف Java Azure ربطا للتكامل مع أطر عمل إدخال التبعية الشائعة في تطبيقات الوظائف الخاصة بك. تحتوي Azure Functions Java SPI على واجهة FunctionInstanceInjector. من خلال تنفيذ هذه الواجهة، يمكنك إرجاع مثيل فئة الدالة الخاصة بك ويتم استدعاء الدالات الخاصة بك على هذا المثيل. يمنح هذا أطر عمل مثل Spring و Quarkus و Google Guice و Dagger وما إلى ذلك القدرة على إنشاء مثيل الدالة وتسجيله في حاوية IOC الخاصة بهم. وهذا يعني أنه يمكنك استخدام أطر عمل إدخال التبعية هذه لإدارة وظائفك بشكل طبيعي.

Note

Microsoft Azure Functions Java SPI Types (azure-function-java-spi) هي حزمة تحتوي على جميع واجهات SPI للجهات الخارجية للتفاعل مع وقت تشغيل وظائف Microsoft Azure.

حقن مثيل الدالة لحقن التبعية

يحتوي azure-function-java-spi على واجهة 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; 

} 

لمزيد من الأمثلة التي تستخدم FunctionInstanceInjector للتكامل مع أطر عمل حقن التبعية، ارجع إلى هذا المستودع.

الخطوات التالية

للحصول على مزيد من المعلومات حول Azure Functions Java، راجع الموارد التالية: