SpringBoot动态修改定时任务执行时间间隔

      Spring Boot实现简单的定时任务:https://blog.csdn.net/duan196_118/article/details/107654743。在这个案例中,我们可以实现简单的定时任务,本篇博客介绍的是动态的执行定时任务,即动态修改定时任务的执行间隔。案例在单体环境下可以实现需求,但还存在这问题,希望看到的小伙伴可以提出您宝贵的意见,望不吝赐教。

   场景:

           在与硬件对接的项目中,每隔一段时间要存储硬件发送的数据,而这个时间间隔需要动态的改变。

   思路:

          首先想到的是@Scheduled(cron =“0/5 * * * * *”)这种方式适用于固定任务周期的任务,若要修改任务执行周期,只能走“停服务—修改任务执行周期—重启服务”这条路。

  如何动态修改呢?

    1. 在定时任务类上增加@EnableScheduling注解,并实现SchedulingConfigurer接口

    2.设置一个静态的cron,用于存放任务执行周期参数。

    3.开启一个线程,用于实际业务中外部原因修改了任务执行周期。

    4.设置任务触发器,触发任务执行。

具体代码如下:
package com.py.monitorPoint.web.controller;

import com.py.monitorPoint.mapper.DataMapper;
import com.py.monitorPoint.web.service.DataService;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.TriggerContext;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Date;

/**

 * Spring @Scheduled定时任务动态修改cron参数

 * @author Angel --曰业而安

 * @version v.0.1

 * @date 2020年8月29日

 */

@Component
@EnableScheduling
public class TaskCronChange implements SchedulingConfigurer {
    @Resource
    private DataMapper dataMapper;
    @Resource
    private MonitorService mpc;

    public  String NewCrons(){
        String numStr = dataMapper.getNum().trim();
        return numStr;
    }


    public static String cron;

    public TaskCronChange() {

        //默认情况是:每1分执行一次.
        cron = "0 */1 * * * ?";
      
        new Thread(new Runnable() {

            // 开启新线程模拟外部更改了任务执行周期.
            @Override
            public void run() {
                try {
                    // 让线程睡眠 15秒.
                    Thread.sleep(15000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //修改为:设定的周期.
                cron = "0 0 */"+NewCrons()+" * * ?";
                System.err.println("cron change to:"+cron);
            }

        }).start();;
    }

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {

        Runnable task = new Runnable() {
            @Override

            public void run() {
                //任务逻辑代码部分.
                System.out.println("TaskCronChange task is running ... "+ new Date());
                mpc.timerNum();//执行任务逻辑
            }

        };

        Trigger trigger = new Trigger() {

            @Override
            public Date nextExecutionTime(TriggerContext triggerContext) {

                //任务触发,可修改任务的执行周期.
                CronTrigger trigger = new CronTrigger(cron);
                Date nextExec = trigger.nextExecutionTime(triggerContext);
                return nextExec;
            }
        };
        taskRegistrar.addTriggerTask(task, trigger);
    }
}

需求得以实现,但是在并发环境下还有需要优化的地方。望不吝赐教,您的宝贵意见将促使码农的成长!

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Spring Boot中,可以使用@Scheduled注解来设置定时任务的触发时间和频率。这个注解可以添加在一个普通的方法上,将该方法标记为定时任务。你可以通过cron表达式、fixedRate、fixedDelay等配置选项来定义任务的触发时间和频率。 如果你想设置定时任务的间隔时间,可以使用fixedRate或fixedDelay配置选项。fixedRate表示任务的执行频率,即任务开始执行时间间隔。fixedDelay表示任务的执行间隔,即任务执行完成后的等待时间。 举个例子,假设你有一个需要每隔5秒执行一次的定时任务,你可以在方法上添加@Scheduled(fixedRate = 5000)注解来实现。这样,每次任务执行完成后,就会等待5秒后再次执行。 另外,还可以通过配置文件来设置定时任务的间隔时间。在application.properties或application.yml文件中添加以下配置属性: ```properties spring.task.scheduling.pool.size=10 spring.task.scheduling.thread-name-prefix=my-scheduled-task- ``` ```yaml spring: task: scheduling: pool: size: 10 thread-name-prefix: my-scheduled-task- ``` 以上配置表示线程池的大小为10,线程名的前缀为"my-scheduled-task-"。 总结起来,Spring Boot提供了多种灵活的方式来设置定时任务的间隔时间,你可以根据具体需求选择合适的配置选项。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [SpringBoot 实现定时任务](https://blog.csdn.net/m0_62854966/article/details/131963712)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [SpringBoot设置动态定时任务](https://blog.csdn.net/qq_45402411/article/details/127291592)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值