以代码的方式管理quartz定时任务的暂停、重启、删除、添加等
【前言】在项目的管理功能中,对定时任务的管理有时会很常见。因为我们不能指望只在配置文件中配置好定时任务就行了,因为如果要控制定时任务的 “暂停” 呢?暂停之后又要在某个时间点 “重启” 该定时任务呢?或者说直接 “删除” 该定时任务呢?要改变某定时任务的触发时间呢? “添加” 一个定时任务对于系统的使用者而言,是不太现实的,因为一个定时任务的处理逻辑他是不可能完成的,还是必须得由开发人员去添加。一般来说,是针对 “已有” 定时任务进行的一些操作,这时候就必须要用到代码来操作了,因为此时通过配置来管控是不太现实的。
版本:Spring4.x + quartz2.x
首先,开发人员会在配置文件中配置一个定时任务(定时任务的实现略……)
- <bean id="job1" class="org.test.job.TestJob2" />
- <!-- 定义触发器来管理任务bean -->
- <bean id="cronTriggerJob1"
- class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"
- p:cronExpression="0 52 17 * * ? *" >
- <property name="jobDetail">
- <bean class="org.springframework.scheduling.quartz.JobDetailFactoryBean"
- p:durability="true"
- p:jobClass="org.test.job.TestJob1"
- />
- </property>
- </bean>
- </bean>
- <!-- 执行实际的调度 -->
- <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
- <property name="triggers">
- <list>
- <ref bean="cronTriggerJob1" />
- </list>
- </property>
- </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");
下面是对定时任务的管理(暂停、重启、删除):
- //暂停
- //schduler.pauseTrigger(TriggerKey triggerKey)
- scheduler.pauseJob(JobKey.jobKey("job1"));//停止触发器
- Thread.sleep(1000*60*2);
- //恢复
- //scheduler.resumeJob(JobKey jobKey)则可恢复一个具体的job,
- scheduler.resumeTrigger(TriggerKey.triggerKey("cronTriggerJob1"));
- Thread.sleep(1000*60*2);
- //删除
- //没有deleteTrigger的方法
- scheduler.deleteJob(JobKey.jobKey("job1"));
- Thread.sleep(1000*60*2);
- //删除后再次尝试重启(会失效)
- 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定时任务的暂停、重启、删除、添加等的更多相关文章
- quartz2.3.0(十)xml配置方式定义quartz定时任务
1.新增pom依赖 除了按照<quartz2.3.0系列目录——带您由浅入深全面掌握quartz2.3.0>添加依赖之外,pom.xml里新增加依赖: <dependency> ...
- SpringBoot + Quartz定时任务示例
程序文件结构,如下图,后面详细列出各文件的代码: 1. maven的pom.xml文件如下: <project xmlns="http://maven.apache.org/POM/4 ...
- repo+manifests+git方式管理安卓代码
repo+manifests+git方式管理安卓代码 1.repo的获取 repo只是google用Python脚本写的调用git的一个脚本,主要是用来下载.管理Android项目的软件仓库.(也就是 ...
- Spring quartz定时任务service注入问题
今天想单元测试一下spring中的quartz定时任务,job类的大致结构和下面的SpringQtz1类相似,我的是实现的org.quartz.Job接口,到最后总是发现job类里注入的service ...
- Quartz定时任务使用小记(11月22日)
骤然接触quartz,先从小处着手,why,what,how quartz定时任务: 为什么使用quartz定时任务,以及定时任务在实际应用场景下的特定需求. 1.用户方面的需要,为了提供更好的使用体 ...
- 对quartz定时任务的初步认识
已经好久没有写技术博文了,今天就谈一谈我前两天自学的quartz定时任务吧,我对quartz定时任务的理解,就是可以设定一个时间,然后呢,在这个时间到的时候,去执行业务逻辑,这是我的简单理解,接下来看 ...
- Spring整合Quartz定时任务 在集群、分布式系统中的应用(Mysql数据库环境)
Spring整合Quartz定时任务 在集群.分布式系统中的应用(Mysql数据库环境) 转载:http://www.cnblogs.com/jiafuwei/p/6145280.html 单个Q ...
- SpringBoot整合Quartz定时任务 的简单实例 2
(1)什么是Quartz?(2)Quartz的特点:(3)Quartz专用词汇说明:(4)Quartz任务调度基本实现原理: 接下来看下具体的内容: (1)什么是Quartz? Quartz是一个完全 ...
- 搭建maven web项目并配置quartz定时任务【业务:对比数据变化内容】 历程
搭建maven web项目并配置quartz定时任务[业务:对比数据变化内容] 历程2018年03月03日 10:51:10 守望dfdfdf 阅读数:100更多个人分类: 工作 问题编辑版权声明:本 ...
随机推荐
- LogInfoHelper
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...
- Linux下使用Eclipse 远程调试
1 开启端口 修改/apache-tomcat-7.0.40/bin/catalina.sh 在合适的位置(请自行判断,只要有JAVA_OPTS的设定前后即可)插入下面的设定:UI_DEBUG=&qu ...
- Codeforces 1167A-Telephone Number
题目链接:http://codeforces.com/problemset/problem/1167/A 思路:检索前面0 ~(n −11)个字符中是否有 8 即可. AC代码: #include&l ...
- python list基本操作一
a = [1,2,3,1,2,3] 一.删除元素 1.按索引删除: a.pop(1) # 删除第二个值 # in:[1,2,3,2] # out:[1,3,2] 返回值:被删除的元素,这个时候list ...
- 我写的界面,在ARM上跑
这个...其实,我对ARM了解并不多,我顶多也就算是知道ARM怎么玩,EMMC干啥,MMU干啥,还有早期的叫法,比如那个NorFlash NandFlash ,然后也就没啥了. 然后写个裸机什么的,那 ...
- jsonArray转换成List
从字符串String转换成List 字符串格式: String jsonstr = "{'studentsjson':[{'student':'张三'},{'student':'李四'}] ...
- 查看收到的邮件的来源ip以及包信息
有时我们需要知道收到的邮件是从哪台服务器发送过来的,或者想知道该邮件的报文头是怎样的.以下以网易邮箱为例介绍如果抓取这些信息. 首先我们需要知道网易邮箱的访问服务器(拉协议),由于SMTP是推的协议, ...
- [JZOJ4665] 【GDOI2017模拟7.21】数列
题目 题目大意 给你一个数列,让你找到一个最长的连续子序列,满足在添加了至多KKK个数之后,能够变成一条公差为DDD的等差数列. 思考历程 一眼看上去似乎是一道神题-- 没有怎么花时间思考,毕竟时间都 ...
- Date()日期转换和简单计算
/** * 判断是否为闰年 * @param year * @return */ public boolean isLeap ( int year ) { if ( (year % 4 == 0 &a ...
- git使用过程中问题
git提交文件命令顺序 fetch merge add commit pull push 取消已add文件 git reset HEAD 文件名 覆盖本地文件 git checkout 文件名 $ g ...