Spring中自帶的@Schedule實(shí)現(xiàn)自動(dòng)任務(wù)的過程解析
SpringBoot中自帶了一個(gè)能夠?qū)崿F(xiàn)定時(shí)任務(wù)的注解@Schedule
如果定時(shí)任務(wù)比較簡(jiǎn)單,則可以使用SpringBoot中自帶的@Schedule,但是如果任務(wù)調(diào)度很復(fù)雜的話,就建議使用Quartz組件了。
說一下這個(gè)@Schedule注解怎么用?
基本使用
1.第一步:在一個(gè)方法上使用@Schedule,標(biāo)注這個(gè)方法是一個(gè)自定義任務(wù)
通過該注解的cron屬性,指定任務(wù)的運(yùn)行規(guī)則
@Slf4j @Component public class MyTimeJob { @Scheduled(cron = "0/1 * * * * *") public void distanceOffDuty() { log.info("現(xiàn)在是{},{}",new Date(),"~~~馬上就要下班了"); } }
關(guān)于Cron表達(dá)式,可以自己學(xué)習(xí),
寫cron表達(dá)式是一件麻煩的事情,就像寫正則表達(dá)式似的
建議使用工具來生成cron表達(dá)式
在線Cron表達(dá)式生成器
2.在配置類上通過@EnableScheduling
開啟定時(shí)任務(wù)配置,開啟了此配置后,SpringBoot會(huì)自動(dòng)掃描容器中帶有@Schedule注解
注意:將包含@Schedule標(biāo)注的方法所在的類,設(shè)置為Component或Configuration,要讓SpringBoot知道這個(gè)類
@SpringBootApplication @EnableScheduling public class TestQuartzApplication { public static void main(String[] args) { SpringApplication.run(TestQuartzApplication.class, args); } }
接下來啟動(dòng)程序,就可以看到自定義任務(wù)執(zhí)行了
多線程執(zhí)行
默認(rèn)情況下,我們所有自定義的任務(wù)是單線程的,多個(gè)任務(wù)之間排隊(duì)執(zhí)行。
例如,我們定義了兩個(gè)任務(wù):
@Slf4j @Component public class MyTimeJob { @Scheduled(cron = "0/1 * * * * *") public void distanceOffDuty() { log.info("現(xiàn)在是{},{}",new Date(),"~~~馬上就要下班了"); } @Scheduled(cron = "0/10 * * * * *") public void work(){ log.info("又工作(摸魚)了10秒鐘了"); } }
看控制臺(tái)這兩個(gè)任務(wù)的執(zhí)行情況:
如果想要為每一個(gè)任務(wù)單獨(dú)開一個(gè)線程,異步化操作,效率能提高,不會(huì)被阻塞。
此時(shí)需要自定義線程池,看操作!
自定義配置類
@Configuration @EnableScheduling public class ScheduledConfig implements SchedulingConfigurer { /** * 任務(wù)執(zhí)行線程池大小 */ private static final int TASK_POOL_SIZE = 50; /** * 自定義線程前綴 */ private static final String TASK_THREAD_PREFIX = "scheduling-task-"; @Override public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) { // 創(chuàng)建任務(wù)線程池 ThreadPoolTaskScheduler taskPool = new ThreadPoolTaskScheduler(); // 設(shè)置線程池大小 taskPool.setPoolSize(TASK_POOL_SIZE); // 線程前綴名 taskPool.setThreadNamePrefix(TASK_THREAD_PREFIX); // 初始化 taskPool.initialize(); scheduledTaskRegistrar.setTaskScheduler(taskPool); } }
看自定義任務(wù)的執(zhí)行情況:
每次執(zhí)行任務(wù),都會(huì)在線程池中取一個(gè)線程來使用
到此這篇關(guān)于關(guān)于Spring中自帶的@Schedule實(shí)現(xiàn)自動(dòng)任務(wù)的文章就介紹到這了,更多相關(guān)Spring @Schedule自動(dòng)任務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Spring多定時(shí)任務(wù)@Scheduled執(zhí)行阻塞問題解決
- springboot使用定時(shí)器@Scheduled不管用的解決
- springBoot?@Scheduled實(shí)現(xiàn)多個(gè)任務(wù)同時(shí)開始執(zhí)行
- SpringBoot項(xiàng)目中使用@Scheduled讀取動(dòng)態(tài)參數(shù)
- springboot定時(shí)任務(wù)@Scheduled執(zhí)行多次的問題
- springboot CommandLineRunner接口實(shí)現(xiàn)自動(dòng)任務(wù)加載功能
相關(guān)文章
Spring-Validation 后端數(shù)據(jù)校驗(yàn)的實(shí)現(xiàn)
這篇文章主要介紹了Spring-Validation 后端數(shù)據(jù)校驗(yàn)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07struts1實(shí)現(xiàn)簡(jiǎn)單的登錄功能實(shí)例(附源碼)
本篇文章主要介紹了struts1實(shí)現(xiàn)簡(jiǎn)單的登錄功能實(shí)例(附源碼),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04java 中Comparable與Comparator詳解與比較
這篇文章主要介紹了java 中Comparable與Comparator詳解與比較的相關(guān)資料,需要的朋友可以參考下2017-04-04java使用MulticastSocket實(shí)現(xiàn)組播
這篇文章主要為大家詳細(xì)介紹了java使用MulticastSocket實(shí)現(xiàn)組播,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01eclipse怎么引入spring boot項(xiàng)目插件的方法
這篇文章主要介紹了eclipse怎么引入spring boot項(xiàng)目插件的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06關(guān)于java開發(fā)的性能問題總結(jié)(必看)
下面小編就為大家?guī)硪黄P(guān)于java開發(fā)的性能問題總結(jié)(必看)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03Java將一個(gè)正整數(shù)分解質(zhì)因數(shù)的代碼
這篇文章主要介紹了將一個(gè)正整數(shù)分解質(zhì)因數(shù)。例如:輸入90,打印出90=2*3*3*5,需要的朋友可以參考下2017-02-02SpringBoot與Spring中數(shù)據(jù)緩存Cache超詳細(xì)講解
我們知道內(nèi)存讀取速度遠(yuǎn)大于硬盤讀取速度,當(dāng)需要重復(fù)獲取相同數(shù)據(jù)時(shí),一次一次的請(qǐng)求數(shù)據(jù)庫(kù)或者遠(yuǎn)程服務(wù),導(dǎo)致在數(shù)據(jù)庫(kù)查詢或者遠(yuǎn)程方法調(diào)用上小號(hào)大量的時(shí)間,最終導(dǎo)致程序性能降低,這就是數(shù)據(jù)緩存要解決的問題,學(xué)過計(jì)算機(jī)組成原理或者操作系統(tǒng)的同學(xué)們應(yīng)該比較熟悉2022-10-10基于java實(shí)現(xiàn)簡(jiǎn)單的銀行管理系統(tǒng)
這篇文章主要介紹了基于java實(shí)現(xiàn)簡(jiǎn)單的銀行管理系統(tǒng),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01