在新版本的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-memoryJobStores
, or a full JDBC-based store. AllJobDetail
,Calendar
andTrigger
beans from your Spring application context will be automatically registered with theScheduler
. 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
需要的一系列配置,如:JobFactory
、SchedulerFactoryBean
等,在我們新增spring-boot-starter-quartz
依賴後就不需要主動宣告工廠類,因為spring-boot-starter-quartz
已經為我們自動化配置好了。
自動化配置原始碼
我們找到Idea
的External 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.yml
、application.properties
檔案內spring.quartz.job-store-type
配置,其目的是配置quartz
任務的資料儲存方式,分別為:MEMORY(記憶體方式:預設
)、JDBC(資料庫方式)。QuartzAutoConfiguration
該類是自動配置的主類,內部配置了SchedulerFactoryBean
以及JdbcStoreTypeConfiguration
,使用QuartzProperties
作為屬性自動化配置條件。QuartzDataSourceInitializer
該類主要用於資料來源初始化後的一些操作,根據不同平臺型別的資料庫進行選擇不同的資料庫指令碼。QuartzProperties
該類對應了spring.quartz
在application.yml
、application.properties
檔案內開頭的相關配置。SchedulerFactoryBeanCustomizer
這是一個介面,我們實現該介面後並且將實現類使用Spring IOC
託管,可以完成SchedulerFactoryBean
的個性化設定,這裡的設定完全可以對SchedulerFactoryBean
做出全部的設定變更。
spring.quartz配置
看到QuartzAutoConfiguration
類原始碼,我們知道了,想要使用自動化配置,需要滿足QuartzProperties
屬性配置類的初始化,所以我們需要再application.yml
、application.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
類內,會自動呼叫SchedulerFactoryBean
的setQuartzProperties
方法,把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學習目錄,感謝閱讀!