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的定時任務功能終因而告一段落了,對經常使用的一些功能進行了實現,相信能夠知足通常項目的需求了。

相關文章
相關標籤/搜索