一、Quartz是什么?
- Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。
- 在企业级应用中,经常会制定一些“计划任务”,即在某个时间点做某件事情,核心是以时间为关注点,即在一个特定的时间点,系统执行指定的一个操作
- 任务调度涉及多线程并发、线程池维护、运行时间规则解析、运行现场的保护以恢复等方面
- Quartz框架是一个开源的企业级任务调度服务,已经被作为任务调度的良好解决方案
Quartz对任务调度进行了高度抽象,提出了3个核心概念,并在
org.quartz
包中通过接口和类进行了描述
核心概念:
-
任务
:就是执行的工作内容。Quartz提供
Job
接口
来支持任务定义 -
触发器
(
何时触发的规则
)
:定义触发Job执行的时间
触发规则
。Quartz提供
Trigger
类及其子类支持触发器功能 -
调度器
:Quartz提供了
Scheduler
接口,将
工作任务和触发器绑定,保证任务可以在正确的时间执行
二、入门程序
①创建maven工程,导入依赖
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.1</version>
</dependency>
一个最简单的应用包含两个类:
HelloJob.java 任务类,需要实现 job 接口,里面实现了你想要 定时执行的方法
SimpleExample.java 主线程,用于任务的调度,执行等操作
②HelloJob.java
public class HelloJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
// 输出 HelloWorld !
System.out.println("Hello World! - " + new Date());
}
}
任务很简单,HelloJob 实现了Quartz 的Job接口中的execute方法,任务的内容就是打印一行字。具体这个任务应该何时去执行,都在SimpleExample.java里面去定义实现。
③SimpleExample.java
public class SimpleExample {
public static void main(String[] args) throws Exception {
// 创建一个任务
JobDetail job = new JobDetailImpl("HelloJob", "group1", HelloJob.class);
// 创建一个触发器
SimpleTrigger simTrig = new SimpleTriggerImpl("trigRemindJob",SimpleTrigger.REPEAT_INDEFINITELY,3000);
// 创建调度者工厂
SchedulerFactory sfc = new StdSchedulerFactory();
// 创建一个调度者
Scheduler sched = sfc.getScheduler();
// 注册并进行调度
sched.scheduleJob(job, simTrig);
// 启动调度
sched.start();
// sleep10s
Thread.sleep(10000);
// 关闭调度
sched.shutdown();
}
}
运行结果
核心接口
- Scheduler
- Job
- JobDetail
- Trigger
- JobDataMap 传输数据
三、CronTrigger
CronTrigger是Trigger的子类
CronTrigger和SimpleTrigger的对比
CronTrigger允许用户更精准地控制任务的运行日期和时间,而不仅仅是定义工作的频度
CronTrigger通过Cron表达式定义准确的运行时间点。创建CronTrigger的语法如下:
创建CronTrigger的语法很简单,最关键的是Cron表达式的编写
要使用CronTrigger,必须掌握Cron表达式
Cron表达式由6~7个由空格分隔的时间元素组成。第7个元素可选
Cron表达式的每个字段,都可以显式地规定一个值(如49)、一个范围(如1-6)、一个列表(如1,3,5)或者一个通配符(如*)
Cron表达式有几个特殊的字符,说明如下
“
–
”:中划线,表示一个范围 1-10
“ , ”:使用逗号间隔的数据,表示一个列表 1,8,10
“ * ”:表示每一个值,它可以用于所有字段。例如:在小时字段表示每小时 *
“ ? ”:该字符仅用于“月份中的哪一天”字段和“星期几”字段,表示不指定值
“ / ”:通常表示为x/y,x为起始值,y表示值的增量。
“ L ”:表示最后一天,仅在日期和星期字段中使用
“ # ”:只能用于“星期几”字段,表示这个月的第几个周几。例如:“6#3”指这个月第三个周五
不太会使用的话,可以使用在线插件:
http://cron.qqe2.com/
测试:
public static void main(String[] args) throws SchedulerException, InterruptedException, ParseException {
// 创建一个任务
JobDetail job = new JobDetailImpl("HelloJob", "group1", HelloJob.class);
// 创建Cron触发器
CronTrigger cronTrig = new CronTriggerImpl("HelloJob", "group1", "1/3 * * * * ?");
// 创建调度者工厂
SchedulerFactory sfc = new StdSchedulerFactory();
// 创建一个调度者
Scheduler sched = sfc.getScheduler();
// 注册并进行调度
sched.scheduleJob(job, cronTrig);
// 启动调度
sched.start();
// sleep10s
Thread.sleep(10000);
// 关闭调度
sched.shutdown();
}