SpringBoot實(shí)現(xiàn)動(dòng)態(tài)定時(shí)任務(wù)
項(xiàng)目情況:
在當(dāng)前項(xiàng)目中需要一個(gè)定時(shí)任務(wù)來清除過期的校驗(yàn)碼,如果使用數(shù)據(jù)庫存儲(chǔ)過程的話不方便維護(hù)。因此采用SpringBoot自帶的方式來設(shè)置定時(shí)任務(wù)。
技術(shù)說明:
SpringBoot自帶的方式有兩種可以實(shí)現(xiàn):
一種是使用@Scheduled注解的方式,只需要在啟動(dòng)類或者它所在的類上添加@EnableScheduling注解允許執(zhí)行定時(shí)任務(wù),并且設(shè)置Schecduled注解的參數(shù),諸如:
1.cron是設(shè)置定時(shí)執(zhí)行的表達(dá)式,如 0 0/5 * * * ?每隔五分鐘執(zhí)行一次
2.zone表示執(zhí)行時(shí)間的時(shí)區(qū)
3.fixedDelay 和fixedDelayString 表示一個(gè)固定延遲時(shí)間執(zhí)行,上個(gè)任務(wù)完成后,延遲多長時(shí)間執(zhí)行
4.fixedRate 和fixedRateString表示一個(gè)固定頻率執(zhí)行,上個(gè)任務(wù)開始后,多長時(shí)間后開始執(zhí)行
5.initialDelay 和initialDelayString表示一個(gè)初始延遲時(shí)間,第一次被調(diào)用前延遲的時(shí)間
示例代碼如下:
package com.allcom.service;
import com.allcom.dao.MysqlDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
/**
* @Author: zy
* @Description: 定時(shí)任務(wù)
* @Date: 2018/7/12_15:15
**/
@Service
public class TaskService {
@Autowired
private MysqlDao mysqlDao;
@Scheduled(fixedRate = 5*1000)
public void deleteInvalidCheckCode() {
mysqlDao.deleteInvalidCheckCode();
}
}
另一種方式是通過自定義配置類的方式,步驟如下:
第一步:新建一個(gè)類實(shí)現(xiàn)SchedulingConfigurer接口,并添加@Configuration注解,@EnableScheduling注解可以寫在這里也可以寫在啟動(dòng)類上,這里我寫在了啟動(dòng)類上。

第二步: 重寫configureTasks方法如下代碼所示:
package com.allcom.task;
import com.allcom.service.TaskService;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.TriggerContext;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import java.util.Date;
@Configuration
public class MyScheduledTask implements SchedulingConfigurer {
@Mapper
public interface CronMapper {
@Select("select cron from user_cron limit 1")
String getCron();
}
@Autowired
@SuppressWarnings("all")
CronMapper cronMapper;
@Autowired
@SuppressWarnings("all")
private TaskService taskService;
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
scheduledTaskRegistrar.addTriggerTask(new Runnable() {
@Override
public void run() {
try {
taskService.deleteInvalidCheckCode(); //異步定時(shí)操作
} catch (Exception e) {
e.printStackTrace();
}
}
}, new Trigger() {
@Override
public Date nextExecutionTime(TriggerContext triggerContext) {
String cron =cronMapper.getCron();
if("".equals(cron)||cron==null)
return null;
//定時(shí)任務(wù)觸發(fā),可修改定時(shí)任務(wù)的執(zhí)行周期
CronTrigger trigger=new CronTrigger(cron);
Date nextExecDate= trigger.nextExecutionTime(triggerContext);
return nextExecDate;
}
});
}
}
第三步:啟動(dòng)項(xiàng)目,定時(shí)任務(wù)就自動(dòng)添加了。
注意:這里我使用的是@Mapper注解使用Mybatis寫了一個(gè)獲取cron表達(dá)式的接口,可以從數(shù)據(jù)庫中查詢自定義表的cron字段值。這樣的話項(xiàng)目運(yùn)行的過程中,不用重新啟動(dòng)項(xiàng)目,只需要修改數(shù)據(jù)庫中的字段值就可以動(dòng)態(tài)的修改定時(shí)任務(wù)中的cron值,實(shí)現(xiàn)動(dòng)態(tài)修改定時(shí)任務(wù)執(zhí)行時(shí)間的功能。
但是,這種方式有一個(gè)缺點(diǎn)就是,將數(shù)據(jù)庫cron字段值設(shè)為null或者“”以及不正確的值,這樣定時(shí)任務(wù)就會(huì)停止執(zhí)行,這樣就算你下一次再給cron字段添加了正確的值,項(xiàng)目也不會(huì)執(zhí)行定時(shí)任務(wù)了,這個(gè)時(shí)候就需要重新啟動(dòng)數(shù)據(jù)庫才行。
這種方式適合于前臺(tái)給幾個(gè)特定的值給用戶選擇,不能讓用戶隨便填。
附定時(shí)任務(wù)執(zhí)行內(nèi)容:
/**
* @Author: zy
* @Description: 刪除用戶過期的校驗(yàn)碼
* @Date: 2018/7/12_15:20
**/
@Delete("DELETE from registinfo where id in (select id from (SELECT id FROM registinfo WHERE TIMESTAMPDIFF(MINUTE,lastupdatetime,NOW()) >= 15)a )")
void deleteInvalidCheckCode();
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- SpringBoot 動(dòng)態(tài)定時(shí)器的使用方法
- 淺談SpringBoot集成Quartz動(dòng)態(tài)定時(shí)任務(wù)
- SpringBoot設(shè)置動(dòng)態(tài)定時(shí)任務(wù)的方法詳解
- SpringBoot實(shí)現(xiàn)固定和動(dòng)態(tài)定時(shí)任務(wù)的三種方法
- SpringBoot實(shí)現(xiàn)設(shè)置動(dòng)態(tài)定時(shí)任務(wù)的方法詳解
- SpringBoot創(chuàng)建動(dòng)態(tài)定時(shí)任務(wù)的幾種方式小結(jié)
- SpringBoot+Quartz實(shí)現(xiàn)動(dòng)態(tài)定時(shí)任務(wù)
- Springboot實(shí)現(xiàn)動(dòng)態(tài)定時(shí)任務(wù)流程詳解
- SpringBoot動(dòng)態(tài)定時(shí)任務(wù)實(shí)現(xiàn)完整版
- Springboot實(shí)現(xiàn)動(dòng)態(tài)定時(shí)任務(wù)管理的示例代碼
- 基于Nacos實(shí)現(xiàn)SpringBoot動(dòng)態(tài)定時(shí)任務(wù)調(diào)度
相關(guān)文章
Java中SynchronousQueue的底層實(shí)現(xiàn)原理剖析
BlockingQueue的實(shí)現(xiàn)類中,有一種阻塞隊(duì)列比較特殊,就是SynchronousQueue(同步移交隊(duì)列),隊(duì)列長度為0。本文就來剖析一下SynchronousQueue的底層實(shí)現(xiàn)原理,感興趣的可以了解一下2022-11-11
postman中參數(shù)和x-www-form-urlencoded傳值的區(qū)別及說明
在Postman中,參數(shù)傳遞有多種方式,其中params和x-www-form-urlencoded最為常用,Params主要用于URL中傳遞查詢參數(shù),適合GET請求和非敏感數(shù)據(jù),其特點(diǎn)是將參數(shù)作為查詢字符串附加在URL末尾,適用于過濾和排序等操作2024-09-09
IDEA下"File is read-only"可能原因分析及"找不到
這篇文章主要介紹了IDEA下"File is read-only"可能原因分析及"找不到或無法加載主類"的問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-05-05
基于Java和FFmpeg實(shí)現(xiàn)視頻壓縮和剪輯功能
在視頻處理開發(fā)中,壓縮和剪輯是常見的需求,本文將介紹如何使用 Java 結(jié)合 FFmpeg 實(shí)現(xiàn)視頻壓縮和剪輯功能,同時(shí)去除數(shù)據(jù)庫操作,僅專注于視頻處理,需要的朋友可以參考下2025-08-08
JSP 開發(fā)之 releaseSession的實(shí)例詳解
這篇文章主要介紹了JSP 開發(fā)之 releaseSession的實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-07-07
Spring中WebClient的創(chuàng)建和使用詳解
這篇文章主要介紹了Spring中WebClient的創(chuàng)建和使用詳解,在Spring5中,出現(xiàn)了Reactive響應(yīng)式編程思想,并且為網(wǎng)絡(luò)編程提供相關(guān)響應(yīng)式編程的支持,如提供了WebFlux,它是Spring提供的異步非阻塞的響應(yīng)式的網(wǎng)絡(luò)框架,需要的朋友可以參考下2023-11-11

