开发者

SpringBoot实现设置动态定时任务的方法详解

目录
  • 一、第一种
    • 1. 引入依赖
    • 2. 添加注解
    • 3. application.yml
    • 4. task-config.ini
    • 5. 定时任务执行类
    • 6. 编写一个接口
  • 二、第二种
    • 2.1. 调整定时任务类
    • 2.2. 添加更新方法
    • 2.3. 测试
  • 三、推荐方案

    一、第一种

    1. 引入依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
            <optional>true</optional>
        </dependency>
    
        <!-- spring boot 2.3版本后,如果需要使用校验,需手动导入validation包-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>
    
        <dependency>
            <groupId>org.projectlombok</groupId&gjst;
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>
    

    2. 添加注解

    @EnableScheduling
    @SpringBootApplication
    public class DemoApplication {
     
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
            System.out.println("(*^▽^*)启动成功!!!(〃'▽'〃)");
        }
    }
    

    3. application.yml

    只定义了服务端口:

    server: port: 8089

    4. task-config.ini

    定时任务执行时间配置文件:task-config.ini:

    printTime.cron=0/10 * * * * ?

    5. 定时任务执行类

    package com.gblfy.demo.task;
     
    import lombok.Data;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.PropertySource;
    import org.springframework.scheduling.Trigger;
    import org.springframework.scheduling.TrigphpgerContext;
    import org.springframework.scheduling.annotation.SchedulingConfigurer;
    import org.springframework.scheduling.config.ScheduledTaskRegistrar;
    import org.springframework.scheduling.support.CronTrigger;
    import org.springframework.stereotype.Component;
     
    import Java.time.LocalDateTime;
    import java.util.Date;
     
    /**
     * 定时任务
     * @author gblfy
     */
    @Data
    @Slf4j
    @Component
    @PropertySource("classpath:/task-config.ini")
    public class ScheduleTask implements SchedulingConfigurer {
     
        @Value("${printTime.cron}")
        private String cron;
     
        @Override
        public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
            // 动态使用cron表达式设置循环间隔
            taskRegistrar.addTriggerTask(new Runnable() {
                @Override
                public void run() {
                    log.info("Current time: {}", LocalDateTime.now());
                }
            }, new Trigger() {
                @Ovhttp://www.devze.comerride
                public Date nextExecutionTime(TriggerContext triggerContext) {
                    // 使用CronTrigger触发器,可动态修改cron表达式来操作循环规则
                    CronTrigger cronTrigger = new CronTrigger(cron);
                    Date nextExecutionTime = cronTrigger.nextExecutionTime(triggerContext);
                    return nextExecutionTime;
                }
            });
        }
    }
    

    6. 编写一个接口

    使得可以通过调用接口动态修改该定时任务的执行时间:

    package com.face.controller;
    
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * @author gblfy
     */
    @Slf4j
    @RestController
    @RequestMapping("/test")
    public class TestController {
    
        private final ScheduleTask scheduleTask;
    
        @Autowired
        public TestController(ScheduleTask scheduleTask) {
            this.scheduleTask = scheduleTask;
        }
        //http://localhost:8089/test/updateCron?cron=0/5%20*%20*%20*%20*%20?
        @GetMapping("/updateCron")
        public String updateCron(String cron) {
            log.info("new cron :{}", cron);
            scheduleTask.setCron(cron);
            return "ok";
        }
        //http://localhost:8089/test/updateTimer?timer=5000
        @GetMapping("/updateTimer")
        public String updateTimer(Long timer) {
            log.info("new timer :{}", timer);
            scheduleTask.setTimer(timer);
            return "ok";
        }
    }
    
    

    启动项目,可以看到任务每10秒执行一次: 访问接口,传入请求参数cron表达式,将定时任务修改为15秒执行一次: 可以看到任务变成了15秒执行一次

    http://localhost:8089/test/updateCron?cron=0/5 * * * * ?
    

    二、第二种

    除了上面的借助cron表达式的方法,还有另一种触发器,区别于CronTrigger触发器,该触发器可随意设置循环间隔时间,不像cron表达式只能定义小于等于间隔59秒。

    2.1. 调整定时任务类

    package com.face.controller;
    
    import lombok.Data;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.PropertySource;
    import org.springframework.scheduling.Trigger;
    import org.springframework.scheduling.TriggerContext;
    import org.springframework.scheduling.annotation.SchedulingConfigurer;
    import org.springframework.scheduling.config.ScheduledTaskRegistrar;
    import org.springframework.scheduling.support.CronTrigger;
    import org.springframework.scheduling.support.PeriodicTrigger;
    import org.springframework.stereotype.Component;
    
    import java.time.LocalDateTime;
    import java.util.Date;
    
    /**
     * 定时任务
     * @author wl
     */
    @Data
    @Slf4j
    @Component
    @PropertySource("classpath:/task-config.ini")
    public class ScheduleTask implements SchedulingConfigurer {
    
        @Value("${printTiDKsPVRTme.cron}")
        private String cron;
        private Long timer = 10000L;
    
        @Override
        public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
            // 动态使用cron表达式设置循环间隔
            taskRegistrar.addTriggerTask(new Runnable() {
                @Override
                public void run() {
                    log.info("Current time: {}", LocalDateTime.now());
                }
            }, new Trigger() {
                @Override
                public Date nextExecutionTime(TriggerContext triggerContext) {
                    // 使用CronTrigger触发器,可动态修改cron表达式来操作循环规则
    //                CronTrigger cronTrigger = new CronTrigger(cron);
    //                Date nextExecutionTime = cronTrigger.nextExecutionTime(triggerConphptext);
    
                    // 使用不同的触发器,为设置循环时间的关键,区别于CronTrigger触发器,该触发器可随意设置循环间隔时间,单位为毫秒
                    PeriodicTrigger periodicTrigger = new PeriodicTrigger(timer);
                    Date nextExecutionTime = periodicTrigger.nextExecutionTime(triggerContext);
                    return nextExecutionTime;`在这里插入代码片`
                }
            });
        }
    }
    
    

    2.2. 添加更新方法

      @GetMapping("/updateTimer")
        public String updateTimer(Long timer) {
            log.info("new timer :{}", timer);
            scheduleTask.setTimer(timer);
            return "ok";
        }
    

    2.3. 测试

    //localhost:8089/test/updateTimer?timer=5000

    三、推荐方案

    上面有很多弊端,弊端定时任务监控,单机故障等等,建议采用分布式任务调度框架xxl-job

    到此这篇关于SpringBoot实现设置动态定时任务的方法详解的文章就介绍到这了,更多相关SpringBoot设置动态定时任务内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜