日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

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

發布時間:2024/9/20 javascript 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring 3整合Quartz 2实现定时任务三:动态暂停 恢复 修改和删除任务 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前面我們已經完成了spring 3和quartz 2的整合以及動態添加定時任務,我們接著來完善它,使之能支持更多的操作,例如暫停、恢復、修改等。

在動態添加定時任務中其實已經涉及到了其中的一些代碼,這里我們再來細化的理一理。先來看一下我們初步要實現的目標效果圖,這里我們只在內存中操作,并沒有把quartz的任何信息保存到數據庫,即使用的是RAMJobStore,當然如果你有需要,可以實現成JDBCJobStore,那樣任務信息將會更全面,貌似還有專門的監控工具,不過本人沒有用過:

如上圖,我們要先列出計劃中的定時任務以及正在執行中的定時任務,這里的正在執行中指的是任務已經觸發線程還沒執行完的情況。比如每天2點執行一個數據導入操作,這個操作執行時間需要5分鐘,在這5分鐘之內這個任務才是運行中的任務。當任務正常時可以使用暫停按鈕,任務暫停時可以使用恢復按鈕。

trigger各狀態說明:

None:Trigger已經完成,且不會在執行,或者找不到該觸發器,或者Trigger已經被刪除 NORMAL:正常狀態 PAUSED:暫停狀態 COMPLETE:觸發器完成,但是任務可能還正在執行中 BLOCKED:線程阻塞狀態 ERROR:出現錯誤

計劃中的任務

指那些已經添加到quartz調度器的任務,因為quartz并沒有直接提供這樣的查詢接口,所以我們需要結合JobKey和Trigger來實現,核心代碼:

  • Scheduler scheduler = schedulerFactoryBean.getScheduler();
  • GroupMatcher<JobKey> matcher = GroupMatcher.anyJobGroup();
  • Set<JobKey> jobKeys = scheduler.getJobKeys(matcher);
  • List<ScheduleJob> jobList = new ArrayList<ScheduleJob>();
  • for (JobKey jobKey : jobKeys) {
  • List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);
  • for (Trigger trigger : triggers) {
  • ScheduleJob job = new ScheduleJob();
  • job.setJobName(jobKey.getName());
  • job.setJobGroup(jobKey.getGroup());
  • job.setDesc("觸發器:" + trigger.getKey());
  • Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
  • job.setJobStatus(triggerState.name());
  • if (trigger instanceof CronTrigger) {
  • CronTrigger cronTrigger = (CronTrigger) trigger;
  • String cronExpression = cronTrigger.getCronExpression();
  • job.setCronExpression(cronExpression);
  • }
  • jobList.add(job);
  • }
  • }
  • 上面代碼中的jobList就是我們需要的計劃中的任務列表,需要注意一個job可能會有多個trigger的情況,在下面講到的立即運行一次任務的時候,會生成一個臨時的trigger也會出現在這。這里把一個Job有多個trigger的情況看成是多個任務。我們前面包括在實際項目中一般用到的都是CronTrigger ,所以這里我們著重處理了下CronTrigger的情況。

    運行中的任務

    實現和計劃中的任務類似,核心代碼:

  • Scheduler scheduler = schedulerFactoryBean.getScheduler();
  • List<JobExecutionContext> executingJobs = scheduler.getCurrentlyExecutingJobs();
  • List<ScheduleJob> jobList = new ArrayList<ScheduleJob>(executingJobs.size());
  • for (JobExecutionContext executingJob : executingJobs) {
  • ScheduleJob job = new ScheduleJob();
  • JobDetail jobDetail = executingJob.getJobDetail();
  • JobKey jobKey = jobDetail.getKey();
  • Trigger trigger = executingJob.getTrigger();
  • job.setJobName(jobKey.getName());
  • job.setJobGroup(jobKey.getGroup());
  • job.setDesc("觸發器:" + trigger.getKey());
  • Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
  • job.setJobStatus(triggerState.name());
  • if (trigger instanceof CronTrigger) {
  • CronTrigger cronTrigger = (CronTrigger) trigger;
  • String cronExpression = cronTrigger.getCronExpression();
  • job.setCronExpression(cronExpression);
  • }
  • jobList.add(job);
  • }
  • 暫停任務

    這個比較簡單,核心代碼:

  • Scheduler scheduler = schedulerFactoryBean.getScheduler();
  • JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
  • scheduler.pauseJob(jobKey);
  • 恢復任務

    和暫停任務相對,核心代碼:

  • Scheduler scheduler = schedulerFactoryBean.getScheduler();
  • JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
  • scheduler.resumeJob(jobKey);
  • 刪除任務

    刪除任務后,所對應的trigger也將被刪除

  • Scheduler scheduler = schedulerFactoryBean.getScheduler();
  • JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
  • scheduler.deleteJob(jobKey);
  • 立即運行任務

    這里的立即運行,只會運行一次,方便測試時用。quartz是通過臨時生成一個trigger的方式來實現的,這個trigger將在本次任務運行完成之后自動刪除。trigger的key是隨機生成的,例如:DEFAULT.MT_4k9fd10jcn9mg。在我的測試中,前面的DEFAULT.MT是固定的,后面部分才隨機生成。

  • Scheduler scheduler = schedulerFactoryBean.getScheduler();
  • JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
  • scheduler.triggerJob(jobKey);
  • 更新任務的時間表達式

    更新之后,任務將立即按新的時間表達式執行:

  • Scheduler scheduler = schedulerFactoryBean.getScheduler();
  • TriggerKey triggerKey = TriggerKey.triggerKey(scheduleJob.getJobName(),
  • scheduleJob.getJobGroup());
  • //獲取trigger,即在spring配置文件中定義的 bean id="myTrigger"
  • CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
  • //表達式調度構建器
  • CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob
  • .getCronExpression());
  • //按新的cronExpression表達式重新構建trigger
  • trigger = trigger.getTriggerBuilder().withIdentity(triggerKey)
  • .withSchedule(scheduleBuilder).build();
  • //按新的trigger重新設置job執行
  • scheduler.rescheduleJob(triggerKey, trigger);
  • 到這里,我們的spring3 整合quartz 2的定時任務功能終于是告一段落了,對常用的一些功能進行了實現,相信可以滿足一般項目的需求了。

    總結

    以上是生活随笔為你收集整理的Spring 3整合Quartz 2实现定时任务三:动态暂停 恢复 修改和删除任务的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。