مقدمة
يتم تنفيذ وظيفة مهمة التوقيت في صندوق الربيع. يمكنك استخدام جدولة مهمة التوقيت التي تأتي مع الربيع ، أو يمكنك استخدام الكوارتز الكلاسيكي المصدر الكلاسيكي المدمج لتحقيق جدولة المهام.
ستقدم هذه المقالة بالتفصيل المحتوى ذي الصلة بتنفيذ المهام المحددة في SPRING BOOT ، ومشاركتها للرجوع إليها وتعلمك. لن أقول الكثير أدناه ، دعنا نلقي نظرة على المقدمة التفصيلية معًا.
1. توقيت الربيع
1. طريقة التعبير كرون
استخدام مهام التوقيت المدمجة أمر بسيط للغاية. تحتاج فقط إلى إضافة تعليقات توضيحية مثل ما يلي ولا تحتاج إلى ورث أي واجهة معالجة التوقيت مثل إطار مهمة التوقيت العادي. رمز المثال البسيط هو كما يلي:
package com.power.demo.scheduledtask.simple ؛ import com.power.demo.util.dateTimeutil ؛ استيراد org.springframework.scheduling.annotation.enablescheduling ؛ استيراد org.springframework.scheduling.annotation.scheduled ؛ org.springframework.stereotype.component ؛ import java.util.date ؛@component@enlobschedulingpublicprublic springtaska {/** * cron expression Reference: http://cron.qqe2.com/ **/scheduled (cron = " */5 * *؟ TimerCron () {try {thread.sleep (100) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } system.out.println (string.format ("(timercron) ٪ s تنفيذ كل 5 ثوانٍ ، تسجيل" ، dateTimeUtil.fmtdate (تاريخ جديد ()))) ؛ }} Springtaskaفي الكود أعلاه ، أضف enablesCheduling التعليق التوضيحي إلى فئة ، وإضافة @scheduled إلى الطريقة ، وتكوين تعبير CRON ، ويتم إكمال أبسط مهمة توقيت cron. فيما يلي مكونات تعبير كرون:
scheduled (cron = "[ثواني] [دقائق] [ساعات] [يوم من الشهر] [الشهر] [يوم من الأسبوع] [سنة]")
2. ثابت و ثابت
يزيل التعليق التوضيحي scheduled التعبير CRON ، وهناك طرق تكوين أخرى ، مثل الثابتة و FixedDelay. يطرح المثال التالي أشكالًا مختلفة من جدولة مهمة التوقيت من خلال طرق التكوين المختلفة. رمز المثال هو كما يلي:
package com.power.demo.scheduledtask.simple ؛ import com.power.demo.util.dateTimeutil ؛ استيراد org.springframework.scheduling.annotation.enablescheduling ؛ استيراد org.springframework.scheduling.annotation.scheduled ؛ org.springframework.stereotype.component ؛ import java.util.date ؛@component@enlobschedulingpublicpublicpublicpubling springtaskb { /*ثابتة: تنفيذ مرة أخرى بعد 5 ثوانٍ من النقطة الزمنية الأخيرة* / scheduled (ثابت = 5000) timerfixedrate () } catch (استثناء e) {E.PrintStackTrace () ؛ } system.out.println (string.format ("((ثابت) الوقت الحالي: ٪ s" ، dateTimeUtil.fmtdate (تاريخ جديد ()))) ؛ } /*ثابتة: قم بتنفيذ 5 ثوانٍ بعد آخر نقطة تنفيذ من الوقت* / scheduled (ثابتة) } catch (استثناء e) {E.PrintStackTrace () ؛ } system.out.println (string.format ("((flexdelay) الوقت الحالي: ٪ s" ، dateTimeUtil.fmtdate (تاريخ جديد ()))) ؛ } /*تنفيذ بعد التأخير الأول هو ثانيتين ، ثم تنفيذها كل 5 ثوانٍ وفقًا لقاعدة ثابتة* / scheduled (initialDelay = 2000 ، flexdelay = 5000) public void timerinitdelay () {try {thread.sleep (100) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } system.out.println (string.format ("((initDelay) الوقت الحالي: ٪ s" ، dateTimeutil.fmtdate (date ()))) ؛ }} springtaskbلاحظ الاختلافات الرئيسية:
@Scheduled(fixedRate = 5000) : تنفيذ مرة أخرى بعد 5 ثوانٍ من آخر نقطة تنفيذ
@Scheduled(fixedDelay = 5000) : تنفيذ مرة أخرى بعد 5 ثوانٍ من آخر نقطة تنفيذ
@Scheduled(initialDelay=2000, fixedDelay=5000) : تنفيذ بعد التأخير الأول هو ثانيتين ، ثم اضغط على قاعدة ثابتة لتنفيذ كل 5 ثوانٍ
في بعض الأحيان ، يجب تكوين العديد من المشاريع وتنفيذها فورًا بعد تكوين المهام المجدولة ، وليس مطلوبًا.
3. المنطقة
يحتوي التعليق التوضيحي لـ SCHEDELED أيضًا على منطقة سمات مألوفة ، تشير إلى المنطقة الزمنية. عادة ، إذا لم يتم كتابة ، ستستخدم مهمة التوقيت المنطقة الزمنية الافتراضية للخادم ؛ إذا أرادت مهمتك الركض في منطقة زمنية محددة ونقطة زمنية محددة ، على سبيل المثال ، قد يقوم نظام متعدد اللغات شائع بتشغيل البرامج النصية لتحديث البيانات بانتظام ، يمكنك تعيين منطقة زمنية ، مثل المنطقة الثامنة الشرقية ، والتي يمكن ضبطها على:
zone = "GMT+8:00"
2. الكوارتز
تعد كوارتز واحدة من أكثر أطر عمل جدولة المهام مفتوحة المصدر استخدامًا ، وتنفيذ العديد من الشركات أنظمة إدارة مهام التوقيت الخاصة بها بناءً على ذلك. يوفر Quartz مشغلات مهمة توقيت أكثر استخدامًا ، وهما Simpletrigger و Crontrigger. تأخذ هذه المقالة أكثر crontrigger استخدامًا على نطاق واسع كمثال.
1. إضافة التبعيات
<Rependency> <roupeD> org.quartz-scheduler </rougeid> <StifactId> Quartz </stifactid> <soph>
2. تكوين تعبيرات cron
كما هو مطلوب لكود النموذج ، أضف التكوين التالي إلى ملف Application.Properties:
## Quartz configation configuration job.taska.cron = */3 * * * * *؟
في الواقع ، يمكننا كتابته في الكود أو استمراره في DB ثم قراءته دون تكوينه.
3. أضف المهام الموقوتة للتنفيذ
المهمة 1:
package com.power.demo.scheduledtask.quartz ؛ import com.power.demo.util.dateTimeUtil ؛ import org.quartz.disallowCurentExecution ؛ import org.quartz.job java.util.date ؛ disallowconcurrentExecutionpublic class QuartzTaska تنفذ Job {Override public void execute (JobexecutionContext var1) remexecutionexception {try {thread.sleep (1) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } system.out.println (string.format ("(QuartzTaska) ٪ S تنفيذ كل 3 ثوان ، سجل السجل" ، dateTimeUtil.fmtdate (تاريخ جديد ()))) ؛ }} Quartztaskaالمهمة 2:
package com.power.demo.scheduledtask.quartz ؛ import com.power.demo.util.dateTimeUtil ؛ import org.quartz.disallowCurentExecution ؛ import org.quartz.job java.util.date ؛ disallowcurncurrentExecutionpublic class QuartzTaskb تنفذ Job {Override public void execute (JobexecutionContext var1) remowSexecutionException {try {thread.sleep (100) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } system.out.println (string.format ("((QuartzTaskb) ٪ s تنفيذ كل 7 ثوان ، سجل السجل" ، dateTimeUtil.fmtdate (تاريخ جديد ()))) ؛ }} QuartzTaskBفي الوقت المناسب إرسال مهام البريد الإلكتروني:
package com.power.demo.scheduledtask.quartz ؛ import com.power.demo.cervice.contract.mailservice ؛ import com.power.demo.util.datetimeutil ؛ import com.power.demo.util.powerlogger ؛ org.quartz.disallowConcurrentExecution ؛ استيراد org.quartz.job ؛ استيراد org.quartz.jobexecutioncontext MailSendTask تنفذ Job {Autowired Private MailService Service ؛ Override public void execute (JobexecutionContext var1) يلقي JobexecutionException {system.out.println (string.format ("(MailSendTask) S Send Send كل 5 ثوان" ، DateTimeUtil.fmtdate (تاريخ جديد ())))) ؛ حاول {//thread.sleep(1) ؛ DateTime dtNow = New DateTime (Date ()) ؛ Date StartTime = dtnow.minusmonths (1) .Todate () ؛ // منذ شهر واحد من وقت الانتهاء = dtnow.plusdays (1) .Todate () ؛ MailService.Autosend (وقت البدء ، نهاية الوقت) ؛ PowerLogger.info (string.format ("إرسال البريد ، وقت البدء: ٪ S ، نهاية الوقت: ٪ S" ، DateTimeUtil.fmtdate (وقت البدء) ، DateTimeutil.fmtdate (Endtime))) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ PowerLogger.info (string.format ("إرسال البريد ، يحدث الاستثناء: ٪ s ، وقت الانتهاء: ٪ s" ، e)) ؛ }}} mailSendTaskيبدو تنفيذ المهام بسيطة للغاية ، فقط ورث واجهة الوظائف الكوارتز وإعادة كتابة طريقة التنفيذ.
4. دمج مهام توقيت الكوارتز
كيفية جعل Spring تلقائيًا التعرف على تهيئة مثيلات مهمة توقيت الكوارتز؟ وهذا يتطلب الإشارة إلى الفاصوليا المدارة في الربيع ، وفضح الفاصوليا اللازمة لحاويات الزنبرك ، وحقنها تلقائيًا عن طريق تحديد المصنع الوظيفي.
أولاً ، أضف فصل فئة مصنع الوظائف التي تم حقنها في الربيع:
package com.power.demo.scheduledtask.quartz.config ؛ استيراد org.quartz.spi.triggerfiredbundle ؛ استيراد org.springframework.beans.factory.config.autowirecapablebeanfactory ؛ استيراد org.springframework. org.springframework.context.applicationContextAware ؛ استيراد org.springframework.scheduling.quartz.springbeanjobfactory ؛ public class public atoWireBeanfActory يمتد springbeanjobfactory distractaxtaware /*** يوفر Spring آلية تتيح لك الحصول على ApplicationContext ، أي ، واجهة ApplicationContextAware* لفئة تنفذ واجهة ApplicationContextAware ، ستقوم Spring بتسهيله واتصل به* public VoidSetApplicationContext (ApplicationContxtContxt) ؛ واجهة ، * تمرير السياق الذي تنتمي إليه الفول. **/ Override public void setapplicationContext (سياق Application Context) {beanfactory = context.getautowiReCupableBeanfactory () ؛ } override كائن محمي CreateJobinstance (حزمة triggerfiredbundle النهائية) يلقي استثناء {Final Object Job = super.createjobinstance (حزمة) ؛ Beanfactory.Autowirebean (Job) ؛ عودة الوظيفة ؛ }} AutoWireBeanJobFactoryتعريف QuartzConfig:
package com.power.demo.scheduledtask.quartz.config ؛ استيراد org.springframework.beans.factory.annotation.autowired ؛ import org.springframework.beans.factory.annotation.qualifier org.springframework.context.annotation.configuration ؛ استيراد org.springframework.scheduling.quartz.crontriggerfactorybean ؛ org.springframework.scheduling.quartz.schedulerfactorybean ؛ @classpubulation QAlifier ("QuartzTaskatrigger") private crontriggerfactorybean quartztaskatrigger ؛ @autowired Qalifier ("QuartzTaskBtrigger") private crontriggerfactorybean quartztaskbtrigger ؛ @autowired QAlifier ("MailSendTrigger") private crontriggerfactorybean mailsendtrigger ؛ . } bean public SchedulerFactoryBean SchedulerFactoryBean () {SchedulerFactoryBean Scheduler = new SchedulerFactoryBean () ؛ Scheduler.setJobFactory (AutoWiringSpringBeanJobFactory ()) ؛ // تكوين فئة الوظائف التي تم حقنها بواسطة spring // تعيين crontriggerfactorybean وقم بتعيين مهام Trigger Scheduler.setTriggers (quartztaskatrigger.getObject () ، QuartzTaskBtrigger.getObject () ، mailsendtrigger.getObject ()) ؛ جدولة العودة ؛ }} QuartzConfigبعد ذلك ، قم بتكوين تفاصيل المهمة:
package com.power.demo.scheduledtask.quartz.config ؛ import com.power.demo.util.configutil ؛ import com.power.demo.scheduledtask.quartz.mailsendtask ؛ import com.power.demo.scheduledtask.quartztask.maraska ؛ com.power.demo.scheduledtask.quartz.quartztaskb ؛ import com.power.demo.util.configutil ؛ import org.springframework.context.annotation.bean org.springframework.scheduling.quartz.crontriggerfactorybean ؛ استيراد org.springframework.scheduling.quartz.jobdetailfactorybean // إنشاء JobDetail JobDetailfactorybean مصنع = جديد JobDetailFactoryBean () ؛ مصنع. // قم بتعيين Job Factory.setGroup المقابل ("QuartzTaskGroup") ؛ مصنع. المصنع. Factory.SetDescription ("Test Task A") ؛ عودة المصنع } bean (name = "quartztaskatrigger") public crontriggerfactorybean crontriggerafactorybean () {string cron = configutil.getConfigval (appfield.job_taska_cron) ؛ crontriggerfactorybean stfactory = crontriggerfactorybean () جديد ؛ // تعيين jobdetail stfactory.setJobDetail (JobDetailafactorybean (). stfactory.setStartDelay (1000) ؛ stfactory.setName ("QuartzTaskatrigger") ؛ stfactory.setGroup ("QuartzTaskGroup") ؛ stfactory.setCronexpression (CRON) ؛ إرجاع stfactory. } bean (name = "QuartzTaskB") public dobdetailfactorybean JobDetailbfactorybean () {// إنشاء JobDetail JobDetailfactorybean Factory = new DobDetailfactorybean () ؛ مصنع. // قم بتعيين Job Factory.setGroup المقابل ("QuartzTaskGroup") ؛ Factory.SetName ("QuartzTaskBjob") ؛ المصنع. Factory.SetDescription ("Test Task B") ؛ عودة المصنع } bean (name = "QuartzTaskBtrigger") public crontriggerfactorybean crontriggerbfactorybean () {string cron = configutil.getConfigval (appfield.job_taskb_cron) ؛ crontriggerfactorybean stfactory = crontriggerfactorybean () جديد ؛ // تعيين jobdetail stfactory.setJobDetail (JobDetailBfactorybean (). stfactory.setStartDelay (1000) ؛ stfactory.setName ("QuartzTaskBtrigger") ؛ stfactory.setGroup ("QuartzTaskGroup") ؛ stfactory.setCronexpression (CRON) ؛ إرجاع stfactory. } bean (name = "mailSendTask") public dobdetailfactorybean jobdetailmailfactorybean () {// إنشاء JobDetail JobDetailfactorybean factory = JobDetailFactoryBean () جديد ؛ مصنع. // قم بتعيين Job Factory.setGroup المقابل ("QuartzTaskGroup") ؛ Factory.SetName ("MailSendTaskJob") ؛ المصنع. Factory.SetDescription ("MailSendTrigger") ؛ عودة المصنع } bean (name = "mailSendTrigger") public crontriggerfactorybean crontriggergaLfactorybean () {String cron = configutil.getConfigval (appfield.job_taskmail_cron) ؛ crontriggerfactorybean stfactory = crontriggerfactorybean () جديد ؛ // تعيين jobdetail stfactory.setJobDetail (JobDetailMailfactorybean (). stfactory.setStartDelay (1000) ؛ stfactory.setName ("MailSendTrigger") ؛ stfactory.setGroup ("QuartzTaskGroup") ؛ stfactory.setCronexpression (CRON) ؛ إرجاع stfactory. }} المهامأخيرًا ، ابدأ تطبيق مهمة توقيت التمهيد الربيعي ، وسيتم تنفيذ مهمة توقيت كاملة بناءً على جدول الكوارتز.
في مثال المهمة المحددة ، هناك بريد مينور إرسال البريد المهني. ستشارك المقالة التالية نظام البريد البسيط في تطبيق SPRING Boot باستخدام MongoDB كوسيط تخزين.
القراءة الموسعة:
لدى العديد من الشركات إطار عمل ومهمة المهام الخاصة بها. كيفية دمج مجموعة الكوارتز في SPRING BOOT لتنفيذ تكوين المهمة الموقوتة الديناميكية؟
الرجوع إلى:
//www.vevb.com/article/139591.htm
//www.vevb.com/article/139597.htm
لخص
ما سبق هو المحتوى الكامل لهذه المقالة. آمل أن يكون لمحتوى هذه المقالة قيمة مرجعية معينة لدراسة أو عمل الجميع. إذا كان لديك أي أسئلة ، فيمكنك ترك رسالة للتواصل. شكرا لك على دعمك إلى wulin.com.