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)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- SpringBoot設(shè)置動(dòng)態(tài)定時(shí)任務(wù)的方法詳解
- Springboot自帶定時(shí)任務(wù)實(shí)現(xiàn)動(dòng)態(tài)配置Cron參數(shù)方式
- 淺談SpringBoot集成Quartz動(dòng)態(tài)定時(shí)任務(wù)
- 基于Springboot執(zhí)行多個(gè)定時(shí)任務(wù)并動(dòng)態(tài)獲取定時(shí)任務(wù)信息
- Springboot整個(gè)Quartz實(shí)現(xiàn)動(dòng)態(tài)定時(shí)任務(wù)的示例代碼
- 詳解SpringBoot 創(chuàng)建定時(shí)任務(wù)(配合數(shù)據(jù)庫動(dòng)態(tài)執(zhí)行)
- springboot整合Quartz實(shí)現(xiàn)動(dòng)態(tài)配置定時(shí)任務(wù)的方法
- SpringBoot實(shí)現(xiàn)動(dòng)態(tài)增刪啟停定時(shí)任務(wù)的方式
相關(guān)文章
SpringCloud實(shí)現(xiàn)基于RabbitMQ消息隊(duì)列的詳細(xì)步驟
在Spring Cloud框架中,我們可以利用RabbitMQ實(shí)現(xiàn)強(qiáng)大而可靠的消息隊(duì)列系統(tǒng),本篇將詳細(xì)介紹如何在Spring Cloud項(xiàng)目中集成RabbitMQ,并創(chuàng)建一個(gè)簡單的消息隊(duì)列,感興趣的朋友一起看看吧2024-03-03Java封裝數(shù)組之改進(jìn)為泛型數(shù)組操作詳解
這篇文章主要介紹了Java封裝數(shù)組之改進(jìn)為泛型數(shù)組操作,結(jié)合實(shí)例形式詳細(xì)分析了Java封裝數(shù)組為泛型數(shù)組相關(guān)原理、操作技巧與注意事項(xiàng),需要的朋友可以參考下2020-03-03SpringMVC核心DispatcherServlet處理流程分步詳解
這篇文章主要介紹了SpringMVC核心之中央調(diào)度器DispatcherServlet的相關(guān)知識(shí),包括SpringMVC請(qǐng)求處理過程及SrpingMVC容器和spring IOC容器關(guān)系,需要的朋友可以參考下2023-04-04Springboot設(shè)置文件上傳大小限制的實(shí)現(xiàn)示例
Spring Boot工程嵌入的tomcat限制了請(qǐng)求的文件大小默認(rèn)為1MB,單次請(qǐng)求的文件的總數(shù)不能大于10Mb,本文主要介紹了Springboot設(shè)置文件上傳大小限制的實(shí)現(xiàn)示例,感興趣的可以了解一下2023-11-11Java實(shí)現(xiàn)多數(shù)據(jù)源的幾種方式總結(jié)
這篇文章主要給大家總結(jié)介紹了關(guān)于Java實(shí)現(xiàn)多數(shù)據(jù)源的幾種方式,最近項(xiàng)目中的工作流需要查詢多個(gè)數(shù)據(jù)源的數(shù)據(jù),數(shù)據(jù)源可能是不同種類的,需要的朋友可以參考下2023-08-08Spring Boot 中PageHelper 插件使用配置思路詳解
這篇文章主要介紹了Spring Boot 中PageHelper 插件使用配置及實(shí)現(xiàn)思路,通過引入myabtis和pagehelper依賴,在yml中配置mybatis掃描和實(shí)體類,具體實(shí)現(xiàn)方法跟隨小編一起看看吧2021-08-08java編程SpringSecurity入門原理及應(yīng)用簡介
Spring 是非常流行和成功的 Java 應(yīng)用開發(fā)框架,Spring Security 正是 Spring 家族中的成員。Spring Security 基于 Spring 框架,提供了一套 Web 應(yīng)用安全性的完整解決方案2021-09-09