一、什么是Quartz框架
Quartz是一个开源的框架,主要的作用是可以协助我们更好进行定时任务的实现和管理。
二、Quartz如何实现定时任务
2.1、任务(JobDetail)
Quartz框架帮助我们封装好了,作业接口 Job,通过实现Job接口进行具体的任务创建。
任务Job接口提供了基本的数据和执行的方法,在框架中,真正调用的是JobDetail,需要将作业数据添加到JobDetail中,并且设置任务的信息、数据等。
2.2 、触发器(Trigger)
触发器Trigger规定了,任务如何执行,在什么时间进行执行,目前我自己使用的触发器是CronTrigger可以进行core表达式设置,还有一个就是SimpleTrigger,指定从某一个时间开始,以一定的时间间隔执行的任务。
2.3、调度器(Scheduler)
有了任务和触发器,如何执行定时任务?此时,我们需要通过调度器来执行定时任务。
下面通过一个简单的案例来看下
三、案例
作业
/**
* 自定义作业
*/
public class CustomJob implements Job {
/**
* 作业需要的数据
*/
private String jobData;
/**
* 定时任务 最终执行的方法
*
* JobExecutionContext中有一个简便的方法可以获取执行上下文中的JobDataMap ,
* 它是JobDetail 中的JobDataMap 和 Trigger 中的JobDataMap 的合并,后者的
* JobDataMap 会覆盖前者相同名称的值
*
* @param context 一个包含了各种上下文信息的句柄,指
* 向执行中的JobDetail 实例 和 执行完成的Trigger实例(可以帮助我们获取业务数据)
* @throws JobExecutionException
*/
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
// todo 根据具体的业务进行实现
JobDetail jobDetail = context.getJobDetail();
Trigger trigger = context.getTrigger();
System.out.println("jonDetail:" + jobDetail.getKey() + ",Trigger:" + trigger.getJobDataMap());
String data = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println("执行时间:" + data);
}
}
3.1、简单触发器(SimpleTrigger)
public class CustomSimpleScheduler {
public static void main(String[] args) throws SchedulerException {
// 1. 获取 调度器
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
// 2. 创建任务
JobDetail jobDetail = JobBuilder.newJob(CustomJob.class)
// 设置任务名称和组
.withIdentity("custom-job-1", "custom-group")
.usingJobData("jobData", "业务数据")
.build();
// 3. 创建触发器
SimpleTrigger trigger = TriggerBuilder.newTrigger()
// 设置任务名称和组
.withIdentity("custom-job-1", "custom-group")
// 开始时间
//.startAt(new Date())
// 设置重复间隔10s,重复次数10次
.withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(10).withRepeatCount(10))
// 结束时间
//.endAt(new Date())
.build();
// 4. 使用调度器 绑定任务和触发器
scheduler.scheduleJob(jobDetail, trigger);
// 5. 开启定时任务
scheduler.start();
}
}
结果:
3.2、Core触发器(CoreTrigger)
public class CustomCoreScheduler {
public static void main(String[] args) throws SchedulerException {
// 1. 获取 调度器
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
// 2. 获取任务
JobDetail jobDetail = JobBuilder.newJob(CustomJob.class)
.withIdentity("customer-job-2", "customer-group")
.usingJobData("jobData", "core")
.build();
// 3. 获取 core 触发器
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("customer-job-2", "customer-group")
// 每隔5秒执行一次
.withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?"))
.build();
// 4. 调度器进行 任务和触发器绑定
scheduler.scheduleJob(jobDetail, trigger);
// 5. 开启调度器
scheduler.start();
}
}
结果: