springboot配置动态定时任务 及 重复执行解决

26 篇文章 0 订阅
8 篇文章 0 订阅

背景:页面会有一个设置时间频率的输入框,这个频率也是定时任务的执行时间间隔,单位是分钟;

 

思路:按springboot的@Scheduled方式配置定时任务,其中有cron规则,和fixedRate、fixedDelay配置,配置规则是这样的,如,每5秒执行一次

@Scheduled(cron = "0/5 * * * * *") 这个配置可以在配置文件添加后@Value获取

@Scheduled(fixedRate = 5000) 这个是每5秒执行一次

@Scheduled(fixedDelay = 5000) 这个是每次任务结束后5秒执行

 

可以参考:http://www.wanqhblog.top/2018/02/01/SpringBootTaskSchedule/

 

如上配置,cron规则有些不太适用,因为单位是分钟;试试看用下面的俩种能不能实现

 

先试试写死执行时间

1.启动类加入注解@EnableScheduling

//这里开启定时任务

@EnableScheduling

public class Application extends SpringBootServletInitializer {

 

public static void main(String[] args) {

SpringApplication.run(Application.class, args);

}

}

2.定时方法上加入@Scheduled

@Component

public class AlarmTimeSchedule {

/**

* 固定cron配置定时任务

*/

@Scheduled(fixedRate = 5000)

public void doTask(){

System.out.println("执行了定时任务,时间为:"+new Date(System.currentTimeMillis()));

}

 

}

启动可以看到执行了

 

到这里,简单的定时完成了,现在触发是自带的,满足不了我们的需求,需要修改触发规则

 

1.先实现Spring提供的SchedulingConfigurer接口,可以看到重写了一个configureTasks方法

添加触发器属性:Trigger,里面有俩个参数:第一个是业务规则,第二个是触发器

这里的新的时间本来想简单的用 SimpleTrigger 触发实现,可是导入不了包,所以还是使用CronTrigger 触发器实现了,二者的区别可参考:https://blog.csdn.net/zixiao217/article/details/53075009

接着上面写: 执行逻辑

private Runnable doTask(){

return new Runnable(){

@Override

public void run() {

System.out.println("执行了定时任务,时间为:"+new Date(System.currentTimeMillis())); //测试是否执行

FailCount(newCron); //调用逻辑

}

};

}

这里的Runnable注意new出来,不然不执行 下面是新的触发规则

private Trigger getTrigger(){

return new Trigger(){

@Override

public Date nextExecutionTime(TriggerContext triggerContext) {

// 触发器

CronTrigger trigger = new CronTrigger(getCron());

return trigger.nextExecutionTime(triggerContext);

}

};

}

public String getCron() {

String newCron = alarmFailCountService.findtimes(); //这里的时间规则来源按自己需求获取

//String newCron = "0/20 * * * * ?"; //测试

if ("".equals(newCron)&&newCron==null) {

throw new CacheException("The config cron expression is empty");

}

if (!newCron.equals(cron)) {

System.out.println((new StringBuffer("Cron has been changed to:'").append(newCron).append("'. Old cron was:'").append(cron).append("'").toString()));

doTask();

cron = newCron;

}

return cron;

}

ok了,定时执行完成!

 

发现的问题:

定时任务跑了,但是触发却是一秒一次,一共会执行60次。

这个是因为定时设置问题,将*改成0就可以了。

我也看底层了,没找到文章里说的next,但是确实有lastTime的if判断,没看懂。

参考:https://blog.csdn.net/has330338724/article/details/80812438

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot 中,可以使用 YAML(YAML Ain't Markup Language)文件来配置定时任务。YAML 是一种人类友好的数据序列化格式,它可以用来替代传统的 XML 或 Properties 文件,更加简洁和易读。 使用 YAML 文件配置定时任务可以实现以下作用: 1. 配置定时任务的触发时间和执行逻辑:通过 YAML 文件可以指定定时任务的触发时间表达式(Cron 表达式)和执行的具体逻辑。这样,可以方便地在应用程序中定义和管理多个定时任务。 2. 避免硬编码:将定时任务配置信息从源代码中分离出来,以便于灵活地修改和调整。通过 YAML 文件,可以在不重新编译和部署应用程序的情况下更改定时任务配置。 3. 统一管理配置信息:将所有的定时任务配置信息集中在一个 YAML 文件中,可以方便地进行统一管理和维护。这样,可以减少重复劳动和错误,并提高配置的可读性和可维护性。 使用 YAML 文件配置定时任务的步骤如下: 1. 在 Spring Boot 项目的 resources 目录下创建一个名为 application.yml 或 application.yaml 的 YAML 文件。 2. 在 YAML 文件中使用 cron 表达式配置定时任务的触发时间,例如: ```yaml spring: task: scheduling: cron: expression: "0 0 * * * ?" # 每天凌晨执行一次 ``` 3. 在应用程序中添加 @EnableScheduling 注解来启用定时任务的支持。 4. 在需要执行定时任务的方法上添加 @Scheduled 注解,并根据需要指定触发时间和执行逻辑。例如: ```java import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component public class MyTask { @Scheduled(cron = "0 0 * * * ?") // 每天凌晨执行一次 public void doTask() { // 执行定时任务的逻辑 System.out.println("定时任务执行了!"); } } ``` 通过以上步骤,就可以使用 YAML 文件配置定时任务,并在 Spring Boot 应用程序中实现定时任务的自动触发和执行

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值