在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何在SpringBoot項目中實現動態定時任務

我快閉嘴 ? 來源:CSDN技術社區 ? 作者:CSDN技術社區 ? 2022-09-30 11:16 ? 次閱讀

之前寫過文章記錄怎么在SpringBoot項目中簡單使用定時任務,不過由于要借助cron表達式且都提前定義好放在配置文件里,不能在項目運行中動態修改任務執行時間,實在不太靈活。

經過網上搜索學習后,特此記錄如何在SpringBoot項目中實現動態定時任務。

因為只是一個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


啟動類:

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("(*^▽^*)啟動成功!!!(〃'▽'〃)");
}
}

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

server:
port:8089

定時任務執行時間配置文件:task-config.ini:

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

定時任務執行類:

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;

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

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

@Override
publicvoidconfigureTasks(ScheduledTaskRegistrartaskRegistrar){
//動態使用cron表達式設置循環間隔
taskRegistrar.addTriggerTask(newRunnable(){
@Override
publicvoidrun(){
log.info("Current time:{}",LocalDateTime.now());
}
},newTrigger(){
@Override
publicDatenextExecutionTime(TriggerContexttriggerContext){
//使用CronTrigger觸發器,可動態修改cron表達式來操作循環規則
CronTriggercronTrigger=newCronTrigger(cron);
DatenextExecutionTime=cronTrigger.nextExecutionTime(triggerContext);
returnnextExecutionTime;
}
});
}
}

編寫一個接口,使得可以通過調用接口動態修改該定時任務的執行時間:

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";
}
}

啟動項目,可以看到任務每10秒執行一次:

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

訪問接口,傳入請求參數cron表達式,將定時任務修改為15秒執行一次:

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

可以看到任務變成了15秒執行一次

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

除了上面的借助cron表達式的方法,還有另一種觸發器,區別于CronTrigger觸發器,該觸發器可隨意設置循環間隔時間,不像cron表達式只能定義小于等于間隔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;

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

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

privateLongtimer=10000L;

@Override
publicvoidconfigureTasks(ScheduledTaskRegistrartaskRegistrar){
//動態使用cron表達式設置循環間隔
taskRegistrar.addTriggerTask(newRunnable(){
@Override
publicvoidrun(){
log.info("Current time:{}",LocalDateTime.now());
}
},newTrigger(){
@Override
publicDatenextExecutionTime(TriggerContexttriggerContext){
//使用CronTrigger觸發器,可動態修改cron表達式來操作循環規則
//CronTriggercronTrigger=newCronTrigger(cron);
//DatenextExecutionTime=cronTrigger.nextExecutionTime(triggerContext);

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

增加一個修改時間的接口:

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";
}
}

測試結果:

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

基于 Spring Boot + MyBatis Plus + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

項目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro

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

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

項目地址:https://gitee.com/zhijiantianya/yudao-cloud

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

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 接口
    +關注

    關注

    33

    文章

    8844

    瀏覽量

    152793
  • spring
    +關注

    關注

    0

    文章

    340

    瀏覽量

    14722
  • SpringBoot
    +關注

    關注

    0

    文章

    175

    瀏覽量

    244

原文標題:SpringBoot 設置動態定時任務,千萬別再寫死了~

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    定時任務的發展史是怎么樣的

    定時任務是互聯網行業里最常用的服務之一,本文給大家介紹定時任務在我司的發展歷程。 linux系統中一般使用crontab命令來實現,在Java世界里,使用最廣泛的就是quartz了。我司
    發表于 07-18 17:38 ?0次下載
    <b class='flag-5'>定時任務</b>的發展史是怎么樣的

    SpringBoot如何實現動態增刪啟停定時任務

    在spring boot項目中,可以通過 @EnableScheduling 注解和@Scheduled注解實現定時任務,也可以通過SchedulingConfigurer接口來實現
    的頭像 發表于 09-24 09:49 ?3097次閱讀
    <b class='flag-5'>SpringBoot</b>如何<b class='flag-5'>實現</b><b class='flag-5'>動態</b>增刪啟停<b class='flag-5'>定時任務</b>

    Python定時任務實現方式

    在日常工作中,我們常常會用到需要周期性執行的任務,一種方式是采用 Linux 系統自帶的 crond 結合命令行實現。另外一種方式是直接使用Python。接下來整理的是常見的Python定時任務
    的頭像 發表于 10-08 15:20 ?7707次閱讀

    解析Golang定時任務庫gron設計和原理

    正巧,最近看到了 gron 這個開源項目,它是用 Golang 實現一個并發安全的定時任務庫。實現非常簡單精巧,代碼量也不多。今天我們就來一起結合源碼看一下,怎樣基于 Golang 的
    的頭像 發表于 12-15 13:57 ?1489次閱讀

    xxl-job任務調度中間件解決定時任務的調度問題

    xxl-job是一款非常優秀的任務調度中間件,輕量級、使用簡單、支持分布式等優點,讓它廣泛應用在我們的項目中,解決了不少定時任務的調度問題。
    的頭像 發表于 01-31 09:53 ?2372次閱讀

    求一種SpringBoot定時任務動態管理通用解決方案

    SpringBoot定時任務的加強工具,實現SpringBoot原生的定時任務進行動態管理,
    的頭像 發表于 02-03 09:49 ?901次閱讀

    SpringBoot如何實現定時任務(下)

    SpringBoot創建定時任務的方式很簡單,主要有兩種方式:一、基于注解的方式(@Scheduled)二、數據庫動態配置。實際開發中,第一種需要在代碼中寫死表達式,如果修改起來,又得重啟會顯得很麻煩;所以我們往往會采取第二種方
    的頭像 發表于 04-07 14:51 ?1333次閱讀
    <b class='flag-5'>SpringBoot</b>如何<b class='flag-5'>實現</b><b class='flag-5'>定時任務</b>(下)

    SpringBoot如何實現定時任務(上)

    SpringBoot創建定時任務的方式很簡單,主要有兩種方式:一、基于注解的方式(@Scheduled)二、數據庫動態配置。實際開發中,第一種需要在代碼中寫死表達式,如果修改起來,又得重啟會顯得很麻煩;所以我們往往會采取第二種方
    的頭像 發表于 04-07 14:51 ?1467次閱讀
    <b class='flag-5'>SpringBoot</b>如何<b class='flag-5'>實現</b><b class='flag-5'>定時任務</b>(上)

    SpringBoot-動態定時任務調度

    先說業務場景,根據用戶輸入的cron表達式進行定時調度,舉個例子:如圖
    的頭像 發表于 04-07 14:56 ?980次閱讀
    <b class='flag-5'>SpringBoot</b>-<b class='flag-5'>動態</b><b class='flag-5'>定時任務</b>調度

    在Spring Boot中如何使用定時任務

    本文介紹在 Spring Boot 中如何使用定時任務,使用非常簡單,就不做過多說明了。
    的頭像 發表于 04-12 10:56 ?1094次閱讀

    如何動態添加修改刪除定時任務

    如何動態添加修改刪除定時任務?那么我們一起看看具體怎么實現,先看下本節大綱: (1)思路說明; (2)代碼解析; (3)修改定時任務執行周期特別說明;
    的頭像 發表于 04-12 11:06 ?1229次閱讀

    Linux如何使用cron進行定時任務的操作

    按計劃執行命令對于計算機來說非常重要,因為假如我親自去執行一些任務的話,可能會因為多方面因素不能按時執行,所以定時任務就顯得非常重要了! cron就是一個能夠執行定時任務的命令,其實該命令本身不難,下面小編帶您詳細了解!
    的頭像 發表于 05-12 16:27 ?2174次閱讀

    python定時任務實踐

    由于程序需求,監測配置變化需要設置定時任務,每分鐘執行一次,對任務持久化要求不高,不需要時可以關閉定時任務
    的頭像 發表于 05-20 17:53 ?1073次閱讀
    python<b class='flag-5'>定時任務</b>實踐

    定時器如何實現定時任務

    1.1、單次定時任務實現 boost 的asio庫里有幾個定時器,老的有 deadline_timer , 還有三個可配合 C++11 的 chrono
    的頭像 發表于 11-09 17:20 ?1252次閱讀

    linux定時任務的用法總結

    習慣了使用 windows 的計劃任務,使用 linux 中的 crontab 管理定時任務時很不適應。
    的頭像 發表于 08-14 18:16 ?1007次閱讀
    linux<b class='flag-5'>定時任務</b>的用法總結
    主站蜘蛛池模板: 欧美在线小视频 | 国产伦精一区二区三区 | 天天躁狠狠躁狠狠躁夜夜躁 | 国产色啪午夜免费视频 | 日本美女视频网站 | 欧美日韩一区二区三区视频 | 在线观看视频网站 | 亚洲网站在线看 | 女女同免费播放毛片 | 天天操天天操天天 | 国产理论视频在线观看 | 天堂网www | 台湾av| 免费观看视频在线观看 | 午夜神马福利影院 | 一区二区美女视频 | 久久久久久国产精品免费 | 伊人久久大香线蕉影院95 | 伊人狼人在线 | 最新版天堂资源8网 | 玖玖福利 | 种子在线搜索bt | 日本大片成人免费播放 | 特黄aaaaa日本大片免费看 | 欧美高清成人 | 亚洲五月激情 | 日在线视频 | 天天做爽夜夜做爽 | 谁有毛片网站 | 狠狠插综合网 | 717影院理论午夜伦八戒 | 真实一级一级一片免费视频 | www.色在线观看 | 亚洲一区欧美二区 | 在线免费看黄的网站 | 一区二区三区四区在线免费观看 | 在线a人片免费观看不卡 | 国产精品综合色区在线观看 | 天天射日日操 | 美女视频黄a全部免费看小说 | 日本特黄特色大片免费播放视频 |