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

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

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

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

trigger各状态说明:测试

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

计划中的任务线程

指那些已经添加到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 =newArrayList<ScheduleJob>();
  5. for(JobKey jobKey : jobKeys){
  6. List<?extendsTrigger> triggers = scheduler.getTriggersOfJob(jobKey);
  7. for(Trigger trigger : triggers){
  8. ScheduleJob job =newScheduleJob();
  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 instanceofCronTrigger){
  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的状况。内存

运行中的任务get

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

  1. Scheduler scheduler = schedulerFactoryBean.getScheduler();
  2. List<JobExecutionContext> executingJobs = scheduler.getCurrentlyExecutingJobs();
  3. List<ScheduleJob> jobList =newArrayList<ScheduleJob>(executingJobs.size());
  4. for(JobExecutionContext executingJob : executingJobs){
  5. ScheduleJob job =newScheduleJob();
  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 instanceofCronTrigger){
  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的定时任务功能终因而告一段落了,对经常使用的一些功能进行了实现,相信能够知足通常项目的需求了。

相关文章
相关标签/搜索