التشغيل السريع: إنشاء تطبيق Java Durable Functions

استخدم Durable Functions، وهي ميزة في ميزات دالات Azure، لكتابة الدوال ذات الحالة في بيئة بدون خادم. Durable Functions يدير الحالة ونقاط التفتيش وإعادة التشغيل في تطبيقك.

في هذه البداية السريعة، تقوم بإنشاء واختبار تطبيق Durable Functions باللغة Java.

تطبيق Durable Functions الأساسي يحتوي على ثلاث وظائف:

  • وظيفة المنسق (Cities): سير عمل يقوم بتنسيق وظائف أخرى.
  • دالة النشاط (Capitalize): دالة يستدعيها المنسق لأداء العمل وإرجاع قيمة.
  • دالة العميل (StartOrchestration): دالة يتم تفعيلها عبر HTTP وتبدأ المنظم.

يوفر هذا البدء السريع ثلاثة مسارات إعداد. استخدم المحدد في أعلى الصفحة لاختيار النهج المفضل لديك:

  • إعداد يدوي: أنشئ كل ملف يدويا للتحكم الكامل في هيكل المشروع.
  • أمر Maven: استخدم نموذج Maven لدعم المشروع في أمر واحد.
  • تعليمة Visual Studio برمجية: استخدم إضافة VS Code دالات Azure لإنشاء المشروع من خلال واجهة مستخدم موجهة.

المتطلبات المسبقه

للتشغيل السريع، تحتاج إلى:

إذا لم يكن لديك حساب Azure، فأنشئ حساباً مجانياً قبل أن تبدأ.

إضافة التبعيات والمكونات الإضافية المطلوبة إلى مشروعك

أضف الكود التالي إلى ملفك pom.xml . قبل أن تنسخه، استبدلها your-unique-app-name باسم تطبيق وظيفي فريد عالميا. قم بتعديل region، javaVersion، ولتتناسب resourceGroup مع بيئتك.

<properties>
  <azure.functions.maven.plugin.version>1.18.0</azure.functions.maven.plugin.version>
  <azure.functions.java.library.version>3.0.0</azure.functions.java.library.version>
  <durabletask.azure.functions>1.0.0</durabletask.azure.functions>
  <functionAppName>your-unique-app-name</functionAppName>
</properties>

<dependencies>
  <dependency>
    <groupId>com.microsoft.azure.functions</groupId>
    <artifactId>azure-functions-java-library</artifactId>
    <version>${azure.functions.java.library.version}</version>
  </dependency>
  <dependency>
    <groupId>com.microsoft</groupId>
    <artifactId>durabletask-azure-functions</artifactId>
    <version>${durabletask.azure.functions}</version>
  </dependency>
</dependencies>

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.8.1</version>
    </plugin>
    <plugin>
      <groupId>com.microsoft.azure</groupId>
      <artifactId>azure-functions-maven-plugin</artifactId>
      <version>${azure.functions.maven.plugin.version}</version>
      <configuration>
        <appName>${functionAppName}</appName>
        <resourceGroup>java-functions-group</resourceGroup>
        <appServicePlanName>java-functions-app-service-plan</appServicePlanName>
        <region>westus</region>
        <runtime>
          <os>windows</os>
          <javaVersion>11</javaVersion>
        </runtime>
        <appSettings>
          <property>
            <name>FUNCTIONS_EXTENSION_VERSION</name>
            <value>~4</value>
          </property>
        </appSettings>
      </configuration>
      <executions>
        <execution>
          <id>package-functions</id>
          <goals>
            <goal>package</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
    <plugin>
      <artifactId>maven-clean-plugin</artifactId>
      <version>3.1.0</version>
    </plugin>
  </plugins>
</build>

إضافة ملفات JSON المطلوبة

أضف ملف host.json إلى دليل المشروع. يجب أن يبدو مشابها للمثال التالي:

{
  "version": "2.0",
  "logging": {
    "logLevel": {
      "DurableTask.AzureStorage": "Warning",
      "DurableTask.Core": "Warning"
    }
  },
  "extensions": {
    "durableTask": {
      "hubName": "JavaTestHub"
    }
  },
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[4.*, 5.0.0)"
  }
}

ملحوظة

Durable Functions for Java يتطلب حزمة التوسعات v4. الحزم السابقة غير مدعومة. لمزيد من المعلومات، راجع وثائق حزم الامتدادات.

تحتاج Durable Functions إلى موفر تخزين لتخزين حالة وقت التشغيل. أضف ملف local.settings.json إلى دليل المشروع لتكوين موفر التخزين. لاستخدام تخزين Azure كموفر، قم بتعيين قيمة AzureWebJobsStorage إلى سلسلة الاتصال لحساب تخزين Azure الخاص بك:

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "<your storage account connection string>",
    "FUNCTIONS_WORKER_RUNTIME": "java"
  }
}

مهم

يمكن أن يحتوي ملف local.settings.json على أسرار. تأكد من إضافتها إلى ملف .gitignore الخاص بك لتجنب التزامها بنظام التحكم في المصدر.

أنشئ منسق Durable Functions، ونشاطك، ووظائف العميل الخاصة بك

يظهر نموذج التعليمات البرمجية التالي مثالا أساسيا لكل نوع من أنواع الدالات:

import com.microsoft.azure.functions.annotation.*;
import com.microsoft.azure.functions.*;
import java.util.*;

import com.microsoft.durabletask.*;
import com.microsoft.durabletask.azurefunctions.DurableActivityTrigger;
import com.microsoft.durabletask.azurefunctions.DurableClientContext;
import com.microsoft.durabletask.azurefunctions.DurableClientInput;
import com.microsoft.durabletask.azurefunctions.DurableOrchestrationTrigger;

public class DurableFunctionsSample {
    /**
     * This HTTP-triggered function starts the orchestration.
     */
    @FunctionName("StartOrchestration")
    public HttpResponseMessage startOrchestration(
            @HttpTrigger(name = "req", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> request,
            @DurableClientInput(name = "durableContext") DurableClientContext durableContext,
            final ExecutionContext context) {
        context.getLogger().info("Java HTTP trigger processed a request.");

        DurableTaskClient client = durableContext.getClient();
        String instanceId = client.scheduleNewOrchestrationInstance("Cities");
        context.getLogger().info("Created new Java orchestration with instance ID = " + instanceId);
        return durableContext.createCheckStatusResponse(request, instanceId);
    }

    /**
     * This is the orchestrator function, which can schedule activity functions, create durable timers,
     * or wait for external events in a way that's completely fault-tolerant.
     */
    @FunctionName("Cities")
    public String citiesOrchestrator(
            @DurableOrchestrationTrigger(name = "taskOrchestrationContext") TaskOrchestrationContext ctx) {
        String result = "";
        result += ctx.callActivity("Capitalize", "Tokyo", String.class).await() + ", ";
        result += ctx.callActivity("Capitalize", "London", String.class).await() + ", ";
        result += ctx.callActivity("Capitalize", "Seattle", String.class).await() + ", ";
        result += ctx.callActivity("Capitalize", "Austin", String.class).await();
        return result;
    }

    /**
     * This is the activity function that is invoked by the orchestrator function.
     */
    @FunctionName("Capitalize")
    public String capitalize(@DurableActivityTrigger(name = "name") String name, final ExecutionContext context) {
        context.getLogger().info("Capitalizing: " + name);
        return name.toUpperCase();
    }
}

أنشئ مشروع Durable Functions محلي باستخدام أمر Maven

قم بتشغيل الأمر التالي لإنشاء مشروع يحتوي على الوظائف الأساسية لتطبيق Durable Functions:

mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DarchetypeVersion=1.62 -Dtrigger=durablefunctions

في المطالبات، قم بتوفير المعلومات التالية:

موجه الإجراء
معرف المجموعة أدخل com.function.
معرف البيانات الاصطناعية أدخل myDurableFunction.
إصدار حدد 1.0-SNAPSHOT.
الحزمة أدخل com.function.
السنة أدخل Y وحدد Enter للتأكيد.

الآن لديك مشروع محلي يحتوي على الوظائف الثلاث الموجودة في تطبيق Durable Functions الأساسي. النمط الأصلي يتضمن com.microsoft:durabletask-azure-functions كتبعية في ملف pom.xml الخاص بك تلقائيا.

تكوين مزود التخزين الخلفي ل Durable Functions

تحتاج Durable Functions إلى موفر تخزين لتخزين حالة وقت التشغيل. يمكنك تعيين تخزين Azure كموفر تخزين في local.settings.json. استخدم سلسلة الاتصال حساب تخزين Azure كقيمة ل AzureWebJobsStorage مثل في هذا المثال:

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "<your storage account connection string>",
    "FUNCTIONS_WORKER_RUNTIME": "java"
  }
}

مهم

يمكن أن يحتوي ملف local.settings.json على أسرار. تأكد من إضافتها إلى ملف .gitignore الخاص بك لتجنب التزامها بنظام التحكم في المصدر.

إنشاء مشروعك المحلي

  1. في تعليمة Visual Studio برمجية، اختر F1 (أو اختر Ctrl/Cmd+Shift+P) لفتح لوحة الأوامر. عند التوجيه (>)، أدخل ثم اختر دالات Azure: إنشاء مشروع جديد.

    لقطة شاشة لأمر إنشاء Project جديد دالات Azure في لوحة أوامر تعليمة Visual Studio برمجية.

  2. حدد استعراض. في مربع الحوار تحديد مجلد ، انتقل إلى مجلد لاستخدامه لمشروعك، ثم اختر تحديد.

  3. في المطالبات، قم بتوفير المعلومات التالية:

    موجه الإجراء
    تحديد لغة حدد Java.
    اختر نسخة من Java حدد Java 8 أو أحدث. حدد إصدار Java الذي تعمل عليه وظائفك في Azure، وإصدار قمت بالتحقق منه محليا.
    إدخال معرف مجموعة أدخل com.function.
    إدخال معرف بيانات اصطناعية أدخل myDurableFunction.
    إدخال إصدار أدخل 1.0-SNAPSHOT.
    إدخال اسم حزمة أدخل com.function.
    إدخال اسم تطبيق أدخل myDurableFunction.
    اختر أداة البناء لمشروع Java حدد Maven.
    تحديد الطريقة التي تريد فتح مشروعك بها حدد فتح في نافذة جديدة.

لديك الآن مشروع يحتوي على مثال لدالة HTTP. يمكنك إزالة دالة HTTP المولدة، لأنك تضيف Durable Functions في الخطوة التالية.

إضافة دالات إلى المشروع

  1. في لوحة الأوامر، أدخل ثم اختر دالات Azure: إنشاء وظيفة.

  2. بالنسبة إلى تغيير عامل تصفية القالب، حدد الكل.

  3. في المطالبات، قم بتوفير المعلومات التالية:

    موجه الإجراء
    تحديد قالب لدالتك حدد DurableFunctionsOrchestration.
    إدخال اسم حزمة أدخل com.function.
    توفير اسم دالة أدخل DurableFunctionsOrchestrator.
  4. في مربع الحوار، اختر تحديد حساب تخزين لإعداد حساب تخزين، ثم اتبع المطالبات.

يجب أن يكون لديك الآن الوظائف الأساسية الثلاث التي تم إنشاؤها لتطبيق Durable Functions.

قم بتكوين pom.xml وhost.json Durable Functions

أضف التبعية التالية إلى ملف pom.xml:

<dependency>
  <groupId>com.microsoft</groupId>
  <artifactId>durabletask-azure-functions</artifactId>
  <version>1.0.0</version>
</dependency>

أضف الخاصية extensions إلى ملف host.json الخاص بك. إذا كان للملف خصائص أخرى بالفعل، قم بدمج الكتلة extensions في JSON الحالي:

{
  "version": "2.0",
  "extensions": {
    "durableTask": {
      "hubName": "JavaTestHub"
    }
  },
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[4.*, 5.0.0)"
  }
}

اختبِر الدالة محليًا

يمنحك دالات Azure Core Tools القدرة على تشغيل مشروع دالات Azure على جهاز التطوير المحلي الخاص بك.

  1. إذا كنت تستخدم تعليمة Visual Studio برمجية، فافتح نافذة طرفية جديدة وقم بتشغيل الأوامر التالية لإنشاء المشروع:

    mvn clean package
    

    ثم قم بتشغيل الدالة الدائمة:

    mvn azure-functions:run
    
  2. في لوحة المحطة الطرفية، انسخ نقطة نهاية عنوان URL للدالة التي تم تشغيلها من قبل HTTP.

    لقطة شاشة لمخرجات الطرفية تظهر عنوان نقطة نهاية HTTP لوقت التشغيل المحلي دالات Azure.

  3. استخدم أداة اختبار HTTP الخاصة بك لإرسال طلب HTTP POST إلى نقطة نهاية الرابط.

    يجب أن تبدو الاستجابة مشابهة للنص التالي:

    {
        "id": "d1b33a60-333f-4d6e-9ade-17a7020562a9",
        "purgeHistoryDeleteUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d1b33a60-333f-4d6e-9ade-17a7020562a9?code=ACCupah_QfGKo...",
        "sendEventPostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d1b33a60-333f-4d6e-9ade-17a7020562a9/raiseEvent/{eventName}?code=ACCupah_QfGKo...",
        "statusQueryGetUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d1b33a60-333f-4d6e-9ade-17a7020562a9?code=ACCupah_QfGKo...",
        "terminatePostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d1b33a60-333f-4d6e-9ade-17a7020562a9/terminate?reason={text}&code=ACCupah_QfGKo..."
    }
    

    الاستجابة هي النتيجة الأولية لدالة HTTP. يتيح لك معرفة أن التزامن الدائم بدأ بنجاح. لا يعرض بعد النتيجة النهائية للتنسيق. تتضمن الاستجابة بعض عناوين URL المفيدة. في الوقت الحالي، استعلم عن حالة التنسيق.

  4. انسخ قيمة URL ل statusQueryGetUri، والصقها في شريط عناوين المستعرض، وقم بتنفيذ الطلب. بدلا من ذلك، يمكنك الاستمرار في استخدام أداة اختبار HTTP لإصدار طلب GET.

    يستعلم الطلب عن مثيل التنسيق للحالة. يجب أن ترى أن المثيل قد انتهى وأنه يتضمن مخرجات أو نتائج الدالة الدائمة، كما هو الحال في هذا المثال:

    {
        "name": "Cities",
        "instanceId": "d1b33a60-333f-4d6e-9ade-17a7020562a9",
        "runtimeStatus": "Completed",
        "input": null,
        "customStatus": "",
        "output":"TOKYO, LONDON, SEATTLE, AUSTIN",
        "createdTime": "2022-12-12T05:00:02Z",
        "lastUpdatedTime": "2022-12-12T05:00:06Z"
    }