SpringBoot整合任務(wù)系統(tǒng)quartz和SpringTask的方法
SpringBoot整合任務(wù)系統(tǒng)
? 這里說的任務(wù)系統(tǒng)指的是定時(shí)任務(wù)。定時(shí)任務(wù)是企業(yè)級(jí)開發(fā)中必不可少的組成部分,諸如長(zhǎng)周期業(yè)務(wù)數(shù)據(jù)的計(jì)算,例如年度報(bào)表,諸如系統(tǒng)臟數(shù)據(jù)的處理,再比如系統(tǒng)性能監(jiān)控報(bào)告,還有搶購類活動(dòng)的商品上架,這些都離不開定時(shí)任務(wù)。下面將介紹兩種不同的定時(shí)任務(wù)技術(shù)。
1:Quartz
? Quartz是一個(gè)比較成熟了的定時(shí)任務(wù)框架,但是捏,它稍微的有些許繁瑣,因此,SpringBoot大哥說:我來給它整合整合。” 于是呢,SpringBoot大哥出手了,對(duì)其進(jìn)行整合,簡(jiǎn)化了一系列配置,將很多配置都簡(jiǎn)化為了默認(rèn)配置(包含常用的注解式開發(fā)??),這樣對(duì)Quartz的的整合就舒服了許多。
? 接下來,咱們先了解下Quartz的一些基本概念。
- 工作(Job):用于定義具體執(zhí)行的工作(工作的邏輯和流程)
- 工作明細(xì)(JobDetail):用于描述定時(shí)工作相關(guān)的信息()
- 觸發(fā)器(Trigger):描述了工作明細(xì)與調(diào)度器的對(duì)應(yīng)關(guān)系
- 調(diào)度器(Scheduler):用于描述觸發(fā)工作的執(zhí)行規(guī)則,通常使用cron表達(dá)式定義規(guī)則
? 這簡(jiǎn)單來說就是咱們要提前定好什么時(shí)候干什么事情,這個(gè)就是工作;兒工作不可能只有一個(gè)工作名稱吧,肯定要有具體的工作內(nèi)容,這個(gè)就是工作明細(xì)(JobDetail)。這個(gè)時(shí)候工作內(nèi)容都明確了,現(xiàn)在需要明確的就是什么時(shí)候去執(zhí)行了,以及按照什么規(guī)則去執(zhí)行,這個(gè)時(shí)候需要調(diào)度器。那么這個(gè)時(shí)候,就有寶貝兒?jiǎn)柫耍|發(fā)器呢?它當(dāng)然在啦,因?yàn)檎{(diào)度器和工作是兩個(gè)獨(dú)立的個(gè)體,所以需要一個(gè)東西去把他們聯(lián)系起來,這個(gè)東西就是觸發(fā)器。
? OK,現(xiàn)在開始,咱們來看SpringBoot來整合Quartz。
1.導(dǎo)入Quartz的Maven坐標(biāo)。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>2,遵守Quartz的規(guī)范編寫相應(yīng)的工作內(nèi)容的bean,讓它交給第三步的JobDetail去綁定
//定義開發(fā)任務(wù)的bean,注意,這里要繼承QuartzJobBean,
//而不是將定義的開發(fā)任務(wù)的bean交給Spring去管理
public class MyQuartz extends QuartzJobBean {
//這個(gè)方法里寫的邏輯是你需要執(zhí)行的操作,也就是任務(wù)內(nèi)容
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("踏風(fēng)彡");
}
}
3.編寫Quartz的具體配置類,這個(gè)配置類要交給Spring去管理
類名稱和方法名稱可以自定義
//創(chuàng)建Quartz的具體配置類,包含任務(wù)綁定和觸發(fā)器
@Configuration
public class QuartzConfig {
//.storeDurably():生命當(dāng)任務(wù)未執(zhí)行會(huì)被框架給持久化,不會(huì)直接結(jié)束
//.newJob():綁定具體的任務(wù)類
@Bean
public JobDetail Print(){
return JobBuilder.newJob(MyQuartz.class).storeDurably().build();
}
//定義觸發(fā)器
// forjob():綁定跟要執(zhí)行任務(wù)綁定的返回值為JObDetail的方法(即工作明細(xì)對(duì)象)
// TriggerBuilder.newTrigger():創(chuàng)建觸發(fā)器對(duì)象
// withSchedule(scheduleBuilder):使用調(diào)度器,規(guī)定任務(wù)的執(zhí)行策略
@Bean
public Trigger PrintJobTrigger(){
//這里使用cron表達(dá)式:
//"0/5 * * * * ?"
//意思是:每五秒 任意分 任意小時(shí) 任意日 任意月 任意周幾
ScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/5 * * * * ?");
return TriggerBuilder.newTrigger().forJob(Print()).withSchedule(scheduleBuilder).build();
}
}
4.配置類里主要實(shí)現(xiàn)兩個(gè)方法,方法名可以自定義,方法返回值要限定
工作明細(xì)方法
//.storeDurably():生命當(dāng)任務(wù)未執(zhí)行會(huì)被框架給持久化,不會(huì)直接結(jié)束
//.newJob():綁定具體的任務(wù)類
@Bean
public JobDetail Print(){
return JobBuilder.newJob(MyQuartz.class).storeDurably().build();
}
觸發(fā)器方法
//定義觸發(fā)器
// forjob():綁定跟要執(zhí)行任務(wù)綁定的返回值為JObDetail的方法(即工作明細(xì)對(duì)象)
// TriggerBuilder.newTrigger():創(chuàng)建觸發(fā)器對(duì)象
// withSchedule(scheduleBuilder):使用調(diào)度器,規(guī)定任務(wù)的執(zhí)行策略
@Bean
public Trigger PrintJobTrigger(){
//這里使用cron表達(dá)式:
//"0/5 * * * * ?"
//意思是:每五秒 任意分 任意小時(shí) 任意日 任意月 任意周幾
ScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/5 * * * * ?");
return TriggerBuilder.newTrigger().forJob(Print()).withSchedule(scheduleBuilder).build();
}
接下來,寶貝們,咱們來看一下執(zhí)行結(jié)果。

? 工作明細(xì)中利用newJob()傳入具體的工作對(duì)象。
? 觸發(fā)器也需要綁定具體的任務(wù),通過forJob()綁定具體的工作明細(xì)對(duì)象,這里可以對(duì)工作明細(xì)對(duì)象設(shè)置具體名稱進(jìn)行綁定,或者直接對(duì)相應(yīng)的bean方法進(jìn)行綁定。觸發(fā)器中最核心的是執(zhí)行規(guī)則,其中最核心的是執(zhí)行時(shí)間,這里我用的是cron表達(dá)式,關(guān)于表達(dá)式我只對(duì)在這篇文章中所需的在代碼里進(jìn)行了介紹,如果朋友們想學(xué)習(xí)更詳細(xì)的cron表達(dá)式規(guī)則,可以自行找相應(yīng)的資料進(jìn)行學(xué)習(xí)呦~~。
總結(jié):
- SpringBoot整合Quartz的核心說到底還是把相應(yīng)的bean容器對(duì)象交給Spring容器管理,包含兩個(gè)對(duì)象:JobDetail和Trigger對(duì)象。
- JobDetail對(duì)象是工作信息,需要綁定一個(gè)繼承了QuartzJobBean類的子類對(duì)象。
- JobDetail和Trigger由觸發(fā)器進(jìn)行關(guān)聯(lián),觸發(fā)器需要綁定相關(guān)的JobDetail,還要設(shè)置執(zhí)行周期調(diào)度器。
2:Task
? 接下來咱們來看Spring對(duì)定時(shí)任務(wù)進(jìn)行整合后的簡(jiǎn)化開發(fā)的操作。
? 簡(jiǎn)單來說就是,注解式開發(fā),你只需要把你要執(zhí)行的任務(wù)加上Spring要求的注解,并根據(jù)注解的格式去設(shè)置定時(shí)任務(wù)的執(zhí)行規(guī)則即可。
1.開啟定時(shí)任務(wù)的開關(guān),在啟動(dòng)類上加入@EnableScheduling注解。
@SpringBootApplication
@EnableScheduling
public class YsjApplication {
public static void main(String[] args) {
SpringApplication.run(YsjApplication.class, args);
}
}
2.創(chuàng)建相應(yīng)的定時(shí)任務(wù)類,并將其交給Spring管理
@Component
public class TestBean {
}3.在定時(shí)任務(wù)類中的相應(yīng)的定時(shí)任務(wù)方法加上@Scheduled注解,相應(yīng)的執(zhí)行時(shí)間規(guī)則用cron表達(dá)式表示
@Component
public class TestBean {
@Scheduled(cron = "0/20 * * * * ?")
public void print(){
System.out.println("踏風(fēng)彡");
}
}
4.若需要對(duì)定時(shí)任務(wù)的相關(guān)配置進(jìn)行配置,可以在配置文件里進(jìn)行配置
spring:
task:
scheduling:
pool:
max-size: 2 #task線程池最大大小
keep-alive: 100s
allow-core-thread-timeout: true
thread-name-prefix: Spring_task_ #調(diào)度線程名前綴,默認(rèn)為:scheduling_
# shutdown:
# await-termination: false #線程池關(guān)閉時(shí)是否等待所有任務(wù)完成
# await-termination-period: 20s #調(diào)度線程前關(guān)閉前的最大等待時(shí)間
shutdown:
await-termination-period: 100s
await-termination: false總結(jié):
一定要先開啟定時(shí)任務(wù)的開關(guān),在啟動(dòng)類上加上@EnableScheduling注解這里的定時(shí)任務(wù)方法的容器所在的類要交給Spring去管理若需要調(diào)試,可以在相應(yīng)配置類中加上相應(yīng)的配置
rmination-period: 100s
await-termination: false
**總結(jié):** 1. 一定要先開啟定時(shí)任務(wù)的開關(guān),在啟動(dòng)類上加上@EnableScheduling注解 2. 這里的定時(shí)任務(wù)方法的容器所在的類要交給Spring去管理 3. 若需要調(diào)試,可以在相應(yīng)配置類中加上相應(yīng)的配置
到此這篇關(guān)于SpringBoot整合任務(wù)系統(tǒng)(quartz和SpringTask)的文章就介紹到這了,更多相關(guān)SpringBoot整合任務(wù)系統(tǒng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java中l(wèi)ambda(函數(shù)式編程)一行解決foreach循環(huán)問題
這篇文章主要介紹了java中l(wèi)ambda(函數(shù)式編程)一行解決foreach循環(huán)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
基于java實(shí)現(xiàn)簡(jiǎn)單的圖片類別識(shí)別
這篇文章主要為大家詳細(xì)介紹了如何基于java實(shí)現(xiàn)簡(jiǎn)單的圖片類別識(shí)別功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12
java內(nèi)存模型jvm虛擬機(jī)簡(jiǎn)要分析
Java 內(nèi)存模型的主要目的是定義程序中各種變量的訪問規(guī)則, 關(guān)注在虛擬機(jī)中把變量值存儲(chǔ)到內(nèi)存和從內(nèi)存中取出變量值這樣的底層細(xì)節(jié)2021-09-09
詳解spring cloud分布式整合zipkin的鏈路跟蹤
這篇文章主要介紹了詳解spring cloud分布式整合zipkin的鏈路跟蹤,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-07-07
深入理解Java線程池從設(shè)計(jì)思想到源碼解讀
這篇文章主要介紹了深入理解Java線程池從設(shè)計(jì)思想到源碼解讀,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
Springboot整合Flowable6.x導(dǎo)出bpmn20的步驟詳解
這篇文章主要介紹了Springboot整合Flowable6.x導(dǎo)出bpmn20,Flowable流程引擎可用于部署B(yǎng)PMN 2.0流程定義,可以十分靈活地加入你的應(yīng)用/服務(wù)/構(gòu)架,本文給出兩種從flowable導(dǎo)出流程定義bpmn20.xml的方式,需要的朋友可以參考下2023-04-04

