初识Quartz(二)
简单作业:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
package quartz_project.example2; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.quartz.JobKey; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * 需要在特定的日期或者时间启动, * 并且期望以一个可能的间隔时间重复执行 n 次的Job * * @author caijw */ public class SimpleJob implements Job { private static Logger _log = LoggerFactory.getLogger(SimpleJob. class ); @Override public void execute(JobExecutionContext ctx) throws JobExecutionException { JobKey jobKey = ctx.getJobDetail().getKey(); _log.info( "SimpleJob says: " + jobKey + " executing at " + new Date()); } } |
注:由于代码较长,本文将按照任务分开解释,第一段代码将做为下列任务的运行环境。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
Logger log = LoggerFactory.getLogger(SimpleTriggerExample. class ); log.info( "----- Initializing --------" ); //第一步我们必须获取一个调度器 SchedulerFactory sf = new StdSchedulerFactory(); Scheduler sched = sf.getScheduler(); log.info( "----- Initialization complete -------" ); //作业的执行时间(这里需要注意,下面详细说明) Date startTime = DateBuilder.nextGivenSecondDate( null , 15 ); log.info( "----- scheduling jobs --------" ); |
注意:Date startTime = DateBuilder.nextGivenSecondDate(null, 15);
每分钟以15秒为单位,在当前时间的在下一个15秒开始。例如:当前时间为18:20:02秒,那么作业将在18:20:15秒执行。
一、在startTime时间点执行job1
1
2
3
4
5
6
7
8
9
10
11
12
13
|
JobDetail job = JobBuilder.newJob(SimpleJob. class ) .withIdentity( "job1" , "group1" ) .build(); SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger() .withIdentity( "trigger1" , "group1" ) .startAt(startTime).build(); //该触发器将在startTime时执行作业 Date ft = sched.scheduleJob(job, trigger); log.info(job.getKey() + " will run at: " + ft + " and repeat: " + trigger.getRepeatCount() + " times, every " + trigger.getRepeatInterval() / 1000 + " seconds" ); |
二、在startTime时间点执行job2
1
2
3
4
5
6
7
8
9
10
11
12
|
job = JobBuilder.newJob(SimpleJob. class ) .withIdentity( "job2" , "group1" ) .build(); trigger = (SimpleTrigger) TriggerBuilder.newTrigger() .withIdentity( "trigger2" , "group1" ) .startAt(startTime).build(); ft = sched.scheduleJob(job, trigger); log.info(job.getKey() + " will run at: " + ft + " and repeat: " + trigger.getRepeatCount() + " times, every " + trigger.getRepeatInterval() / 1000 + " seconds" ); |
通过下面的输出结果可以发现:该作业是以多线程并发运行的。
1
2
3
4
5
|
[INFO] 27 一月 09:19:15.000 下午 DefaultQuartzScheduler_Worker-2 [quartz_project.example2.SimpleJob] SimpleJob says: group1.job1 executing at Mon Jan 27 21:19:15 CST 2014 [INFO] 27 一月 09:19:15.000 下午 DefaultQuartzScheduler_Worker-3 [quartz_project.example2.SimpleJob] SimpleJob says: group1.job2 executing at Mon Jan 27 21:19:15 CST 2014 |
三、在startTime时间点执行job3,以后每隔10s运行一次,重复10次,共运行11次。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
job = JobBuilder.newJob(SimpleJob. class ) .withIdentity( "job3" , "group1" ) .build(); trigger = TriggerBuilder.newTrigger() .withIdentity( "trigger3" , "group1" ) .startAt(startTime) .withSchedule(SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds( 10 ) //时间间隔10s .withRepeatCount( 10 )) //重复次数10次 .forJob(job).build(); ft = sched.scheduleJob(job, trigger); log.info(job.getKey() + " will run at: " + ft + " and repeat: " + trigger.getRepeatCount() + " times, every " + trigger.getRepeatInterval() / 1000 + " seconds" ); |
三、为job3重新绑定trigger,在startTime时间点执行job3,以后每隔10s运行一次,重复2次。
1
2
3
4
5
6
7
8
9
10
11
|
trigger = TriggerBuilder.newTrigger() .withIdentity( "trigger3" , "group2" ) //记得换成group2不然就不唯一了 .startAt(startTime) .withSchedule(SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds( 10 ) .withRepeatCount( 2 )) .forJob(job).build(); ft = sched.scheduleJob(trigger); //注意这里,不可以使用sched.scheduleJob(job, trigger) log.info(job.getKey() + " will [also] run at: " + ft + " and repeat: " + trigger.getRepeatCount() + " times, every " + trigger.getRepeatInterval() / 1000 + " seconds" ); |
四、在当前时间的5分钟后执行job5。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
job = JobBuilder.newJob(SimpleJob. class ) .withIdentity( "job5" , "group1" ) .build(); trigger = (SimpleTrigger) TriggerBuilder.newTrigger() .withIdentity( "trigger5" , "group1" ) .startAt(DateBuilder.futureDate( 5 , IntervalUnit.MINUTE)) //当前时间的5分钟后 .build(); ft = sched.scheduleJob(job, trigger); log.info(job.getKey() + " will run at: " + ft + " and repeat: " + trigger.getRepeatCount() + " times, every " + trigger.getRepeatInterval() / 1000 + " seconds" ); |
五、在startTime时间点执行job6,以后每隔40s运行一次,无限执行下去。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
job = JobBuilder.newJob(SimpleJob. class ) .withIdentity( "job6" , "group1" ) .build(); trigger = TriggerBuilder.newTrigger() .withIdentity( "trigger6" , "group1" ) .startAt(startTime) .withSchedule(SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds( 40 ) .repeatForever()) //无限次 .forJob(job).build(); ft = sched.scheduleJob(job, trigger); log.info(job.getKey() + " will run at: " + ft + " and repeat: " + trigger.getRepeatCount() + " times, every " + trigger.getRepeatInterval() / 1000 + " seconds" ); |
六、所有的作业都被加到了调度器中,但是只有调度器启动作业才会开始执行
1
2
3
|
log.info( "------ starting scheduler -------" ); sched.start(); //启动调度器 log.info( "------ started scheduler -------" ); |
七、在调度器启动后,仍可以添加作业进去:在startTime时间点执行job7,以后每隔5分钟运行一次,执行20次。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
job = JobBuilder.newJob(SimpleJob. class ) .withIdentity( "job7" , "group1" ) .build(); trigger = TriggerBuilder.newTrigger() .withIdentity( "trigger7" , "group1" ) .startAt(startTime) .withSchedule(SimpleScheduleBuilder.simpleSchedule() .withIntervalInMinutes( 5 ) .withRepeatCount( 20 )) .build(); ft = sched.scheduleJob(job, trigger); log.info(job.getKey() + " will run at: " + ft + " and repeat: " + trigger.getRepeatCount() + " times, every " + trigger.getRepeatInterval() / 1000 + " seconds" ); |
八、作业可以不需要触发器,而是通过手动启动。
1
2
3
4
5
6
7
8
9
|
job = JobBuilder.newJob(SimpleJob. class ) .withIdentity( "job8" , "group1" ) .storeDurably() //即使没有Trigger关联时,也不需要删除该JobDetail .build(); sched.addJob(job, true ); log.info( "'Manually' triggering job8..." ); sched.triggerJob(JobKey.jobKey( "job8" , "group1" )); //通过手动触发,执行作业8 |
九、重新注册job7,利用线程休眠模拟过了执行时间,效果就是该作业会马上执行一次。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
log.info( "------- Waiting 30 seconds... --------------" ); try { Thread.sleep(30L * 1000L); } catch (Exception e) { log.error(e.getMessage(), e); } log.info( "---------- rescheduling... -------" ); trigger = TriggerBuilder.newTrigger() .withIdentity( "trigger7" , "group1" ) .startAt(startTime) .withSchedule(SimpleScheduleBuilder.simpleSchedule() .withIntervalInMinutes( 5 ) .withRepeatCount( 20 )) .build(); ft = sched.rescheduleJob(trigger.getKey(), trigger); log.info( "job7 rescheduled to run at: " + ft); |
注意: ft = sched.rescheduleJob(trigger.getKey(), trigger); 表示在sched.start()之后调用,可以在job开始后重新定义trigger,然后重新注册。
十、五分钟后关闭调度器,所以没有执行完的作业将终止。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
log.info( "------- Waiting five minutes... ------------" ); try { // wait five minutes to show jobs Thread.sleep(300L * 1000L); // executing... } catch (Exception e) { } log.info( "------- Shutting Down ---------------------" ); sched.shutdown( true ); log.info( "------- Shutdown Complete -----------------" ); |
十一、查看这段时间内,总执行了多少任务。
1
2
|
SchedulerMetaData metaData = sched.getMetaData(); log.info( "Executed " + metaData.getNumberOfJobsExecuted() + " jobs." ); |
初识Quartz(二)的更多相关文章
- 初识quartz 并分析 项目中spring整合quartz的配置【原创+转载】
初识quartz 并分析 项目中spring整合quartz的配置[原创+转载]2018年01月29日 12:08:07 守望dfdfdf 阅读数:114 标签: quartz 更多个人分类: 工具 ...
- 初识Quartz之第一个Quartz实例
转: 初识Quartz之第一个Quartz实例 2018年04月09日 17:07:31 carson0408 阅读数:366 版权声明:本文为博主原创文章,未经博主允许不得转载. https:/ ...
- 初识JavaScript(二)
初识JavaScript(二) 我从上一篇<初识JavaScript(一)>知道和认识JavaScript的词法结构,也开始慢慢接触到了JavaScript的使用方法,是必须按照JavaS ...
- 初识Quartz (一)
首先大概的了解一下Quartz. 一:首先进入官网去看看什么是quartz.http://www.quartz-scheduler.org/ Quartz是一个功能丰富的开源作业调度库,可以集成到几乎 ...
- python初识(二)
目录: 进制 基本数据类型 整形 布尔值 字符串 列表 元祖 字典 集合 range & enumerate 一.进制 二进制转换十进制计算: 十进制:==47 一个字节公式:==128 64 ...
- 初识Quartz(三)
本文将介绍CronTrigger的使用方法,CronTrigger相比 SimpleTrigger可以支持更复杂的作业计划.cron这一观念来自UNIX,在UNIX中,cron是一个运行于后台的守护程 ...
- 开源定时任务框架Quartz(二)
概述 上一篇文章完成了第一个Quartz程序的编写,这篇从Quartz中的几个重要对象来更深一层认识Quartz框架. Job和JobDetail Job是Quartz中的一个接口,接口下只有exec ...
- webpack入门教程之初识loader(二)
上一节我们学习了webpack的安装和编译,这一节我们来一起学习webpack的加载器和配置文件. 要想让网页看起来绚丽多彩,那么css就是必不可少的一份子.如果想要在应用中增加一个css文件,那么w ...
- 初识Quartz(入门案例)+常用的Cron表达式
1.Quartz架构图 1.实体层 package cn.happy.entity; //1. public class Plan { //时间 private String date; //任务 p ...
随机推荐
- 【模拟】洛谷 P1328 NOIP2014提高组 day1 T1 生活大爆炸版石头剪刀布
把所有情况打表,然后随便暴力. #include<cstdio> using namespace std; int n,an,bn,p1,p2; ],b[]; ][]; int ans1, ...
- Eclipse快速补全快捷键Ctrl+1修改为Android Studio的Alt+Enter
步骤: Window ->Preferences->key-> type filter text 下输入quick fix(这个是快速补全的快捷键)改为Alt+Enter 下面的wh ...
- 报错:numRecords must not be negative
报错的原因:删除已经使用过的kafka topic,然后新建同名topic 解决方法:把topic名字换一下 (有其他更好的解决方法,可以不修改topic名)
- sqls
ALTER TABLE `shh_data`.`topic_floor` ADD COLUMN `updated_date` DATETIME NULL AFTER `publish_date`,AD ...
- 一起talk C栗子吧(第二十二回:C语言实例--队列一)
各位看官们,大家好,上一回中咱们说的是表达式求值的样例,该样例使用了栈,这一回咱们说的是栈的 兄弟:队列. 闲话休提,言归正转.让我们一起talk C栗子吧. 我们在这里说的队列是一种抽象的数据结构, ...
- 让Qt Creator支持Windows Phone 8开发
让Qt Creator支持Windows Phone 8开发 近期QtCreator3.2出了.修复了一些Bug.比上一个版本号3.1.2要好了一些. 因为在上一个版本号(Qt for WinRT自带 ...
- leetcode第一刷_Sudoku Solver
这道题简直是耻辱啊.竟然被吓得不敢做,最终開始写还犯下了各种低级错误,花了好久的时间. 事实上假设想明确81*9事实上是非常小的规模的话,早就想到用回溯法了,这不是跟八皇后全然一样的嘛.每次填入的时候 ...
- 说说C#的数学类,Math,浮点数(上)
说说C#的数学类,Math,浮点数 C#语言支持下图所看到的的数值类型,各自是整数,浮点数和小数 可能不是非常清楚,可是细致看看还是能看清楚的. 在一个C#程序中,整数(没有小数点的数)被觉得是一个i ...
- 挖一挖C#中那些我们不经常使用的东西之系列(1)——ToDictionary,ToLookup
这个系列我们看看C#中有哪些我们知道.可是又不知道怎么用.又或者懒得去了解的东西,比方这篇我们要介绍的toDictionary 和ToLookup. 从图中我们看到有四个ToXXX的方法,当中ToAr ...
- Notepad++输入模式之改动模式、插入模式
notepad++光标是直的,怎样让它变成竖的? 通常光标是竖的.为插入模式,光标在字符之间时输入,内容会随输入的内容向后移动,新输入的内容不会替换后面的内容. 当按一下"Insert&qu ...