@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 注解形式