在上一篇文章里面,已经可以启动定时器完成预期任务了.
这个时候,客户提了个新的需求,需要在界面可以修改任务的启动间隔,这要怎么处理呢?
其实是很简单的,quartz天生自带这个功能.
为什么这么说呢,回想第一篇里面的,我是图省事才把所有需要的bean都配置在spring里面,有spring来注入和管理的
现在这个要求,把spring的工作拿出来自己做就是了.
1. 把上篇的所有配置全部删掉,只保留quartz的工厂bean
<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" />
2.把所有的任务信息保存进数据库,其中class文件是真正要执行的task
3. 配置一个开机启动的task,启动quartz
<!-- quartz初始化任务,随着web项目的启动而启动 --> <bean id="loadTask" class="com.aw.task.LoadTask" init-method="initTask" />
4. 实现LoadTask类
1 public class LoadTask 2 { 3 private final Logger log = LoggerFactory.getLogger(this.getClass()); 4 5 @Autowired 6 private JobMapper jobMapper; 7 8 @Autowired 9 private SchedulerFactoryBean schedulerFactoryBean; 10 11 12 13 public Class<? extends Job> getJobClass(String className) 14 { 15 try 16 { 17 return (Class<? extends Job>) Class.forName(className); 18 } catch (ClassNotFoundException e) 19 { 20 log.error(className + "*********" + e.toString()); 21 e.printStackTrace(); 22 } 23 24 return null; 25 } 26 27 28 public void initTask() throws SchedulerException { 29 30 log.info("task manager start..."); 31 32 Scheduler scheduler = schedulerFactoryBean.getScheduler(); 33 34 List<ScheduleJob> jobList = jobMapper.getAllJob(); 35 36 for(ScheduleJob job: jobList) 37 { 38 //获取trigger,即在spring配置文件中定义的 bean id="myTrigger" 39 TriggerKey triggerKey = TriggerKey.triggerKey(job.getJobName(), job.getJobGroup()); 40 41 //不存在,创建一个 42 CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); 43 44 if (null == trigger) { 45 JobDetail jobDetail = JobBuilder.newJob(getJobClass(job.getClassName())) 46 .withIdentity(job.getJobName(), job.getJobGroup()).build(); 47 jobDetail.getJobDataMap().put("scheduleJob", job); 48 //表达式调度构建器 49 CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression()); 50 //按新的cronExpression表达式构建一个新的trigger 51 trigger = TriggerBuilder.newTrigger().withIdentity(job.getJobName(), job.getJobGroup()).withSchedule(scheduleBuilder).build(); 52 scheduler.scheduleJob(jobDetail, trigger); 53 } else { 54 // Trigger已存在,那么更新相应的定时设置 55 //表达式调度构建器 56 CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job 57 .getCronExpression()); 58 //按新的cronExpression表达式重新构建trigger 59 trigger = trigger.getTriggerBuilder().withIdentity(triggerKey) 60 .withSchedule(scheduleBuilder).build(); 61 //按新的trigger重新设置job执行 62 scheduler.rescheduleJob(triggerKey, trigger); 63 } 64 65 } 66 67 } 68 }
这样,上面的操作就可以把数据库里面定义的task保存起来了.
那怎么更新task的时间间隔呢?
5. 提供一个界面,让用户修改表里面的jobInterval字段,然后在修改成功后,执行下面的代码.
//自动注入task加载类 @Autowired private LoadTask loadTask; //保存完成以后 loadTask.initTask();
就可以重新调度了
时间: 2024-10-10 03:22:31