SpringBoot日程管理Quartz與定時任務(wù)Task實現(xiàn)詳解
任務(wù)系統(tǒng)指的是定時任務(wù)。定時任務(wù)是企業(yè)級開發(fā)中必不可少的組成部分,諸如?周期業(yè)務(wù)數(shù)據(jù)的計算,都會?到定時任務(wù)
1 Quartz
Quartz是OpenSymphony開源組織在Job scheduling領(lǐng)域的?個開源項?,完全由Java開發(fā)的?個開源的任務(wù)?程管理系統(tǒng),在預(yù)先確定(被納??程)的時間到達時,負(fù)責(zé)執(zhí)?(或者通知)其他軟件組件的系統(tǒng)。
核?概念
Job(任務(wù)):為?個接?,只定義?個?法 execute(JobExecutionContext context),在實現(xiàn)接?的execute?法中編寫所需要定時執(zhí)?的 Job(任務(wù)),JobExecutionContext類提供了調(diào)度應(yīng)?的?些信息。Job運?時的信息保存在JobDataMap實例中。
JobDetail(任務(wù)信息):Quartz每次調(diào)度Job時,都重新創(chuàng)建?個Job實例,它不直接接受?個Job的實例,相反它接收?個Job實現(xiàn)類(JobDetail,描述Job的實現(xiàn)類及其他相關(guān)的靜態(tài)信息,如Job名字、描述、關(guān)聯(lián)監(jiān)聽器等信息)。
Trigger(觸發(fā)器):為?個類,描述觸發(fā)Job執(zhí)?的時間觸發(fā)規(guī)則。主要有SimpleTrigger和CronTrigger兩個?類。當(dāng)且僅當(dāng)需調(diào)度?次或者以固定時間間隔周期執(zhí)?調(diào)度,SimpleTrigger是最適合的選擇;?CronTrigger則可以通過Cron表達式定義出各種復(fù)雜時間規(guī)則的調(diào)度?案。
Scheduler(調(diào)度器):調(diào)度器就相當(dāng)于?個容器,裝載著任務(wù)和觸發(fā)器。該類是?個接?,代表?個Quartz的獨?運?容器,Trigger和JobDetail可以注冊到Scheduler中。
Springboot整合Quartz
1.導(dǎo)?springboot整合Quartz的starter
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency>
2.定義任務(wù)Bean
按照Quartz的開發(fā)規(guī)范制作,繼承QuartzJobBean
public class MyQuartz extends QuartzJobBean { @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { System.out.println("quartz task is going......"); } }
3.創(chuàng)建Quartz配置類
定義?作明細(xì)(JobDetail)與觸發(fā)器的(Trigger)bean
@Configuration public class QuartzConfig { @Bean public JobDetail testDetail(){ return JobBuilder.newJob(MyQuartz.class).storeDurably().build(); } @Bean public Trigger testJobTrigger(){ //創(chuàng)建調(diào)度器 ScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/5 * * * * ? "); //綁定對應(yīng)的?作明細(xì) return TriggerBuilder.newTrigger().forJob(testDetail()).withSchedule(scheduleBuilder).build(); } }
cron表達式,定時執(zhí)?
- 第?位,表示秒,取值 0-59;
- 第?位,表示分,取值 0-59;
- 第三位,表示?時,取值 0-23;
- 第四位,?期天/?,取值 1-31;
- 第五位,?期?份,取值 1-12;
- 第六位,星期,取值 1-7,星期?、星期?…;
注:不是第1周、第2周的意思,另外:1表示星期天,2表示星期?。
- 第七位,年份,可以留空,取值 1970-2099。
特殊符號
- (*)星號:可以理解為每的意思,每秒、每分、每天、每?、每年
- (?)問號:問號只能出現(xiàn)在?期和星期這兩個位置,表示這個位置的值不確定,每天 3點執(zhí)?,所以第六位星期的位置是不需要關(guān)注的,就是不確定的值。同時,?期和星期是兩個相互排斥的元素,通過問號來表明不指定值。假如 1 ? 10 ?是星期?,如果在星期的位置是另指定星期?,就前后沖突?盾了
- (-)減號:表達?個范圍,如在?時字段中使?“10-12”,則表示從 10~12 點,即10、11、12
- (,)逗號:表達?個列表值,如在星期字段中使?“1、2、4”,則表示星期?、星期?、星期四
- (/)斜杠:如 x/y,x 是開始值,y 是步?,假設(shè)在第?位(秒) 0/15 就是,從 0秒開始,每 15 秒,最后就是 0、15、30、45、60,另 */y,等同于 0/y
總結(jié)
1. springboot整合Quartz就是將Quartz對應(yīng)的核?對象交給spring容器管理,包含兩個對象,JobDetail和Trigger對象
2. JobDetail對象描述的是?作的執(zhí)?信息,需要綁定?個QuartzJobBean類型的對象
3. Trigger對象定義了?個觸發(fā)器,需要為其指定綁定的JobDetail是哪個,同時要設(shè)置執(zhí)?周期調(diào)度器
2. Task
spring根據(jù)定時任務(wù)的特征,將定時任務(wù)的開發(fā)簡化到了極致。
1.開啟定時任務(wù)功能
在引導(dǎo)類上開啟定時任務(wù)功能的開關(guān),使?注解@EnableScheduling
@SpringBootApplication @EnableScheduling//打開定時任務(wù)開關(guān) public class Demo12SpringbootTaskApplication { public static void main(String[] args) { SpringApplication.run(Demo12SpringbootTaskApplication.class, args); } }
2.定義Bean
在對應(yīng)要定時執(zhí)?的操作上?,使?注解@Scheduled定義執(zhí)?的時間,執(zhí)?時間的描述?式還是cron表達式
@Component public class MyBean { @Scheduled(cron = "0/1 * * * * ?") public void print() { System.out.println(Thread.currentThread().getName() + ":spring task run..."); } }
3.配置文件
如何想對定時任務(wù)進?相關(guān)配置,可以通過配置?件進?
spring:
task:
scheduling:
## 調(diào)度線程名稱前綴 默認(rèn)scheduling-
thread-name-prefix: myTask_
pool:
# 任務(wù)調(diào)度線程池?? 默認(rèn) 1
size: 1
shutdown:
# 線程池關(guān)閉時等待所有任務(wù)完成
await-termination: false
# 調(diào)度線程關(guān)閉前最?等待時間,確保最后?定關(guān)閉
await-termination-period: 10s
總結(jié)
1. spring task需要使?注解@EnableScheduling開啟定時任務(wù)功能
2. 為定時執(zhí)?的的任務(wù)設(shè)置執(zhí)?周期,描述?式cron表達式
到此這篇關(guān)于SpringBoot日程管理Quartz與定時任務(wù)Task實現(xiàn)詳解的文章就介紹到這了,更多相關(guān)SpringBoot Quartz與Task內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JAVA Netty實現(xiàn)聊天室+私聊功能的示例代碼
這篇文章主要介紹了JAVA Netty實現(xiàn)聊天室+私聊功能的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08Mybatis-Plus的saveOrUpdateBatch(null)問題及解決
這篇文章主要介紹了Mybatis-Plus的saveOrUpdateBatch(null)問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07Java怎么獲取當(dāng)前時間、計算程序運行時間源碼詳解(超詳細(xì)!)
有的時候,我們需要查看某一段代碼的性能如何,最為簡單的方式,可以通過計算該段代碼執(zhí)行的耗時,來進行簡單的判斷,這篇文章主要給大家介紹了關(guān)于Java怎么獲取當(dāng)前時間、計算程序運行時間的相關(guān)資料,需要的朋友可以參考下2024-07-07將BigDecimal轉(zhuǎn)成字符串為科學(xué)計數(shù)法的踩坑記錄
這篇文章主要介紹了將BigDecimal轉(zhuǎn)成字符串為科學(xué)計數(shù)法的踩坑記錄,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06