@Scheduled (springboot 自带的 注解)
基于注解@Scheduled默认为单线程,开启多个任务时,任务的执行时机会受上一个任务执行时间的影响。
@EnableScheduling注解: 在配置类上使用,开启计划任务的支持(类上)。
@Scheduled注解: 来声明这是一个任务,包括 cron (可通过在线生成Cron表达式的工具:网址http://cron.qqe2.com/ 来生成自己想要的表达式。),fixDelay,fixRate 等类型(方法上,需先开启计划任务的支持)。
@Slf4j
@Configuration
public class TastOne {// 可以从IOC容器中获取到对应的Service@Autowiredprivate TestService testService;@Scheduled(cron = "0/1 * * * * ?")public void out(){log.info("正在执行定时任务输出方法..............");}
}
开启多线程
private final int corePoolSize = Runtime.getRuntime().availableProcessors();
/*** 此处方法名为Bean的名字,方法名无需固定* 因为是按TaskScheduler接口自动注入*/
@Bean
public TaskScheduler taskScheduler(){// Spring提供的定时任务线程池类ThreadPoolTaskScheduler taskScheduler=new ThreadPoolTaskScheduler();//设定最大可用的线程数目taskScheduler.setPoolSize(corePoolSize);return taskScheduler;
}
注意 禁止 启动类加@EnableAsync,Scheduled加@Async 这么使用
原因:@Async的使用场景和这个不同,用在这里并不合适,虽然也会实现多线程,但是会产生任务重复执行的问题,也会使 fixedDelay策略失效。
参考 spring 注解实现定时任务详解
xxl-job框架
在实际项目中,90%都是用的XXL-JOB,因为它易用性最好。
xxl-job官网
待续…
定时任务放线程池
spring task实现
springboot 注解形式