转载

第四十七章:SpringBoot2.0新特性 - Quartz自动化配置集成

在新版本的 SpringBoot2.0 发布后,急迫尝鲜的我将相关的项目已经更换为最新版本,在 SpringBoot 源码 GitHub 看到更新日志,表明了针对 Quartz 新版本进行了 AutoConfiguration 自动化配置,省去了很多繁琐的配置。

官网更新日志

Auto-configuration support is now include for theQuartz Scheduler. We’ve also added a new  spring-boot-starter-quartz starter POM. You can use in-memory  JobStores , or a full JDBC-based store. All  JobDetailCalendar and  Trigger beans from your Spring application context will be automatically registered with the  Scheduler . For more details read the new  "Quartz Scheduler" section of the reference documentation.

SpringBoot2.0 版本集成了 Quartz2.3.0 官网最新版本。

本章目标

使用 SpringBoot2.0 新特性完成 Quartz 自动化配置。

SpringBoot 企业级核心技术学习专题

专题 专题名称 专题描述
001 Spring Boot 核心技术 讲解SpringBoot一些企业级层面的核心组件
002 Spring Boot 核心技术章节源码 Spring Boot 核心技术简书每一篇文章码云对应源码
003 Spring Cloud 核心技术 对Spring Cloud核心技术全面讲解
004 Spring Cloud 核心技术章节源码 Spring Cloud 核心技术简书每一篇文章对应源码
005 QueryDSL 核心技术 全面讲解QueryDSL核心技术以及基于SpringBoot整合SpringDataJPA
006 SpringDataJPA 核心技术 全面讲解SpringDataJPA核心技术
007 SpringBoot核心技术学习目录 SpringBoot系统的学习目录,敬请关注点赞!!!

构建项目

在前面章节 第四十章:基于SpringBoot & Quartz完成定时任务分布式多节点负载持久化 内我们已经通过添加配置的方式完成集成,为了本章的方便直接复制之前的项目,在基础上进行修改。 打开 pom.xml 配置文件, SpringBoot 为我们提供了对应的依赖,我们将之前的 quartz 相关依赖删除,替换为 spring-boot-starter-quartz ,如下所示:

<!--quartz相关依赖-->
<dependency>
	<groupId>org.quartz-scheduler</groupId>
	<artifactId>quartz</artifactId>
	<version>${quartz.version}</version>
</dependency>
<dependency>
	<groupId>org.quartz-scheduler</groupId>
	<artifactId>quartz-jobs</artifactId>
	<version>${quartz.version}</version>
</dependency>
>>>>替换为:>>>>
<!--quartz依赖-->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
......

删除QuartzConfiguration配置类

在之前章节我们使用 QuartzConfiguration 配置类来完成了 Quartz 需要的一系列配置,如: JobFactorySchedulerFactoryBean 等,在我们添加 spring-boot-starter-quartz 依赖后就不需要主动声明工厂类,因为 spring-boot-starter-quartz 已经为我们自动化配置好了。

自动化配置源码

我们找到 IdeaExternal Libraries 并且展开 spring-boot-autoconfigure-2.0.0.RELEASE.jar ,找到 org.springframework.boot.autoconfigure.quartz ,该目录就是 SpringBoot 为我们提供的 Quartz 自动化配置源码实现,在该目录下有如下所示几个类:

  • AutowireCapableBeanJobFactory 该类替代了我们之前在 QuartzConfiguration 配置类的 AutowiringSpringBeanJobFactory 内部类实现,主要作用是我们自定义的 QuartzJobBean 子类被 Spring IOC 进行托管,可以在定时任务类内使用注入任意被 Spring IOC 托管的类。
  • JobStoreType 该类是一个枚举类型,定义了对应 application.ymlapplication.properties 文件内 spring.quartz.job-store-type 配置,其目的是配置 quartz 任务的数据存储方式,分别为:MEMORY(内存方式: 默认 )、JDBC(数据库方式)。
  • QuartzAutoConfiguration 该类是自动配置的主类,内部配置了 SchedulerFactoryBean 以及 JdbcStoreTypeConfiguration ,使用 QuartzProperties 作为属性自动化配置条件。
  • QuartzDataSourceInitializer 该类主要用于数据源初始化后的一些操作,根据不同平台类型的数据库进行选择不同的数据库脚本。
  • QuartzProperties 该类对应了 spring.quartzapplication.ymlapplication.properties 文件内开头的相关配置。
  • SchedulerFactoryBeanCustomizer 这是一个接口,我们实现该接口后并且将实现类使用 Spring IOC 托管,可以完成 SchedulerFactoryBean 的个性化设置,这里的设置完全可以对 SchedulerFactoryBean 做出全部的设置变更。

spring.quartz配置

看到 QuartzAutoConfiguration 类源码,我们知道了,想要使用自动化配置,需要满足 QuartzProperties 属性配置类的初始化,所以我们需要再 application.ymlapplication.properties 配置文件内添加对应的配置信息,如下所示:

spring:
  quartz:
    #相关属性配置
    properties:
      org:
        quartz:
          scheduler:
            instanceName: clusteredScheduler
            instanceId: AUTO
          jobStore:
            class: org.quartz.impl.jdbcjobstore.JobStoreTX
            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
            tablePrefix: QRTZ_
            isClustered: true
            clusterCheckinInterval: 10000
            useProperties: false
          threadPool:
            class: org.quartz.simpl.SimpleThreadPool
            threadCount: 10
            threadPriority: 5
            threadsInheritContextClassLoaderOfInitializingThread: true
    #数据库方式
    job-store-type: jdbc
    #初始化表结构
    #jdbc:
      #initialize-schema: never
  • spring.quartz.properties 该配置其实代替了之前的 quartz.properties ,我们把之前 quartz.properties 配置文件内的所有配置转换成 YUML 风格,对应的添加在该配置下即可,在 QuartzAutoConfiguration 类内,会自动调用 SchedulerFactoryBeansetQuartzProperties 方法,把 spring.quartz.properties 内的所有配置进行设置。
@Bean
@ConditionalOnMissingBean
public SchedulerFactoryBean quartzScheduler() {
        SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
        schedulerFactoryBean.setJobFactory(new AutowireCapableBeanJobFactory(this.applicationContext.getAutowireCapableBeanFactory()));
        // 如果配置了spring.quartz.properties
        if (!this.properties.getProperties().isEmpty()) {
        //  将所有properties设置到QuartzProperties
            schedulerFactoryBean.setQuartzProperties(this.asProperties(this.properties.getProperties()));
        }
......省略部分代码
  • spring.quartz.job-store-type 设置 quartz 任务的数据持久化方式,默认是内存方式,我们这里沿用之前的方式,配置 JDBC 以使用数据库方式持久化任务。
  • spring.quartz.jdbc.initialize-schema

该配置目前版本没有生效,根据官网文档查看,其目的是自动将 quartz 需要的数据表通过配置方式进行初始化。

测试

http://localhost:8083/good/save?name=abcd&unit=斤&price=12.5
22:55:18.812  INFO 17161 --- [           main] c.hengyu.chapter39.Chapter47Application  : 【【【【【【定时任务分布式节点 - quartz-cluster-node-second 已启动】】】】】】
2018-03-06 22:55:20.772  INFO 17161 --- [uartzScheduler]] o.s.s.quartz.SchedulerFactoryBean        : Starting Quartz Scheduler now, after delay of 2 seconds
2018-03-06 22:55:20.793  INFO 17161 --- [uartzScheduler]] org.quartz.core.QuartzScheduler          : Scheduler quartzScheduler_$_yuqiyudeMacBook-Pro.local1520348117910 started.
2018-03-06 22:56:20.103  INFO 17161 --- [nio-8083-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring FrameworkServlet 'dispatcherServlet'
2018-03-06 22:56:20.103  INFO 17161 --- [nio-8083-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization started
2018-03-06 22:56:20.121  INFO 17161 --- [nio-8083-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization completed in 18 ms
Hibernate: select next_val as id_val from hibernate_sequence for update
Hibernate: update hibernate_sequence set next_val= ? where next_val=?
Hibernate: insert into basic_good_info (bgi_name, bgi_price, bgi_unit, bgi_id) values (?, ?, ?, ?)
2018-03-06 22:56:20.268 TRACE 17161 --- [nio-8083-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [VARCHAR] - [abcd]
2018-03-06 22:56:20.269 TRACE 17161 --- [nio-8083-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [2] as [NUMERIC] - [12.5]
2018-03-06 22:56:20.269 TRACE 17161 --- [nio-8083-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [3] as [VARCHAR] - [斤]
2018-03-06 22:56:20.269 TRACE 17161 --- [nio-8083-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [4] as [BIGINT] - [1]
2018-03-06 22:56:47.253  INFO 17161 --- [eduler_Worker-1] c.h.c.timers.GoodStockCheckTimer         : 分布式节点quartz-cluster-node-second,执行库存检查定时任务,执行时间:Tue Mar 06 22:56:47 CST 2018
2018-03-06 22:57:00.012  INFO 17161 --- [eduler_Worker-2] c.h.c.timers.GoodStockCheckTimer         : 分布式节点quartz-cluster-node-second,执行库存检查定时任务,执行时间:Tue Mar 06 22:57:00 CST 2018
2018-03-06 22:57:20.207  INFO 17161 --- [eduler_Worker-3] c.hengyu.chapter39.timers.GoodAddTimer   : 分布式节点quartz-cluster-node-second,商品添加完成后执行任务,任务时间:Tue Mar 06 22:57:20 CST 2018
2018-03-06 22:57:30.013  INFO 17161 --- [eduler_Worker-4] c.h.c.timers.GoodStockCheckTimer         : 分布式节点quartz-cluster-node-second,执行库存检查定时任务,执行时间:Tue Mar 06 22:57:30 CST 2018
2018-03-06 22:58:00.014  INFO 17161 --- [eduler_Worker-5] c.h.c.timers.GoodStockCheckTimer         : 分布式节点quartz-cluster-node-second,执行库存检查定时任务,执行时间:Tue Mar 06 22:58:00 CST 2018

根据控制台内容,可以看到我们的定时任务已经正常的开始执行,当然我们如果打开 多个节点 同样可以实现 任务自动漂移 的效果。

总结

综上所述我们已经完成了 SpringBoot2.0 集成 Quartz ,我们只需要添加依赖、添加配置即可,别的不需要做任何代码编写。

本章源码已经上传到码云: SpringBoot配套源码地址: gitee.com/hengboy/spr… SpringCloud配套源码地址: gitee.com/hengboy/spr… SpringBoot相关系列文章请访问: 目录:SpringBoot学习目录 QueryDSL相关系列文章请访问: QueryDSL通用查询框架学习目录 SpringDataJPA相关系列文章请访问: 目录:SpringDataJPA学习目录 ,感谢阅读! 欢迎加入QQ技术交流群,共同进步。

第四十七章:SpringBoot2.0新特性 - Quartz自动化配置集成
第四十七章:SpringBoot2.0新特性 - Quartz自动化配置集成
原文  https://juejin.im/post/5b2dd022f265da59b52ca5d6
正文到此结束
Loading...