SpringBoot -- Quartz
SpringBoot -- Quartz
Quartz
是一个定时任务的调度框架,涉及到的主要概念有以下几个:
-
Scheduler
:调度器,所有的调度都由它控制,所有的任务都由它管理。 -
Job
:任务,定义业务逻辑。 -
JobDetail
:基于Job,进一步封装。其中关联一个Job,并为Job指定更详细的信息。 -
Trigger
:触发器,可以指定给某个任务,指定任务的触发机制。
1 springboot----Quartz简单集成
1.1 依赖引入
<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>
1.2 定义任务Job
任务 extends QuartzJobBean
@Slf4j
public class FirstJob extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
String now = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now());
System.out.println("当前时间:"+now);
}
}
@Slf4j
public class SecondJob extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
String now = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now());
System.out.println("secondJob执行 当前时间:"+now);
}
}
1.3 QuartzConfig配置类
@Configuration
public class QuartzConfig {
private static final String ID = "Job";
@Bean
public JobDetail jobDetail01(){
return JobBuilder.newJob(FirstJob.class)
.withIdentity(ID + "01")
.storeDurably()
.build();
}
@Bean
public SimpleScheduleBuilder simpleScheduleBuilder(){
return SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(5)
.withRepeatCount(100);
}
@Bean
public CronScheduleBuilder cronScheduleBuilder(){
return CronScheduleBuilder.cronSchedule("0/5 * * * * ? *");
}
@Bean
public Trigger trigger(){
return TriggerBuilder.newTrigger()
.forJob(jobDetail01())
.withIdentity(ID + "01Trigger")
.withSchedule(simpleScheduleBuilder())
.build();
}
}
1.4 yml文件配置
spring:
quartz:
auto-startup: true
job-store-type: jdbc
startup-delay: 0
wait-for-jobs-to-complete-on-shutdown: true
overwrite-existing-jobs: false
scheduler-name: myQuartzScheduler
2 Quartz任务持久化到MySQL
Quartz默认使用
RAMJobStore
存储方式将任务存储在内存中,除了这种方式还支持使用JDBC将任务存储在数据库,为了防止任务丢失,我们一般会将任务存储在数据库中。这里使用mysql进行存储,在quartz的源码包中找到文件
tables_mysql_innodb.sql
,然后在客户端进行运行sql文件。
2.1 依赖导入
<dependencies>
<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>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
2.2 导入Quartz数据库sql
如果springboot容器中有Trigger的springbean,则会自动使用JDBC持久化到该数据库中。