定時任務和常見定時任務區別
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次)

