Spring 3整合Quartz 2实现定时任务三:动态暂停 恢复 修改和删除任务

时间:2022-02-08 07:53:49

原文:http://www.meiriyouke.net/?p=140

Spring 3整合Quartz 2实现定时任务一:常规整合

Spring 3整合Quartz 2实现定时任务二:动态添加任务

续篇及demo下载地址:

Spring 整合Quartz 2实现定时任务四:细化调整及一些已知的问题

Spring 整合Quartz 2实现定时任务五:集群、分布式架构实现探讨

前面我们已经完成了spring 3和quartz 2的整合以及动态添加定时任务,我们接着来完善它,使之能支持更多的操作,例如暂停、恢复、修改等。

在动态添加定时任务中其实已经涉及到了其中的一些代码,这里我们再来细化的理一理。先来看一下我们初步要实现的目标效果图,这里我们只在内存中操作,并没有把quartz的任何信息保存到数据库,即使用的是RAMJobStore,当然如果你有需要,可以实现成JDBCJobStore,那样任务信息将会更全面,貌似还有专门的监控工具,不过本人没有用过:

Spring 3整合Quartz 2实现定时任务三:动态暂停 恢复 修改和删除任务

如上图,我们要先列出计划中的定时任务以及正在执行中的定时任务,这里的正在执行中指的是任务已经触发线程还没执行完的情况。比如每天2点执行一个数据导入操作,这个操作执行时间需要5分钟,在这5分钟之内这个任务才是运行中的任务。当任务正常时可以使用暂停按钮,任务暂停时可以使用恢复按钮。

trigger各状态说明:

None:Trigger已经完成,且不会在执行,或者找不到该触发器,或者Trigger已经被删除
NORMAL:正常状态
PAUSED:暂停状态
COMPLETE:触发器完成,但是任务可能还正在执行中
BLOCKED:线程阻塞状态
ERROR:出现错误

计划中的任务

指那些已经添加到quartz调度器的任务,因为quartz并没有直接提供这样的查询接口,所以我们需要结合JobKey和Trigger来实现,核心代码:

 
  1. Scheduler scheduler = schedulerFactoryBean.getScheduler();
  2. GroupMatcher<JobKey> matcher = GroupMatcher.anyJobGroup();
  3. Set<JobKey> jobKeys = scheduler.getJobKeys(matcher);
  4. List<ScheduleJob> jobList = new ArrayList<ScheduleJob>();
  5. for (JobKey jobKey : jobKeys) {
  6. List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);
  7. for (Trigger trigger : triggers) {
  8. ScheduleJob job = new ScheduleJob();
  9. job.setJobName(jobKey.getName());
  10. job.setJobGroup(jobKey.getGroup());
  11. job.setDesc("触发器:" + trigger.getKey());
  12. Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
  13. job.setJobStatus(triggerState.name());
  14. if (trigger instanceof CronTrigger) {
  15. CronTrigger cronTrigger = (CronTrigger) trigger;
  16. String cronExpression = cronTrigger.getCronExpression();
  17. job.setCronExpression(cronExpression);
  18. }
  19. jobList.add(job);
  20. }
  21. }

上面代码中的jobList就是我们需要的计划中的任务列表,需要注意一个job可能会有多个trigger的情况,在下面讲到的立即运行一次任务的时候,会生成一个临时的trigger也会出现在这。这里把一个Job有多个trigger的情况看成是多个任务。我们前面包括在实际项目中一般用到的都是CronTrigger ,所以这里我们着重处理了下CronTrigger的情况。

运行中的任务

实现和计划中的任务类似,核心代码:

 
 
  1. Scheduler scheduler = schedulerFactoryBean.getScheduler();
  2. List<JobExecutionContext> executingJobs = scheduler.getCurrentlyExecutingJobs();
  3. List<ScheduleJob> jobList = new ArrayList<ScheduleJob>(executingJobs.size());
  4. for (JobExecutionContext executingJob : executingJobs) {
  5. ScheduleJob job = new ScheduleJob();
  6. JobDetail jobDetail = executingJob.getJobDetail();
  7. JobKey jobKey = jobDetail.getKey();
  8. Trigger trigger = executingJob.getTrigger();
  9. job.setJobName(jobKey.getName());
  10. job.setJobGroup(jobKey.getGroup());
  11. job.setDesc("触发器:" + trigger.getKey());
  12. Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
  13. job.setJobStatus(triggerState.name());
  14. if (trigger instanceof CronTrigger) {
  15. CronTrigger cronTrigger = (CronTrigger) trigger;
  16. String cronExpression = cronTrigger.getCronExpression();
  17. job.setCronExpression(cronExpression);
  18. }
  19. jobList.add(job);
  20. }
暂停任务

这个比较简单,核心代码:

 
 
  1. Scheduler scheduler = schedulerFactoryBean.getScheduler();
  2. JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
  3. scheduler.pauseJob(jobKey);
恢复任务

和暂停任务相对,核心代码:

 
 
  1. Scheduler scheduler = schedulerFactoryBean.getScheduler();
  2. JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
  3. scheduler.resumeJob(jobKey);
删除任务

删除任务后,所对应的trigger也将被删除

 
 
  1. Scheduler scheduler = schedulerFactoryBean.getScheduler();
  2. JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
  3. scheduler.deleteJob(jobKey);
立即运行任务

这里的立即运行,只会运行一次,方便测试时用。quartz是通过临时生成一个trigger的方式来实现的,这个trigger将在本次任务运行完成之后自动删除。trigger的key是随机生成的,例如:DEFAULT.MT_4k9fd10jcn9mg。在我的测试中,前面的DEFAULT.MT是固定的,后面部分才随机生成。

 
 
  1. Scheduler scheduler = schedulerFactoryBean.getScheduler();
  2. JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
  3. scheduler.triggerJob(jobKey);
更新任务的时间表达式

更新之后,任务将立即按新的时间表达式执行:

 
 
  1. Scheduler scheduler = schedulerFactoryBean.getScheduler();
  2.  
  3. TriggerKey triggerKey = TriggerKey.triggerKey(scheduleJob.getJobName(),
  4. scheduleJob.getJobGroup());
  5.  
  6. //获取trigger,即在spring配置文件中定义的 bean id="myTrigger"
  7. CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
  8.  
  9. //表达式调度构建器
  10. CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob
  11. .getCronExpression());
  12.  
  13. //按新的cronExpression表达式重新构建trigger
  14. trigger = trigger.getTriggerBuilder().withIdentity(triggerKey)
  15. .withSchedule(scheduleBuilder).build();
  16.  
  17. //按新的trigger重新设置job执行
  18. scheduler.rescheduleJob(triggerKey, trigger);

到这里,我们的spring3 整合quartz 2的定时任务功能终于是告一段落了,对常用的一些功能进行了实现,相信可以满足一般项目的需求了。

<iframe id="starIframe2" src="http://inte.sogou.com/ct?id=426219&amp;h=60&amp;w=640&amp;fv=13&amp;if=16&amp;sohuurl=http%3A%2F%2Fwww.meiriyouke.net%2F%3Fp%3D140&amp;refer=http%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3Dz8coF9MwVZHxDJ72Uc4HkdpGy69zt3FBsuy8_sYhZy9VT3_jxGlIftVUm02acvNm%26wd%3D%26eqid%3Da0ac21d20000f852000000055575475a%26ie%3Dutf-8&amp;rnd=8e3a1455c4bc6145&amp;z=e72d9155c5147f84&amp;lmt=1433782322&amp;srp=1680,1050&amp;ccd=24&amp;lhi=1&amp;eja=true&amp;npl=34&amp;nmi=81&amp;ece=true&amp;lan=zh-CN&amp;bi=2&amp;t1=3&amp;t2=1433811123&amp;pvt=1433811118953&amp;ssi0=259&amp;ti=Spring%203%E6%95%B4%E5%90%88Quartz%202%E5%AE%9E%E7%8E%B0%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1%E4%B8%89%EF%BC%9A%E5%8A%A8%E6%80%81%E6%9A%82%E5%81%9C%20%E6%81%A2%E5%A4%8D%20%E4%BF%AE%E6%94%B9%E5%92%8C%E5%88%A0%E9%99%A4%E4%BB%BB%E5%8A%A1%20%E2%80%93%20%E6%AF%8F%E6%97%A5%E6%9C%89%E5%AE%A2%2C%E6%82%A0%E5%93%A5%E7%9A%84%E9%9A%8F%E6%96%87&amp;bs=792,537&amp;tmp_cdif=0&amp;m=MTQzMzc0OTM2OF9wcmV0dHkgZG9nXzQyNjIxOQA-&amp;ex=" width="640" height="60" align="center,center" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true"></iframe>

转载请注明:每日有客,悠哥的随文 » Spring 3整合Quartz 2实现定时任务三:动态暂停 恢复 修改和删除任务