定时任务和常见定时任务区别
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次)