لفهم سبب عدم سلوك الـ /api/2
كما هو متوقع، يتعين علينا التفكير في كيفية عمل الـ Async Controllers في Spring. عندما تقوم بإرجاع Callable
من طريقة الوحدة التحكم، فإن Spring يأخذ هذا الـ Callable
ويضعه في قائمة الأعمال القادمة لمواضيع ThreadPool
الخاص به، وليس لديه تأثير مباشر على قدرة Tomcat على استقبال المزيد من الطلبات.
في هذه الحالة، على الرغم من أن الـ Callable
يبدأ في تنفيذه في خيط مختلف (وبالتالي يتوفر الخيط الرئيسي لـ Tomcat لمعالجة طلبات جديدة)، إلا أن خيط الـ ThreadPool
لا يمكنه أن يعالج طلبات جديدة حتى يكتمل تنفيذ الـ Callable
. هذا يعني أنه بمجرد استقبال طلب /api/2
، ستقوم Spring بإضافة الـ Callable
للتنفيذ في خيط منفصل، ولكن الـ ThreadPool
لن يكون قادرًا على استقبال أي طلبات جديدة حتى ينتهي تنفيذ الـ Callable
.
لحل هذه المشكلة، يمكنك زيادة حجم ThreadPool
لـ Tomcat لتتيح له استقبال المزيد من الطلبات في نفس الوقت. يمكنك فعل ذلك عن طريق ضبط خاصية server.tomcat.max-threads
في ملف تكوين Spring Boot الخاص بك. ومن المهم أيضًا فهم أن استخدام Callable
يعني أن لديك القدرة على تنفيذ العمليات الطويلة في خلفية منفصلة بينما تبقى الخيوط الرئيسية متاحة لخدمة المزيد من الطلبات.
المزيد من المعلومات
بالطبع! عند استخدام الـ Callable
في Spring، يتم إنشاء مهمة (Task
) جديدة في ThreadPool
خاص بـ Tomcat لتنفيذ الكود الموجود داخل الـ Callable
. عندما يتم استدعاء الـ Callable
، يتم وضعها في قائمة الانتظار في ThreadPool
، وعندما يتاح له خيط فرعي متاح في الـ ThreadPool
، يتم تنفيذ الكود الموجود في الـ Callable
في هذا الخيط.
ومن الجدير بالذكر أن استخدام الـ Callable
في Spring لا يؤثر على عدد خيوط الـ Tomcat المتاحة لخدمة الطلبات الجديدة، ولكنه يؤثر على الـ ThreadPool
الذي يستخدمه Tomcat لتنفيذ المهام الخلفية. لذا، إذا كانت لديك حالة حيث ترغب في السماح لـ Tomcat بخدمة المزيد من الطلبات أثناء تنفيذ مهمة طويلة، يجب زيادة حجم ThreadPool
لـ Tomcat.
إذا كنت ترغب في مزيد من التفاصيل حول كيفية زيادة حجم ThreadPool
في Tomcat في Spring Boot، فأنا هنا للمساعدة.