0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何在SpringBoot項(xiàng)目中實(shí)現(xiàn)動(dòng)態(tài)定時(shí)任務(wù)

我快閉嘴 ? 來(lái)源:CSDN技術(shù)社區(qū) ? 作者:CSDN技術(shù)社區(qū) ? 2022-09-30 11:16 ? 次閱讀

之前寫(xiě)過(guò)文章記錄怎么在SpringBoot項(xiàng)目中簡(jiǎn)單使用定時(shí)任務(wù),不過(guò)由于要借助cron表達(dá)式且都提前定義好放在配置文件里,不能在項(xiàng)目運(yùn)行中動(dòng)態(tài)修改任務(wù)執(zhí)行時(shí)間,實(shí)在不太靈活。

經(jīng)過(guò)網(wǎng)上搜索學(xué)習(xí)后,特此記錄如何在SpringBoot項(xiàng)目中實(shí)現(xiàn)動(dòng)態(tài)定時(shí)任務(wù)。

因?yàn)橹皇且粋€(gè)demo,所以只引入了需要的依賴:



org.springframework.boot
spring-boot-starter-web



org.springframework.boot
spring-boot-starter-log4j2
true


 

org.springframework.boot
spring-boot-starter-validation



org.projectlombok
lombok
true


啟動(dòng)類:

packagecom.wl.demo;

importorg.springframework.boot.SpringApplication;
importorg.springframework.boot.autoconfigure.SpringBootApplication;
importorg.springframework.scheduling.annotation.EnableScheduling;

/**
*@authorwl
*/
@EnableScheduling
@SpringBootApplication
publicclassDemoApplication{

publicstaticvoidmain(String[]args){
SpringApplication.run(DemoApplication.class,args);
System.out.println("(*^▽^*)啟動(dòng)成功!!!(〃'▽'〃)");
}
}

配置文件application.yml,只定義了服務(wù)端口

server:
port:8089

定時(shí)任務(wù)執(zhí)行時(shí)間配置文件:task-config.ini:

printTime.cron=0/10****?

定時(shí)任務(wù)執(zhí)行類:

packagecom.wl.demo.task;

importlombok.Data;
importlombok.extern.slf4j.Slf4j;
importorg.springframework.beans.factory.annotation.Value;
importorg.springframework.context.annotation.PropertySource;
importorg.springframework.scheduling.Trigger;
importorg.springframework.scheduling.TriggerContext;
importorg.springframework.scheduling.annotation.SchedulingConfigurer;
importorg.springframework.scheduling.config.ScheduledTaskRegistrar;
importorg.springframework.scheduling.support.CronTrigger;
importorg.springframework.stereotype.Component;

importjava.time.LocalDateTime;
importjava.util.Date;

/**
*定時(shí)任務(wù)
*@authorwl
*/
@Data
@Slf4j
@Component
@PropertySource("classpath:/task-config.ini")
publicclassScheduleTaskimplementsSchedulingConfigurer{

@Value("${printTime.cron}")
privateStringcron;

@Override
publicvoidconfigureTasks(ScheduledTaskRegistrartaskRegistrar){
//動(dòng)態(tài)使用cron表達(dá)式設(shè)置循環(huán)間隔
taskRegistrar.addTriggerTask(newRunnable(){
@Override
publicvoidrun(){
log.info("Current time:{}",LocalDateTime.now());
}
},newTrigger(){
@Override
publicDatenextExecutionTime(TriggerContexttriggerContext){
//使用CronTrigger觸發(fā)器,可動(dòng)態(tài)修改cron表達(dá)式來(lái)操作循環(huán)規(guī)則
CronTriggercronTrigger=newCronTrigger(cron);
DatenextExecutionTime=cronTrigger.nextExecutionTime(triggerContext);
returnnextExecutionTime;
}
});
}
}

編寫(xiě)一個(gè)接口,使得可以通過(guò)調(diào)用接口動(dòng)態(tài)修改該定時(shí)任務(wù)的執(zhí)行時(shí)間:

packagecom.wl.demo.controller;

importcom.wl.demo.task.ScheduleTask;
importlombok.extern.slf4j.Slf4j;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.web.bind.annotation.GetMapping;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.RestController;

/**
*@authorwl
*/
@Slf4j
@RestController
@RequestMapping("/test")
publicclassTestController{

privatefinalScheduleTaskscheduleTask;

@Autowired
publicTestController(ScheduleTaskscheduleTask){
this.scheduleTask=scheduleTask;
}

@GetMapping("/updateCron")
publicStringupdateCron(Stringcron){
log.info("newcron:{}",cron);
scheduleTask.setCron(cron);
return"ok";
}
}

啟動(dòng)項(xiàng)目,可以看到任務(wù)每10秒執(zhí)行一次:

cbf90050-4065-11ed-b1c7-dac502259ad0.png

訪問(wèn)接口,傳入請(qǐng)求參數(shù)cron表達(dá)式,將定時(shí)任務(wù)修改為15秒執(zhí)行一次:

cc1f6740-4065-11ed-b1c7-dac502259ad0.png

可以看到任務(wù)變成了15秒執(zhí)行一次

cc4bd6e0-4065-11ed-b1c7-dac502259ad0.png

除了上面的借助cron表達(dá)式的方法,還有另一種觸發(fā)器,區(qū)別于CronTrigger觸發(fā)器,該觸發(fā)器可隨意設(shè)置循環(huán)間隔時(shí)間,不像cron表達(dá)式只能定義小于等于間隔59秒。

packagecom.wl.demo.task;

importlombok.Data;
importlombok.extern.slf4j.Slf4j;
importorg.springframework.beans.factory.annotation.Value;
importorg.springframework.context.annotation.PropertySource;
importorg.springframework.scheduling.Trigger;
importorg.springframework.scheduling.TriggerContext;
importorg.springframework.scheduling.annotation.SchedulingConfigurer;
importorg.springframework.scheduling.config.ScheduledTaskRegistrar;
importorg.springframework.scheduling.support.CronTrigger;
importorg.springframework.scheduling.support.PeriodicTrigger;
importorg.springframework.stereotype.Component;

importjava.time.LocalDateTime;
importjava.util.Date;

/**
*定時(shí)任務(wù)
*@authorwl
*/
@Data
@Slf4j
@Component
@PropertySource("classpath:/task-config.ini")
publicclassScheduleTaskimplementsSchedulingConfigurer{

@Value("${printTime.cron}")
privateStringcron;

privateLongtimer=10000L;

@Override
publicvoidconfigureTasks(ScheduledTaskRegistrartaskRegistrar){
//動(dòng)態(tài)使用cron表達(dá)式設(shè)置循環(huán)間隔
taskRegistrar.addTriggerTask(newRunnable(){
@Override
publicvoidrun(){
log.info("Current time:{}",LocalDateTime.now());
}
},newTrigger(){
@Override
publicDatenextExecutionTime(TriggerContexttriggerContext){
//使用CronTrigger觸發(fā)器,可動(dòng)態(tài)修改cron表達(dá)式來(lái)操作循環(huán)規(guī)則
//CronTriggercronTrigger=newCronTrigger(cron);
//DatenextExecutionTime=cronTrigger.nextExecutionTime(triggerContext);

//使用不同的觸發(fā)器,為設(shè)置循環(huán)時(shí)間的關(guān)鍵,區(qū)別于CronTrigger觸發(fā)器,該觸發(fā)器可隨意設(shè)置循環(huán)間隔時(shí)間,單位為毫秒
PeriodicTriggerperiodicTrigger=newPeriodicTrigger(timer);
DatenextExecutionTime=periodicTrigger.nextExecutionTime(triggerContext);
returnnextExecutionTime;
}
});
}
}

增加一個(gè)修改時(shí)間的接口:

packagecom.wl.demo.controller;

importcom.wl.demo.task.ScheduleTask;
importlombok.extern.slf4j.Slf4j;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.web.bind.annotation.GetMapping;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.RestController;

/**
*@authorwl
*/
@Slf4j
@RestController
@RequestMapping("/test")
publicclassTestController{

privatefinalScheduleTaskscheduleTask;

@Autowired
publicTestController(ScheduleTaskscheduleTask){
this.scheduleTask=scheduleTask;
}

@GetMapping("/updateCron")
publicStringupdateCron(Stringcron){
log.info("newcron:{}",cron);
scheduleTask.setCron(cron);
return"ok";
}

@GetMapping("/updateTimer")
publicStringupdateTimer(Longtimer){
log.info("newtimer:{}",timer);
scheduleTask.setTimer(timer);
return"ok";
}
}

測(cè)試結(jié)果:

cc85a49c-4065-11ed-b1c7-dac502259ad0.png

基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

項(xiàng)目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro

視頻教程:https://doc.iocoder.cn/video/

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

項(xiàng)目地址:https://gitee.com/zhijiantianya/yudao-cloud

視頻教程:https://doc.iocoder.cn/video/

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8598

    瀏覽量

    151152
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    340

    瀏覽量

    14343
  • SpringBoot
    +關(guān)注

    關(guān)注

    0

    文章

    173

    瀏覽量

    179

原文標(biāo)題:SpringBoot 設(shè)置動(dòng)態(tài)定時(shí)任務(wù),千萬(wàn)別再寫(xiě)死了~

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    定時(shí)任務(wù)的發(fā)展史是怎么樣的

    定時(shí)任務(wù)是互聯(lián)網(wǎng)行業(yè)里最常用的服務(wù)之一,本文給大家介紹定時(shí)任務(wù)在我司的發(fā)展歷程。 linux系統(tǒng)中一般使用crontab命令來(lái)實(shí)現(xiàn),在Java世界里,使用最廣泛的就是quartz了。我司
    發(fā)表于 07-18 17:38 ?0次下載
    <b class='flag-5'>定時(shí)任務(wù)</b>的發(fā)展史是怎么樣的

    SpringBoot如何實(shí)現(xiàn)動(dòng)態(tài)增刪啟停定時(shí)任務(wù)

    在spring boot項(xiàng)目中,可以通過(guò) @EnableScheduling 注解和@Scheduled注解實(shí)現(xiàn)定時(shí)任務(wù),也可以通過(guò)SchedulingConfigurer接口來(lái)實(shí)現(xiàn)
    的頭像 發(fā)表于 09-24 09:49 ?2947次閱讀
    <b class='flag-5'>SpringBoot</b>如何<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>動(dòng)態(tài)</b>增刪啟停<b class='flag-5'>定時(shí)任務(wù)</b>

    Python定時(shí)任務(wù)實(shí)現(xiàn)方式

    在日常工作中,我們常常會(huì)用到需要周期性執(zhí)行的任務(wù),一種方式是采用 Linux 系統(tǒng)自帶的 crond 結(jié)合命令行實(shí)現(xiàn)。另外一種方式是直接使用Python。接下來(lái)整理的是常見(jiàn)的Python定時(shí)任務(wù)
    的頭像 發(fā)表于 10-08 15:20 ?5733次閱讀

    解析Golang定時(shí)任務(wù)庫(kù)gron設(shè)計(jì)和原理

    正巧,最近看到了 gron 這個(gè)開(kāi)源項(xiàng)目,它是用 Golang 實(shí)現(xiàn)一個(gè)并發(fā)安全的定時(shí)任務(wù)庫(kù)。實(shí)現(xiàn)非常簡(jiǎn)單精巧,代碼量也不多。今天我們就來(lái)一起結(jié)合源碼看一下,怎樣基于 Golang 的
    的頭像 發(fā)表于 12-15 13:57 ?1339次閱讀

    xxl-job任務(wù)調(diào)度中間件解決定時(shí)任務(wù)的調(diào)度問(wèn)題

    xxl-job是一款非常優(yōu)秀的任務(wù)調(diào)度中間件,輕量級(jí)、使用簡(jiǎn)單、支持分布式等優(yōu)點(diǎn),讓它廣泛應(yīng)用在我們的項(xiàng)目中,解決了不少定時(shí)任務(wù)的調(diào)度問(wèn)題。
    的頭像 發(fā)表于 01-31 09:53 ?1941次閱讀

    求一種SpringBoot定時(shí)任務(wù)動(dòng)態(tài)管理通用解決方案

    SpringBoot定時(shí)任務(wù)的加強(qiáng)工具,實(shí)現(xiàn)對(duì)SpringBoot原生的定時(shí)任務(wù)進(jìn)行動(dòng)態(tài)管理,
    的頭像 發(fā)表于 02-03 09:49 ?782次閱讀

    SpringBoot如何實(shí)現(xiàn)定時(shí)任務(wù)(下)

    SpringBoot創(chuàng)建定時(shí)任務(wù)的方式很簡(jiǎn)單,主要有兩種方式:一、基于注解的方式(@Scheduled)二、數(shù)據(jù)庫(kù)動(dòng)態(tài)配置。實(shí)際開(kāi)發(fā)中,第一種需要在代碼中寫(xiě)死表達(dá)式,如果修改起來(lái),又得重啟會(huì)顯得很麻煩;所以我們往往會(huì)采取第二種方
    的頭像 發(fā)表于 04-07 14:51 ?1237次閱讀
    <b class='flag-5'>SpringBoot</b>如何<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>定時(shí)任務(wù)</b>(下)

    SpringBoot如何實(shí)現(xiàn)定時(shí)任務(wù)(上)

    SpringBoot創(chuàng)建定時(shí)任務(wù)的方式很簡(jiǎn)單,主要有兩種方式:一、基于注解的方式(@Scheduled)二、數(shù)據(jù)庫(kù)動(dòng)態(tài)配置。實(shí)際開(kāi)發(fā)中,第一種需要在代碼中寫(xiě)死表達(dá)式,如果修改起來(lái),又得重啟會(huì)顯得很麻煩;所以我們往往會(huì)采取第二種方
    的頭像 發(fā)表于 04-07 14:51 ?1349次閱讀
    <b class='flag-5'>SpringBoot</b>如何<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>定時(shí)任務(wù)</b>(上)

    SpringBoot-動(dòng)態(tài)定時(shí)任務(wù)調(diào)度

    先說(shuō)業(yè)務(wù)場(chǎng)景,根據(jù)用戶輸入的cron表達(dá)式進(jìn)行定時(shí)調(diào)度,舉個(gè)例子:如圖
    的頭像 發(fā)表于 04-07 14:56 ?838次閱讀
    <b class='flag-5'>SpringBoot</b>-<b class='flag-5'>動(dòng)態(tài)</b><b class='flag-5'>定時(shí)任務(wù)</b>調(diào)度

    在Spring Boot中如何使用定時(shí)任務(wù)

    本文介紹在 Spring Boot 中如何使用定時(shí)任務(wù),使用非常簡(jiǎn)單,就不做過(guò)多說(shuō)明了。
    的頭像 發(fā)表于 04-12 10:56 ?975次閱讀

    如何動(dòng)態(tài)添加修改刪除定時(shí)任務(wù)?

    如何動(dòng)態(tài)添加修改刪除定時(shí)任務(wù)?那么我們一起看看具體怎么實(shí)現(xiàn),先看下本節(jié)大綱: (1)思路說(shuō)明; (2)代碼解析; (3)修改定時(shí)任務(wù)執(zhí)行周期特別說(shuō)明;
    的頭像 發(fā)表于 04-12 11:06 ?1081次閱讀

    Linux如何使用cron進(jìn)行定時(shí)任務(wù)的操作

    按計(jì)劃執(zhí)行命令對(duì)于計(jì)算機(jī)來(lái)說(shuō)非常重要,因?yàn)榧偃缥矣H自去執(zhí)行一些任務(wù)的話,可能會(huì)因?yàn)槎喾矫嬉蛩夭荒馨磿r(shí)執(zhí)行,所以定時(shí)任務(wù)就顯得非常重要了! cron就是一個(gè)能夠執(zhí)行定時(shí)任務(wù)的命令,其實(shí)該命令本身不難,下面小編帶您詳細(xì)了解!
    的頭像 發(fā)表于 05-12 16:27 ?2059次閱讀

    python定時(shí)任務(wù)實(shí)踐

    由于程序需求,監(jiān)測(cè)配置變化需要設(shè)置定時(shí)任務(wù),每分鐘執(zhí)行一次,對(duì)任務(wù)持久化要求不高,不需要時(shí)可以關(guān)閉定時(shí)任務(wù)
    的頭像 發(fā)表于 05-20 17:53 ?977次閱讀
    python<b class='flag-5'>定時(shí)任務(wù)</b>實(shí)踐

    定時(shí)器如何實(shí)現(xiàn)定時(shí)任務(wù)

    1.1、單次定時(shí)任務(wù)實(shí)現(xiàn) boost 的asio庫(kù)里有幾個(gè)定時(shí)器,老的有 deadline_timer , 還有三個(gè)可配合 C++11 的 chrono
    的頭像 發(fā)表于 11-09 17:20 ?957次閱讀

    linux定時(shí)任務(wù)的用法總結(jié)

    習(xí)慣了使用 windows 的計(jì)劃任務(wù),使用 linux 中的 crontab 管理定時(shí)任務(wù)時(shí)很不適應(yīng)。
    的頭像 發(fā)表于 08-14 18:16 ?850次閱讀
    linux<b class='flag-5'>定時(shí)任務(wù)</b>的用法總結(jié)