@Scheduled (springboot 自带的 注解)
基于注解@Scheduled默认为单线程,开启多个任务时,任务的执行时机会受上一个任务执行时间的影响。
@EnableScheduling注解: 在配置类上使用,开启计划任务的支持(类上)。
@Scheduled注解: 来声明这是一个任务,包括 cron (可通过在线生成Cron表达式的工具:网址http://cron.qqe2.com/ 来生成自己想要的表达式。),fixDelay,fixRate 等类型(方法上,需先开启计划任务的支持)。
@Slf4j
@Configuration
public class TastOne {
// 可以从IOC容器中获取到对应的Service
@Autowired
private 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策略失效。
xxl-job框架
在实际项目中,90%都是用的XXL-JOB,因为它易用性最好。
xxl-job官网
待续…