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

SpringBoot 设置定时任务,求求你别再写死了~,太low了!

0
分享至

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

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

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


org.springframework.bootgroupId>
spring-boot-starter-webartifactId>
dependency>


org.springframework.bootgroupId>
spring-boot-starter-log4j2artifactId>
trueoptional>
dependency>


org.springframework.bootgroupId>
spring-boot-starter-validationartifactId>
dependency>

启动类:

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精选,回复“加群”,即可入群!

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

------ 特别推荐 ------

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

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


org.projectlombokgroupId>
lombokartifactId>
trueoptional>
dependency>
dependencies>

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

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.

相关推荐
热点推荐
为什么欧美男性不那么介意带孩子的离异女性?网友回答揭露真相!

为什么欧美男性不那么介意带孩子的离异女性?网友回答揭露真相!

有趣的羊驼
2024-06-19 18:20:23
国家社科基金项目成果:男人阴茎越短,智商越高

国家社科基金项目成果:男人阴茎越短,智商越高

必记本
2024-06-19 01:09:57
记者:路易斯、特谢拉、朱辰杰等7名球员没随申花出征佛山

记者:路易斯、特谢拉、朱辰杰等7名球员没随申花出征佛山

懂球帝
2024-06-20 22:11:09
博主吐槽美国新势力Rivian是垃圾车:续航虚标、窗户漏风!智能驾驶接近于0,回家第一件事把他家股票全抛了

博主吐槽美国新势力Rivian是垃圾车:续航虚标、窗户漏风!智能驾驶接近于0,回家第一件事把他家股票全抛了

和讯网
2024-06-20 10:26:47
央视败类?抛弃妻子和董卿同居?14岁才知叔叔是亲爸,他有苦难言

央视败类?抛弃妻子和董卿同居?14岁才知叔叔是亲爸,他有苦难言

舞娱天地
2024-06-20 17:03:07
美国顶级预言家再出手!直言2024美日中命运!这个岛最先出事!

美国顶级预言家再出手!直言2024美日中命运!这个岛最先出事!

飞云如水
2024-06-09 21:53:34
《玫瑰的故事》:既不打算重修旧好,黄亦玫为何带娃约会庄国栋?

《玫瑰的故事》:既不打算重修旧好,黄亦玫为何带娃约会庄国栋?

伍悦看剧
2024-06-21 00:10:20
霍思燕晒她北京的大庄园,院子里养孔雀,一个月水电费都超乎想象

霍思燕晒她北京的大庄园,院子里养孔雀,一个月水电费都超乎想象

花花lo先森
2024-06-20 14:30:44
抗日神剧八路军的伙食,不是海鲜就是法国菜,主打的就是一个上流

抗日神剧八路军的伙食,不是海鲜就是法国菜,主打的就是一个上流

附允历史观
2024-06-19 16:45:10
停业11万家!昔日购物天堂,如今靠餐饮“续命”

停业11万家!昔日购物天堂,如今靠餐饮“续命”

餐饮老板内参
2024-06-20 09:57:29
上海这一夜,由王中磊牵头的明星聚会,将华谊的落魄展现淋漓尽致

上海这一夜,由王中磊牵头的明星聚会,将华谊的落魄展现淋漓尽致

先人后记
2024-06-19 00:01:03
你见过最主动的女生是什么样的?网友们也太会了!

你见过最主动的女生是什么样的?网友们也太会了!

滑稽斑马呀
2024-06-18 18:38:21
6月第2周新能源销量排行,比亚迪断崖式领先,宝马大幅反超特斯拉

6月第2周新能源销量排行,比亚迪断崖式领先,宝马大幅反超特斯拉

财经老庄
2024-06-20 23:51:10
退钱哥晒照观战英格兰vs丹麦:威廉王子陪着看球,这你受得了吗

退钱哥晒照观战英格兰vs丹麦:威廉王子陪着看球,这你受得了吗

直播吧
2024-06-21 00:08:07
华为参与!全球首次,试验成功

华为参与!全球首次,试验成功

每日经济新闻
2024-06-19 08:01:06
事态升级!南医大拒绝央视采访,上海急诊部主任:强求上报不合理

事态升级!南医大拒绝央视采访,上海急诊部主任:强求上报不合理

户外小阿隋
2024-06-20 11:56:36
尹锡悦:再不生孩子韩国要灭绝了!韩国鼓励生育:每月育儿假津贴从150万韩元提高到250万韩元

尹锡悦:再不生孩子韩国要灭绝了!韩国鼓励生育:每月育儿假津贴从150万韩元提高到250万韩元

和讯网
2024-06-20 12:00:10
德转宣!艾克森还没离开成都蓉城,徐正源就敲定国安锋霸顶替他

德转宣!艾克森还没离开成都蓉城,徐正源就敲定国安锋霸顶替他

罗掌柜体育
2024-06-20 12:02:54
北京余琦大妈成了死老虎,司马南撸胳膊挽袖子好一顿揍

北京余琦大妈成了死老虎,司马南撸胳膊挽袖子好一顿揍

尤五爱音乐
2024-06-21 02:34:42
男上司暗恋我,我们在一起这天,我得到了前所未有的满足

男上司暗恋我,我们在一起这天,我得到了前所未有的满足

沧海已桑田
2023-05-10 14:40:14
2024-06-21 04:48:49
Java精选
Java精选
一场永远也演不完的戏
1551文章数 3855关注度
往期回顾 全部

科技要闻

小米SU7流量泼天,富贵却被蔚来接住了

头条要闻

欧洲杯:凯恩破门 英格兰1-1丹麦

头条要闻

欧洲杯:凯恩破门 英格兰1-1丹麦

体育要闻

千夫所指的关系户 成了拯救葡萄牙的英雄

娱乐要闻

叶舒华参加柯震东生日聚会,五毒俱全

财经要闻

楼市新“王炸”!释放何信号?

汽车要闻

售价11.79-14.39万元 新一代哈弗H6正式上市

态度原创

时尚
艺术
亲子
数码
教育

当男人不耍帅时,就是最帅的时候(穿衣篇)

艺术要闻

穿越时空的艺术:《马可·波罗》AI沉浸影片探索人类文明

亲子要闻

夫妻俩趁孩子睡着后聊聊一天的琐事,这就是向往的婚姻吧?

数码要闻

AMD 发布 ROCm 6.1.3,支持 RX 7900 GRE 显卡及 TensorFlow

教育要闻

学霸的题目,当然要学霸来做了!学渣挤眉弄眼一个字都没写出来

无障碍浏览 进入关怀版