SpringBoot2.x 定时任务

定时任务和常见定时任务区别

1、常见定时任务 Java自带的java.util.Timer类
timer:配置比较麻烦,时间延后问题
timertask:不推荐

2、Quartz框架
配置更简单
xml或者注解

3、SpringBoot使用注解方式开启定时任务
1)启动类里面 @EnableScheduling开启定时任务,自动扫描
2)定时任务业务类 加注解 @Component被容器扫描
3)定时执行的方法加上注解 @Scheduled(fixedRate=2000) 定期执行一次

 

先介绍第三种定时任务(spring):

 

1、cron 定时任务表达式 @Scheduled(cron="*/1 * * * * *") 表示每秒
1)cron工具 https://tool.lu/crontab/    或者 http://cron.qqe2.com/
2、fixedRate: 定时多久执行一次(上一次开始执行时间点后xx秒再次执行;)
3、fixedDelay: 上一次执行结束时间点后xx秒再次执行
4、fixedDelayString: 字符串形式,可以通过配置文件指定

 

下面上代码:

一、添加配置任务线程池,开启同步任务:

 

@Configuration
public class ScheduleConfig implements SchedulingConfigurer {


    /**
     * 添加定时任务到线程池
     * @param scheduledTaskRegistrar
     */
    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
        scheduledTaskRegistrar.setTaskScheduler(getScheduler());
    }

    /**
     * 线程池配置类
     * @return
     */
    @Bean(destroyMethod = "shutdown")
    public ThreadPoolTaskScheduler getScheduler(){
        ThreadPoolTaskScheduler taskScheduler=new ThreadPoolTaskScheduler();
        taskScheduler.setPoolSize(100);
        taskScheduler.setAwaitTerminationSeconds(60);
        taskScheduler.setThreadNamePrefix("task-");
        taskScheduler.setWaitForTasksToCompleteOnShutdown(true);
        return taskScheduler;
    }

    /**
     * 设置定时触发器
     * @return
     */
    private Trigger getTrigger(String cron){
        return new Trigger() {
            @Override
            public Date nextExecutionTime(TriggerContext triggerContext) {
                CronTrigger trigger=new CronTrigger(cron);
                return trigger.nextExecutionTime(triggerContext);
            }
        };
    }
}

 

二、建立任务执行类(实现逻辑):

 

 

public class DynamicTask1 implements Runnable{


    @Override
    public void run() {
        System.out.print("定时任务1");
    }
}


public class DynamicTask2 implements Runnable {


    @Override
    public void run() {
        System.out.print("定时任务2");
    }
}

三、建立Controller,动态配置定时时间(mysql):

@RestController
@RequestMapping(value = "api/")
public class ScheduleController {

    @Autowired
    private ThreadPoolTaskScheduler threadPoolTaskScheduler;

    @Autowired
    private CronService cronService;

    private ScheduledFuture<?> DynamicTask1Future;

    private ScheduledFuture<?> DynamicTask2Future;

    /**
     * 运行定时任务
     * @return
     */
    @GetMapping(value = "/sch1.do")
    public Object run1(){


        //获取时间间隔
        String cron=cronService.findByCode("task1").getCron();

        //添加运行时间
        DynamicTask1Future=threadPoolTaskScheduler.schedule(new DynamicTask1(),new CronTrigger(cron));

        return new ReturnResult().Success();

    }

    @GetMapping(value = "/sch2.do")
    public Object run2(){


        //获取时间间隔
        String cron=cronService.findByCode("task2").getCron();

        //添加运行时间
        DynamicTask2Future=threadPoolTaskScheduler.schedule(new DynamicTask2(),new CronTrigger(cron));

        return new ReturnResult().Success();

    }


    /**
     * 关闭定时任务
     * @param future
     * @return
     */
    @GetMapping(value = "/stop.do/{future}")
    public Object stop(@PathVariable("future") String future){

        if(future.equals("DynamicTask1Future")) {
            if(DynamicTask1Future != null) {
                DynamicTask1Future.cancel(true);
            }
        }
        if(future.equals("DynamicTask2Future")) {
            if(DynamicTask2Future != null) {
                DynamicTask2Future.cancel(true);
            }
        }

        return new ReturnResult().Success();
    }


    /**
     * 更改时间马上执行定时任务
     * @param future
     * @return
     */
    @GetMapping(value = "/update.do/{future}")
    public Object change(@PathVariable("future") String future){

        String cron="0/8 * * * * ?";
        stop(future);
        if(future.equals("DynamicTask1Future")) {
            cronService.updateById(cron,1);
            DynamicTask1Future = threadPoolTaskScheduler.schedule(new DynamicTask1(), new CronTrigger(cron));
        }
        if(future.equals("DynamicTask2Future")) {
            cronService.updateById(cron,2);
            DynamicTask2Future = threadPoolTaskScheduler.schedule(new DynamicTask2(), new CronTrigger(cron));
        }

        return new ReturnResult().Success();
    }


    /**
     * 默认启动
     */
    @PostConstruct
    private void autoRun(){
        run1();
    }
}

 四、结果,这里我配置任务1运行时间(8秒一次),任务2运行时间(1秒1次)

posted @ 2018-10-19 14:14  M_Blood  阅读(2790)  评论(0编辑  收藏  举报