• 技术文章 >Java >java教程

    SpringBoot动态管理定时任务的实现代码

    不言不言2018-09-11 14:20:58原创3063
    本篇文章给大家带来的内容是关于SpringBoot动态管理定时任务的实现代码,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

    SpringBoot动态管理定时任务

    首先使用@EnableScheduling 开启定时任务

    package com.fighting;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.scheduling.annotation.EnableScheduling;
    
    @SpringBootApplication
    @EnableScheduling
    public class ScheduledApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ScheduledApplication.class, args);
        }
    }

    配置日志级别

    logging.level.com= debug
    logging.file=springboot-scheduled.log

    固定周期定时任务

    package com.fighting;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.stereotype.Component;
    
    /**
     * Spring静态周期定时任务
     *
     * @author fighting
     * @date 2018-09-11
     */
    @Component
    public class SpringStaticCronTask {
    
        public static final Logger logger = LoggerFactory.getLogger(SpringStaticCronTask.class);
    
    
        @Scheduled(cron = "0/5 * * * * ?")
        public void staticCornTask() {
            logger.debug("staticCronTask is running...");
        }
    
    
    }

    动态修改定时周期

    实现SchedulingConfigurer 接口,重写 configureTasks方法

    package com.fighting;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.scheduling.annotation.SchedulingConfigurer;
    import org.springframework.scheduling.config.ScheduledTaskRegistrar;
    import org.springframework.scheduling.support.CronTrigger;
    import org.springframework.stereotype.Component;
    
    /**
     * 动态定时任务
     *
     * @author fighting
     * @date 2018-09-11
     */
    @Component
    public class SpringDynamicCronTask implements SchedulingConfigurer {
    
        private static final Logger logger = LoggerFactory.getLogger(SpringDynamicCronTask.class);
    
        private static String cron = "0/5 * * * * ?";
    
    
        @Override
        public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
            scheduledTaskRegistrar.addTriggerTask(() -> {
                // 任务逻辑
                logger.error("dynamicCronTask is running...");
            }, triggerContext -> {
                // 任务触发,在这里可修改任务的执行周期,因为每次调度都会执行这里
                CronTrigger cronTrigger = new CronTrigger(cron);
                return cronTrigger.nextExecutionTime(triggerContext);
            });
    
        }
    
    
        public SpringDynamicCronTask() {
            //模拟业务修改周期,可以在具体业务中修改参数cron
            new Thread(() -> {
                try {
                    Thread.sleep(15000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                cron = "0/2 * * * * ?";
            }).start();
        }
    
    }

    观察打印结果,周期变了,但是项目没有重启。

    2018-09-11 13:36:50.009 DEBUG 16708 --- [pool-1-thread-1] com.fighting.SpringStaticCronTask        : staticCronTask is running...
    2018-09-11 13:36:50.010 ERROR 16708 --- [pool-1-thread-1] com.fighting.SpringDynamicCronTask       : dynamicCronTask is running...
    2018-09-11 13:36:55.001 DEBUG 16708 --- [pool-1-thread-1] com.fighting.SpringStaticCronTask        : staticCronTask is running...
    2018-09-11 13:36:55.002 ERROR 16708 --- [pool-1-thread-1] com.fighting.SpringDynamicCronTask       : dynamicCronTask is running...
    2018-09-11 13:37:00.009 DEBUG 16708 --- [pool-1-thread-1] com.fighting.SpringStaticCronTask        : staticCronTask is running...
    2018-09-11 13:37:00.016 ERROR 16708 --- [pool-1-thread-1] com.fighting.SpringDynamicCronTask       : dynamicCronTask is running...
    2018-09-11 13:37:05.016 DEBUG 16708 --- [pool-1-thread-1] com.fighting.SpringStaticCronTask        : staticCronTask is running...
    2018-09-11 13:37:05.016 ERROR 16708 --- [pool-1-thread-1] com.fighting.SpringDynamicCronTask       : dynamicCronTask is running...
    2018-09-11 13:37:06.013 ERROR 16708 --- [pool-1-thread-1] com.fighting.SpringDynamicCronTask       : dynamicCronTask is running...
    2018-09-11 13:37:08.008 ERROR 16708 --- [pool-1-thread-1] com.fighting.SpringDynamicCronTask       : dynamicCronTask is running...
    2018-09-11 13:37:10.002 ERROR 16708 --- [pool-1-thread-1] com.fighting.SpringDynamicCronTask       : dynamicCronTask is running...
    2018-09-11 13:37:10.003 DEBUG 16708 --- [pool-1-thread-1] com.fighting.SpringStaticCronTask        : staticCronTask is running...
    2018-09-11 13:37:12.002 ERROR 16708 --- [pool-1-thread-1] com.fighting.SpringDynamicCronTask       : dynamicCronTask is running...
    2018-09-11 13:37:14.006 ERROR 16708 --- [pool-1-thread-1] com.fighting.SpringDynamicCronTask       : dynamicCronTask is running...
    2018-09-11 13:37:15.015 DEBUG 16708 --- [pool-1-thread-1] com.fighting.SpringStaticCronTask        : staticCronTask is running...
    2018-09-11 13:37:16.012 ERROR 16708 --- [pool-1-thread-1] com.fighting.SpringDynamicCronTask       : dynamicCronTask is running...
    2018-09-11 13:37:18.002 ERROR 16708 --- [pool-1-thread-1] com.fighting.SpringDynamicCronTask       : dynamicCronTask is running...

    相关推荐:

    SpringBoot 调度任务及常用任务表达式

    通过reidis管理定时任务

    以上就是SpringBoot动态管理定时任务的实现代码的详细内容,更多请关注php中文网其它相关文章!

    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    专题推荐:SpringBoot
    上一篇:Java中finally与return的执行顺序解析(代码示例) 下一篇:Java中Spring Boot有什么优势?
    大前端线上培训班

    相关文章推荐

    • SpringBoot+Thymeleaf实现html文件引入(类似include功能)_html/css_WEB-ITnose• 解析springboot使用thymeleaf时报html没有结束标签• 详解SpringBoot中实现依赖注入功能• 分享几个在IDEA上面搭建SpringBoot的web-mvc项目常见问题• 详解springboot集成mybatis的代码实例• 深度解析springboot如何配置多个redis连接

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网