在日常项目研发中,定时任务可谓是必不可少的一环,关于 Spring Boot 如何实现静态定时任务、动态定时任务以及如何开启多线程跑任务,均已在上篇分享过,不再赘述。
虽然 Spring Boot 内置注解方式实现的定时任务,在一定程度上也能解决一定的业务场景问题,但是若做更复杂的动作,例如启停任务、删除任务等等操作,实现起来则稍显复杂,此时便可以通过集成开源任务框架来实现。
常见的定时任务框架有 Quartz、elastic-job、xxl-job等等,本次主要介绍 Spring Boot 集成定时任务第 3 部分:Spirng Boot 集成 Quartz 定时任务框架。
Quartz 存储方式有两种:MEMORY 和 JDBC。默认是内存形式维护任务信息,意味着服务重启了任务就从头再来,就像喝酒断片了一样;而 JDBC 形式就是能够把任务信息持久化到数据库,虽然服务重启了,依然还能接着来。
Quartz 提供了单机版和集群版,默认就是单机版,接下来逐一分享一波。
Spring Boot 集成 Quartz 的方式也很简单,首先引入封装好的 Quartz 依赖。
<!-- 引入 Quartz 依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
1. 内存方式存储任务信息
1.1 定义任务类
可以通过实现 Job 接口来定义任务,也可以通过继承 QuartzJobBean 这个抽象类来定义任务,其实 QuartzJobBean 本身也实现了 Job 接口,其本质都是实现 Job 接口来定义任务。
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
/**
* 定义任务
*/
public class DongAoJob extends QuartzJobBean {
private static final Log logger = LogFactory.getLog(DongAoJob.class);
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
logger.info("幼年是盼盼,青年是晶晶,中年是冰墩墩,生活见好逐渐发福");
}
}
1.2 定义任务描述及任务触发规则
定义每隔 5 秒执行一次任务,代码如下。
import com.example.demo.quartz.task.DongAoJob;
import org.quartz.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 定义任务描述和具体的执行时间
*/
@Configuration
public class QuartzConfig {
@Bean
public JobDetail jobDetail() {
//指定任务描述具体的实现类
return JobBuilder.newJob(DongAoJob.class)
// 指定任务的名称
.withIdentity("dongAoJob")
// 任务描述
.withDescription("任务描述:用于输出冬奥欢迎语")
// 每次任务执行后进行存储
.storeDurably()
.build();
}
@Bean
public Trigger trigger() {
//创建触发器
return TriggerBuilder.newTrigger()
// 绑定工作任务
.forJob(jobDetail())
// 每隔 5 秒执行一次 job
.withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(5))
.build();
}
}