分布式調(diào)度器之Spring Task 的使用詳解
Spring Task是 Spring 框架的一個(gè)組件,它為任務(wù)調(diào)度提供了支持,使開發(fā)者能 創(chuàng)建后臺任務(wù) 或 定期執(zhí)行任務(wù)
1、啟動類(App.java)上加@EnableScheduling注解: 開啟基于注解的任務(wù)調(diào)度器
默認(rèn)情況下,系統(tǒng)會自動啟動一個(gè)線程,調(diào)度執(zhí)行項(xiàng)目中定義的所有定時(shí)任務(wù)
這個(gè)注解 是SpringBoot內(nèi)置的 不需要依賴任何的starter包
2、同步定時(shí)任務(wù)
需要在定時(shí)執(zhí)行的方法上 添加@Scheduled注解
定時(shí)執(zhí)行的方法不能有參數(shù),并且一般沒有返回值
定時(shí)任務(wù)所在的類要作為 Spring Bean,在類上添加@Component注解即可,即:定時(shí)方法所在的類,要放到IOC容器里面
注意:使用@Scheduled注解形式的定時(shí)任務(wù),默認(rèn)是單線程來執(zhí)行項(xiàng)目中所有的定時(shí)任務(wù)。
即使如果同一時(shí)刻有兩個(gè)定時(shí)任務(wù)需要執(zhí)行,那么只能其中一個(gè)定時(shí)任務(wù)完成之后再執(zhí)行下一個(gè)定時(shí)任務(wù)。
如果項(xiàng)目只有一個(gè)定時(shí)任務(wù)還好。若定時(shí)任務(wù)增多時(shí),如果一個(gè)任務(wù)被阻塞,則會導(dǎo)致其他任務(wù)無法正常執(zhí)行。
若要改變這種行為,使得定時(shí)任務(wù)能夠并發(fā)執(zhí)行,可以配置任務(wù)調(diào)度線程池,來解決以上問題。首先配置一個(gè)線程池
package com.***.springtask;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
@Slf4j
@EnableAsync //開啟異步支持
@EnableScheduling //開啟定時(shí)任務(wù)支持
public class ScheduledTask {
int i = 1;
//@Scheduled(fixedRate = 5000, initialDelay = 15*1000)
public void task1(){
// i++;
// if(i > 5){
// ThreadUtil.safeSleep(8*1000);
// }
log.debug("task1執(zhí)行了{(lán)}次,{}",i,Thread.currentThread().getId());
}
@Scheduled(cron = "0/5 * * * * ?")
@Async("asyncScheduledPool")
public void task2(){
// ThreadUtil.safeSleep(8*1000);
log.debug("task2執(zhí)行了,{}",Thread.currentThread().getId());
}
}3、多線程(異步)定時(shí)任務(wù)
3.1 配置線程池
package com.***.config;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Component;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
@Component
public class ExecutorConfig {
//定義核心線程數(shù)
public static final int CORE_POOL_SIZE = 10;
// 最大線程數(shù)
public static final int MAX_POOL_SIZE = 20;
// 任務(wù)隊(duì)列容量大小
public static final int QUEUE_MAX_COUNT = 100;
@Bean("asyncScheduledPool")
public Executor asyncScheduledPool(){
//自定義線程池
ThreadPoolTaskExecutor threadPoolExecutor = new ThreadPoolTaskExecutor();
//設(shè)置核心線程數(shù)
threadPoolExecutor.setCorePoolSize(CORE_POOL_SIZE);
//設(shè)置最大線程數(shù) : 長工 + 臨時(shí)工
threadPoolExecutor.setMaxPoolSize(MAX_POOL_SIZE);
//設(shè)置任務(wù)隊(duì)列容量大小
threadPoolExecutor.setQueueCapacity(QUEUE_MAX_COUNT);
//設(shè)置線程的名稱前綴
threadPoolExecutor.setThreadNamePrefix("myTask-");
//設(shè)置拒絕策略
threadPoolExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
return threadPoolExecutor;
}
}3.2 開啟異步支持
要在 Spring Boot 應(yīng)用中啟用異步方法調(diào)用,需在啟動類上添加 @EnableAsync 注解
3.3 定義異步方法
在服務(wù)類中定義一個(gè)方法,并使用 @Async 注解標(biāo)記它以實(shí)現(xiàn)異步執(zhí)行
4、Api說明
4.1 fixedDelay
@Scheduled(fixedDelay = 4000)
4.2 fixedRate
@Scheduled(fixedRate = 10000)
4.3 initialDelay
@Scheduled(initialDelay=1000, fixedRate=5000) //第一次延遲1秒后執(zhí)行,之后按fixedRate的規(guī)則每5秒執(zhí)行一次
4.4 cron(掌握)
cron表達(dá)式 ① 格式
Seconds Minutes Hours Day Month Week
② 特殊符號
*:任意值
-:范圍,eg:3-5指3點(diǎn)到5點(diǎn)執(zhí)行
,:枚舉,eg:3,5指3點(diǎn)和5點(diǎn)執(zhí)行
/:增量,eg:3/5從第3秒開始每隔5秒執(zhí)行一次
?:忽略,且只能在 日期域 或 星期域 只用
③ 練習(xí) 標(biāo)準(zhǔn)格式: * * * * * ?
周一至周五的上午10:15觸發(fā)
0 15 10 ? * 2-6

表示在每月的1日的凌晨2點(diǎn)調(diào)整任務(wù)
0 0 2 1 * ?

朝九晚五工作時(shí)間內(nèi)每半小時(shí)
0 0/30 9-16 * * ?

每天上午10點(diǎn),下午2點(diǎn),4點(diǎn)
0 0 10,14,16 * * ?

表示每個(gè)星期三中午12點(diǎn)
0 0 12 ? * 4

在每天下午2點(diǎn)到下午2:59期間的每1分鐘觸發(fā)
0 /1 14-15 * * ?

在每天下午2點(diǎn)到下午2:05期間的每1分鐘觸發(fā)
0 0-5/1 14 * * ?

在每天下午2點(diǎn)到下午2:55期間的每5分鐘觸發(fā)
0 0-55/5 14 * * ?

在每天下午2點(diǎn)到2:55期間和下午6點(diǎn)到6:55期間的每5分鐘觸發(fā)
0 0-55/5 14,18 * * ?

到此這篇關(guān)于分布式調(diào)度器之Spring Task 的使用詳解的文章就介紹到這了,更多相關(guān)Spring Task 使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決SpringBoot項(xiàng)目啟動后網(wǎng)頁顯示Please sign in的問題
這篇文章主要介紹了解決SpringBoot項(xiàng)目啟動后網(wǎng)頁顯示Please sign in的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04
將java項(xiàng)目打包成exe可執(zhí)行文件的完整步驟
最近項(xiàng)目要求,需要將java項(xiàng)目生成exe文件,下面這篇文章主要給大家介紹了關(guān)于如何將java項(xiàng)目打包成exe可執(zhí)行文件的相關(guān)資料,文章通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06
Java中List與數(shù)組相互轉(zhuǎn)換實(shí)例分析
這篇文章主要介紹了Java中List與數(shù)組相互轉(zhuǎn)換的方法,實(shí)例分析了Java中List與數(shù)組相互轉(zhuǎn)換中容易出現(xiàn)的問題與相關(guān)的解決方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-05-05
你知道怎么用Spring的三級緩存解決循環(huán)依賴嗎
這篇文章主要為大家詳細(xì)介紹了Spring的三級緩存解決循環(huán)依賴,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-02-02

