Quartz调度框架的学习使用
比较完整的blog:
https://blog.csdn.net/ScholarTang/article/details/118891297
入门1 (SimpleTrigger触发器)
- 添加依赖配置
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
- 创建一个类,实现Job接口,实现execute方法
- 创建调度器Scheduler
- 使用Job实现类创建任务实例JobDetail
- 创建触发器Trigger,使用的是SimpleTrigger触发器
- 绑定任务实例JobDetail和触发器Trigger
- 开启定时任务
- 具体代码:
@Slf4j
//@PersistJobDataAfterExecution //Job设置为有状态的
public class HelloJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
JobDataMap mergedJobDataMap = jobExecutionContext.getMergedJobDataMap();
log.info(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()) + " | 任务被执行了");
}
}
public class HelloSchedulerDemo {
public static void main(String[] args) throws SchedulerException {
//从调度工厂中获取调度器实例
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
//通过JobBuilder构建一个任务实例
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
//设置任务的唯一实例名称和任务组名称组名
.withIdentity("job1", "group1")
//构建实例
.build();
//通过TriggerBuilder构建触发器实例
SimpleTrigger trigger = TriggerBuilder.newTrigger()
//设置触发器唯一实例名称和触发器的组名
.withIdentity("trigger1", "group1")
//执行计划,每五秒执行一次
.withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(5))
//立即执行
.startNow()
//构建实例
.build();
//调度器绑定任务实例和触发器
scheduler.scheduleJob(jobDetail,trigger);
//开启定时任务
scheduler.start();
}
}
入门2 (CronTrigger触发器)
- 创建一个类,实现Job接口,实现execute方法
- 创建调度器Scheduler
- 使用Job实现类创建任务实例JobDetail
- 创建触发器Trigger,使用的是CronTrigger触发器,支持Cron表达式
- 绑定任务实例JobDetail和触发器Trigger
- 开启定时任务
- 具体代码
public class HelloSchedulerDemo {
public static void main(String[] args) throws SchedulerException {
//从调度工厂中获取调度器实例
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
//通过JobBuilder构建一个任务实例
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
//设置任务的唯一实例名称和任务组名称组名
.withIdentity("job1", "group1")
//构建实例
.build();
//通过TriggerBuilder构建触发器实例
Trigger trigger = TriggerBuilder.newTrigger()
//设置触发器唯一实例名称和触发器的组名
.withIdentity("trigger1", "group1")
//执行计划,每五秒执行一次
.withSchedule(CronScheduleBuilder.cronSchedule("*/5 * * * * ? *"))
//构建实例
.build();
//调度器绑定任务实例和触发器
scheduler.scheduleJob(jobDetail,trigger);
//开启定时任务
scheduler.start();
}
}
quartz中的监听器的使用
主要用到JobListener、TriggerListener、SchedulerListener对任务中的状态进行监听
- 创建一个类,实现Job接口,实现execute方法
- 创建一个类,实现全局监听器接口JobListener
- 创建调度器Scheduler对象
- 使用Job实现类创建任务实例JobDetail 对象
- 创建触发器Trigger对象,使用的是CronTrigger触发器,支持Cron表达式
- 绑定任务实例JobDetail和触发器Trigger,绑定任务实例和监听器JobListener
- 开启定时任务
- 具体代码
Job实现类:
@Slf4j
//@PersistJobDataAfterExecution //Job设置为有状态的
public class HelloJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
JobDataMap mergedJobDataMap = jobExecutionContext.getMergedJobDataMap();
log.info("[Job执行类]"+new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()) + " | 任务被执行了");
}
}
JobListener实现类:
@Slf4j
public class MyJobListener implements JobListener {
@Override
public String getName() {
String name = this.getClass().getSimpleName();
log.info("[监听器]当前JobListener的名称为:" + name);
return name;
}
@Override
public void jobToBeExecuted(JobExecutionContext context) {
String name = context.getJobDetail().getJobClass().getName();
log.info("[监听器]当前Job的名称为:" + name + ",JobDetail将要被执行了...");
}
@Override
public void jobExecutionVetoed(JobExecutionContext context) {
String name = context.getJobDetail().getJobClass().getName();
log.info("[监听器]当前Job的名称为:" + name + ",JobDetail将要被执,但被TriggerListener否决...");
}
@Override
public void jobWasExecuted(JobExecutionContext context, JobExecutionException jobException) {
String name = context.getJobDetail().getJobClass().getName();
log.info("[监听器]当前Job的名称为:" + name + ",JobDetail执行完成了...");
}
}
任务启动类:
public class HelloSchedulerDemo {
public static void main(String[] args) throws SchedulerException {
//从调度工厂中获取调度器实例
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
//通过JobBuilder构建一个任务实例
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
//设置任务的唯一实例名称和任务组名称组名
.withIdentity("job1", "group1")
//构建实例
.build();
//通过TriggerBuilder构建触发器实例
Trigger trigger = TriggerBuilder.newTrigger()
//设置触发器唯一实例名称和触发器的组名
.withIdentity("trigger1", "group1")
//执行计划,每五秒执行一次
.withSchedule(CronScheduleBuilder.cronSchedule("*/5 * * * * ? *"))
//构建实例
.build();
//调度器绑定任务实例和触发器
scheduler.scheduleJob(jobDetail,trigger);
scheduler.getListenerManager().addJobListener(new MyJobListener(), KeyMatcher
//jobKey中的name参数和group参数对应的就是任务实例【JobDetail】的name和group
.keyEquals(JobKey.jobKey("job1","group1")));
//开启定时任务
scheduler.start();
}
}
其他监听器还有TriggerListener、SchedulerListener