初识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 ...
随机推荐
- [Codeforces 26E] MultiThreading
Brief Intro: 给你n个数,每个数有2*CNT[i]个,让你构造一个序列 使得最终的Y值为W(其余见题面) Solution: 就是一道纯构造的题目: 先把特殊情况特殊处理,接下来考虑一般情 ...
- POJ 1180 Batch Scheduling(斜率优化DP)
[题目链接] http://poj.org/problem?id=1180 [题目大意] N个任务排成一个序列在一台机器上等待完成(顺序不得改变), 这N个任务被分成若干批,每批包含相邻的若干任务. ...
- 【Python笔记】Python语言基础
Python是一种解释性(没有编译).交互式.面向对象的语言 1.安装python编译器 版本:Python2.7比较普遍,Python不是向下兼容的软件,因此Python3.x有些东西不好找资料 2 ...
- Android中选项卡功能的实现
Android中选项卡功能的实现 Android中使用TabHost和TabWidget来实现选项卡功能.TabHost必须是布局的根节点,它包含两个子节点: TabWidget,显示选项卡: Fra ...
- JNI之数据类型
1. JNIEnv 作用 JNIEnv 概念 : 是一个线程相关的结构体, 该结构体代表了 Java 在本线程的运行环境 ; JNIEnv 与 JavaVM : 注意区分这两个概念; -- JavaV ...
- 【Node.js】1.安装步骤
1.在官网找到对应版本下载 2.点击安装 3.检查安装成功 path可以看到node.js的安装目录已经自动配置在环境变量path中了 如果node -v或者node --version不能正确展示当 ...
- Python数据整合与数据准备-BigGorilla实例应用
参考文档:http://www.biggorilla.org/walkt/ 一.BigGorilla应用主要步骤 如下图: 二.实例应用 1.数据获取 urllib是非常受欢迎的用于在网络上读取数据的 ...
- Oracle Database Link 的创建和使用小见
假设:需要从数据库db_a通过db_link连接到db_b查询数据库b的部分相关信息 前提条件: 数据库a账户需要有创建dblink的权限,如果没有可以使用dba账户赋权限 grant CREATE ...
- android studio 警告 synchronization on non-final field
测试代码如下: public class SyncNonFinalField { private Object object = new Object(); public void start() { ...
- easyui required 提交验证
使用easyui时,对于提交验证,不不过在标签属性中加入data-options=required:true这句话这么来的.还须要另外加上才写东西能够把验证完整实现 1.设置from的属性 <f ...