Dalam kerangka musim semi, tugas waktu dapat diimplementasikan melalui @schedule. Melalui aturan yang dijelaskan oleh deskripsi atribut Cron, Spring akan memanggil metode ini.
Spring telah menerapkan tugas waktu secara sederhana dan kasar, mengapa menggunakan kuarsa?
Jika Anda memiliki banyak tugas waktunya sekarang, aturannya berbeda, misalnya:
Ketergantungan Maven
<dependency> <GroupId> org.quartz-Scheduler </groupId> <ArTifactId> kuarsa </t ArtifactId> <version> 2.2.1 </version> </dependency> <sependency> <roupid> org.quartz-scheduler </groupid> <ArtiFacTId> Kuartz-Jobs </Version </Version.12 </version> <TROGER?
Berikut ini adalah kode sumber dari kerangka pembelajaran sumber terbuka bootdo
Saya tidak menggunakan semua bidang, idenya adalah untuk menanyakan DB terlebih dahulu.
Merangkum dua objek berikut
Ketika kondisi pemicu dipenuhi, kelas akan ditemukan berdasarkan set beansclass (org.quartz.job harus diimplementasikan). Pada saat ini, data dalam JobDetail dapat diambil dan logika bisnis tertentu dapat dieksekusi.
@ComponentPublic Class WelcomeJob mengimplementasikan Job {@Override public void execute (jobexecutionContext arg0) melempar JobexecutionException {// Logika Bisnis Anda}}Struktur tabel
CREATE TABLE `sys_task` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `cronExpression` varchar(255) DEFAULT NULL COMMENT 'cron expression', `methodName` varchar(255) DEFAULT NULL COMMENT 'The method name of the task call', `isConcurrent` varchar(255) DEFAULT NULL COMMENT 'Is the task stateful', `description` Varchar (255) Default Null Comment 'Deskripsi Tugas', `updateBy` varchar (64) Default null komentar 'updator',` beanclass` varchar (255) komentar null 'mana kelas mana yang dipanggil ketika tugas dilaksanakan', `comeat` dateTime nol komentar null 'create time',` `jobstatus` commondate `commondate` comment `comment` comment `comment` comment `commondate` commondate `commondate` commondate `,` `` varchoup `commondate` commondate `comment` comment `` varchoup `commondate` commondate `comment` comment `` varchoup ` Varchar (255) Default null komentar 'pengelompokan tugas', `updateT` datetime nol komentar null 'pembaruan waktu',` create` varchar (64) komentar nol creator 'pencipta', `springbean` varchar (255) nol komentar nol, Auto_increment = 3 charset default = utf8 row_format = compact;
Kelas konfigurasi
Impor java.io.ioException; impor java.util.properties; impor org.quartz.scheduler; impor org.springframework.beans.factory.annotation.Autowired; impor org.springframework.beans.factory.config.propericfacory org.springframework.context.annotation.bean; impor org.springframework.context.annotation.configuration; impor org.springframework.core.io.classpathResource; impor org.spramework.scheduling.quartz.schedulc com.txgl.common.quartz.factory.jobfactory; @configurationpublic kelas kuarsaconfigration {@Autowired jobfactory jobfactory; @Bean Public SchedulerFactoryBean JadwalFactoryBean () {SCRECTERERFACTORYBEAN JadwalFactoryBean = new ScadulerFactoryBean (); coba {schedulerFactoryBean.setOverwriteExistingJobs (true); schedulerfactorybean.setquartzproperties (kuarsaproperti ()); schedulerfactorybean.setjoBfactory (jobfactory); } catch (ioException e) {e.printstacktrace (); } return scedulerFactoryBean; } // tentukan quartz.properties @bean properti publik kuarsaproperties () melempar ioException {propertiesFactoryBean PropertiesFactoryBean = new PropertiesFactoryBean (); PropertiesFactoryBean.setLocation (ClassPathResource baru ("/config/quartz.properties")); PropertiesFactoryBean.AfterPropertiesset (); Return PropertiesFactoryBean.getObject (); } // Buat jadwal @bean (name = "scheduler") public scheduler scheduler () {return schedulerFactoryBean (). Getscheduler (); }}Kode QuartzManager adalah kunci untuk beroperasi pada tugas dengan menyuntikkan penjadwal
Impor java.util.arraylist; impor java.util.list; impor java.util.set; impor org.apache.log4j.logger; impor org.quartz.cronscheduleBuilder; impor org.quartz.crontrigger; impor org.quartz.dateBuilder; orgrontrigger; impor org.quartz.dateBuilder; org.quartz.job; impor org.quartz.jobbuilder; impor org.quartz.jobdetail; impor org.quartz.jobexecutionContext; impor org.quartz.jobkey; impor org.quartz. org.quartz.triggerBuilder; impor org.quartz.triggerkey; impor org.quartz.impl.matchers.groupMatcher; impor org.springframework.beans.factory.annotation.Autowired; org.springframework.beans.factory.annotation. org.springframework.scheduling.quartz.schedulerFactorybean; impor org.springframework.stereotype.service; impor org.springframework.web.context.support.springbeanautowingsupport; impor com.comono.commoin.springbeana. com.bootdo.common.quartz.factory.*;import com.bootdo.common.utils.SpringContextHolder;;/** * * * @title: QuartzManager.java * @description: Scheduled Task Management* */@Servicepublic class QuartzManager { public final Logger log = Logger.getLogger(this.getClass()); // Private SchedulerFactoryBean JadwalFactoryBean // = springcontextholder.getbean (scarcleRerFactoryBean.class); // @Autowired // @qualifier ("schedulerFactoryBean") // private shadulerFactoryBean jadwalFactoryBean; @Autowired Private Scheduler Scheduler; / ** * Tambahkan tugas * * @param jadwaljob * @throws scradulerException */ public void addJob (jadwal jobob) {coba {// Buat instance jobdetail, ikat kelas implementasi pekerjaan // tentukan nama pekerjaan, nama grup, dan ikat kelas kelas pekerjaan <? Extends job> jobclass = (class <? Extends job>) (class.forname (job.getBeAnclass ()). newInstance () .getClass ()); JobDetail JobDetail = jobbuilder.newjob (jobclass) .withlandity (job.getjobname (), job.getjobroup ()) // nama tugas dan grup membentuk kunci tugas .build (); // Tentukan aturan pemicu dispatch // Gunakan pemicu aturan aturan corntrigger = triggerBuilder.newtrigger (). Withentity (job.getjobname (), job.getjobroup ()) // kunci pemicu .startat (dateBuilder.futuredate (1, intervalunit.second))) .withschedule (cronscheduleBuilder.CronsChedule (job.getCroRExpression ())). startNow (). build (); // Daftarkan pekerjaan dan pemicu di penjadwal tugas. // Mulai if (! SCRETERER.ISSHUTDOWN ()) {SCRETERER.START (); }} catch (Exception e) {e.printstacktrace (); }} // public void addJob (jadwal jadwal pekerjaan) melempar jadwalException {// if (job == null ||! jadwaljob.status_running.equals (job.getjobstatus ()) {// return; //} /// triggerkey triggerkey = triggerkey.triggey.triggey.triggey.triggey.triggey.triggey.triggey.triggey.triggey.triggey.triggey.triggey.trigger.trigger.trigger.trigger.trigger.trigger.trigger.trigger.trigger.trigger.trigger.trigger.trigger.trigger.trigger.trigger.trigger.trigger.trigger.triggey job.getjoBroup ()); //// crontrigger trigger = (crontrigger) scheduler.gettrigger (triggerKey); //// // if (null == trigger) {// class <? Extends Job> clazz = jadwaljob.concurrent_is.equals (job.getisconcurrent ()) //? QuartzjoBfactory.class //: QuartzjoBfactoryDisallowCurrentExecution.class; ///// JobDetail JobDetail = jobbuilder.newjob (clazz) .withidentity (job.getjobname (), job.getjobroup ()). jobdetail.getjobDatamap (). put ("jadwalJob", job); //// cronscheduleBuilder jadwalBuilder = cronscheduleBuilder.cronschedule (job.getcronexpression ()); /// trigger = triggerbuilder.newrigger (). Withrigger (). job.getjoBroup ()) // .withschedule (jadwalBuilder) .build (); //// scheduler.scheduleJob (jobdetail, pemicu); //} else {// pemicu sudah ada, lalu perbarui setting waktu yang sesuai ////cronscheduleBuilder = CronscheduleBuilder.Cronschedule (job.getcronexpression ()); //// // rebuild pemicu sesuai dengan ekspresi cronexpression baru ///// trigger = trigger.gettriggerBuilder (). TENGAH (). scheduler.rescheduleJob (triggerKey, trigger); //} //}/ ** * Dapatkan daftar semua tugas yang dijadwalkan * * @return * @throwsceptException */ Daftar publik <dructorjob> getAllJob () Throws DjoDulerException {groupMatcher <ePerKey> cochinger = grouper = groupker = grupker = grupcher = grupker = grupker = grupker = grupker = grupker = grupker = grupker = grupker = grupker = groupker = groupker = groupker = groupker = groupkery; Atur <eCKey> jobkeys = scheduler.getjobkeys (pencocokan); Daftar <dradorjob> JOBLIST = ArrayList baru <scartyJob> (); untuk (jobkey jobkey: jobkeys) {list <? Extends Trigger> Triggers = SCRECTERER.GETTRIGGERSOFJOB (JOBKEY); for (pemicu pemicu: pemicu) {jadwal jobob = jadwal new (); job.setjobname (jobkey.getname ()); job.setjobgroup (jobkey.getgroup ()); job.setDescription ("pemicu:" + trigger.getKey ()); Trigger.triggerstate triggerstate = scheduler.gettriggerstate (trigger.getKey ()); job.setjobstatus (triggerstate.name ()); if (instance pemicu crontrigger) {crontrigger crontrigger = (crontrigger) pemicu; String cronexpression = crontrigger.getCronexpression (); job.setCronexpression (cronexpression); } JOBLIST.ADD (JOB); }} return bojlist; } / ** * Semua pekerjaan yang berjalan * * @return * @throws schedulerException * / Daftar publik <dradorjob> getRunningJob () melempar jadwalException {list <eCrexExecutionContext> executeJobs = scheduler.getCurrentlyExecutingJobs (); Daftar <dradorjob> JOBLIST = ArrayList baru <dructoryjob> (exectingjobs.size ()); untuk (JobexecutionContext executionJob: executionJobs) {jadwalJob job = new jadwalJob (); JobDetail JobDetail = executionJob.getjoBdetail (); Jobkey jobkey = jobdetail.getKey (); Pemicu pemicu = executionjob.getTrigger (); job.setjobname (jobkey.getname ()); job.setjobgroup (jobkey.getgroup ()); job.setDescription ("pemicu:" + trigger.getKey ()); Trigger.triggerstate triggerstate = scheduler.gettriggerstate (trigger.getKey ()); job.setjobstatus (triggerstate.name ()); if (instance pemicu crontrigger) {crontrigger crontrigger = (crontrigger) pemicu; String cronexpression = crontrigger.getCronexpression (); job.setCronexpression (cronexpression); } JOBLIST.ADD (JOB); } return joBlist; } / ** * Jeda pekerjaan * * @param jadwalJob * @throws scraduleRexception * / public void jubeJob (jadwal jadwaljob) melempar jadwalException {jobkey jobkey = jobkey.jobkey (jadwaljob.getjobname (), jadwaljob.getjobroup (); scheduler.PaSejob (JobKey); } / ** * Memulihkan pekerjaan * * @param jadwalJob * @throws sclapleRexception * / public void resumeJob (jadwal jadwaljob) melempar jadwalException {jobkey jobkey = jobkey.jobkey (jadwaljob.getjobname (), jadwaljob.getjobroup (); penjadwal.resumeJob (JobKey); } / ** * Hapus pekerjaan * * @param jadwalJob * @throws sclapleRexception * / public void deleteJob (jadwal jadwalJob) melempar jadwalException {jobkey jobkey = jobkey.jobkey (jadwaljob.getjobname (), jadwaljob.getjobroup (); scheduler.deletejob (jobKey); } / ** * Jalankan pekerjaan segera * * @param jadwalJob * @throws scradulerexception * / public void runajobnow (jadwal jadwalJob) melempar jadwalException {jobkey jobkey = jobkey.jobkey (jadwaljob.getjobname (), jadwaljob.getjobroup (); scheduler.triggerjob (jobKey); } / ** * Perbarui Ekspresi Waktu Kerja * * @param DatedJob * @Throws SCHECTERErException * / public void updateJobcron (jadwal jadwalJob) melempar jadwalException {triggerKey triggerKey = triggerKey.triggerkey (jadwalJob.getjobname (), jadwaljob.getjobroup (););); Crontrigger trigger = (crontrigger) scheduler.gettrigger (triggerKey); CronscheduleBuilder jadwalBuilder = cronscheduleBuilder.cronschedule (jadwaljob.getcronexpression ()); trigger = trigger.gettriggerBuilder (). withentity (triggerKey) .withschedule (jadwalBuilder) .build (); scheduler.rescheduleJob (pemicu, pemicu); }}Implementasi Layanan
impor com.bootdo.common.config.constant; impor com.bootdo.common.dao.taskdao; impor com.bootdo.common.domain.schedulejob; impor com.bootdo.common.domain.tasko; impor com.bootdo.common.quartz.quartzil. com.bootdo.common.service.jobservice; import com.bootdo.common.utils.scheduleJobutils; impor org.quartz.scheduleRException; impor org.springframework.bean.factory.annotation.Autowired; impor org.springframework.bean.factory.annotation.Autowired; impor org.springframework.bean.factory.annotation.Autowired; impor org.springframework.bean.factory.annotation.Autowired; impor org java.util.hashmap; impor java.util.list; impor java.util.map; @servicepublic kelas jobserviceImpl mengimplementasikan jobservice {@autowired private Taskdao TaskscheduleJobmapper; @Autowired QuartzManager QuartzManager; @Override Public Taskdo Get (Long ID) {return TasksCheduleJoBmapper.get (id); } @Override Daftar publik <KeckDo> Daftar (peta <String, Object> peta) {return TasksCheduleJoBmapper.list (peta); } @Override public int count (peta <string, object> peta) {return taskscheduleJobmapper.count (peta); } @Override Public int save (TaskDo TasksCheduleJob) {return TasksCheduleJoBmapper.save (TasksCheduleJob); } @Override Public Int Update (TaskDo TasksCheduleJob) {return TasksCheduleJoBmapper.update (TasksCheduleJob); } @Override public int hapus (ID panjang) {coba {taskdo jadwaljob = get (id); quartzmanager.deletejob (jadwalJobutils.entitytodata (jadwaljob)); return TasksCheduleJobmapper.remove (id); } Catch (SCHECTLULERException E) {E.PrintStackTrace (); kembali 0; }} @Override public int batchremove (long [] id) {for (Long ID: IDS) {coba {Taskdo jadwalJob = get (id); quartzmanager.deletejob (jadwalJobutils.entitytodata (jadwaljob)); } Catch (SCHECTLULERException E) {E.PrintStackTrace (); kembali 0; }} return TasksCheduleJoBmapper.BatchRemove (IDS); } @Override public void initschedule () melempar SCLECLULEREXCEPTION {// Dapatkan data informasi tugas di sini Daftar <EckMen> JOBLIST = TasksCheduleJoBmapper.list (HashMap baru <String, Object> (16)); untuk (Taskdo DatedJob: JOBLIST) {if ("1" .Equals (jadwalJob.getjobstatus ())) {jadwal JOBBOB = jadwalJobutils.entitytodata (jadwal); quartzmanager.addjob (pekerjaan); }}} @Override public void changestatus (long jobId, string cmd) melempar scheduleRexception {taskdo jadwaljob = get (jobid); if (jadwaljob == null) {return; } if (constant.status_running_stop.equals (cmd)) {quartzmanager.deleteJob (jadwaljobutils.entitytodata (jadwaljob)); jadwaljob.setjobstatus (jadwaljob.status_not_running); } else {if (! constant.status_running_start.equals (cmd)) {} else {jadwaljob.setjobstatus (jadwaljob.status_running); quartzmanager.addjob (jadwalJobutils.entitytodata (jadwaljob)); }} update (jadwaljob); } @Override public void updateCron (long jobId) melempar jadwalException {taskdo jadwaljob = get (jobId); if (jadwaljob == null) {return; } if (jadwaljob.status_running.equals (jadwaljob.getjobstatus ())) {quartzmanager.updateJobcron (jadwaljobutils.entitytodata (jadwaljob)); } update (jadwaljob); }}Mulailah pendengar untuk menginisialisasi kuarsa
Impor org.springframework.beans.factory.annotation.Autowired; impor org.springframework.boot.Commandlinunner; org.springframework.core.annotation. com.bootdo.common.service.jobservice;@component@order (value = 1) kelas publik jadwalJObinitListener mengimplementasikan commandlinerner {@Autowired jadwal jadwal jadwaljobservice; @Autowired QuartzManager QuartzManager; @Override public void run (String ... arg0) melempar Exception {coba {jadwaljoBservice.initschedule (); } catch (Exception e) {E.PrintStackTrace (); }}}Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.