SpringBoot自定義定時任務的實現示例
通常,在我們的項目中需要定時給前臺發(fā)送一些提示性消息或者我們想要的定時信息,這個時候就需要使用定時任務來實現這一功能,實現也很簡單,接下來具體來看看吧~
簡單定時任務
首先,你需要在你的啟動類上加上開啟定時任務的注解

然后,就可以開始編寫一個簡單的自定義定時任務的邏輯
@Component
public class ScheduleConfig {
@Scheduled(cron = "*/5 * * * * ?")
public void printNowTime(){
System.out.println("固定定時任務執(zhí)行:--->"+ LocalDateTime.now()+",此任務為五秒執(zhí)行一次");
}
}
以上的代碼邏輯為每五秒打印出當前的時間,控制臺打印結果:

@Scheduled除過cron還有三種方式:fixedRate,fixedDelay,initialDelay
cron:表達式可以定制化執(zhí)行任務,但是執(zhí)行的方式是與fixedDelay相近的,也是會按照上一次方法結束時間開始算起。
fixedRate:在每次任務完成后等待一定的時間再進行下一次執(zhí)行,指定連續(xù)執(zhí)行之間的延遲時間。
initialDelay:initialDelay = 10000 表示在容器啟動后,延遲10秒后再執(zhí)行一次定時器。
fixedDelay:是按照一定的速率執(zhí)行,是從上一次方法執(zhí)行開始的時間算起,如果上一次方法阻塞住了,下一次也是不會執(zhí)行,但是在阻塞這段時間內累計應該執(zhí)行的次數,當不再阻塞時,一下子把這些全部執(zhí)行掉,而后再按照固定速率繼續(xù)執(zhí)行。
因此,需要注意fixedRate與fixedDelay的區(qū)別:fixedRate是基于任務開始執(zhí)行的時間點來計算下一次任務開始執(zhí)行的時間,因此任務的執(zhí)行時間間隔是相對固定的,不受到任務執(zhí)行時間的影響。如果指定的時間間隔小于任務執(zhí)行的實際時間,則任務可能會并發(fā)執(zhí)行。而fixedDelay是基于任務執(zhí)行完成的時間點來計算下一次任務開始執(zhí)行的時間,因此任務的執(zhí)行時間間隔是相對不規(guī)則的,受到任務執(zhí)行時間的影響.
cron表達式
cron表達式是一個字符串,分為6或7個域,每兩個域之間用空格分隔,
其語法格式為:"秒域 分域 時域 日域 月域 周域 年域"
取值范圍

常例

但是,你會發(fā)現以上的方式雖然也能實現定時任務,缺點是當我們調整了執(zhí)行周期的時候,需要重啟應用才能生效,這多少有些不方便。為了達到實時生效的效果,那么可以使用接口來完成定時任務,統一將定時器信息存放在數據庫中。
基于接口的方式
以下是對應數據表信息

使用mybatis-plus實現cron表的mapper、service接口、serviceimpl實現類



接下來實現自定義定時任務,通過從數據庫中獲取cron表達式
@Component
public class CompleteScheduleConfig implements SchedulingConfigurer
{
@Autowired
private CronDao cronMapper;
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.addTriggerTask(
()-> System.out.println("時間到了哦,當前時間為"+ LocalDateTime.now().toLocalTime()),
// 設置定時任務執(zhí)行周期,從數據庫中獲取
triggerContext -> {
String cron=cronMapper.selectById(1).getCronExpression();
if(cron==null){
return null;
}
// 返回執(zhí)行周期
return new CronTrigger(cron).nextExecutionTime(triggerContext);
}
);
}這里我把需要從數據中查的cron表達式id寫死了,讀者可以根據自己的項目需求進行修改。
到此這篇關于SpringBoot自定義定時任務的文章就介紹到這了,更多相關SpringBoot自定義定時任務內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
詳解Java的MyBatis框架中動態(tài)SQL的基本用法
這篇文章主要介紹了詳解Java的MyBatis框架中動態(tài)SQL的基本用法,文中列出了一些常用SQL動態(tài)語句進行講解,需要的朋友可以參考下2016-04-04
SpringBoot如何取消內置Tomcat啟動并改用外接Tomcat
這篇文章主要介紹了SpringBoot如何取消內置Tomcat啟動并改用外接Tomcat,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-11-11
SpringBoot整合Redis實現附近位置查找(LBS)功能
Redis 提供了 GEO 數據結構,可以高效地存儲和查詢地理位置數據,本文將介紹如何使用 Spring Boot + Redis 來實現附近位置查找,需要的可以了解下2025-03-03
maven依賴關系中的<scope>provided</scope>使用詳解
這篇文章主要介紹了maven依賴關系中的<scope>provided</scope>使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-07-07

