专栏首页测试人生SpringBoot 动态修改定时任务频率

SpringBoot 动态修改定时任务频率

本文共636字 阅读约需1分钟

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.TriggerContext;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;
import java.util.concurrent.ScheduledFuture;


@RestController
@RequestMapping(value = "test")
public class TestController {

    @Autowired
    private ThreadPoolTaskScheduler threadPoolTaskScheduler;

    private ScheduledFuture<?> future;

    // 线程池任务调度类
    @Bean
    public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
        return new ThreadPoolTaskScheduler();
    }

    private String cronStr = "0/5 * * * * *";

    @RequestMapping("/start")
    public String startCron() {
        // 创建定时计划
        future = threadPoolTaskScheduler.schedule(new MyRunnable(), new Trigger(){
            @Override
            public Date nextExecutionTime(TriggerContext triggerContext){
                return new CronTrigger(cronStr).nextExecutionTime(triggerContext);
            }
        });
        System.out.println("DynamicTask.startCron()");
        return "startCron";
    }

    @RequestMapping("/stop")
    public String stopCron() {

        if (future != null) {
            future.cancel(true);
        }
        System.out.println("DynamicTask.stopCron()");
        return "stopCron";
    }

    @PostMapping("/change")
    public String changeCron(@RequestBody String cron) {
        cronStr = cron;
        // 先停止,在开启
        stopCron();
        future = threadPoolTaskScheduler.schedule(new MyRunnable(), new Trigger(){
            @Override
            public Date nextExecutionTime(TriggerContext triggerContext){
                return new CronTrigger(cronStr).nextExecutionTime(triggerContext);
            }
        });
        System.out.println("DynamicTask.changeCron()");
        return "changeCron";
    }

    private class MyRunnable implements Runnable {
        @Override
        public void run() {
            System.out.println("DynamicTask.MyRunnable.run()," + new Date());
        }
    }
}

调试情况如下: 1.调用start 2.调用change,并传入0/3 * * * * * 3.调用stop

本文分享自微信公众号 - 软件测试君(backlight2018),作者:糖小幽

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-05-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • spring事物中的传播及隔离

    1、使用 propagation 指定事务的传播行为, 即当前的事务方法被另外一个事务方法调用时。如何使用事务, 默认取值为 REQUIRED, 即使用调用方法...

    软件测试君
  • 一篇文章学会PageFactory模式

    我们已经学习了Page Object设计模式,优势很明显,能更好的体现java的面向对象思想和封装特性。但同时也存在一些不足之处,那就是随着这种模式使用,随着元...

    软件测试君
  • 如何使用Jsoup爬取网页内容?

    这是一篇迟到很久的文章了,人真的是越来越懒,前一阵用jsoup实现了一个功能,个人觉得和selenium的webdriver原理类似,所以今天正好有时间,就又来...

    软件测试君
  • 实战:十分钟实现基于JWT前后端分离的权限框架

    面试过很多Java开发,能把权限这块说的清楚的实在是不多,很多人因为公司项目职责问题,很难学到这类相关的流程和技术,本文梳理一个简单的场景,实现一个基于jwt前...

    JAVA葵花宝典
  • RabbitMQ 延迟队列,消息延迟推送

    在上面两种场景中,如果我们使用下面两种传统解决方案无疑大大降低了系统的整体性能和吞吐量:

    海向
  • springBoot @Enable*注解的工作原理

    run方法打印的内容是异步进行的,是独立于主线程外的线程,所以-----------end-----------打印后,run方法依然再进行打印

    HUC思梦
  • Spring boot with Service

    本文节选自《Netkiller java 手札》 5.7. Service 5.7.1. Application @ComponentScan({ "web",...

    netkiller old
  • 基于Springboot+jpa+thymeleaf+rabbit+SpringBoot mail 的简单项目

    Springboot+jpa+thymeleaf+rabbit 紧跟要求, 不需要使用Mybatis, 也不需要使用Eureka!!! 使用Rabbi...

    时间静止不是简史
  • springboot使用rabbitMQ(带回调)

    配置文件2:RabbitConstants(主要用于用户名、密码等值从配置文件获取,也可以用@Value方式)

    小尘哥
  • Redis整合Spring项目搭建实例

    本文介绍了如何使用注解的方式,将Redis缓存整合到你的Spring项目。 首先我们将使用jedis驱动,进而开始配置我们的Gradle。 group 'com...

    CSDN技术头条

扫码关注云+社区

领取腾讯云代金券