引入quartz依赖:
<!-- 实现对 Quartz 的自动化配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
1. 创建Job
整合Quartz有两种方式创建Job:
- 继承QuartzJobBean抽象类 (由spring提供)
- 实现原生的Job接口
QuartzJobBean抽象类也实现了Job接口,并且定义共有的execute方法,子类可以继承QuartzJobBean并实现executeInternal
例1:继承QuartzJobBean抽象类
public class HelloJob extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
//打印当前日期和数据
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateformat = simpleDateFormat.format(date);
//执行任务
System.out.println(dateformat+"--数据库备份!!");
}
}
例2:实现Job接口
public class HelloJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
//打印当前日期和数据
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateformat = simpleDateFormat.format(date);
//执行任务
System.out.println(dateformat+"--数据库备份!!");
}
}
2. 组件配置
两种方式:
- 使用Bean自动配置
- 使用Sechedler手动配置
2.1 自动配置
@Configuration
public class HelloQuartzConfig {
@Bean
public JobDetail getJobDetail(){
JobDetail jobDetail = JobBuilder.newJob(HelloQuartzJobBeanJob.class)
.withIdentity("hellojob", "hellogroup")
.storeDurably()//设置当没有Trigger关联job时, 是否继续持久化job,默认为true,这个必须设置,因为在bean的创建中有先后顺序
.build();
return jobDetail;
}
@Bean
public Trigger getTrigger(){
SimpleTrigger simpleTrigger = TriggerBuilder.newTrigger()
.withIdentity("helloTrigger", "helloTriggerGroup")
.startNow()
.withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(3))
.build();
return simpleTrigger;
}
@Bean
public Scheduler getScheduler() throws SchedulerException {
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.scheduleJob(getJobDetail(),getTrigger());
return scheduler;
}
}
运行springboot:
2022-10-19 15:57:49--数据库备份!! 2022-10-19 15:57:52--数据库备份!! 2022-10-19 15:57:55--数据库备份!!
注:Job的storeDurably(true)必须加上,不然假如job先创建而trigger没有被初始化,那么这个job就被删除,之后trigger因为找不到job而报错
2.2 手动配置
手动配置:
- @Component
- 实现ApplicationRunner接口
@Component
public class HelloJobInit implements ApplicationRunner {
@Autowired
Scheduler scheduler;//这个对象必须引入,本地创建不会被调用
@Override
public void run(ApplicationArguments args) throws Exception {
JobDetail jobDetail = JobBuilder.newJob(HelloQuartzJobBeanJob.class)
.withIdentity("job1","jobgroup1")
.storeDurably()
.build();
CronScheduleBuilder scheduleBuilder =
CronScheduleBuilder.cronSchedule("0/5 * * * * ? *");
// 创建任务触发器
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("01Trigger","01TriggerGroup")
.startNow() //立即執行一次任務
.withSchedule(scheduleBuilder)
.build();
// 手动将触发器与任务绑定到调度器内
scheduler.scheduleJob(jobDetail, trigger);
}
}
注:Scheduler scheduler对象必须使用Spring进行注入,本地创建会失效
输出:
2022-10-19 16:19:40--数据库备份!! 2022-10-19 16:19:45--数据库备份!! 2022-10-19 16:19:50--数据库备份!! 2022-10-19 16:19:55--数据库备份!! 2022-10-19 16:20:00--数据库备份!! 2022-10-19 16:20:05--数据库备份!!
3. Quartz的配置
SpringBoot集成Quartz配置,可以在application.yml的配置Quartz
以下是quartz的一下配置项:
spring:
# Quartz 的配置,对应 QuartzProperties 配置类
quartz:
job-store-type: memory # Job 存储器类型。默认为 memory 表示内存,可选 jdbc 使用数据库。
auto-startup: true # Quartz 是否自动启动
startup-delay: 0 # 延迟 N 秒启动
wait-for-jobs-to-complete-on-shutdown: true # 应用关闭时,是否等待定时任务执行完成。默认为 false ,建议设置为 true
overwrite-existing-jobs: false # 是否覆盖已有 Job 的配置
properties: # 添加 Quartz Scheduler 附加属性
org:
quartz:
threadPool:
threadCount: 25 # 线程池大小。默认为 10 。
threadPriority: 5 # 线程优先级
class: org.quartz.simpl.SimpleThreadPool # 线程池类型





Comments | NOTHING