Quartz: 专业的定时框架quartz,功能强大,可以让你的程序在指定时间执行,也可以按照某一个频度执行,支持数据库、监听器、插件、集群
quartz:
-
下载: http://www.quartz-scheduler.org/downloads/
-
导入lib或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>
-
核心接口
a. scheduler 调度器
b. Job 任务
c. trigger 触发器
d. JobDetail 任务信息 -
trigger触发器
a. SimpleTrigger // 功能简单 指定时间、周期
b. CronTrigger // 基于cron表达式触发器 cron表达式: 秒 分 时 日 月 周 年
- 简单入门
/**
*
* Created by gaozhy on 2017/6/25.
*/
public class MyScheduler {
public static void main(String[] args) {
try {
// 1. 创建调度器工厂
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
// 2. 获取调度器
Scheduler scheduler = schedulerFactory.getScheduler();
// 3. 创建任务详情
JobDetail jobDetail = JobBuilder.newJob(MyJob.class).withIdentity("myJob","default").build();
// 4. 启动10秒后的时间
Date futureDate = DateBuilder.futureDate(10, DateBuilder.IntervalUnit.SECOND);
// 5. 创建触发器
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger","default").startAt(futureDate).build();
// 6. 注册任务详情和触发器
scheduler.scheduleJob(jobDetail,trigger);
//7. 启动调度任务
scheduler.start();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
/**
* Created by gaozhy on 2017/6/25.
*/
public class MyJob implements Job {
private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("log:"+simpleDateFormat.format(new Date()));
}
}
- 基于simpleSchedule的定时任务
/**
* 简单触发器 调度程序
* Created by Administrator on 2017/6/25 0025.
*/
public class SimpleTriggerScheduler {
public static void main(String[] args) {
try {
StdSchedulerFactory factory = new StdSchedulerFactory();
Scheduler scheduler = factory.getScheduler();
JobDetail jobDetail = JobBuilder.newJob(MyJob.class).withIdentity("myJob","default").build();
// 指定触发器
// lucene 唐诗
// 1. 获取数据库每天新增的诗
// 2. 定时任务 每天零点触发
// 3. 任务方法 增量索引
// 简单定时 SimpleTrigger 间隔或者重复调用
Trigger trigger = TriggerBuilder.newTrigger().withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(10).withRepeatCount(10)).build();
scheduler.scheduleJob(jobDetail,trigger);
scheduler.start();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
- 基于CronSchedule的定时任务
/**
* 基于CronTrigger
* Created by Administrator on 2017/6/25 0025.
*/
public class CronTriggerScheduler {
public static void main(String[] args) {
try {
StdSchedulerFactory factory = new StdSchedulerFactory();
Scheduler scheduler = factory.getScheduler();
JobDetail jobDetail = JobBuilder.newJob(MyJob.class).withIdentity("myJob","default").
usingJobData("id",1).usingJobData("name","zs").build();
/**
* 在cron表达式中 日和周中不能同时出现*
* quartz cron表达式 6位或者7位
*/
//Trigger trigger = TriggerBuilder.newTrigger().withSchedule(CronScheduleBuilder.cronSchedule("0 0 10 ? * 4#3")).
Trigger trigger = TriggerBuilder.newTrigger().withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * ? * * 2017-2020")).
withIdentity("myTrigger","default").build();
scheduler.scheduleJob(jobDetail,trigger);
scheduler.start();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}