خلفية
أثناء تطوير المشروع ، غالبًا ما نحتاج إلى أداء مهام دورية. يمكن أن يساعدنا في تحقيق ذلك بشكل جيد من خلال مهام التوقيت.
دعنا نقارن العديد من أطر عمل المهام ذات التوقيت الشائع:
كما يتضح من الجدول أعلاه ، يحتوي إطار عمل الربيع على وظائف كاملة وبسيطة وسهلة الاستخدام. جدول الربيع مؤهل بالكامل للمشاريع الصغيرة والمتوسطة الحجم.
1. جدول تكامل سبرينج بوت
1.1 إضافة حزمة تبعية Maven
نظرًا لأنه يتم تضمين جدول الربيع في الوحدة النمطية الأساسية لثلاثة أدوات الربيع ، لا يلزم تبعيات إضافية.
<ependencies> <Rependency> <roupiD> org.springframework.boot </groupId> <StifactId> spring-boot-starter </stifactid> </redepency> <redency> <roupid> org.springframework.boot </rougiDid> </premency> </تبعيات>
1.2 فئة البدء ، أضف شرح شرح بدء التشغيل
يمكن لإضافة التعليق التوضيحي enablesCheduling إلى فئة أو تكوين Springboot تمكين مهام التوقيت.
@enblescheduling@springbootapplicationpublicpublic class schedulePlication {public static void main (string [] args) {springapplication.run (SchedulePlication.class ، args) ؛}}1.3. إضافة المهام التوقيت
سنقدم أمثلة على جدولين المهام الثلاثة لجدول الربيع.
1.3.1 تعبيرات كرون
على غرار قواعد تعريف وقت التعبير CRON ضمن Linux. يتكون تعبير CRON من 6 أو 7 مساحات مفصولة بحقول الوقت ، كما هو مبين في الشكل أدناه:
تعبيرات شائعة:
خذ كستناء:
أضف طريقة عمل () ، والتي يتم تنفيذها كل 10 ثوان.
ملاحظة: عندما يتجاوز وقت تنفيذ الطريقة تردد جدولة المهمة ، سيتم تنفيذ المجدول في الدورة التالية.
على سبيل المثال: على افتراض أن طريقة العمل () تبدأ في تنفيذها في الثانية الثانية ويتم تنفيذ الطريقة لمدة 12 ثانية ، ثم في المرة التالية التي يتم فيها تنفيذ طريقة العمل () هي الثانية العشرين.
ComponentPublic Class MyTask {scheduled (cron = "0/10 * * * *")1.3.2 مهام الفاصل الزمني الثابت
يتم حساب وقت تنفيذ المهمة التالي من وقت نهاية تنفيذ المهمة الأخير للطريقة. وابدأ التنفيذ الدوري للمهام مع هذه القاعدة.
خذ كستناء:
أضف طريقة عمل () وتنفيذها كل 10 ثوان.
على سبيل المثال: لنفترض أن طريقة العمل () تبدأ في تنفيذها في الثانية 0 ويتم تنفيذ الطريقة لمدة 12 ثانية ، ثم في المرة التالية التي يتم فيها تنفيذ طريقة العمل () هي الثانية 22.
scheduled (flexdelay = 1000*10) عمل باطل عام () {// منطق تنفيذ المهام}1.3.3 مهام التردد الثابتة
تنفيذ المهام على التردد المحدد وابدأ التنفيذ الدوري للجدولة مع هذه القاعدة.
خذ كستناء:
أضف طريقة عمل () ، والتي يتم تنفيذها كل 10 ثوان.
ملاحظة: عندما يتجاوز وقت تنفيذ الطريقة تواتر جدولة المهمة ، سيقوم المجدول بتنفيذ المهمة التالية فور تنفيذ الطريقة الحالية.
على سبيل المثال: افترض أن طريقة العمل () تبدأ في التنفيذ في الثانية 0 ويتم تنفيذ الطريقة لمدة 12 ثانية ، ثم في المرة التالية التي يتم فيها تنفيذ طريقة العمل () هي الثانية الثانية عشرة.
scheduled (ثابت = 1000*10) عمل باطل عام () {// منطق تنفيذ المهمة}2. قم بتكوين تجمع مؤشر ترابط المهام
في المشاريع الفعلية ، قد يحدد نظامنا مهام التوقيت المتعددة. ثم يمكن تنفيذ مهام التوقيت المتعددة بشكل مستقل ومما يوازي.
من خلال النظر إلى org.springframework.scheduling.config.ScheduleDtaskregistrar ، وجد أن الربيع سيقوم بإنشاء تجمع واحد متخلف بشكل افتراضي. هذا يمكن أن يكون قاتلا لمهامنا المتعددة. عندما يتم تنفيذ مهام متعددة بشكل متزامن (أو يجب تنفيذها في نفس الوقت) ، فإن جدولة المهام سيواجه انجراف الوقت وسيكون وقت تنفيذ المهمة غير مؤكد.
جداول الفراغ المحمية () {if (this.taskscheduler == null) {this.localexecutor = eversorors.newsinglethreadscheduledexecutor () ؛ this.taskscheduler = concurrenttasscscheduler (this.localexecutor) ؛} // shfer ...}2.1 تجمع الخيوط المخصصة
تمت إضافة فئة التكوين لتنفيذ واجهة SchedulingConfigurer. أعد كتابة طريقة التكوينات وتعيين تجمع مؤشرات ترابط مخصص من خلال TaskRegistrar.
ConfigurationPublic Class ScheduleConfig تنفذ SchedulingConfigurer {OverRidepublic void configureTasks (ScheduleDTaskregistrar Taskregistrar) {taskregistrar.setscheduler (taskexecutor ()) ؛ Executors.NewScheduledThreadPool (20) ؛}}3. مشاكل في التطبيقات العملية
3.1 مشكلات بدء التشغيل والإغلاق في تطبيقات الويب
نحن نعلم أنه سيتم تفريغ الفاصوليا المحملة أو تهيئتها من خلال الربيع تلقائيًا (تم تدميرها) عند إيقاف الخدمة. ومع ذلك ، نظرًا لأن مؤشرات الترابط هي مستوى JVM ، إذا بدأ المستخدم مؤشر ترابط في تطبيق ويب ، فلن تكون دورة حياة هذا الموضوع متسقة مع تطبيق الويب. وهذا يعني ، حتى لو تم إيقاف تطبيق الويب ، لا يزال الخيط لا ينتهي (الموت).
حل:
1) تتم تهيئة الكائن الحالي خلال الربيع
عند إلغاء تثبيت الربيع (يدمر) مثيلًا ، سيتم استدعاء طريقة التدمير للمثال. تم تنفيذها عن طريق تنفيذ طريقة التخلص من التخلص من طريقة التدمير. أغلق بفعالية الخيط في طريقة التدمير.
@componentpubublic class myTask تنفذ dispositableBean {Overridepublic void Dride () يلقي الاستثناء {// أغلق مؤشر الترابط أو pool pool threadpooltaskscheduler scheduler = (threadpooltascscheduler) applicationContext.getBean ("Screeduler") ؛2) لا يتم تهيئة الكائن الحالي (مُدار) خلال الربيع
ثم يمكننا إضافة مستمع سياق Servlet لإغلاق مؤشر الترابط بنشاط عند إيقاف خدمة Servlet.
الفئة العامة myTaskListerenter تنفذ servletContextListener {Overridepublic void contextDestRoyed (servletContextevent Arg0) {// Close Ordure أو Thread Pool} // shomit ...}3.2 قضايا النشر الموزعة
في المشاريع الفعلية ، سيتم عادة نشر نظامنا في مجموعات أو موزعة أو استرداد كارثة. ثم قد تواجه مهام التوقيت مشاكل في التزامن ، أي أن المهمة نفسها تعمل على خوادم متعددة في نفس الوقت.
الحل (القفل الموزع):
1) قفل جدول قاعدة البيانات
2) ذاكرة التخزين المؤقت الوسيطة
3) تم تنفيذها من خلال Zookeeper
تلخيص:
يوفر لنا جدول الربيع إطار عمل توقيت بسيط وسريع وفعال ومستقر. ومع ذلك ، من الضروري النظر في دورة حياة الخيوط وقضايا النشر الموزعة.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.