写点什么

SpringBoot 系列:Spring Boot 集成定时任务 Quartz

  • 2021 年 11 月 11 日
  • 本文字数:1780 字

    阅读完需:约 6 分钟

在 Quartz 中的主要概念:


  • Scheduler:调度任务的主要 API

  • ScheduleBuilder:用于构建 Scheduler,例如其简单实现类 SimpleScheduleBuilder

  • Job:调度任务执行的接口,也即定时任务执行的方法

  • JobDetail:定时任务作业的实例

  • JobBuilder:关联具体的 Job,用于构建 JobDetail

  • Trigger:定义调度执行计划的组件,即定时执行

  • TriggerBuilder:构建 Trigger

一、Quartz 演示示例

在 SpringBoot 中,我们需要引入 quartz 的依赖。


<dependency>


<groupId>org.springframework.boot</groupId>


<artifactId>spring-boot-starter-web</artifactId>


</dependency>


<dependency>


<groupId>org.springframework.boot</groupId>


<artifactId>spring-boot-starter-quartz</artifactId>


</dependency>


首先定义定时具体执行逻辑 Job,创建类 QuartzJob1,这里集继承 QuartzJobBean 实现 executeInternal 即可,该方法即定时执行任务逻辑,这里简单打印了下当前时间。


public class QuartzJob1 extends QuartzJobBean {


@Override


protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {


SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");


System.out.println("QuartzJob1----" sdf.format(new Date()));


}


}


然后创建 QuartzConfig,接着定义 JobDetail,JobDetail 由 JobBuilder 构建,同时关联了任


【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


务 QuartzJob1。


@Configuration


public class QuartzConfig {


@Bean


public JobDetail jobDetail1(){


return JobBuilder.newJob(QuartzJob1.class).storeDurably().build();


}


}


最后我们需要定义定时调度 Trigger,简单实现类 SimpleScheduleBuilder 用于构建 Scheduler,TriggerBuilder 则用于构建 Trigger。


@Configuration


public class QuartzConfig {


@Bean


public JobDetail jobDetail1(){


return JobBuilder.newJob(QuartzJob1.class).storeDurably().build();


}


@Bean


public Trigger trigger1(){


SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()


.withIntervalInSeconds(1) //每一秒执行一次


.repeatForever(); //永久重复,一直执行下去


return TriggerBuilder.newTrigger()


.forJob(jobDetail1())


.withSchedule(scheduleBuilder)


.build();


}


}


这样一个 Quartz 定时任务就配置完成了。


其实 Job 的定义也可以使用内部类,这样可以省去 Job 类的创建,例如下面定时任务 2 jobDetail2 和 trigger2。


@Bean


public JobDetail jobDetail2(){


QuartzJobBean quartzJob2 = new QuartzJobBean() {


@Override


protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {


SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");


System.out.println("内部类 quartzJob2----" sdf.format(new Date()));


}


};


return JobBuilder.newJob(quartzJob2.getClass()).storeDurably().build();


}


@Bean


public Trigger trigger2(){


//JobDetail 的 bean 注入不能省略


//JobDetail jobDetail3 = JobBuilder.newJob(QuartzJob2.class).storeDurably().build();


SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()


.withIntervalInSeconds(2) //每 2 秒执行一次


.repeatForever(); //永久重复,一直执行下去


return TriggerBuilder.newTrigger()


.forJob(jobDetail2())


.withSchedule(scheduleBuilder).build();


}


启动程序,我们就可以看到控制台的时间输出了。



同时 Quartz 是支持数据持久化的,可以将定时调度信息持久化到数据库。


选择持久化到数据库,我们需要创建对应的表,建表语句可以在Quartz官网进行下载,解压后在 docs\dbTables 目录下寻找对应数据库的 SQL 脚本。


为了方便,我也将该文件放在了项目源码 resources 里。


操作数据库,我们引入相关的依赖。若有 ORM 框架,例如 mybatis,hibernate 或者 jpa,则无需再引入 jdbc 依赖。


<dependency>


<groupId>mysql</groupId>


<artifactId>mysql-connector-java</artifactId>


<scope>runtime</scope>


</dependency>


<dependency>


<groupId>com.alibaba</groupId>


<artifactId>druid-spring-boot-starter</artifactId>


<version>1.1.10</version>


</dependency>


<dependency>


<groupId>org.springframework.boot</groupId>

评论

发布
暂无评论
SpringBoot系列:Spring Boot集成定时任务Quartz