二、Quartz可以做什么?Quartz 是一个完全由 Java 编写的开源作业调度框架,为在 Java 应用程序中进行作
业调度提供了简单却强大的机制。
Quartz 可以与 J2EE 与 J2SE 应用程序相结合也可以单独使用。
Quartz 允许程序开发人员根据时间的间隔来调度作业。
Quartz 实现了作业和触发器的多对多的关系,还能把多个作业与不同的触发器关联。
三、Quartz核心概念指定一个特定的时间去执行特定的任务。每秒/每分/每小时/每天/每天几点几分去执行
- 信用卡账单通知,每月几号定时发送短信给用户
- 每天数据推送等操作
3.1 Trigger 3.1.1 SimpleTrigger
- Job 表示一个工作,要执行的具体内容。此接口中只有一个方法,实现这个接口在方法中编写需要执行的代码
execute(JobExecutionContext context)- JobDetail 表示一个具体的可执行的调度程序,Job 是这个可执行程调度程序所要执行的内容,另外 JobDetail 还包含了这个任务调度的方案和策略。
- Trigger 代表一个调度参数的配置,什么时候去调。指定Job的执行时间,执行间隔,运行次数等
- Scheduler 代表一个调度容器,一个调度容器中可以注册多个 JobDetail 和 Trigger。当 Trigger 与 JobDetail 组合,就可以被 Scheduler 容器调度了。
在一个指定时间段内执行一次作业任务或是在指定的时间间隔内多次执行作业任务
距离当前时间4秒钟之后首次执行任务,6秒后停止,每隔2秒执行,执行3次
//获取距离当前时间4秒后的时间
date.setTime(date.getTime()+4000);
//获取距离当前时间6秒后的时间
Date endDate=new Date();
endDate.setTime(endDate.getTime()+6000);
//创建一个SimpleTrigger实例,定义该Job4秒后执行,并且每隔两秒钟重复执行一次,6秒后停止
SimpleTrigger trigger=(SimpleTrigger)TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1")//定义name/group
.startAt(date) //设置开始时间
.endAt(endDate) //设置结束时间
.withSchedule(SimpleScheduleBuilder.simpleSchedule() //使用SimpleTrigger
.withIntervalInSeconds(2) //每隔两秒执行一次
.withRepeatCount(3) //重复执行三次
).build();
3.1.2 CalendarIntervalTrigger
3.1.3 CronTrigger日期触发器
Cron表达式触发器
Cron表达式是由7个子表达式组成的字符串,其中"年" 是可选的,可以不指定,格式如下:
[秒] [分] [小时] [日] [月] [周] [年]
例子:
表达式: * 30 10 ? * 1/5 * --> (从后向前解释) --> [指定年份]的[周一到周五][指定月][不指定日][上午10时][30分][指定秒]
常见的Cron表达式(大小写不敏感)
“0 0 12 * * ?” 每天12点运行
“0 15 10 ? * *” 每天10:15运行
“0 15 10 * * ?” 每天10:15运行
“0 15 10 * * ? *” 每天10:15运行
“0 15 10 * * ? 2008” 在2008年的每天10:15运行
“0 * 14 * * ?” 每天14点到15点之间每分钟运行一次,开始于14:00,结束于14:59
“0 0/5 14 * * ?” 每天14点到15点每5分钟运行一次,开始于14:00,结束于14:55
“0 0/5 14,18 * * ?” 每天14点到15点每5分钟运行一次,此外每天18点到19点每5钟也运行一次
“0 0-5 14 * * ?” 每天14:00点到14:05,每分钟运行一次
“0 10,44 14 ? 3 WED” 3月每周三的14:10分到14:44,每分钟运行一次
“0 15 10 ? * MON-FRI” 每周一,二,三,四,五的10:15分运行
“0 15 10 15 * ?” 每月15日10:15分运行
“0 15 10 L * ?” 每月最后一天10:15分运行
“0 15 10 ? * 6L” 每月最后一个星期五10:15分运行
“0 15 10 ? * 6L 2014-2016” 在2014,2015,2016年每个月的最后一个星期五的10:15分运行
“0 15 10 ? * 6#3” 每月第三个星期五的10:15分运行
添加例外日期,直接跳过不需要执行
baseCalendar 为高级的Calendar 实现了基本的功能,实现了org.quartz.Calendar 接口
AnnualCalendar 排除年中一天或多天
CronCalendar 日历的这种实现排除了由给定的Cronexpression 表达的时间集合。例如,
您可以使用此日历使用表达式“* * 0-7,18-23?* *”每天排除所有营业时
间(上午8 点至下午5 点)。如果CronTrigger 具有给定的cron 表达式并
且与具有相同表达式的CronCalendar 相关联,则日历将排除触发器包含的
所有时间,并且它们将彼此抵消。
DailyCalendar 您可以使用此日历来排除营业时间(上午8 点- 5 点)每天。每个
DailyCalendar 仅允许指定单个时间范围,并且该时间范围可能不会跨越每
日边界(即,您不能指定从上午8 点至凌晨5 点的时间范围)。如果属
性invertTimeRange 为false(默认),则时间范围定义触发器不允许触发
的时间范围。如果invertTimeRange 为true,则时间范围被反转- 也就是
排除在定义的时间范围之外的所有时间。
HolidayCalendar 特别的用于从Trigger 中排除节假日
MonthlyCalendar 排除月份中的指定数天,例如,可用于排除每月的最后一天
WeeklyCalendar 排除星期中的任意周几,例如,可用于排除周末,默认周六和周日



