1. 概述
Quartz是一个完全由Java编写的开源作业调度框架,为在Java应用程序中进行作业调度提供了简单而强大的机制。更多介绍,请参阅Quartz官网
1.1. 核心概念
Job
表示任务,是一个接口,只有一个方法
void execute(JobExecutionContext context);
开发一个新任务时,只需要实现该接口就能运行任务
JobDetail
任务描述,在每次执行实例时都重新创建一个job实例,不直接接受一个job实例,而是通过接受一个job实现类
Trigger
触发器,主要有SimpleTrigger和CronTrigger两个子类,当仅触发一次或者以固定时间间隔周期执行时,使用SimpleTrigger。CronTrigger通过cron表达式,定义出各种复杂时间规则的调度方案
Scheduler
调度器,代表Quartz的一个独立运行容器,Trigger和JobDetail需要注册到Scheduler中。
2. 核心依赖
新建一个springboot项目,引入核心依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
3. 编写任务实现
cron表达式实现
public class CronJob extends QuartzJobBean {
private static final Logger logger = LoggerFactory.getLogger(CronJob.class);
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
logger.info("执行当前任务开始,时间为:{}", LocalDateTime.now());
}
}
时间间隔实现
public class SimpleJob extends QuartzJobBean {
private static final Logger logger = LoggerFactory.getLogger(SimpleJob.class);
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
logger.info("start job...当前时间为:{}", LocalDateTime.now());
try {
Thread.sleep(3000);
logger.info(context.getScheduler().getSchedulerInstanceId());
logger.info("task name is {}", context.getJobDetail().getKey().getName());
} catch (Exception e) {
e.printStackTrace();
}
logger.info("end job...当前时间为:{}", LocalDateTime.now());
}
}
4. 配置类
将任务实现类注册到schedule中
@Configuration
public class ScheduleConfig {
@Bean
public JobDetail simpleJobDetail() {
return JobBuilder.newJob(SimpleJob.class).withIdentity("simpleJobDetail").storeDurably().build();
}
@Bean
public Trigger simpleTrigger() {
SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(20).repeatForever();
return TriggerBuilder.newTrigger()
.forJob(simpleJobDetail())
.withIdentity("simpleTrigger")
.withSchedule(scheduleBuilder)
.build();
}
@Bean
public JobDetail cronJobDetail() {
return JobBuilder.newJob(CronJob.class).withIdentity("cronJobDetail").storeDurably().build();
}
@Bean
public Trigger cronTrigger() {
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/30 * * * * ?");
return TriggerBuilder.newTrigger()
.forJob(cronJobDetail())
.withIdentity("cronTrigger")
.withSchedule(scheduleBuilder)
.build();
}
}
5. 验证
启动项目,验证结果
2021-11-01 17:54:44.485 INFO 21104 --- [eduler_Worker-3] com.xlhj.boot.job.SimpleJob : start job...当前时间为:2021-11-01T17:54:44.485
2021-11-01 17:54:47.489 INFO 21104 --- [eduler_Worker-3] com.xlhj.boot.job.SimpleJob : NON_CLUSTERED
2021-11-01 17:54:47.490 INFO 21104 --- [eduler_Worker-3] com.xlhj.boot.job.SimpleJob : task name is simpleJobDetail
2021-11-01 17:54:47.490 INFO 21104 --- [eduler_Worker-3] com.xlhj.boot.job.SimpleJob : end job...当前时间为:2021-11-01T17:54:47.490
2021-11-01 17:55:00.016 INFO 21104 --- [eduler_Worker-4] com.xlhj.boot.job.CronJob : 执行当前任务开始,时间为:2021-11-01T17:55:00.016