新聞中心
這篇文章主要為大家展示了SpringBoot集成Quartz如何實現(xiàn)定時任務(wù),內(nèi)容簡而易懂,希望大家可以學(xué)習(xí)一下,學(xué)習(xí)完之后肯定會有收獲的,下面讓小編帶大家一起來看看吧。
1 需求
在我的前后端分離的實驗室管理項目中,有一個功能是學(xué)生狀態(tài)統(tǒng)計。我的設(shè)計是按天統(tǒng)計每種狀態(tài)的比例。為了便于計算,在每天0點(diǎn),系統(tǒng)需要將學(xué)生的狀態(tài)重置,并插入一條數(shù)據(jù)作為一天的開始狀態(tài)。另外,考慮到學(xué)生的請假需求,請假的申請往往是提前做好,等系統(tǒng)時間走到實際請假時間的時候,系統(tǒng)要將學(xué)生的狀態(tài)修改為請假。
顯然,這兩個子需求都可以通過定時任務(wù)實現(xiàn)。在網(wǎng)上略做搜索以后,我選擇了比較流行的定時任務(wù)框架Quartz。
2 Quartz
Quartz是一個定時任務(wù)框架,其他介紹網(wǎng)上也很詳盡。這里要介紹一下Quartz里的幾個非常核心的接口。
2.1 Scheduler接口
Scheduler翻譯成調(diào)度器,Quartz通過調(diào)度器來注冊、暫停、刪除Trigger和JobDetail。Scheduler還擁有一個SchedulerContext,顧名思義就是上下文,通過SchedulerContext我們可以獲取到觸發(fā)器和任務(wù)的一些信息。
2.2 Trigger接口
Trigger可以翻譯成觸發(fā)器,通過cron表達(dá)式或是SimpleScheduleBuilder等類,指定任務(wù)執(zhí)行的周期。系統(tǒng)時間走到觸發(fā)器指定的時間的時候,觸發(fā)器就會觸發(fā)任務(wù)的執(zhí)行。
2.3 JobDetail接口
Job接口是真正需要執(zhí)行的任務(wù)。JobDetail接口相當(dāng)于將Job接口包裝了一下,Trigger和Scheduler實際用到的都是JobDetail。
3 SpringBoot官方文檔解讀
SpringBoot官方寫了spring-boot-starter-quartz
。使用過SpringBoot的同學(xué)都知道這是一個官方提供的啟動器,有了這個啟動器,集成的操作就會被大大簡化。
現(xiàn)在我們來看一看SpingBoot2.2.6官方文檔,其中第4.20小節(jié)Quartz Scheduler
就談到了Quartz,但很可惜一共只有兩頁不到的內(nèi)容,先來看看這么精華的文檔里能學(xué)到些什么。
Spring Boot offers several conveniences for working with the Quartz scheduler, including the
spring-boot-starter-quartz “Starter”. If Quartz is available, a Scheduler is auto-configured (through the SchedulerFactoryBean abstraction).
Beans of the following types are automatically picked up and associated with the Scheduler:
• JobDetail: defines a particular Job. JobDetail instances can be built with the JobBuilder API.
• Calendar.
• Trigger: defines when a particular job is triggered.
翻譯一下:
SpringBoot提供了一些便捷的方法來和Quartz協(xié)同工作,這些方法里面包括`spring-boot-starter-quartz`這個啟動器。如果Quartz可用,Scheduler會通過SchedulerFactoryBean這個工廠bean自動配置到SpringBoot里。
JobDetail、Calendar、Trigger這些類型的bean會被自動采集并關(guān)聯(lián)到Scheduler上。Jobs can define setters to inject data map properties. Regular beans can also be injected in a similar manner.
翻譯一下:
Job可以定義setter(也就是set方法)來注入配置信息。也可以用同樣的方法注入普通的bean。
下面是文檔里給的示例代碼,我直接完全照著寫,拿到的卻是null。不知道是不是我的使用方式有誤。后來仔細(xì)一想,文檔的意思應(yīng)該是在創(chuàng)建Job對象之后,調(diào)用set方法將依賴注入進(jìn)去。但后面我們是通過框架反射生成的Job對象,這樣做反而會搞得更加復(fù)雜。最后還是決定采用給Job類加@Component注解的方法。
文檔的其他篇幅就介紹了一些配置,但是介紹得也不全面,看了幫助也并不是很大。詳細(xì)的配置可以參考w3school的Quartz配置。
4 SpringBoot集成Quartz
4.1 建表
我選擇將定時任務(wù)的信息保存在數(shù)據(jù)庫中,優(yōu)點(diǎn)是顯而易見的,定時任務(wù)不會因為系統(tǒng)的崩潰而丟失。
建表的sql語句在Quartz的github中可以找到,里面有針對每一種常用數(shù)據(jù)庫的sql語句,具體地址是:Quartz數(shù)據(jù)庫建表sql。
建表以后,可以看到數(shù)據(jù)庫里多了11張表。我們完全不需要關(guān)心每張表的具體作用,在添加刪除任務(wù)、觸發(fā)器等的時候,Quartz框架會操作這些表。
4.2 引入依賴
在pom.xml
里添加依賴。
org.springframework.boot spring-boot-starter-quartz 2.2.6.RELEASE
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站www.cdcxhl.com,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
網(wǎng)頁題目:SpringBoot集成Quartz如何實現(xiàn)定時任務(wù)-創(chuàng)新互聯(lián)
鏈接地址:http://www.ef60e0e.cn/article/esjio.html