【前言】在项目的管理功能中,对定时任务的管理有时会很常见。因为我们不能指望只在配置文件中配置好定时任务就行了,因为如果要控制定时任务的 “暂停” 呢?暂停之后又要在某个时间点 “重启” 该定时任务呢?或者说直接 “删除” 该定时任务呢?要改变某定时任务的触发时间呢? “添加” 一个定时任务对于系统的使用者而言,是不太现实的,因为一个定时任务的处理逻辑他是不可能完成的,还是必须得由开发人员去添加。一般来说,是针对 “已有” 定时任务进行的一些操作,这时候就必须要用到代码来操作了,因为此时通过配置来管控是不太现实的。

版本:Spring4.x + quartz2.x

首先,开发人员会在配置文件中配置一个定时任务(定时任务的实现略……)

  1. <bean id="job1" class="org.test.job.TestJob2" />
  2. <!-- 定义触发器来管理任务bean -->
  3. <bean id="cronTriggerJob1"
  4. class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"
  5. p:cronExpression="0 52 17 * * ? *" >
  6. <property name="jobDetail">
  7. <bean class="org.springframework.scheduling.quartz.JobDetailFactoryBean"
  8. p:durability="true"
  9. p:jobClass="org.test.job.TestJob1"
  10. />
  11. </property>
  12. </bean>
  13. </bean>
  14. <!-- 执行实际的调度 -->
  15. <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
  16. <property name="triggers">
  17. <list>
  18. <ref bean="cronTriggerJob1" />
  19. </list>
  20. </property>
  21. </bean>

我们怎么根据配置的bean来操作该定时任务的管理呢?

需查阅spring4.x结合quartz2.x的底层API,并搞清楚以下概念:

1)Trigger trigger. trigger.getKey()会得到两个东西——group:DEFAULT(默认的group name)、name(triggerName)。其中name对应的就是配置文件中配置的trigger的bean的id(或name)

2)trigger.getJobKey()一样会得到两个东西——group:DEFAULT(默认的group name)、name(jobName)。其中jobName对应的就是配置文件中job的bean的id或name(本例为job1)

注:以上粗体字的部分即为代码管理定时任务的关键之处!

3)如何根据jobName查找到他关联到的trigger呢?

quartz1.x还有这种语法,不过quartz2.x已经废除了:

quartz1.x   Trigger trigger = sched.getTrigger(jobName,TRIGGER_GROUP_NAME);

quartz2.x的相关语法(Scheduler类的方法)更为丰富,如下:

public abstract List<? extends Trigger> getTriggersOfJob(JobKey paramJobKey)

throws SchedulerException;

public abstract List<String> getTriggerGroupNames()

throws SchedulerException;

public abstract Set<TriggerKey> getTriggerKeys(GroupMatcher<TriggerKey> paramGroupMatcher)

throws SchedulerException;

public abstract Trigger getTrigger(TriggerKey paramTriggerKey)

throws SchedulerException;

为了改变触发时间,

Trigger trigger =
TriggerBuilder.forJob(String
jobName).newTrigger()..withSchedule(CronScheduleBuilder.cronSchedule(time))build();

然后再用Scheduler调度类去执行:

schedler.resumeTrigger(trigger.getKey());

根据trigger得到相应的JobDetail:

JobDetail jobDetail = (JobDetail) trigger.getJobDataMap().get("jobDetail");

下面是对定时任务的管理(暂停、重启、删除):

  1. //暂停
  2. //schduler.pauseTrigger(TriggerKey triggerKey)
  3. scheduler.pauseJob(JobKey.jobKey("job1"));//停止触发器
  4. Thread.sleep(1000*60*2);
  5. //恢复
  6. //scheduler.resumeJob(JobKey jobKey)则可恢复一个具体的job,
  7. scheduler.resumeTrigger(TriggerKey.triggerKey("cronTriggerJob1"));
  8. Thread.sleep(1000*60*2);
  9. //删除
  10. //没有deleteTrigger的方法
  11. scheduler.deleteJob(JobKey.jobKey("job1"));
  12. Thread.sleep(1000*60*2);
  13. //删除后再次尝试重启(会失效)
  14. scheduler.resumeTrigger(TriggerKey.triggerKey("cronTriggerJob1"));

代码经测试,有效,并注意到:

当resume一个定时任务时,会立即执行该定时任务,执行完此次,然后再按原先设定的时间来定期执行;

当删除一个任务后,就算再次resume时,会失效,即并不会被恢复了。

=========================================

Spring bean必须注意的几点:

1)bean的id和name是一回事儿;

2)当一个bean类继承了InitializingBean接口后,必须实现其setBeanName(String
name)抽象方法。name一般是bean的id或name属性值,此时bean实例化时方法的顺序为setProperties(String
propName)->setBeanName()->afterPropertiesSet();

3)当为了获得一个bean对外提供的接口方法时,必须先获得这个bean的bean对象,通过Spring的SpringContextHolder.getBean(beanId) (其中beanId为bean的id或name属性值)。而不能通过new或者getInstance(获取单例)的方式,否则获取不到该bean的其他属性值!

以代码的方式管理quartz定时任务的暂停、重启、删除、添加等的更多相关文章

  1. quartz2.3.0(十)xml配置方式定义quartz定时任务

    1.新增pom依赖 除了按照<quartz2.3.0系列目录——带您由浅入深全面掌握quartz2.3.0>添加依赖之外,pom.xml里新增加依赖: <dependency> ...

  2. SpringBoot + Quartz定时任务示例

    程序文件结构,如下图,后面详细列出各文件的代码: 1. maven的pom.xml文件如下: <project xmlns="http://maven.apache.org/POM/4 ...

  3. repo+manifests+git方式管理安卓代码

    repo+manifests+git方式管理安卓代码 1.repo的获取 repo只是google用Python脚本写的调用git的一个脚本,主要是用来下载.管理Android项目的软件仓库.(也就是 ...

  4. Spring quartz定时任务service注入问题

    今天想单元测试一下spring中的quartz定时任务,job类的大致结构和下面的SpringQtz1类相似,我的是实现的org.quartz.Job接口,到最后总是发现job类里注入的service ...

  5. Quartz定时任务使用小记(11月22日)

    骤然接触quartz,先从小处着手,why,what,how quartz定时任务: 为什么使用quartz定时任务,以及定时任务在实际应用场景下的特定需求. 1.用户方面的需要,为了提供更好的使用体 ...

  6. 对quartz定时任务的初步认识

    已经好久没有写技术博文了,今天就谈一谈我前两天自学的quartz定时任务吧,我对quartz定时任务的理解,就是可以设定一个时间,然后呢,在这个时间到的时候,去执行业务逻辑,这是我的简单理解,接下来看 ...

  7. Spring整合Quartz定时任务 在集群、分布式系统中的应用(Mysql数据库环境)

    Spring整合Quartz定时任务 在集群.分布式系统中的应用(Mysql数据库环境)   转载:http://www.cnblogs.com/jiafuwei/p/6145280.html 单个Q ...

  8. SpringBoot整合Quartz定时任务 的简单实例 2

    (1)什么是Quartz?(2)Quartz的特点:(3)Quartz专用词汇说明:(4)Quartz任务调度基本实现原理: 接下来看下具体的内容: (1)什么是Quartz? Quartz是一个完全 ...

  9. 搭建maven web项目并配置quartz定时任务【业务:对比数据变化内容】 历程

    搭建maven web项目并配置quartz定时任务[业务:对比数据变化内容] 历程2018年03月03日 10:51:10 守望dfdfdf 阅读数:100更多个人分类: 工作 问题编辑版权声明:本 ...

随机推荐

  1. 牛客多校第九场 B Quadratic equation 模平方根

    题意: 已知 $x+y$ $mod$ $q = b$ $x*y$ $mod$ $q = c$ 已知b和c,求x和y 题解: 容易想到$b^2-4c=x^2-2xy+y^2=(x-y)^2$ 那么开个根 ...

  2. jQuery 基本使用

    index.html <head><meta http-equiv="Content-Type" content="text/html; charset ...

  3. LOJ #113. 最大异或和 (线性基)

    题目链接:#113. 最大异或和 题目描述 这是一道模板题. 给由 \(n\) 个数组成的一个可重集 \(S\),每次给定一个数 \(k\),求一个集合 \(T \subseteq S\),使得集合 ...

  4. Python骚操作(一)

    1. 交换变量值 2. 将列表中所有元素组合成字符串 3. 查找列表中频率最高的值 4. 检查连个字符串是不是由相同字母不同顺序组成 5. 反转字符串 6. 反转列表 7. 转置二维数组 8. 链式比 ...

  5. LeetCode 31. Next Permutation【Medium】

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

  6. 次梯度(Subgradient)

    参考链接:https://closure11.com/subgradient/

  7. 整理及优化CSS代码的7个原则

    作为网页设计师(前端工程师),你可能还记得曾经的那个网页大小建议:一个网页(包括HTML.CSS.Javacript.Flash和图片)尽量不要超过30KB的大小,随着互联网的日益庞大,网络带宽也在飞 ...

  8. Vue.js小游戏:测试CF打狙速度

    此项目只测试反应速度,即手点击鼠标的反应速度 html代码 <div id="top">请等待图片变颜色,颜色便的那一刻即可点击测手速</div> < ...

  9. List、Map、Set 三个接口,存取元素时,各有什么特点

    List与Set都是单列元素的集合,它们有一个功共同的父接口Collection. Set里面不允许有重复的元素, 存元素:add方法有一个boolean的返回值,当集合中没有某个元素,此时add方法 ...

  10. VC 复制移动删除重命名文件文件

    说明: 1.以下封装了4个函数_CopyFile,_DeleteFile,_MoveFile,_ReNameFile 2.每个函数都先拷贝了原来的路径,保证了路径是以2个\0\0结尾.(如果不以2个\ ...