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

版本: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. 使用Docker在服务器上部署Ubuntu,本地传文件到docker

    使用Docker在服务器上部署Ubuntu,本地传文件到docker 作者:王佳乐 目录 安装Docker 安装Docker 全部安装流程: 登录服务器 ssh username@ip 检查是否已经安 ...

  2. 引入CSS的方法

    ##1 关于引入css样式的方法: 1 外部引入: <link rel="stylesheet" type="text/css" href="& ...

  3. Java 网络编程(1):使用 NetworkInterface 获得本机在局域网内的 IP 地址

    原文地址:https://segmentfault.com/a/1190000007462741 1.问题提出 在使用 Java 开发网络程序时,有时候我们需要知道本机在局域网中的 IP 地址.很常见 ...

  4. day27-面向对象进阶

    #!/usr/bin/env python # -*- coding:utf-8 -*- # ----------------------------------------------------- ...

  5. Mysql 提交Big sql的过程

    此处的big sql指的是单条sql的size 超过innodb_log_file_size,通过构造这样的测试,来分析mysql的提交过程. 做这个分析的起因是我不是很明白,既然mysql需要将被执 ...

  6. KEIL, MDK 关于C99结构体变量初始化

    C99:here 例如声明了这样的结构体 void test1() { tt_t t1 ={ .a = , .d = 'd', .b = , .c = }; static tt_t t2 = { ,, ...

  7. n-map安装实操

    强烈建议大家从官网下载nmap,而不是其他的第三方.官网地址:https://nmap.org/download.html 打开是这样的,感觉有点阴森森的色调.BTW,谁能逃得过真香定律呢. wind ...

  8. 19-Ubuntu-文件和目录命令-删除文件和目录-rm

    rm 删除文件或目录 注:使用rm命令要小心,因为文件删除后不能恢复.不会放在垃圾箱里,直接从磁盘删除. 选项 含义 -f 强制删除文件,无需提示.不能删除目录! -r 递归的删除目录下的内容,删除文 ...

  9. 【洛谷】P1009阶乘之和

    题目链接:https://www.luogu.org/problemnew/show/P1009 题意:给一个整数n(n<50),求$ \sum^{n}_{i=1} i! $ 题解:我..拿py ...

  10. 【2018ACM/ICPC网络赛】徐州赛区

    呃.自闭了自闭了.我才不会说我写D写到昏天黑地呢. I  Characters with Hash 题目链接:https://nanti.jisuanke.com/t/31461 题意:给你一个字符串 ...