- quartz框架
- 是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或 EJBs。的最新版本为 2.3.0。
- openSymphony开源组织的一个开源项目
- 官网
- http://www.quartz-scheduler.org
- 核心概念
- 任务(Job)
- 需要执行的具体工作任务:需要执行的具体工作
- 触发器(Trigger)
- 在特定的时间触发任务的执行
- 调度器(Scheduler)
- 任务的实际执行者,负责粘合任务和触发器
- 任务(Job)
quartz环境初始化
- 创建maven工程
- 引入quartz依赖
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>1.8.6</version>
</dependency>
- 定义任务
public class RemindJob implements Job {
public RemindJob() {}
/**
* jobExecutionContext:通过此参数,可以获取调度上下文的各种信息,例如:任务名称等;
* job接口中只有一个execute()方法,在实现类中实现该方法以执行具体任务
*
* @param jobExecutionContext
* @throws JobExecutionException
*/
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
// 提醒服务类,封装提醒业务
System.out.println("任务执行...");
}
}
- 创建任务
/**
* 参数1:任务的名称,可以自定义
* 参数2:任务的分组名(多个任务可以进行分组)
* 参数3:任务的类型,.class字节码文件,通过反射进行操作
*/
new JobDetail("remindJob", "group1", RemindJob.class);
- 创建触发器
- 触发器:在特定的时间触发任务的执行
- SimpleTrigger是Trigger的子类
/**
* 创建触发器 trigger
* 参数1:触发器名称
* 参数2:触发器执行的规则/策略
* 参数3:重复间隔时间
* setStartTime:表示开始时间
*/
SimpleTrigger simTrig = new SimpleTrigger(
"trigRemindJob", SimpleTrigger.REPEAT_INDEFINITELY, 3000);
simTrig.setStartTime(new Date(System.currentTimeMillis() + 1000));
- 创建调度器
- 任务的实际执行者,负责粘合任务和触发器
/**
* quartz定义了一个工厂,可以通过工厂得到scheduler实例
*/
SchedulerFactory sfc = new StdSchedulerFactory();
Scheduler scheduler = sfc.getScheduler();
- 注册任务和触发器
/**
* 通过scheduler的scheduleJob绑定任务和触发器
*/
scheduler.scheduleJob(jobDetail, simTrig);
- 任务的启动和关闭
/**
* 任务的启动和关闭
*/
scheduler.start();
scheduler.shutdown();
cronTrgger的使用
- cronTrigger是trigger的子类
触发器 |
应用场景 |
使用方式 |
SimpleTrigger |
固定时间间隔的调度任务(例如:每隔2小时执行1次) |
通过设置触发器的属性:开始时间、结束时间、重复次数、重复间隔 |
CronTrigger |
指定时间点的调度任务(例如:每天凌晨1:00执行1次 |
通过定义Cron表达式 |
/**
* 参数3:cron表达式(定义执行时间)
*/
CronTrigger cronTrigger = new CronTrigger("myTrigger", "group", "* 35 15 ? * * ");
- cron表达式
位置 |
字段含义 |
范围 |
允许的特殊字符 |
1 |
秒 |
0~59 |
* / |
2 |
分钟 |
0~59 |
* / |
3 |
小时 |
0~23 |
* / |
4 |
月份中的哪一天 |
1~31 |
* / ? L |
5 |
月份 |
1~12 或 JAN~DEC |
* / |
6 |
星期几 |
1~7 或 SUN~SAT |
* / ? L # |
7 |
年份 |
1970~2099 |
* / |
- cron表达式的每个字段,都可以显式地规定一个值(如49)、一个范围(如1-6)、一个列表(如1,3,5)或者一个通配符(如*)
- cron表达式特殊字符
- “ * ”:表示每一个值,它可以用于所有字段
- “ ? ”:该字符仅用于“月份中的哪一天”字段和“星期几”字段,表示不指定值
- “ - ”:中划线,表示一个范围
- “ , ”:使用逗号间隔的数据,表示一个列表
- “ / ”:通常表示为x/y,x为起始值,y表示值的增量
- “ L”:可以指定指定月份和星期,比如星期指定5L,表示在最后一个星期4执行
- “ #”:只能用与指定月份,用于指定第几个星期几,例如4#2,表示某月的第2个星期3
- cron表达式示例
Cron表达式 |
含义 |
0 15 4 * * ? |
每天凌晨4点15分 |
30 0 0 1 1 ? 2014 |
2014年1月1日凌晨过30秒 |
0 0 14 1,10,20 * ? * |
每月的1号、10号、20号的下午2点 |
0 0/5 15,17 * * ? |
每天15点到16点每5分钟运行一次, 此外,每天17点到18点每5分钟运行一次 |
- 真实开发中,可以使用cron表达式在线生成
- 在线生成网站:http://cron.qqe2.com/
spring整合quartz
- XML方式
- 注解方式
- @Scheduled(cron="0/5 * * * * ? ")
- 引入quartz的依赖
- 在spirng的配置文件中添加约束,并开启task的注解扫描
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd"
<!--开启任务调度注解扫描-->
<task:annotation-driven/>
- 项目中使用
/**
* 10分钟执行一次 刷新订单的状态 不对外公布
*/
@Scheduled(cron = "*0 0/10 * * * ?")
public void flushCancelOrderStatus() {
...
}
/**
* 2小时执行一次 刷新订单的状态 不对外公布
*/
@Scheduled(cron = "0 0 0/2 * * ?")
public void flushOrderStatus() {
...
}