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次)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM