百度百科对Quartz的解释:
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或 EJBs。Quartz的最新版本为Quartz 2.2.1。Quartz 对任务调度的领域问题进行了高度的抽象,提出了调度器、任务和触发器这3个核心的概念。
其核心接口和类有:
-
Job 接口:只有一个方法void execute(JobExecutionContext context),开发者实现该接口定义运行任务,JobExecutionContext类提供了调度上下文的各种信息。Job运行时的信息保存在JobDataMap实例中。
-
JobDetail 类:Quartz在每次执行Job时,都重新创建一个Job实例,所以它不直接接受一个Job的实例,相反它接收一个Job实现类,以便运行时通过newInstance()的反射机制实例化Job。因此需要通过一个类来描述Job的实现类及其它相关的静态信息,如Job名字、描述、关联监听器等信息,JobDetail承担了这一角色。
-
Trigger 类:描述触发Job执行的时间触发规则。主要有SimpleTrigger和CronTrigger这两个子类。当仅需触发一次或 者以固定时间间隔周期执行,SimpleTrigger是最适合的选择;而CronTrigger则可以通过Cron表达式定义出各种复杂时间规则的调度 方案:如每早晨9:00执行,周一、周三、周五下午5:00执行等。
-
Scheduler:代表一个Quartz的独立运行容器,Trigger和JobDetail可以注册到Scheduler中,两者在 Scheduler中拥有各自的组及名称,组及名称是Scheduler查找定位容器中某一对象的依据,Trigger的组及名称必须唯 一,JobDetail的组和名称也必须唯一(但可以和Trigger的组和名称相同,因为它们是不同类型的)。Scheduler定义了多个接口方法, 允许外部通过组及名称访问和控制容器中Trigger和JobDetail。
-
Calendar 类:和java.util.Calendar不同,它是一些日历特定时间点的集合(可以简单地将org.quartz.Calendar看作 java.util.Calendar的集合——java.util.Calendar代表一个日历时间点,无特殊说明后面的Calendar即指 org.quartz.Calendar)。一个Trigger可以和多个Calendar关联,以便排除或包含某些时间点。
-
还有一些线程池ThreadPool等等,比较重要的类。
重点说一下:CronTrigger,调度规则基于 Cron 表达式,CronTrigger 支持日历相关的重复时间间隔(比如每月第一个周一执行),而不是简单的周期时间间隔。因此,相对于SimpleTrigger而言,CronTrigger在使用上也要复杂一些。百度百科上说:
Quartz经常会用到cron表达式,可以使用国外网站cronmaker辅助生成cron表达式。
Cronmaker 网站地址:http://www.cronmaker.com/
Cron表达式包含6个必要组件和一个可选组件,如下表所示:
位置 | 含义 | 允许的特殊字符 |
1 | 秒(0~59) | , - * / |
2 | 分(0~59) | , - * / |
3 | 小时(0~24) | , - * / |
4 | 日期(1~31) | , - * / ? L W C |
5 | 月(JAN~DEC或1~12) | , - * / |
6 | 星期(SUN~SAT或1~7) | , - * / ? L C # |
7 | 年(可选,1970~2099)若为空,表示全部时间范围 | , - * / |
特殊字符 | 说明 |
* | 通配符,任意值 |
? | 无特定值。通常和其他指定的值一起使用,表示必须显示该值但不能检查 |
- | 范围。e.g.小时部分10-12表示10:00,11:00, 12:00 |
, | 列分隔符。可以让你指定一系列的值。e.g.在星期域中指定MON、TUE和WED |
/ | 增量。表示一个值的增量,e.g.分钟域中0/1表示从0开始,每次增加1min |
L | 表示Last。它在日期和星期域中表示有所不同。在日期域中,表示这个月的最后一天,而在星期域中,它永远是7(星期六)。当你希望使用星期中某一天时,L字符非常有用。e.g.星期域中6L表示每一个月的最后一个星期五 |
W | 在本月内离当天最近的工作日触发,所谓的最近工作日,即当天到工作日的前后最短距离,如果当天即为工作日,则距离是0;所谓本月内指的是不能跨月取到最近工作日,即使前/后月份的最后一天/第一天确实满足最近工作日。e.g. LW表示本月的最后一个工作日触发,W强烈依赖月份。 |
# | 表示该月的第几个星期,e.g. 1#2表示每一个月的第一个星期一 |
C | 日历值。日期值是根据一个给定的日历计算出来的。在日期域中给定一个20C将在20日(日历包括20日)或20日后日历中包含的第一天(不包括20日)激活触发器。例如在一个星期域中使用6C表示日历中星期五(日历包括星期五)或者第一天(日历不包括星期五) |
表示式 | 说明 |
"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 2007-2009" | 在2007,2008,2009年每个月的最后一个星期五的10:15分运行。 |
"0 15 10 ? * 6#3" | 每月第三个星期五的10:15分运行。 |
maven 依赖包 引用:
<!-- 任务调度 quartz-all 包 -->
<dependency>
<groupId>org.opensymphony.quartz</groupId>
<artifactId>quartz-all</artifactId>
<version>1.6.1</version>
</dependency>
<!-- 任务调度 quartz-all 依赖包 -->
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.3</version>
</dependency>
可参考官方API:http://www.quartz-scheduler.org/api/2.2.1/
可参考博客:http://www.blogjava.net/baoyaer/articles/155645.html