【前言】在项目的管理功能中,对定时任务的管理有时会很常见。因为我们不能指望只在配置文件中配置好定时任务就行了,因为如果要控制定时任务的 “暂停” 呢?暂停之后又要在某个时间点 “重启” 该定时任务呢?或者说直接 “删除” 该定时任务呢?要改变某定时任务的触发时间呢? “添加” 一个定时任务对于系统的使用者而言,是不太现实的,因为一个定时任务的处理逻辑他是不可能完成的,还是必须得由开发人员去添加。一般来说,是针对 “已有” 定时任务进行的一些操作,这时候就必须要用到代码来操作了,因为此时通过配置来管控是不太现实的。
版本: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的其他属性值!
相关推荐
Spring + quartz 定时任务修改定时时间不重启服务
quartz定时任务使用例子大全,这里面介绍了三种使用quartz定时任务的方式,第一种方式是完全使用代码写死的调用方式,第二种使用的是从数据库读取任务配置信息的调用方式,第三种是使用从数据库读取任务配置,生成...
Quartz定时任务
附件中实现了对quartz的动态添加、修改和删除定时任务,方便通过页面动态控制执行定时任务。
ssm整合quartz 并持久化到数据库中,实现动态增删改查,暂停任务,恢复任务等 将链接内的target文件直接放到项目ssmquartztest文件夹下 运行环境: jdk5+tomcat7+mysql+eclipse+maven lib jar包下载地址 地址1:...
Spring Quartz 动态暂停、恢复、修改定时任务的一个demo,使用maven构建,框架采用spring springmvc jpa,数据库mysql,含数据库脚本,运行可用,页面访问地址http://localhost:8080/quartz_demo/quartz/list
Java Quartz定时任务简单列子
使用quartz实现的java 定时任务,通过写cron表达式,让任务在制定时刻触发执行。
基于SSM+quartz的定时任务管理demo
Quartz定时任务框架,本次小白使用它实现一个简单的定时任务。每隔3秒打印一次Hello。这个是例子的jar包,实现过程在博客首页可看到。
C# Quartz.Net定时任务操作明细、完整过程 每种场景均有涉及,代码Copy稍作修改就可使用
.net Quartz定时任务实例,两种方式调用:配置文件,代码动态调用
2.quartz-2.1.3目录下也有目前最新的quartz定时任务所需的jar包 3.有两个word档,可自行查看学习和了解quartz的相关应用 定时任务所需jar: commons-collections.jar, commons-logging.jar, log4j-1.2.14.jar, jta...
定时任务quartz实现分组串行并行动态配置
Quartz定时任务常用的11张数据库脚本表结构,网上大部分都是只是说说,没有实际帮助,有的大部分积分还很贵,本人总结一下,希望能给有需要的人一些帮助。
spring整合quartz定时任务调度..........
可以通过quartz和spring的简单配置即可完成,但如果要改变任务的执行时间、频率,废弃任务等就需要改变配置甚至代码需要重启服务器,这里介绍一下如何通过quartz与spring的组合实现动态的改变定时任务的状态的一个...
Quartz.net作业调度自定义定时执行任务多任务执行c#,定时执行任务,如超时取消订单,自动确认收货等等
Springboot整合Quartz实现定时任务数据库动态配置,新增任务、修改cron表达式、暂停任务、恢复任务、删除任务等操作
Quartz.Net是一个定时任务框架,可以实现异常灵活的定时任务,开发人员只要编写少量的代码就可以实现“每隔1小时执行”、“每天22点执行”、“每月18日的下午执行8次”等各种定时任务。 Quartz.Net中的概念:计划者...