إشعار
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تسجيل الدخول أو تغيير الدلائل.
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تغيير الدلائل.
استخدم Durable Functions، وهي ميزة في دالات Azure، لكتابة سير عمل بدون خادم ذات حالة في Java. في هذا البدء السريع، تقوم باستنساخ وتشغيل تطبيق عينات يوضح نمطين شائعين من التوزيع الأوركسترالي:
- تسلسل الدوال: يستدعي الأنشطة بشكل متسلسل (طوكيو → سياتل → لندن).
- الخروج من اللاعبين/الداخل: يقوم بأنشطة المكالمات بالتوازي عبر خمس مدن، ثم يجمع النتائج.
بحلول النهاية، سيكون لديك كلا النظامين الموسيقيين يعملان محليا باستخدام محاكي Durable Task Scheduler ويمكنك عرض حالتهما في لوحة التحكم.
- قم باستنساخ وتحضير مشروع العينات لمشروع Hello Cities.
- قم بإعداد محاكي Durable Task Scheduler وAzurite للتطوير المحلي.
- قم ببناء وتشغيل تطبيق الوظائف وتشغيل كلا التنسيقين.
- راجع حالة التوزيع والنتائج في لوحة تحكم جدولة المهام الدائمة.
المتطلبات المسبقه
- Java 11+ (JDK) مثبت.
- Apache Maven 3.0 أو أحدث.
- دالات Azure Core Tools الإصدار الرابع أو أحدث.
- Docker لتشغيل المحاكي وAzurite.
- قم باستنساخ ><جدولة المهام المتطورة GitHub المستودع لاستخدام عينة البدء السريع.
إعداد محاكي جدولة المهام الدائمة
يوفر محاكي جدولة المهام Durable TasksScheduler بيئة تطوير محلية حتى تتمكن من اختبار التنسيقات الموسيقية دون اشتراك Azure. يتطلب مضيف الوظائف Java أيضا Azurite للتخزين المحلي.
ابدأ كلا الحاويين:
docker run -d --name dtsemulator -p 8080:8080 -p 8082:8082 \
mcr.microsoft.com/dts/dts-emulator:latest
docker run -d --name azurite -p 10000:10000 -p 10001:10001 -p 10002:10002 \
mcr.microsoft.com/azure-storage/azurite
نصيحة
بمجرد تشغيل المحاكي، يمكنك الوصول إلى لوحة تحكم Durable Task Scheduler لمراقبة http://localhost:8082 التنسيقات.
شغل عينة البدء السريع
انتقل إلى دليل نماذج Hello Cities:
cd samples/durable-functions/java/HelloCitiesتحقق من أن الملف
local.settings.jsonيحتوي على التكوين التالي:{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "java", "DURABLE_TASK_SCHEDULER_CONNECTION_STRING": "Endpoint=http://localhost:8080;TaskHub=default;Authentication=None" } }بناء المشروع:
mvn clean packageشغل تطبيق الوظائف:
mvn azure-functions:runفي محطة منفصلة، قم بتفعيل تنسيق سلسلة الدالة :
$response = Invoke-RestMethod -Method POST -Uri http://localhost:7071/api/StartChaining $responseتحتوي الاستجابة على روابط الحالة لنسخة التنسيق. انسخ القيمة
statusQueryGetUriوشغلها للتحقق من النتيجة:Invoke-RestMethod -Uri $response.statusQueryGetUriتشغيل توزيع التوزيع الموسيقي بين التوسع والدخول إلى المروحة :
$response = Invoke-RestMethod -Method POST -Uri http://localhost:7071/api/StartFanOutFanIn Invoke-RestMethod -Uri $response.statusQueryGetUri
الإنتاج المتوقع
يعيد طلب POST استجابة JSON مع عناوين الحالة. على سبيل المثال:
{
"id": "<instanceId>",
"statusQueryGetUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/<instanceId>?code=...",
"sendEventPostUri": "...",
"terminatePostUri": "...",
"purgeHistoryDeleteUri": "..."
}
عندما تستفسر statusQueryGetUri وتكون نتائج التوزيع runtimeStatusCompletedهو ، يمكنك العثور على نتائج التحية في output الحقل. تعود التوزيع الموسيقي المتسلسل:
{
"name": "ChainingOrchestration",
"runtimeStatus": "Completed",
"output": "Hello Tokyo! Hello Seattle! Hello London!"
}
تعود التوزيع الموسيقي بين الجمهور والانضمام:
{
"name": "FanOutFanInOrchestration",
"runtimeStatus": "Completed",
"output": ["Hello Tokyo!", "Hello Seattle!", "Hello London!", "Hello Paris!", "Hello Berlin!"]
}
نصيحة
إذا runtimeStatus ظهر Running السؤال أو Pendingانتظر لحظة واسأل statusQueryGetUri مرة أخرى.
افتح لوحة تحكم جدولة المهام الدائمة على ال http://localhost:8082 لعرض حالة التوزيع وسجل التنفيذ.
افهم الشيفرة
يحتوي المشروع النموذجي في src/main/java/com/example/Functions.java على جميع أنواع الوظائف الثلاثة المطلوبة لتطبيق Durable Functions.
دالة النشاط
يأخذ النشاط SayHello اسم مدينة ويعيد التحية:
@FunctionName("SayHello")
public String sayHello(
@DurableActivityTrigger(name = "city") String city) {
return "Hello " + city + "!";
}
دالات المنسق
يقوم منسق التسلسل بالاتصال SayHello بثلاث مدن:
@FunctionName("ChainingOrchestration")
public String chainingOrchestration(
@DurableOrchestrationTrigger(name = "ctx") TaskOrchestrationContext ctx) {
String result = "";
result += ctx.callActivity("SayHello", "Tokyo", String.class).await();
result += " " + ctx.callActivity("SayHello", "Seattle", String.class).await();
result += " " + ctx.callActivity("SayHello", "London", String.class).await();
return result;
}
يقوم الموزع الخارج/الداخل بجدول الأنشطة بالتوازي:
@FunctionName("FanOutFanInOrchestration")
public List<String> fanOutFanInOrchestration(
@DurableOrchestrationTrigger(name = "ctx") TaskOrchestrationContext ctx) {
String[] cities = {"Tokyo", "Seattle", "London", "Paris", "Berlin"};
List<Task<String>> parallelTasks = new ArrayList<>();
for (String city : cities) {
parallelTasks.add(ctx.callActivity("SayHello", city, String.class));
}
List<String> results = new ArrayList<>();
for (Task<String> task : parallelTasks) {
results.add(task.await());
}
return results;
}
دالات العميل
تبدأ دوال العميل التي تفعل بواسطة HTTP كل عملية تنسيق:
@FunctionName("StartChaining")
public HttpResponseMessage startChaining(
@HttpTrigger(name = "req", methods = {HttpMethod.POST},
authLevel = AuthorizationLevel.ANONYMOUS)
HttpRequestMessage<Void> request,
@DurableClientInput(name = "durableContext") DurableClientContext durableContext) {
DurableTaskClient client = durableContext.getClient();
String instanceId = client.scheduleNewOrchestrationInstance("ChainingOrchestration");
return durableContext.createCheckStatusResponse(request, instanceId);
}
التكوين
تستخدم العينة محاكي Durable Task Scheduler كخلفية للتخزين. يتم تكوين هذا في host.json:
{
"extensions": {
"durableTask": {
"hubName": "default",
"storageProvider": {
"type": "azureManaged",
"connectionStringName": "DURABLE_TASK_SCHEDULER_CONNECTION_STRING"
}
}
}
}
سلسلة الاتصال المحاكي مضبوط في local.settings.json:
{
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "java",
"DURABLE_TASK_SCHEDULER_CONNECTION_STRING": "Endpoint=http://localhost:8080;TaskHub=default;Authentication=None"
}
}
تنظيف الموارد
أوقف حاويات المحاكي عندما تنتهي:
docker stop dtsemulator azurite && docker rm dtsemulator azurite