คำนำ
ฟังก์ชั่นงานเวลาถูกนำไปใช้ในการบูตฤดูใบไม้ผลิ คุณสามารถใช้การกำหนดเวลางานเวลาที่มาพร้อมกับฤดูใบไม้ผลิหรือคุณสามารถใช้ส่วนประกอบโอเพ่นซอร์สคลาสสิกแบบรวมควอตซ์เพื่อให้ได้การกำหนดเวลางาน
บทความนี้จะแนะนำรายละเอียดเนื้อหาที่เกี่ยวข้องเกี่ยวกับการใช้งานที่กำหนดเวลาในการบูตฤดูใบไม้ผลิและแบ่งปันสำหรับการอ้างอิงและการเรียนรู้ของคุณ ฉันจะไม่พูดด้านล่างมากนักลองมาดูการแนะนำรายละเอียดด้วยกัน
1. ตัวจับเวลาฤดูใบไม้ผลิ
1. วิธีการแสดงออกของ cron
การใช้งานเวลาในตัวนั้นง่ายมาก คุณเพียงแค่ต้องเพิ่มคำอธิบายประกอบดังต่อไปนี้และไม่จำเป็นต้องสืบทอดอินเทอร์เฟซการประมวลผลเวลาใด ๆ เช่นกรอบงานเวลาทั่วไป รหัสตัวอย่างง่าย ๆ มีดังนี้:
แพ็คเกจ com.power.demo.scheduledtask.simple; นำเข้า com.power.demo.util.datetimeutil; นำเข้า org.springframework.scheduling.annotation.enableduling; นำเข้า org.springframework.scheduling org.springframework.stereotype.Component; นำเข้า java.util.date;@component@enableschedulingpublic Class Springtaska {/** * cron expression อ้างอิง: http://cron.qqe2.com/ **/@scheduled timercron () {ลอง {thread.sleep (100); } catch (exception e) {e.printstacktrace (); } system.out.println (string.format ("(timercron)%s ดำเนินการทุก ๆ 5 วินาที, การบันทึก", datetimeutil.fmtdate (วันที่ใหม่ ()))); }} Springtaskaในรหัสด้านบนเพิ่ม @EnablesChediling คำอธิบายประกอบลงในชั้นเรียนเพิ่ม @Scheduled ลงในวิธีการกำหนดค่านิพจน์ cron และงานกำหนดเวลา cron ที่ง่ายที่สุดเสร็จสมบูรณ์ ต่อไปนี้เป็นองค์ประกอบของนิพจน์ cron:
@Scheduled (cron = "[วินาที] [นาที] [ชั่วโมง] [วันของเดือน] [เดือน] [วันของสัปดาห์] [ปี]"))
2. คงที่และคงที่
คำอธิบายประกอบ @Scheduled ช่วยลดการแสดงออกของ cron และมีวิธีการกำหนดค่าอื่น ๆ เช่น rexivetate และ recideDelay ตัวอย่างต่อไปนี้ใช้รูปแบบที่แตกต่างกันของการกำหนดเวลางานเวลาผ่านวิธีการกำหนดค่าที่แตกต่างกัน รหัสตัวอย่างมีดังนี้:
แพ็คเกจ com.power.demo.scheduledtask.simple; นำเข้า com.power.demo.util.datetimeutil; นำเข้า org.springframework.scheduling.annotation.enableduling; นำเข้า org.springframework.scheduling org.springframework.stereotype.Component; นำเข้า java.util.date;@component@enableschedulingpublic คลาส Springtaskb { /*คงที่: ดำเนินการอีกครั้ง 5 วินาทีหลังจากจุดสุดท้าย* / @scheduled } catch (exception e) {e.printstacktrace (); } system.out.println (string.format ("(คงที่) เวลาปัจจุบัน: %s", dateTimeUtil.fmtdate (วันที่ใหม่ ()))); } /*fixeddelay: ดำเนินการ 5 วินาทีหลังจากจุดเวลาดำเนินการครั้งสุดท้าย* / @scheduled (recideDelay = 5000) โมฆะสาธารณะ TimerFixedDelay () {ลอง {thread.sleep (100); } catch (exception e) {e.printstacktrace (); } system.out.println (string.format ("(คงที่) เวลาปัจจุบัน: %s", datetimeutil.fmtdate (วันที่ใหม่ ()))); } /*ดำเนินการหลังจากการหน่วงเวลาครั้งแรกคือ 2 วินาทีจากนั้นดำเนินการทุก ๆ 5 วินาทีตามกฎการกำหนดค่าคงที่* / @scheduled (initialdelay = 2000, recideDelay = 5000) โมฆะสาธารณะ } catch (exception e) {e.printstacktrace (); } system.out.println (string.format ("(เริ่มต้น) เวลาปัจจุบัน: %s", datetimeutil.fmtdate (วันที่ใหม่ ()))); }} springtaskbสังเกตความแตกต่างหลัก:
@Scheduled(fixedRate = 5000) : ดำเนินการอีกครั้ง 5 วินาทีหลังจากจุดดำเนินการครั้งสุดท้าย
@Scheduled(fixedDelay = 5000) : ดำเนินการอีกครั้ง 5 วินาทีหลังจากจุดเวลาดำเนินการล่าสุด
@Scheduled(initialDelay=2000, fixedDelay=5000) : ดำเนินการหลังจากการล่าช้าครั้งแรกคือ 2 วินาทีจากนั้นกดกฎคงที่
บางครั้งโครงการจำนวนมากจำเป็นต้องได้รับการกำหนดค่าและดำเนินการทันทีหลังจากกำหนดค่างานตามกำหนดเวลาและไม่จำเป็นต้องมีการเริ่มต้น
3. โซน
@Scheduled Annotation ยังมีโซนแอตทริบิวต์ที่คุ้นเคยซึ่งบ่งบอกถึงโซนเวลา โดยปกติหากไม่ได้เขียนงานเวลาจะใช้โซนเวลาเริ่มต้นของเซิร์ฟเวอร์ หากงานของคุณต้องการทำงานในเขตเวลาที่เฉพาะเจาะจงและจุดเวลาที่เฉพาะเจาะจงตัวอย่างเช่นระบบหลายภาษาทั่วไปอาจเรียกใช้สคริปต์เพื่ออัปเดตข้อมูลเป็นประจำคุณสามารถตั้งค่าเขตเวลาเช่นโซน East Eighth ซึ่งสามารถตั้งค่าเป็น:
zone = "GMT+8:00"
2. ควอตซ์
ควอตซ์เป็นหนึ่งในกรอบการกำหนดตารางเวลางานโอเพ่นซอร์สที่ใช้กันอย่างแพร่หลายมากที่สุดและหลาย บริษัท ใช้ระบบการจัดการงานเวลาของตนเองตาม ควอตซ์ให้สองงานที่ใช้เวลามากที่สุดทริกเกอร์คือ Triggers คือ SimpletRigger และ Crontrigger บทความนี้ใช้ Crontrigger ที่ใช้กันอย่างแพร่หลายมากที่สุดเป็นตัวอย่าง
1. เพิ่มการพึ่งพา
<การพึ่งพา> <roupId> org.quartz-Scheduler </groupId> <ratifactid> quartz </artifactid> <version> 2.3.0 </version>
2. กำหนดค่า cron expressions
ตามที่จำเป็นสำหรับโค้ดตัวอย่างเพิ่มการกำหนดค่าต่อไปนี้ในไฟล์ Application.properties:
## Quartz กำหนดค่างานกำหนดค่า Job.taska.cron = */3 * * * *? job.taskb.cron = */7 * * * *? job.taskmail.cron = */5 * * *? job.taskmail.cron = */5 * * * * * * * * * * * * * * * * *
ในความเป็นจริงเราสามารถเขียนในรหัสหรือคงอยู่ในฐานข้อมูลแล้วอ่านโดยไม่ต้องกำหนดค่า
3. เพิ่มงานที่กำหนดเวลาเพื่อนำไปใช้
ภารกิจที่ 1:
แพ็คเกจ com.power.demo.scheduledtask.quartz; นำเข้า com.power.demo.util.datetimeutil; นำเข้า org.quartz.disallowconcurrentexecution นำเข้า org.quartz.job; นำเข้า org.quartz java.util.date; @disallowconcurrentexecutionpublic คลาส Quartztaska ใช้งาน {@Override โมฆะสาธารณะดำเนินการ (jobExecutionContext VAR1) โยน jobExecutionException {ลอง {thread.sleep (1); } catch (exception e) {e.printstacktrace (); } system.out.println (string.format ("(quartztaska)%s ดำเนินการทุก 3 วินาทีบันทึกบันทึก", datetimeutil.fmtdate (วันที่ใหม่ ()))); }} quartztaskaภารกิจที่ 2:
แพ็คเกจ com.power.demo.scheduledtask.quartz; นำเข้า com.power.demo.util.datetimeutil; นำเข้า org.quartz.disallowconcurrentexecution นำเข้า org.quartz.job; นำเข้า org.quartz java.util.date; @disallowconcurrentexecutionpublic คลาส QuartzTaskB ใช้งาน {@Override โมฆะสาธารณะดำเนินการ (JobExecutionContext VAR1) โยน JobExecutionException {ลอง {thread.sleep (100); } catch (exception e) {e.printstacktrace (); } system.out.println (string.format ("(quartztaskb)%s ดำเนินการทุก ๆ 7 วินาทีบันทึกบันทึก", datetimeutil.fmtdate (วันที่ใหม่ ()))); }} quartztaskbส่งงานอีเมลในเวลาที่เหมาะสม:
แพ็คเกจ com.power.demo.scheduledtask.quartz; นำเข้า com.power.demo.service.contract.mailservice; นำเข้า com.power.demo.util.datetimeutil; นำเข้า com.power.demo.util.powerlogger; org.quartz.job; นำเข้า org.quartz.jobexecutioncontext; นำเข้า org.quartz.jobexecutionexception; นำเข้า org.springframework.beans.factory.annotation.autowired; นำเข้า Java.util.Date; MailService; @Override โมฆะสาธารณะดำเนินการ (jobExecutionContext var1) พ่น jobExecutionException {system.out.println (string.format ("(mailsendtask)%S ส่งจดหมายทุก 5 วินาที", datetimeutil.fmtdate (วันที่ใหม่ ())); ลอง {//thread.sleep(1); DateTime dtnow = dateTime ใหม่ (วันที่ใหม่ ()); วันที่เริ่มต้น = dtnow.minusmonths (1) .todate (); // เดือนที่ผ่านมาวันที่ endtime = dtnow.plusdays (1) .todate (); MailService.Autosend (เริ่มต้นเวลาสิ้นสุด); powerlogger.info (string.format ("ส่งจดหมาย, เวลาเริ่มต้น: %s, เวลาสิ้นสุด: %s", datetimeutil.fmtdate (เริ่มต้น), dateTimeutil.fmtdate (endtime))); } catch (exception e) {e.printstacktrace (); powerlogger.info (string.format ("ส่งเมล, ข้อยกเว้นเกิดขึ้น: %s, เวลาสิ้นสุด: %s", e)); }}} MailSendTaskการใช้งานนั้นดูง่ายมากเพียงแค่สืบทอดส่วนต่อประสานงานของ Quartz และเขียนวิธีการดำเนินการใหม่
4. รวมงานเวลาควอตซ์
จะทำให้สปริงจดจำการเริ่มต้นของอินสแตนซ์งานเวลาควอทซ์โดยอัตโนมัติได้อย่างไร สิ่งนี้ต้องมีการอ้างถึงถั่วที่มีการจัดการในฤดูใบไม้ผลิเปิดเผยถั่วที่จำเป็นไปยังตู้คอนเทนเนอร์ฤดูใบไม้ผลิและฉีดโดยอัตโนมัติโดยการกำหนดโรงงานงาน
ก่อนอื่นให้เพิ่มคลาสโรงงานที่ฉีดสปริง:
แพ็คเกจ com.power.demo.scheduledtask.quartz.config; นำเข้า org.quartz.spi.triggerFiredBundle; นำเข้า org.springframework.beans.factory.config.autowirecapableBeanformatory; org.springframework.context.applicationContextaware; นำเข้า org.springframework.scheduling.quartz.springbeanjobfactory; ระดับสุดท้ายของภาครัฐ /*** สปริงจัดให้มีกลไกที่ช่วยให้คุณได้รับ ApplicationContext นั่นคือ ApplicationContextaware Interface* สำหรับคลาสที่ใช้อินเตอร์เฟส ApplicationContextaware, Spring จะสร้างอินสแตนซ์และเรียกใช้* Public VoidsetApplicationContext อินเทอร์เฟซ, * ผ่านบริบทที่ถั่วเป็นของ **/ @Override โมฆะสาธารณะ setApplicationContext (บริบท ApplicationContext สุดท้าย) {beanfactory = context.getautowirecapableBeanFactory (); } @Override วัตถุที่ได้รับการป้องกัน createJobinStance (Final TriggerFiredBundle Bundle) โยนข้อยกเว้น {งานสุดท้ายงาน = super.createJobinstance (Bundle); beanfactory.autowirebean (Job); กลับงาน; }} AutoWireBeanJobFactoryกำหนด quartzconfig:
แพ็คเกจ com.power.demo.scheduledtask.quartz.config; นำเข้า org.springframework.beans.factory.annotation.autowired; นำเข้า org.springframework.beans.factory.annotation.qualifier; org.springframework.context.annotation.configuration; นำเข้า org.springframework.scheduling.quartz.crontriggerfactorybean; นำเข้า org.springframework.scheduling.quartz.schedulafactorybean; @configuration @qualifier ("QuartzTaskatrigger") Private CrontriggerFactoryBean Quartztaskatrigger; @autowired @qualifier ("QuartzTaskBtrigger") Private CrontriggerFactoryBean QuartzTaskBtrigger; @autowired @qualifier ("MailSendTrigger") Private CrontriggerFactoryBean MailSendtrigger; // งานในควอตซ์จะฉีดวัตถุโดยอัตโนมัติที่โฮสต์โดยสปริงคอนเทนเนอร์ @Bean สาธารณะ AutoWireBeanJobFactory autowiringspringBeanJobFactory () {ส่งคืน AutoWireBeanJobFactory ใหม่ (); } @Bean สาธารณะ SchedulerFactoryBean SchedulerFactoryBean () {SchedulerFactoryBean Scheduler = ใหม่ SchedulerFactoryBean (); Scheduler.SetJobFactory (autowiringspringbeanjobfactory ()); // กำหนดค่าคลาสงานที่ฉีดโดย Spring // Set CrontriggerFactoryBean และตั้งค่า Task Trigger Scheduler.SetTriggers (QuartzTaskatrigger.getObject (), QuartzTaskBtrigger.getObject (), MailsEndTrigger.getObject (); ส่งคืนตัวกำหนดเวลา; }} quartzConfigถัดไปกำหนดค่ารายละเอียดงาน:
แพ็คเกจ com.power.demo.scheduledtask.quartz.config; นำเข้า com.power.demo.util.configutil; นำเข้า com.power.demo.scheduledtask.quartz.mailsendtask; นำเข้า com.demo.scheduledtask.quartz.quartz. com.power.demo.scheduledtask.quartz.quartztaskb; นำเข้า com.power.demo.util.configutil; นำเข้า org.springframework.context.annotation.bean; นำเข้า org.springframework.context.annotation org.springframework.scheduling.quartz.crontriggerfactorybean; นำเข้า org.springframework.scheduling.quartz.jobdetailfactorybean; @configurationPublic Tasksetting {@bean (name = "quartztaska // สร้าง JobDetail JobDetailFactoryBean Factory = ใหม่ JobDetailFactoryBean (); Factory.SetJobclass (Quartztaska.class); // ตั้งค่างานที่สอดคล้องกันโรงงาน SetGroup ("QuartzTaskGroup"); Factory.setName ("Quartztaskajob"); Factory.SetDurability (เท็จ); Factory.setDescription ("Test Task A"); โรงงานกลับมา; } @Bean (name = "QuartzTaskatRigger") Public CrontriggerFactoryBean CrontiggerAfactoryBean () {String cron = configutil.getConfigval (appfield.job_taska_cron); CrontriggerFactoryBean Stfactory = ใหม่ CrontriggerFactoryBean (); // ตั้งค่า JobDetail Stfactory.SetJobDetail (JobDetailAfactoryBean (). getObject ()); Stfactory.SetStartDelay (1,000); stfactory.setName ("Quartztaskatrigger"); stfactory.setGroup ("QuartzTaskGroup"); Stfactory.setCronexpression (cron); กลับ Stfactory; } @Bean (name = "quartzTaskB") งานสาธารณะ JobDetailFactoryBean JobDetailBfactoryBean () {// สร้าง JobDetail JobDetailFactoryBean โรงงาน = ใหม่ JobDetailFactoryBean (); Factory.SetJobclass (QuartzTaskb.class); // ตั้งค่างานที่สอดคล้องกันโรงงาน SetGroup ("QuartzTaskGroup"); Factory.setName ("Quartztaskbjob"); Factory.SetDurability (เท็จ); 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 (). getObject ()); Stfactory.SetStartDelay (1,000); stfactory.setName ("QuartzTaskBtrigger"); stfactory.setGroup ("QuartzTaskGroup"); Stfactory.setCronexpression (cron); กลับ Stfactory; } @Bean (name = "MailSendTask") งานสาธารณะ JobDetailFactoryBean JobDetailMailFactoryBean () {// สร้าง JobDetail JobDetailFactoryBean โรงงาน = ใหม่ JobDetailFactoryBean (); Factory.SetJobClass (MailSendTask.Class); // ตั้งค่างานที่สอดคล้องกันโรงงาน SetGroup ("QuartzTaskGroup"); Factory.setName ("MailSendTaskJob"); Factory.SetDurability (เท็จ); Factory.setDescription ("MailSendtrigger"); โรงงานกลับมา; } @Bean (name = "MailSendTrigger") Public CrontriggerFactoryBean CrontriggerMailFactoryBean () {String cron = configutil.getConfigval (appfield.job_taskmail_cron); CrontriggerFactoryBean Stfactory = ใหม่ CrontriggerFactoryBean (); // ตั้งค่า JobDetail Stfactory.SetJobDetail (JobDetailMailFactoryBean (). getObject ()); Stfactory.SetStartDelay (1,000); stfactory.setName ("mailsendtrigger"); stfactory.setGroup ("QuartzTaskGroup"); Stfactory.setCronexpression (cron); กลับ Stfactory; }} tasksettingสุดท้ายเริ่มแอปพลิเคชันงานสปริงบูตเวลาและงานเวลาที่สมบูรณ์ตามกำหนดเวลาควอตซ์จะถูกนำมาใช้
ในตัวอย่างงานที่กำหนดเวลานี้มีการส่งจดหมายส่งจดหมาย Task MailSendTask บทความถัดไปจะแบ่งปันระบบจดหมายง่าย ๆ ในแอปพลิเคชัน Spring Boot โดยใช้ MongoDB เป็นสื่อการจัดเก็บข้อมูล
การอ่านเพิ่มเติม:
หลาย บริษัท มีกรอบการกำหนดเวลางานและระบบของตัวเอง วิธีการรวมคลัสเตอร์ควอตซ์ในสปริงบูตเพื่อใช้การกำหนดค่างานที่กำหนดเวลาแบบไดนามิก?
อ้างถึง:
//www.vevb.com/article/139591.htm
//www.vevb.com/article/139597.htm
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่าเนื้อหาของบทความนี้จะมีค่าอ้างอิงบางอย่างสำหรับการศึกษาหรือที่ทำงานของทุกคน หากคุณมีคำถามใด ๆ คุณสามารถฝากข้อความไว้เพื่อสื่อสาร ขอบคุณสำหรับการสนับสนุน Wulin.com