SpringBoot整合任務系統(tǒng)quartz和SpringTask的方法
SpringBoot整合任務系統(tǒng)
? 這里說的任務系統(tǒng)指的是定時任務。定時任務是企業(yè)級開發(fā)中必不可少的組成部分,諸如長周期業(yè)務數(shù)據(jù)的計算,例如年度報表,諸如系統(tǒng)臟數(shù)據(jù)的處理,再比如系統(tǒng)性能監(jiān)控報告,還有搶購類活動的商品上架,這些都離不開定時任務。下面將介紹兩種不同的定時任務技術。
1:Quartz
? Quartz是一個比較成熟了的定時任務框架,但是捏,它稍微的有些許繁瑣,因此,SpringBoot大哥說:我來給它整合整合。” 于是呢,SpringBoot大哥出手了,對其進行整合,簡化了一系列配置,將很多配置都簡化為了默認配置(包含常用的注解式開發(fā)??),這樣對Quartz的的整合就舒服了許多。
? 接下來,咱們先了解下Quartz的一些基本概念。
- 工作(Job):用于定義具體執(zhí)行的工作(工作的邏輯和流程)
- 工作明細(JobDetail):用于描述定時工作相關的信息()
- 觸發(fā)器(Trigger):描述了工作明細與調度器的對應關系
- 調度器(Scheduler):用于描述觸發(fā)工作的執(zhí)行規(guī)則,通常使用cron表達式定義規(guī)則
? 這簡單來說就是咱們要提前定好什么時候干什么事情,這個就是工作;兒工作不可能只有一個工作名稱吧,肯定要有具體的工作內容,這個就是工作明細(JobDetail)。這個時候工作內容都明確了,現(xiàn)在需要明確的就是什么時候去執(zhí)行了,以及按照什么規(guī)則去執(zhí)行,這個時候需要調度器。那么這個時候,就有寶貝兒問了,觸發(fā)器呢?它當然在啦,因為調度器和工作是兩個獨立的個體,所以需要一個東西去把他們聯(lián)系起來,這個東西就是觸發(fā)器。
? OK,現(xiàn)在開始,咱們來看SpringBoot來整合Quartz。
1.導入Quartz的Maven坐標。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency>
2,遵守Quartz的規(guī)范編寫相應的工作內容的bean,讓它交給第三步的JobDetail去綁定
//定義開發(fā)任務的bean,注意,這里要繼承QuartzJobBean, //而不是將定義的開發(fā)任務的bean交給Spring去管理 public class MyQuartz extends QuartzJobBean { //這個方法里寫的邏輯是你需要執(zhí)行的操作,也就是任務內容 @Override protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException { System.out.println("踏風彡"); } }
3.編寫Quartz的具體配置類,這個配置類要交給Spring去管理
類名稱和方法名稱可以自定義
//創(chuàng)建Quartz的具體配置類,包含任務綁定和觸發(fā)器 @Configuration public class QuartzConfig { //.storeDurably():生命當任務未執(zhí)行會被框架給持久化,不會直接結束 //.newJob():綁定具體的任務類 @Bean public JobDetail Print(){ return JobBuilder.newJob(MyQuartz.class).storeDurably().build(); } //定義觸發(fā)器 // forjob():綁定跟要執(zhí)行任務綁定的返回值為JObDetail的方法(即工作明細對象) // TriggerBuilder.newTrigger():創(chuàng)建觸發(fā)器對象 // withSchedule(scheduleBuilder):使用調度器,規(guī)定任務的執(zhí)行策略 @Bean public Trigger PrintJobTrigger(){ //這里使用cron表達式: //"0/5 * * * * ?" //意思是:每五秒 任意分 任意小時 任意日 任意月 任意周幾 ScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/5 * * * * ?"); return TriggerBuilder.newTrigger().forJob(Print()).withSchedule(scheduleBuilder).build(); } }
4.配置類里主要實現(xiàn)兩個方法,方法名可以自定義,方法返回值要限定
工作明細方法
//.storeDurably():生命當任務未執(zhí)行會被框架給持久化,不會直接結束 //.newJob():綁定具體的任務類 @Bean public JobDetail Print(){ return JobBuilder.newJob(MyQuartz.class).storeDurably().build(); }
觸發(fā)器方法
//定義觸發(fā)器 // forjob():綁定跟要執(zhí)行任務綁定的返回值為JObDetail的方法(即工作明細對象) // TriggerBuilder.newTrigger():創(chuàng)建觸發(fā)器對象 // withSchedule(scheduleBuilder):使用調度器,規(guī)定任務的執(zhí)行策略 @Bean public Trigger PrintJobTrigger(){ //這里使用cron表達式: //"0/5 * * * * ?" //意思是:每五秒 任意分 任意小時 任意日 任意月 任意周幾 ScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/5 * * * * ?"); return TriggerBuilder.newTrigger().forJob(Print()).withSchedule(scheduleBuilder).build(); }
接下來,寶貝們,咱們來看一下執(zhí)行結果。
? 工作明細中利用newJob()傳入具體的工作對象。
? 觸發(fā)器也需要綁定具體的任務,通過forJob()綁定具體的工作明細對象,這里可以對工作明細對象設置具體名稱進行綁定,或者直接對相應的bean方法進行綁定。觸發(fā)器中最核心的是執(zhí)行規(guī)則,其中最核心的是執(zhí)行時間,這里我用的是cron表達式,關于表達式我只對在這篇文章中所需的在代碼里進行了介紹,如果朋友們想學習更詳細的cron表達式規(guī)則,可以自行找相應的資料進行學習呦~~。
總結:
- SpringBoot整合Quartz的核心說到底還是把相應的bean容器對象交給Spring容器管理,包含兩個對象:JobDetail和Trigger對象。
- JobDetail對象是工作信息,需要綁定一個繼承了QuartzJobBean類的子類對象。
- JobDetail和Trigger由觸發(fā)器進行關聯(lián),觸發(fā)器需要綁定相關的JobDetail,還要設置執(zhí)行周期調度器。
2:Task
? 接下來咱們來看Spring對定時任務進行整合后的簡化開發(fā)的操作。
? 簡單來說就是,注解式開發(fā),你只需要把你要執(zhí)行的任務加上Spring要求的注解,并根據(jù)注解的格式去設置定時任務的執(zhí)行規(guī)則即可。
1.開啟定時任務的開關,在啟動類上加入@EnableScheduling注解。
@SpringBootApplication @EnableScheduling public class YsjApplication { public static void main(String[] args) { SpringApplication.run(YsjApplication.class, args); } }
2.創(chuàng)建相應的定時任務類,并將其交給Spring管理
@Component public class TestBean { }
3.在定時任務類中的相應的定時任務方法加上@Scheduled注解,相應的執(zhí)行時間規(guī)則用cron表達式表示
@Component public class TestBean { @Scheduled(cron = "0/20 * * * * ?") public void print(){ System.out.println("踏風彡"); } }
4.若需要對定時任務的相關配置進行配置,可以在配置文件里進行配置
spring: task: scheduling: pool: max-size: 2 #task線程池最大大小 keep-alive: 100s allow-core-thread-timeout: true thread-name-prefix: Spring_task_ #調度線程名前綴,默認為:scheduling_ # shutdown: # await-termination: false #線程池關閉時是否等待所有任務完成 # await-termination-period: 20s #調度線程前關閉前的最大等待時間 shutdown: await-termination-period: 100s await-termination: false
總結:
一定要先開啟定時任務的開關,在啟動類上加上@EnableScheduling注解這里的定時任務方法的容器所在的類要交給Spring去管理若需要調試,可以在相應配置類中加上相應的配置
rmination-period: 100s
await-termination: false
**總結:** 1. 一定要先開啟定時任務的開關,在啟動類上加上@EnableScheduling注解 2. 這里的定時任務方法的容器所在的類要交給Spring去管理 3. 若需要調試,可以在相應配置類中加上相應的配置
到此這篇關于SpringBoot整合任務系統(tǒng)(quartz和SpringTask)的文章就介紹到這了,更多相關SpringBoot整合任務系統(tǒng)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
spring boot 配置動態(tài)刷新實現(xiàn)詳解
這篇文章主要介紹了spring boot 配置動態(tài)刷新實現(xiàn)詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-09-09