Quartz 提供了一种基于数据库的分布式任务解决方案。
Quartz 源码下载地址
所需jar包
详细的配置可以参考官方网站:http://www.quartz-scheduler.org/documentation/quartz-2.2.x/configuration/
quartz 常用接口
接口名称 | 说明 |
Job | 执行任务调度的组件要实现的接口 |
JobDetail | 用来定义Job的实例 |
JobBuilder | 用来定义或创建JobDetail的实例 |
Tigger | 定义一个Job何时被执行的组件,也称触发器 |
TriggerBuilder | 用来创建Tigger的实例 |
Scheduler | 跟任务调度相关的接口 |
quartz主要有三个概念
(1)任务调度器Scheduler
①
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler sched = sf.getScheduler();
②
Scheduler schedule = StdSchedulerFactory.getDefaultScheduler();
(2)任务触发器Trigger
Trigger tri = TriggerBuilder.newTrigger().build;
(3)任务Job
JobBuilder.newJob(MyJob.class).build();
Cron表达式:
格式:秒 分 时 日 月 星期几 年(可选)
位置 | 字段定义 | 范围 | 允许的特殊字符 |
1 | 秒 | 0~59 | ,_*/ |
2 | 分钟 | 0~59 | ,_*/ |
3 | 小时 | 0~23 | ,_*/ |
4 | 月份中的哪一天 | 1~31 | ,_*?/LWC |
5 | 月份 | 1~12或JAN~DEC | ,_*/ |
6 | 星期几 | 1~7或SUN~SAT | ,_*?/LC# |
7 | 年份 | 1970~2099 | ,_*/ |
1:?只能用在日或星期几的域上
2:分隔符[",","-","/","*"];eg:在分钟域使用12/15(从12分开始每隔15分钟触发)
3: 星期(1-7)
4:日跟星期的域不能是互斥的,不能同时使用
5:完整的例子:0 15,25,35 9-17 ? * 6 2017-2018 = 2017年和2018年的6月份每天9点到17点分钟刻度为15或25或35时触发
demo
public class JobDemo1 implements Job{
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
JobKey jobKey = context.getJobDetail().getKey();
System.out.println("任务id>>>>>>>>>>>>>>>"+jobKey);
for(int i=0;i<5;i++) {
System.out.println("i am a superman");
}
}
}
public static void main(String[] args) throws SchedulerException, ParseException {
try {
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
JobDetail jobdetail = JobBuilder.newJob(JobDemo1.class).withIdentity("任务名字")
//传值
.usingJobData("name", "张三").build();
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("触发器名字")
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(5).withRepeatCount(3))
.build();
scheduler.scheduleJob(jobdetail, trigger);
scheduler.start();
} catch (SchedulerException se) {
se.printStackTrace();
}
}