网易首页 > 网易号 > 正文 申请入驻

简单两步,轻松实现 Spring Boot 动态定时任务,爽~

0
分享至

Java精选面试题 (微信小程序): 5000+ 道面试题和选择题, 真实面经 , 简历模版 ,包含Java基础、并发、JVM、线程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架构设计、大厂真题等,在线随时刷题!

之前写过文章记录怎么在SpringBoot项目中简单使用定时任务,不过由于要借助cron表达式且都提前定义好放在配置文件里,不能在项目运行中动态修改任务执行时间,实在不太灵活。

经过网上搜索学习后,特此记录如何在SpringBoot项目中实现动态定时任务。

因为只是一个demo,所以只引入了需要的依赖:


     

         

 org.springframework.boot groupId>         

 spring-boot-starter-web artifactId>      dependency>     

         

 org.springframework.boot groupId>         

 spring-boot-starter-log4j2 artifactId>         

 true optional>      dependency>          

         

 org.springframework.boot groupId>         

 spring-boot-starter-validation artifactId>      dependency>     

         

 org.projectlombok groupId>         

 lombok artifactId>         

 true optional>      dependency> dependencies>














启动类:

package com.wl.demo;   import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconp.SpringBootApplication; import org.springframework.scheduling.annotation.EnableScheduling;   /**  * @author wl  */ @EnableScheduling @SpringBootApplication public class DemoApplication {       public static void main(String[] args) {         SpringApplication.run(DemoApplication.class, args);         System.out.println("(*^▽^*)启动成功!!!(〃'▽'〃)");     } }

配置文件application.yml,只定义了服务端口:

server:   port: 8089

定时任务执行时间配置文件:task-config.ini:

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

定时任务执行类:

package com.wl.demo.task;   import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.PropertySource; import org.springframework.scheduling.Trigger; import org.springframework.scheduling.TriggerContext; import org.springframework.scheduling.annotation.SchedulingConpr; import org.springframework.scheduling.config.ScheduledTaskRegistrar; import org.springframework.scheduling.support.CronTrigger; import org.springframework.stereotype.Component;   import java.time.LocalDateTime; import java.util.Date;   /**  * 定时任务  * @author wl  */ @Data @Slf4j @Component @PropertySource("classpath:/task-config.ini") public class ScheduleTask implements SchedulingConpr {       @Value("${printTime.cron}")     private String cron;       @Override     public void conpTasks(ScheduledTaskRegistrar taskRegistrar) {         // 动态使用cron表达式设置循环间隔         taskRegistrar.addTriggerTask(new Runnable() {             @Override             public void run() {                 log.info("Current time: {}", LocalDateTime.now());             }         }, new Trigger() {             @Override             public Date nextExecutionTime(TriggerContext triggerContext) {                 // 使用CronTrigger触发器,可动态修改cron表达式来操作循环规则                 CronTrigger cronTrigger = new CronTrigger(cron);                 Date nextExecutionTime = cronTrigger.nextExecutionTime(triggerContext);                 return nextExecutionTime;             }         });     } }

编写一个接口,使得可以通过调用接口动态修改该定时任务的执行时间:

package com.wl.demo.controller;   import com.wl.demo.task.ScheduleTask; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;   /**  * @author wl  */ @Slf4j @RestController @RequestMapping("/test") public class TestController {       private final ScheduleTask scheduleTask;       @Autowired     public TestController(ScheduleTask scheduleTask) {         this.scheduleTask = scheduleTask;     }       @GetMapping("/updateCron")     public String updateCron(String cron) {         log.info("new cron :{}", cron);         scheduleTask.setCron(cron);         return "ok";     } }

启动项目,可以看到任务每10秒执行一次:

访问接口,传入请求参数cron表达式,将定时任务修改为15秒执行一次:

可以看到任务变成了15秒执行一次,面试宝典:https://www.yoodb.com

除了上面的借助cron表达式的方法,还有另一种触发器,区别于CronTrigger触发器,该触发器可随意设置循环间隔时间,不像cron表达式只能定义小于等于间隔59秒。

package com.wl.demo.task;   import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.PropertySource; import org.springframework.scheduling.Trigger; import org.springframework.scheduling.TriggerContext; import org.springframework.scheduling.annotation.SchedulingConpr; import org.springframework.scheduling.config.ScheduledTaskRegistrar; import org.springframework.scheduling.support.CronTrigger; import org.springframework.scheduling.support.PeriodicTrigger; import org.springframework.stereotype.Component;   import java.time.LocalDateTime; import java.util.Date;   /**  * 定时任务  * @author wl  */ @Data @Slf4j @Component @PropertySource("classpath:/task-config.ini") public class ScheduleTask implements SchedulingConpr {       @Value("${printTime.cron}")     private String cron;       private Long timer = 10000L;       @Override     public void conpTasks(ScheduledTaskRegistrar taskRegistrar) {         // 动态使用cron表达式设置循环间隔         taskRegistrar.addTriggerTask(new Runnable() {             @Override             public void run() {                 log.info("Current time: {}", LocalDateTime.now());             }         }, new Trigger() {             @Override             public Date nextExecutionTime(TriggerContext triggerContext) {                 // 使用CronTrigger触发器,可动态修改cron表达式来操作循环规则 //                CronTrigger cronTrigger = new CronTrigger(cron); //                Date nextExecutionTime = cronTrigger.nextExecutionTime(triggerContext);                   // 使用不同的触发器,为设置循环时间的关键,区别于CronTrigger触发器,该触发器可随意设置循环间隔时间,单位为毫秒                 PeriodicTrigger periodicTrigger = new PeriodicTrigger(timer);                 Date nextExecutionTime = periodicTrigger.nextExecutionTime(triggerContext);                 return nextExecutionTime;             }         });     } }

增加一个修改时间的接口:

package com.wl.demo.controller;   import com.wl.demo.task.ScheduleTask; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;   /**  * @author wl,推荐公众 号Java精选  */ @Slf4j @RestController @RequestMapping("/test") public class TestController {       private final ScheduleTask scheduleTask;       @Autowired     public TestController(ScheduleTask scheduleTask) {         this.scheduleTask = scheduleTask;     }       @GetMapping("/updateCron")     public String updateCron(String cron) {         log.info("new cron :{}", cron);         scheduleTask.setCron(cron);         return "ok";     }       @GetMapping("/updateTimer")     public String updateTimer(Long timer) {         log.info("new timer :{}", timer);         scheduleTask.setTimer(timer);         return "ok";     } }

测试结果:


作者:wl_Honest https://blog.csdn.net/wl_Honest/article/details/123654621

公众号“Java精选”所发表内容注明来源的,版权归原出处所有(无法查证版权的或者未注明出处的均来自网络,系转载,转载的目的在于传递更多信息,版权属于原作者。如有侵权,请联系,笔者会第一时间删除处理!

最近有很多人问,有没有技术或摸鱼交流群!加入方式很简单,公众号Java精选,回复“加群”,即可入群!在线摸鱼:https://www.yoodb.com/

Java精选面试题(微信小程序):3000+道面试题,包含Java基础、并发、JVM、线程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架构设计等,在线随时刷题!

特别推荐:专注分享最前沿的技术与资讯,为弯道超车做好准备及各种开源项目与高效率软件的公众号,「大咖笔记」,专注挖掘好东西,非常值得大家关注。点击下方公众号卡片关注

文章有帮助的话,点在看,转发吧!

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
一言不合就是床戏,Netflix爆款终于回归

一言不合就是床戏,Netflix爆款终于回归

来看美剧
2026-05-22 16:23:12
花700美元买Mesh路由后,我的网速反而更慢了

花700美元买Mesh路由后,我的网速反而更慢了

Ping值焦虑
2026-05-22 02:00:32
啥情况?石牌村酒店清退又招租...

啥情况?石牌村酒店清退又招租...

广州楼市发布
2026-05-21 21:49:46
金溥聪无地自容!马英九妻子、亲姐连夜发通告:盼马英九安享晚年

金溥聪无地自容!马英九妻子、亲姐连夜发通告:盼马英九安享晚年

何咯说
2026-05-22 08:11:10
真不怪哈登!骑士队输球揪出最大“罪臣”,最佳主教练遭“完爆”

真不怪哈登!骑士队输球揪出最大“罪臣”,最佳主教练遭“完爆”

大卫的篮球故事
2026-05-22 15:05:09
图赫尔弃用福登:连他踢什么位置都搞不清楚

图赫尔弃用福登:连他踢什么位置都搞不清楚

星河漫山野
2026-05-23 00:44:53
真实事件!普京女婿被俄罗斯亿万富翁欺负,普京助理找上门

真实事件!普京女婿被俄罗斯亿万富翁欺负,普京助理找上门

马尔科故事会
2024-11-05 13:56:12
重建蓝图!引进三大强援留下五大主力,阿隆索的切尔西初见端倪

重建蓝图!引进三大强援留下五大主力,阿隆索的切尔西初见端倪

体坛老球迷
2026-05-22 11:15:28
普京心里比谁都明白,卖给中国的天然气,不降价真的不行了

普京心里比谁都明白,卖给中国的天然气,不降价真的不行了

科技讲者66
2026-05-21 12:51:56
为什么有很多人连基本的常识都没有?网友:人无语的时候真的会笑

为什么有很多人连基本的常识都没有?网友:人无语的时候真的会笑

另子维爱读史
2026-05-22 20:43:04
科学家:第一次生物大灭绝的原因,可能是因为地球有一个行星环

科学家:第一次生物大灭绝的原因,可能是因为地球有一个行星环

魅力科学君
2026-05-21 17:03:04
张军被查创下多个尴尬“纪录”,18年前曾因酒驾被查

张军被查创下多个尴尬“纪录”,18年前曾因酒驾被查

元芳有看法
2026-04-30 09:25:44
记者:开拓者将面试小范甘迪,他已成主帅最终候选人之一

记者:开拓者将面试小范甘迪,他已成主帅最终候选人之一

懂球帝
2026-05-22 07:38:20
国际乒联设百年荣誉榜,国乒仅入选3人,一邓亚萍二马龙,三是?

国际乒联设百年荣誉榜,国乒仅入选3人,一邓亚萍二马龙,三是?

格斗社
2026-04-15 16:51:15
惠山国家森林公园用墓碑铺路,律师解读:有违公序良俗,可能涉嫌侵权

惠山国家森林公园用墓碑铺路,律师解读:有违公序良俗,可能涉嫌侵权

上游新闻
2026-05-22 19:40:14
泽连斯基发现大事不妙,除了朝鲜之外,俄罗斯又拉来一个狠角色

泽连斯基发现大事不妙,除了朝鲜之外,俄罗斯又拉来一个狠角色

小兰聊历史
2026-05-23 03:07:37
别再被隋唐演义误导,正史中公认武力值最高的,是这五位顶尖猛将

别再被隋唐演义误导,正史中公认武力值最高的,是这五位顶尖猛将

长风文史
2026-05-21 17:01:36
普京政府心里比谁都明白,卖给中国的天然气,不降价真的不行了

普京政府心里比谁都明白,卖给中国的天然气,不降价真的不行了

星星邮递员
2026-05-21 21:22:56
铁原阻击战:一场被“过度神化”的英雄绝唱?

铁原阻击战:一场被“过度神化”的英雄绝唱?

浪子说
2026-05-22 09:42:26
北京单节被轰39-11净负28分引热议!社媒彻底沸腾 球迷评论一边倒

北京单节被轰39-11净负28分引热议!社媒彻底沸腾 球迷评论一边倒

狼叔评论
2026-05-22 21:30:07
2026-05-23 04:12:49
Java精选
Java精选
一场永远也演不完的戏
1789文章数 3859关注度
往期回顾 全部

科技要闻

雷军:输给特斯拉不丢人

头条要闻

伊朗前总统内贾德被指是"最大内鬼" 其目前下落不明

头条要闻

伊朗前总统内贾德被指是"最大内鬼" 其目前下落不明

体育要闻

最糟糕裁判?他想要退役当市长

娱乐要闻

周也恋情曝光!对象身份不简单

财经要闻

富途拟被罚18.5亿元 老虎 长桥也回应了

汽车要闻

11万级直接上四驱 银河星耀7限时权益价9.88万起

态度原创

旅游
时尚
游戏
房产
健康

旅游要闻

楚雄双柏爱尼山乡观鸟经济带动生态旅游开门红

中年男人特供,害惨年轻女性

《黑旗重制》确认支持PS5 Pro神技!画质性能要起飞

房产要闻

疯抢511轮!今年海南最魔幻的地块,被福建能源企业抢了!

外泌体 ≠ 生长因子!它们之间究竟有何区别?

无障碍浏览 进入关怀版