在sb中,支持多种定时执行模式(cron, fixRate, fixDelay),开启也非常简单:
1、在Application或者其他Autoconfig上
@EnableScheduling
2、在需要定时执行的函数上
@Scheduled(fixedDelayString = "${config.timeInMs}")
@Scheduled(cron = "${config.cronStr}")
不过这里有个小坑,默认这个schedule只使用一个线程。
如果你在多个函数上使用了@Scheduled,那么一定是一个执行完毕,才能排下一个。这往往不是我们想要的效果。
可以这么搞:
@Configuration
@EnableScheduling
public class SchedulingConfiguration {
// 给sched用的,默认只有1个,时间太长会阻塞
@Bean(destroyMethod = "shutdown")
public Executor taskScheduler() {
return Executors.newScheduledThreadPool(3);
}
}
搞完之后,多个@Scheduled可以并发执行了,最高并发度是3,但是同一个@Schedule不会并发执行。很智能了。