مقدمة
من أجل ضمان توافر عالي وارتفاع التزامن في التطبيقات ، يتم نشر عقد متعددة بشكل عام ؛ بالنسبة لمهام التوقيت ، إذا كانت كل عقدة تنفذ مهام التوقيت الخاصة بها ، فإنها تستهلك موارد النظام من ناحية.
من ناحية أخرى ، يتم تنفيذ بعض المهام عدة مرات ، مما قد يتسبب في مشاكل منطق التطبيق ، لذلك هناك حاجة إلى نظام جدولة موزعة لتنسيق كل عقدة لأداء مهام التوقيت.
الربيع يدمج الكوارتز
الكوارتز هو نظام جدولة المهام الناضجة. الربيع متوافق مع الكوارتز لسهولة التطوير. دعونا نرى كيفية دمجها:
1.MAVEN ملف التبعية
<Rependencies> <Rependency> <roupiD> org.springframework </rougiD> <StifactId> Spring-Core </shintifactid> <sophy> 4.3.5 <sophy> 4.3.5.release </version> </sependency> <redence> <roupiD> org.springframework </rougeid> <StifactId> spring-tx </intifactid> <sophy> 4.3.5.5 <sophy> 4.3.5.release </version> </sependency> <redence> <roupiD> org.quartz-scheduler </rougeid> <StifactId> quartz </sontifactid> <soph> <splection> 5.1.29 </version> </sependency> </rependencies>
أهمها المكتبات ذات الصلة بنابض ومكتبات الكوارتز ومكتبات سائق MySQL. ملاحظة: يتطلب الجدولة الموزعة استخدام قاعدة البيانات ، ويتم تحديد MySQL هنا ؛
2. تكوين الوظيفة
هناك طريقتان لتكوين الوظائف ، هما
2.1Methodinvokingjobdetailfactorybean
عندما ترغب في استدعاء طريقة لحبة معينة ، يكون التكوين المحدد كما يلي:
<bean id = "firsttask"> <property name = "targetObject" ref = "firstService" /> <property name = "targetmethod" value = "service" /> </ea
2.2 jobdetailfactorybean
هذه الطريقة أكثر مرونة ويمكنها تعيين المعلمات المارة ، على النحو التالي:
<bean id = "firsttask"> <property name = "jobclass" value = "zh.maven.squartz.task.firsttask"/> <property name = "JobDatamap"> <map> <intrade key = "firstservice" value-ref = "firstservice"/> </map> </property>
يرث فئة المهام المحددة بواسطة Jobclass Quartzjobbean وينفذ طريقة التنفيذ ؛ يتم استخدام JobDatamap لتمرير البيانات إلى الوظيفة
3. تكوين المشغلات المستخدمة للجدولة
كما يتم توفير نوعين من الزناد: SimpleTriggerfactorybean و CrontriggerFactorybean
التركيز على crontriggerfactorybean ، هذا النوع أكثر مرونة ، على النحو التالي:
<bean id = "firstcrontrigger"> <property name = "JobDetail" ref = "firstTask" /> <property name = "cronexpression" value = "0/5 *؟ * *" /> </bean>
يحدد JobDetail المهمة التي تم تكوينها في الخطوة 2 ، ويتم تكوين cronexpression لتنفيذ المهمة كل 5 ثوان ؛
4. تكوين SchedulerFactoryBean من جدولة الكوارتز
هناك أيضًا طريقتان: Memory Ramjobstore وطرق قاعدة البيانات
4.1 ذاكرة Ramjobstore
يتم تخزين المعلومات المتعلقة بالوظيفة في الذاكرة ، وتخزن كل عقدة خاصة بها ، وتعزل بعضها البعض ، ويتم تكوينها على النحو التالي:
<Bean> <property name = "triggers"> <list> <ref bean = "firstcrontrigger"/> </list> </sprement> </bean>
4.2 طريقة قاعدة البيانات
يتم تخزين المعلومات ذات الصلة للوظيفة في قاعدة البيانات. تشارك جميع العقد قاعدة البيانات. تتواصل كل عقدة من خلال قاعدة البيانات لضمان تنفيذ الوظيفة فقط على عقدة واحدة في نفس الوقت.
إذا فشلت عقدة ، فسيتم تعيين المهمة في العقد الأخرى للتنفيذ. التكوين المحدد هو كما يلي:
<bean id = "dataSource" تدمير method = "close"> <property name = "driverclass" value = "com.mysql.jdbc.driver" /> <property name = "jdbcurl" value = "jdbc: mysql: // localhost: 3306 /quartz" /> </bean> <boet> <property name = "datasource" ref = "datasource"/> <property name = "configlocation" value = "classpath: quartz.properties"/> <property name = "triggers"> <list> <ref bean = "firstcrontrigger"/> </list> </property>
يتم استخدام مصدر البيانات لتكوين مصادر البيانات والمعلومات المتعلقة جدول البيانات. يمكنك تنزيل حزمة GZ من الموقع الرسمي. يقع ملف SQL ضمن المسار: مستندات/DBTABLES ، والذي يوفر ملف SQL لقاعدة البيانات السائدة ؛
ملف quartz.properties الذي تم تكوينه في configlocation هو في حزمة org.quartz من Quartz.jar ، والتي توفر بعض البيانات الافتراضية ، مثل org.quartz.jobstore.class
org.quartz.jobstore.class: org.quartz.simpl.Ramjobstore
تحتاج هنا إلى نسخ Quartz.Properties وإجراء بعض التعديلات. التعديلات المحددة هي كما يلي:
org.quartz.scheduler.instanceid: autoorg.quartz.jobstore.class: org.quartz.impl.jdbcjobstore.jobstorexorg.quartz.jobstore.iscluster: trueorg.quartz.jobstore.clustercheckin.
5. الفئات ذات الصلة
الطبقة العامة FirstTask يمتد Quartzjobbean {private firstservice firstservice ؛ Override محمية void executeinternal (JobexecutionContext Context) يلقي JobexecutionException {firstservice.service () ؛ } public void setFirstService (firstservice firstservice) {this.firstService = firstService ؛ }}يرث FirstTask Quartzjobbean ، ويقوم بتنفيذ طريقة تنفيذ ، ويدعو Firstservice
الخدمات العامة في الطبقة العامة تتسلسل تسلسل {private static final long serialversionuid = 1L ؛ خدمة void العامة () {system.out.println (new SimplEdateFormat ("Yyymmdd HH: mm: ss"). التنسيق (تاريخ جديد ()) + "--- ابدأ FirstService") ؛ حاول {thread.sleep (2000) ؛ } catch (interruptedException e) {E.PrintStackTrace () ؛ } system.out.println (جديد simpleateformat ("yyymmdd hh: mm: ss"). التنسيق (تاريخ جديد ()) + "--- نهاية FirstService") ؛ }}تحتاج FirstService إلى توفير واجهة تسلسل لأنه يجب حفظها في قاعدة البيانات ؛
تطبيق الفئة العامة {public static void main (string [] args) {AbstractapplicationContext context = new ClassPathxMlAppLicationContext ("quartz.xml") ؛ }}يتم استخدام الفئة الرئيسية لتحميل ملف تكوين الكوارتز ؛
اختبار الجدولة الموزعة
1. ابدأ التطبيق مرتين في نفس الوقت ومراقبة السجل:
20180405 14:48:10 --- ابدأ FirstService
20180405 14:48:12 ---- End Firstservice
20180405 14:48:15 --- بدء FirstService
20180405 14:48:17 ---- End Firstservice
من بينها ، A1 لديه إخراج السجل ، ولكن A2 لا ؛ عند إيقاف A1 ، يحتوي A2 على إخراج السجل ؛
2. أضف وظائف جديدة وإنشاء وظائف جديدة: SecondTask و SecondService على التوالي. إضافة ملفات التكوين ذات الصلة في نفس الوقت. ابدأ التطبيق مرتين ومراقبة السجل:
سجل A1 كما يلي:
20180405 15:03:15 --- ابدأ FirstService
20180405 15:03:15 --- ابدأ SecondService
20180405 15:03:17 ---- End FirstService
20180405 15:03:17 --- نهاية SecondService
20180405 15:03:20 --- ابدأ FirstService
20180405 15:03:22 ---- End Firstservice
20180405 15:03:25 --- ابدأ FirstService
20180405 15:03:27 ---- End Firstservice
سجل A2 كما يلي:
20180405 15:03:20 --- ابدأ SecondService
20180405 15:03:22 --- نهاية SecondService
20180405 15:03:25 --- ابدأ SecondService
20180405 15:03:27 --- نهاية SecondService
يمكن العثور على أن كلا من A1 و A2 لهما مهام تنفيذ ، ولكن لن يتم تنفيذ نفس المهمة إلا في عقدة واحدة في نفس الوقت ، ومن الممكن تعيينها في العقد الأخرى بعد اكتمال التنفيذ ؛
3. إذا كان وقت الفاصل الزمني أقل من وقت تنفيذ المهمة ، على سبيل المثال ، يتم تغيير هنا إلى النوم (6000)
سجل A1 كما يلي:
20180405 15:14:40 --- ابدأ FirstService
20180405 15:14:45 --- بدء FirstService
20180405 15:14:46 ---- End Firstservice
20180405 15:14:50 --- ابدأ FirstService
20180405 15:14:50 --- ابدأ SecondService
20180405 15:14:51 --- نهاية FirstService
سجل A2 كما يلي:
20180405 15:14:40 --- ابدأ SecondService
20180405 15:14:45 --- ابدأ SecondService
20180405 15:14:46 --- نهاية SecondService
20180405 15:14:51 --- نهاية SecondService
الفاصل الزمني هو 5 ثوان ، في حين أن تنفيذ المهمة يستغرق 6 ثوان. مراقبة السجل ، يمكنك أن تجد أن المهمة لم تنته بعد وبدأت مهمة جديدة. قد يسبب هذا الموقف مشاكل منطقية في التطبيق ، وهو في الواقع مسألة ما إذا كانت المهمة يمكن أن تدعم المسلسل ؛
4.
إضافة @ @ @starenctionexecution endation on firstTask و SecondTask على التوالي ، ونتائج السجل هي كما يلي:
سجل A1 كما يلي:
20180405 15:32:45 --- بدء FirstService
20180405 15:32:51 --- نهاية FirstService
20180405 15:32:51 --- ابدأ FirstService
20180405 15:32:51 --- ابدأ SecondService
20180405 15:32:57 ---- End Firstservice
20180405 15:32:57 --- نهاية SecondService
20180405 15:32:57 --- ابدأ FirstService
20180405 15:32:57 --- ابدأ SecondService
سجل A2 كما يلي:
20180405 15:32:45 --- ابدأ SecondService
20180405 15:32:51 --- نهاية SecondService
مراقبة السجلات ، يمكنك أن تجد أن المهمة ستبدأ مهمة جديدة فقط بعد النهاية ، وتحقق تسلسل المهمة ؛
لخص
تهدف هذه المقالة إلى فهم بديهي لجدولة SPRING+Quartz الموزعة وحل المشكلة من خلال الاستخدام الفعلي. بالطبع ، قد يكون هناك العديد من الأسئلة مثل كيفية جدولة ذلك ، وماذا سيحدث إذا تم تعليق قاعدة البيانات ، وما إلى ذلك ، والمزيد من الفهم المتعمق.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.