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

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

如上图,我们要先列出计划中的定时任务以及正在执行中的定时任务,这里的正在执行中指的是任务已经触发线程还没执行完的情况。比如每天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. TriggerKey triggerKey = TriggerKey.triggerKey(scheduleJob.getJobName(),
  3. scheduleJob.getJobGroup());
  4. //获取trigger,即在spring配置文件中定义的 bean id="myTrigger"
  5. CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
  6. //表达式调度构建器
  7. CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob
  8. .getCronExpression());
  9. //按新的cronExpression表达式重新构建trigger
  10. trigger = trigger.getTriggerBuilder().withIdentity(triggerKey)
  11. .withSchedule(scheduleBuilder).build();
  12. //按新的trigger重新设置job执行
  13. scheduler.rescheduleJob(triggerKey, trigger);

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

Spring 3整合Quartz 2实现定时任务三:动态暂停 恢复 修改和删除任务的更多相关文章

  1. spring boot 整合 quartz 集群环境 实现 动态定时任务配置【原】

    最近做了一个spring boot 整合 quartz  实现 动态定时任务配置,在集群环境下运行的 任务.能够对定时任务,动态的进行增删改查,界面效果图如下: 1. 在项目中引入jar 2. 将需要 ...

  2. Spring 3整合Quartz 2实现定时任务一:常规整合 (基于maven构建)

    最近工作中需要用到定时任务的功能,虽然Spring3也自带了一个轻量级的定时任务实现,但感觉不够灵活,功能也不够强大.在考虑之后,决定整合更为专业的Quartz来实现定时任务功能. 首先,当然是添加依 ...

  3. Spring 3整合Quartz 1实现定时任务一:常规整合(基于maven构建)

    Spring配置Quartz例子(基于maven构建) 在Spring中使用Quartz有两种方式实现:第一种是任务类继承QuartzJobBean,第二种则是在配置文件里定义任务类和要执行的方法,类 ...

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

    先展示一下后台管理定时任务效果图: 1.新增任务页面: 2.列表页(实现任务的禁用启用) 3.数据库脚本: -- ------------------------------ Table struct ...

  5. Spring 3整合Quartz 2实现定时任务--转

    常规整合 http://www.meiriyouke.net/?p=82 最近工作中需要用到定时任务的功能,虽然Spring3也自带了一个轻量级的定时任务实现,但感觉不够灵活,功能也不够强大.在考虑之 ...

  6. Spring 3整合Quartz 2实现手动设置定时任务:新增,修改,删除,暂停和恢复(附带源码)

    摘要:在项目的管理功能中,对定时任务的管理有时会很常见.但一般定时任务配置都在xml中完成,包括cronExpression表达式,十分的方便.但是如果我的任务信息是保存在数据库的,想要动态的初始化, ...

  7. spring boot 整合quartz ,job不能注入的问题

    在使用spring boot 整合quartz的时候,新建定时任务类,实现job接口,在使用@AutoWire或者@Resource时,运行时出现nullpointException的问题.显然是相关 ...

  8. spring boot整合quartz实现多个定时任务

        版权声明:本文为博主原创文章,转载请注明出处. https://blog.csdn.net/liuchuanhong1/article/details/78543574 最近收到了很多封邮件, ...

  9. Quartz动态添加、修改和删除定时任务

    任务调度开源框架Quartz动态添加.修改和删除定时任务 Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制.Quartz框架包含了调度器监听.作业和触 ...

随机推荐

  1. wim2008 让FTP防火墙可用性配置

    转: Win2003和Win2008防火墙导致FTP服务器不能访问的解决方法 这篇文章主要介绍了Win2003和Win2008防火墙导致FTP服务器不能访问的解决方法,需要的朋友可以参考下 由于通过远 ...

  2. 下载Sourceforge等国内无法下载站点文件的另一种方法

    Sourceforge是一些开源软件经常用到的网站,然而国内的网站一直不稳定,如今是可以访问,但是一直无法下载,今天发现了一种新方法那就是http://www.mirrorservice.org 这个 ...

  3. 检测Sql Server服务器SQL语句执行情况

    1.查找目前SQL Server所执行的SQL语法,并展示资源情况: SQL code ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ...

  4. go语言之进阶篇通过map生成json

    1.通过map生成json 示例1: package main import ( "encoding/json" "fmt" ) func main() { / ...

  5. 【Lua】LuaForWindows_v5.1.4-46安装失败解决方案

    下个补丁vcredist_x86.exe 可以到下面连接下载: https://download.csdn.net/download/tvcctv27tv/10344318

  6. iOS的settings bundle中开关button(Toggle Switch)取不到值的问题

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 假设认为写的不好请多提意见,假设认为不错请多多支持点赞.谢谢! hopy ;) 在Xcode7.2中设置App的settings bundle ...

  7. 入门GTD时间管理系统必读

    让我们从什么时间管理开始.什么是时间管理呢?嗯,时间管理就是管理时间.可是,时间怎么能够管理呢? 其实我们管理地并不是时间,而是我们做的事.我们将事情分配到合适的时间段中,在有限的精力中完成它们,得到 ...

  8. ArcGIS查找空洞多边形

    现需要用ArcGIS将多边形面层中是"空洞"的要素查找出来. 代码思路 一开始没有思路,于是写了代码,基本流程如下: 1)遍历需要判断的要素(可通过属性筛选): 2)检查某一要素相 ...

  9. Jquery遍历筛选数组的几种方法和遍历解析json对象|Map()方法详解

    Jquery遍历筛选数组的几种方法和遍历解析json对象|Map()方法详解 一.Jquery遍历筛选数组 1.jquery grep()筛选遍历数组 $().ready( function(){ v ...

  10. C#常用特性

    1.服务器控件ID .NET服务器控件有三个ID,即:ID,ClientID和UniqueID ID为服务器控件的服务器标示,在服务器代码中通过ID来唯一区分服务器控件: ClientID是服务器控件 ...