在线观看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.福利| chinesevideo普通话对白 | 在线观看日本一区 | 免费爱做网站在线看 | 久操资源在线 | 亚洲五月婷 | 色妞视频资源在线观看 | 国模于子涵啪啪大胆 | 91男人| 色综合天天综合网国产成人 | 免费看污视频软件 | 爱逼色| 久久精品国产亚洲5555 | 国产高清一区二区三区四区 | 亚洲国产精品综合久久2007 | 国产片91人成在线观看 | 一级黄色片在线看 | 激情综合视频 | 亚洲国产色婷婷精品综合在线观看 | 黄色一级片毛片 | 久久国产午夜精品理论篇小说 | 欧美在线观看www | 国产美女视频一区二区二三区 | 五月天停婷基地 | 三浦理惠子中文在 | 欧美色人阁 | 日韩一级欧美一级一级国产 | 成人久久网站 | 亚洲男人的性天堂 | 五月激情六月 | 性欧美日本 | 美女黄色一级毛片 | 天天做天天爱天天一爽一毛片 | 午夜精品福利在线 | 1024人成网色www| 色妞在线 | 亚洲第一香蕉视频 | 一级一级特黄女人精品毛片 | 热re久久精品国产99热 | 午夜影视网 | 久久久久免费观看 |