SpringBoot实现动态定时任务的示例代码
作者:野生java研究僧 发布时间:2022-06-22 19:27:39
标签:SpringBoot,动态,定时,任务
前言
之前在SpringBoot项目中简单使用定时任务,不过由于要借助cron表达式且都提前定义好放在配置文件里,不能在项目运行中动态修改任务执行时间,实在不太灵活。现在我们就来实现可以动态修改cron表达式的定时任务。
配置文件
application-task.yml,其余的配置 application.yml 等就按照springBoot正常配置即可
task:
cron: 0/10 * * * * ?
timer: 10
定时任务核心类
import cn.hutool.core.date.DateUtil;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.PeriodicTrigger;
import java.util.Date;
@Data
@Slf4j
@Configuration
@EnableScheduling
@ConfigurationProperties(prefix = "task")
public class WorkScheduleTask implements SchedulingConfigurer {
private String cron;
private Long timer;
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
// 动态使用cron表达式设置循环间隔
taskRegistrar.addTriggerTask(() -> {
String dateTime = DateUtil.formatDateTime(new Date());
String threadName = Thread.currentThread().getName();
log.info("定时任务开始[configureTasks] :{},线程:{}", dateTime, threadName);
}, triggerContext -> {
// 使用CronTrigger触发器,可动态修改cron表达式来操作循环规则
// 只能定义小于等于间隔59秒
// CronTrigger cronTrigger = new CronTrigger(cron);
// return cronTrigger.nextExecutionTime(triggerContext);
// 能定义大于等于间隔59秒
// 使用不同的触发器,为设置循环时间的关键,区别于CronTrigger触发器,
// 该触发器可随意设置循环间隔时间,单位为毫秒
long seconds = timer * 1000; // 毫秒转秒
PeriodicTrigger periodicTrigger = new PeriodicTrigger(seconds);
return periodicTrigger.nextExecutionTime(triggerContext);
});
}
}
提供修改cron表达式的controller
@Slf4j
@CrossOrigin
@RestController
@RequestMapping("/updateTask")
public class UpdateTaskController {
@Resource
private WorkScheduleTask workScheduleTask;
@PostMapping("/updateCron")
public String updateCron(String cron) {
log.info("new cron :{}", cron);
workScheduleTask.setCron(cron);
return "ok";
}
@PostMapping("/updateTimer")
public String updateTimer(Long timer) {
log.info("new timer :{}", timer);
workScheduleTask.setTimer(timer);
return "ok";
}
}
一开始定时任务的执行时机和周期都是配置文件指定的,但是我们如果对于执行的周期不满意,我们可以调用接口进行修改定时任务,但是需要注意的是,这种外暴露的接最好做一下安全校验,不是谁都可以调用,否则被别人扫描到这个接口,然后随意修改,会影响我们正常的业务流程,严重可能会造成严重损失。
来源:https://blog.csdn.net/m0_46188681/article/details/127495568


猜你喜欢
- 一、maven项目的目录结构pom文件定于了一个maven项目的maven配置,一般pom文件的放在项目或者模块的根目录下。maven的遵循
- 《IDEA 破解新招 - 无限重置30天试用期》,这种方法适用idea2021以下所有版本,亲测idea2020.3成功激活,其他版本自测吧
- 在进行需求开发的时候,我们总是避不开和用户的数据打交道,那提到获取用户的数据一定会想到的东西就是申请权限<uses-permissio
- 现在许多流行的软件中都有欢迎界面,今天就介绍一下欢迎界面的制作,由于界面涉及到页面的滑动,因此要采用ViewPager,sdk在4.0一下的
- 在Mms中每个Thread都有其相应的联系人,但是threads表中并没有直接保存联系人的信息(号码或名字),而是保存一个叫做recipie
- 前言 SpringCloud 是微服务中的翘楚,最佳的落地方案。 在微服务架构中多层服务之间会相互调用,如果其中有一
- 线程池的好处可以实现线程的复用,避免重新创建线程和销毁线程。创建线程和销毁线程对CPU的开销是很大的。可以限制最大可创建的线程数,可根据自己
- 一、三方库介绍地址:https://github.com/youth5201314/banner介绍:从学习 Android 开始到现在工作
- 我就废话不多说了,大家还是直接看代码吧~ public static void main(String[] args) { &n
- 前言${} 和 #{} 都是 MyBatis 中用来替换参数的,它们都可以将用户传递过来的参数,替换到 MyBatis 最终生成的
- 上次面试中遇到的一个问题,问到System.out.println()中的out是不是内部类,当时就给问蒙了,直观感觉out应该是Syste
- 项目比较大有时候会比较卡,虽然有GC自动清理机制,但是还是有不尽人意的地方。所以尝试在项目启动文件中,手动写了一个定时器,定时清理内存,加快
- 1.概述最近一直都在带实习生做项目,发现自己好久没有写博客了,这几天更新会比较频繁,今天玩QQ的时候发现QQ主页菜单滑动效果早就变了,实在忍
- 一:父级pom.xml文件 resources目录下新建指定文件夹,存放Spring配置文件<profiles> &
- 我们经常会有用到,当A 用户在北京登录 ,然后A用户在天津再登录 ,要踢出北京登录的状态。如果用户在北京重新登录,那么又要踢出天津的用户,这
- 项目中常用到的圆形进度条有好多个,从网上搜到的自定义进度条多是封装的比较好的代码,但是不利于初学者,现在本博客就教给大家如何一步步实现自定义
- 首先,要添加图片列,绑定数据的时候会触发CellFormatting事件,在事件中取出图片路径,读取图片赋值给当前单元格。private v
- 一、图示二、MapStructpom文件 <dependency> &n
- 引言从前面我们可以大致了解了协程的玩法,如果一个协程中使用子协程,那么该协程会等待子协程执行结束后才真正退出,而达到这种效果的原因就是协程上
- 作为java中的一个重要理念,说起面向对象也是老生常谈了。在找资料的时候多是很专业的术语,又或者很多框架的知识点合集,其实大部分人刚看资料的