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

在新版本的SpringBoot2.0發佈後,急迫嚐鮮的我將相關的項目已經更換爲最新版本,在SpringBoot源碼GitHub看到更新日誌,代表了針對Quartz新版本進行了 AutoConfiguration自動化配置,省去了不少繁瑣的配置。html

官網更新日誌

Auto-configuration support is now include for the Quartz 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.node

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

本章目標

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

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,以下所示:spring

<!--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已經爲咱們自動化配置好了。sql

自動化配置源碼

咱們找到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須要的數據表經過配置方式進行初始化。bash

測試

  1. 啓動項目
  2. 打開瀏覽器訪問http://localhost:8083/good/save?name=abcd&unit=斤&price=12.5進行添加定時任務
  3. 查看控制檯輸出
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學習目錄,感謝閱讀!

微信掃碼關注 - 專一分享

歡迎加入知識星球,恆宇少年帶你走之後的技術道路!!!

限時特惠66元/年,加入恆宇少年的鐵桿粉絲知識星球,這裏有你想要學習獲得的知識,恆宇少年一對一解答知識難點難點問題!!!

知識星球
相關文章
相關標籤/搜索