SpringBoot自定義定時任務(wù)的實現(xiàn)示例
通常,在我們的項目中需要定時給前臺發(fā)送一些提示性消息或者我們想要的定時信息,這個時候就需要使用定時任務(wù)來實現(xiàn)這一功能,實現(xiàn)也很簡單,接下來具體來看看吧~
簡單定時任務(wù)
首先,你需要在你的啟動類上加上開啟定時任務(wù)的注解
然后,就可以開始編寫一個簡單的自定義定時任務(wù)的邏輯
@Component public class ScheduleConfig { @Scheduled(cron = "*/5 * * * * ?") public void printNowTime(){ System.out.println("固定定時任務(wù)執(zhí)行:--->"+ LocalDateTime.now()+",此任務(wù)為五秒執(zhí)行一次"); } }
以上的代碼邏輯為每五秒打印出當(dāng)前的時間,控制臺打印結(jié)果:
@Scheduled除過cron還有三種方式:fixedRate,fixedDelay,initialDelay
cron:表達(dá)式可以定制化執(zhí)行任務(wù),但是執(zhí)行的方式是與fixedDelay相近的,也是會按照上一次方法結(jié)束時間開始算起。
fixedRate:在每次任務(wù)完成后等待一定的時間再進(jìn)行下一次執(zhí)行,指定連續(xù)執(zhí)行之間的延遲時間。
initialDelay:initialDelay = 10000 表示在容器啟動后,延遲10秒后再執(zhí)行一次定時器。
fixedDelay:是按照一定的速率執(zhí)行,是從上一次方法執(zhí)行開始的時間算起,如果上一次方法阻塞住了,下一次也是不會執(zhí)行,但是在阻塞這段時間內(nèi)累計應(yīng)該執(zhí)行的次數(shù),當(dāng)不再阻塞時,一下子把這些全部執(zhí)行掉,而后再按照固定速率繼續(xù)執(zhí)行。
因此,需要注意fixedRate與fixedDelay的區(qū)別:fixedRate
是基于任務(wù)開始執(zhí)行的時間點來計算下一次任務(wù)開始執(zhí)行的時間,因此任務(wù)的執(zhí)行時間間隔是相對固定的,不受到任務(wù)執(zhí)行時間的影響。如果指定的時間間隔小于任務(wù)執(zhí)行的實際時間,則任務(wù)可能會并發(fā)執(zhí)行。而fixedDelay
是基于任務(wù)執(zhí)行完成的時間點來計算下一次任務(wù)開始執(zhí)行的時間,因此任務(wù)的執(zhí)行時間間隔是相對不規(guī)則的,受到任務(wù)執(zhí)行時間的影響.
cron表達(dá)式
cron表達(dá)式是一個字符串,分為6或7個域,每兩個域之間用空格分隔,
其語法格式為:"秒域 分域 時域 日域 月域 周域 年域"
取值范圍
常例
但是,你會發(fā)現(xiàn)以上的方式雖然也能實現(xiàn)定時任務(wù),缺點是當(dāng)我們調(diào)整了執(zhí)行周期的時候,需要重啟應(yīng)用才能生效,這多少有些不方便。為了達(dá)到實時生效的效果,那么可以使用接口來完成定時任務(wù),統(tǒng)一將定時器信息存放在數(shù)據(jù)庫中。
基于接口的方式
以下是對應(yīng)數(shù)據(jù)表信息
使用mybatis-plus實現(xiàn)cron表的mapper、service接口、serviceimpl實現(xiàn)類
接下來實現(xiàn)自定義定時任務(wù),通過從數(shù)據(jù)庫中獲取cron表達(dá)式
@Component public class CompleteScheduleConfig implements SchedulingConfigurer { @Autowired private CronDao cronMapper; @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { taskRegistrar.addTriggerTask( ()-> System.out.println("時間到了哦,當(dāng)前時間為"+ LocalDateTime.now().toLocalTime()), // 設(shè)置定時任務(wù)執(zhí)行周期,從數(shù)據(jù)庫中獲取 triggerContext -> { String cron=cronMapper.selectById(1).getCronExpression(); if(cron==null){ return null; } // 返回執(zhí)行周期 return new CronTrigger(cron).nextExecutionTime(triggerContext); } ); }
這里我把需要從數(shù)據(jù)中查的cron表達(dá)式id寫死了,讀者可以根據(jù)自己的項目需求進(jìn)行修改。
到此這篇關(guān)于SpringBoot自定義定時任務(wù)的文章就介紹到這了,更多相關(guān)SpringBoot自定義定時任務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java的MyBatis框架中實現(xiàn)多表連接查詢和查詢結(jié)果分頁
這篇文章主要介紹了Java的MyBatis框架中實現(xiàn)多表連接查詢和查詢結(jié)果分頁,借助MyBatis框架中帶有的動態(tài)SQL查詢功能可以比普通SQL查詢做到更多,需要的朋友可以參考下2016-04-04Springboot使用Spring Data JPA實現(xiàn)數(shù)據(jù)庫操作
Spring Data JPA 是 Spring 基于 Spring Data 框架、在JPA 規(guī)范的基礎(chǔ)上開發(fā)的一個框架,使用 Spring Data JPA 可以極大地簡化JPA 的寫法,本章我們將詳細(xì)介紹在Springboot中使用 Spring Data JPA 來實現(xiàn)對數(shù)據(jù)庫的操作2021-06-06SpringBoot繼承LogStash實現(xiàn)日志收集的方法示例
這篇文章主要介紹了SpringBoot繼承LogStash實現(xiàn)日志收集的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-05Java中使用JWT生成Token進(jìn)行接口鑒權(quán)實現(xiàn)方法
這篇文章主要介紹了Java中使用JWT生成Token進(jìn)行接口鑒權(quán)實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08java實現(xiàn)微信小程序加密數(shù)據(jù)解密算法
這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)微信小程序加密數(shù)據(jù)解密算法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-09-09