900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 动态配置定时任务(Spring Boot + quartz 的整合)

动态配置定时任务(Spring Boot + quartz 的整合)

时间:2023-08-11 08:07:42

相关推荐

动态配置定时任务(Spring Boot + quartz 的整合)

在整个项目规划中,有的时候需要定时的去执行某一段代码,触发时间能随时修改,并且不影响项目的整体运行。所以,定时器的设计就必须要灵活,能随时的增,删,改定时任务。

数据库设计

CREATETABLE`sys_task`(`id`int(11)NOTNULLAUTO_INCREMENT,`created_at`datetimeNOTNULLCOMMENT'创建时间',`updated_at`datetimeNOTNULLCOMMENT'修改时间',`task_name`varchar(255)DEFAULTNULLCOMMENT'任务名称',`task_remark`varchar(255)DEFAULTNULLCOMMENT'说明',`job_class`varchar(255)NOTNULLCOMMENT'任务类',`cron_expression`varchar(255)NOTNULLCOMMENT'规则表达式',`is_enable`smallint(1)NOTNULLCOMMENT'是否启用',`status`varchar(25)DEFAULTNULLCOMMENT'状态',PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=40DEFAULTCHARSET=utf8COMMENT='系统任务调度';

maven 依赖

<dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.2.1</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>4.3.7.RELEASE</version></dependency>

调度器类

importjava.util.Date;importorg.quartz.CronScheduleBuilder;importorg.quartz.CronTrigger;importorg.quartz.JobBuilder;importorg.quartz.JobDetail;importorg.quartz.JobKey;importorg.quartz.Scheduler;importorg.quartz.SchedulerException;importorg.quartz.TriggerBuilder;importorg.quartz.TriggerKey;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.context.annotation.Configuration;/***任务调度**/@ConfigurationpublicclassQuartzScheduler{@AutowiredprivateSchedulerscheduler;/***获取Job信息**@paramname类名*@return*@throwsSchedulerException*/publicStringgetJobInfo(Stringname)throwsSchedulerException{TriggerKeytriggerKey=newTriggerKey(name,scheduler.DEFAULT_GROUP);CronTriggercronTrigger=(CronTrigger)scheduler.getTrigger(triggerKey);returnString.format("time:%s,state:%s",cronTrigger.getCronExpression(),scheduler.getTriggerState(triggerKey).name());}/***修改某个任务的执行时间**@paramname类名*@paramtime任务触发时间*@return*@throwsSchedulerException*/publicbooleanmodifyJob(Stringname,Stringtime)throwsSchedulerException{Datedate=null;TriggerKeytriggerKey=newTriggerKey(name,scheduler.DEFAULT_GROUP);CronTriggercronTrigger=(CronTrigger)scheduler.getTrigger(triggerKey);StringoldTime=cronTrigger.getCronExpression();if(!oldTime.equalsIgnoreCase(time)){CronScheduleBuildercronScheduleBuilder=CronScheduleBuilder.cronSchedule(time);CronTriggertrigger=TriggerBuilder.newTrigger().withIdentity(name,scheduler.DEFAULT_GROUP).withSchedule(cronScheduleBuilder).build();date=scheduler.rescheduleJob(triggerKey,trigger);}returndate!=null;}/***暂停所有任务**@throwsSchedulerException*/publicvoidpauseAllJob()throwsSchedulerException{scheduler.pauseAll();}/***暂停某个任务**@paramname类名*/publicvoidpauseJob(Stringname)throwsSchedulerException{JobKeyjobKey=newJobKey(name,scheduler.DEFAULT_GROUP);JobDetailjobDetail=scheduler.getJobDetail(jobKey);if(jobDetail==null)return;scheduler.pauseJob(jobKey);}/***恢复所有任务**@throwsSchedulerException*/publicvoidresumeAllJob()throwsSchedulerException{scheduler.resumeAll();}/***恢复某个任务**@paramname类名*/publicvoidresumeJob(Stringname)throwsSchedulerException{JobKeyjobKey=newJobKey(name,scheduler.DEFAULT_GROUP);JobDetailjobDetail=scheduler.getJobDetail(jobKey);if(jobDetail==null)return;scheduler.resumeJob(jobKey);}/***删除某个任务**@paramname类名*/publicvoiddeleteJob(Stringname)throwsSchedulerException{JobKeyjobKey=newJobKey(name,scheduler.DEFAULT_GROUP);JobDetailjobDetail=scheduler.getJobDetail(jobKey);if(jobDetail==null)return;scheduler.deleteJob(jobKey);}/***添加定时器**@paramname类名*@paramtime任务触发时间*@throwsSchedulerException*/publicvoidaddJob(Stringname,Stringtime)throwsSchedulerException{Classclasss=null;try{classs=Class.forName(name);}catch(ClassNotFoundExceptione1){e1.printStackTrace();}JobDetailjobDetail=JobBuilder.newJob(classs).withIdentity(name,scheduler.DEFAULT_GROUP).build();CronScheduleBuildercronScheduleBuilder=CronScheduleBuilder.cronSchedule(time);CronTriggercronTrigger=TriggerBuilder.newTrigger().withIdentity(name,scheduler.DEFAULT_GROUP).withSchedule(cronScheduleBuilder).build();scheduler.scheduleJob(jobDetail,cronTrigger);}}

初始化任务

importjava.util.List;importorg.quartz.CronScheduleBuilder;importorg.quartz.CronTrigger;importorg.quartz.JobBuilder;importorg.quartz.JobDetail;importorg.quartz.Scheduler;importorg.quartz.SchedulerException;importorg.quartz.SchedulerFactory;importorg.quartz.TriggerBuilder;importorg.quartz.impl.StdSchedulerFactory;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.context.ApplicationListener;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.context.event.ContextRefreshedEvent;importtk.mybatis.mapper.entity.Example;importtk.mybatis.mapper.entity.Example.Criteria;/***任务初始化调度**/@ConfigurationpublicclassApplicationStartQuartzJobimplementsApplicationListener<ContextRefreshedEvent>{@AutowiredprivateSysTaskServicesysTaskService;@OverridepublicvoidonApplicationEvent(ContextRefreshedEventevent){Exampleexample=newExample(SysTask.class);CriteriacreateCriteria=example.createCriteria();createCriteria.andEqualTo("isEnable",1);List<SysTask>sysTaskList=sysTaskService.selectByExample(example);Schedulerscheduler=null;try{scheduler=scheduler();}catch(SchedulerExceptione){e.printStackTrace();}if(!sysTaskList.isEmpty()){for(SysTasksysTask:sysTaskList){Classclasss=null;try{classs=Class.forName(sysTask.getJobClass());}catch(ClassNotFoundExceptione){e.printStackTrace();}JobDetailjobDetail=JobBuilder.newJob(classs).withIdentity(sysTask.getJobClass(),scheduler.DEFAULT_GROUP).build();CronScheduleBuildercronScheduleBuilder=CronScheduleBuilder.cronSchedule(sysTask.getCronExpression());CronTriggercronTrigger=TriggerBuilder.newTrigger().withIdentity(sysTask.getJobClass(),scheduler.DEFAULT_GROUP).withSchedule(cronScheduleBuilder).build();try{scheduler.scheduleJob(jobDetail,cronTrigger);}catch(SchedulerExceptione){e.printStackTrace();}}}try{scheduler.start();}catch(SchedulerExceptione){e.printStackTrace();}}/***初始注入scheduler*@return*@throwsSchedulerException*/@BeanpublicSchedulerscheduler()throwsSchedulerException{SchedulerFactoryschedulerFactoryBean=newStdSchedulerFactory();returnschedulerFactoryBean.getScheduler();}}

编写测试类

publicclassTest1implementsJob{@Overridepublicvoidexecute(JobExecutionContextcontext)throwsJobExecutionException{//任务执行逻辑代码片段}}

Spring Boot 与 quartz 的整合已经完成了,可以通过配置表 sys_task 表中的数据数来灵活的配置定时任务了。

作者:万木林

链接:

/qq_37465151/article/details/82906654

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。