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

恆宇少年發表於2018-06-23

在新版本的SpringBoot2.0釋出後,急迫嚐鮮的我將相關的專案已經更換為最新版本,在SpringBoot原始碼GitHub看到更新日誌,表明了針對Quartz新版本進行了 AutoConfiguration自動化配置,省去了很多繁瑣的配置。

官網更新日誌

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.

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需要的資料表通過配置方式進行初始化。

測試

  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元/年,加入恆宇少年的鐵桿粉絲知識星球,這裡有你想要學習得到的知識,恆宇少年一對一解答知識難點難點問題!!!

知識星球

相關文章