我将使用Java Spring中的@Scheduled注解来定时执行任务,但如果任务速度较慢,则Spring默认情况下不会按照固定速率执行该任务。请问,是否有一些设置可以添加到我的Spring配置中以更改此行为?
示例:
我有一个解决方案,但看起来不太理想。基本上,我只是用线程池替换了默认的单线程执行器,然后我让一个计划方法调用异步方法,因为@Async注释允许并发执行:
@Service
public class MyTask{
@Scheduled(fixedRate = 1000)
public void doIt(){
// this sometimes takes >1000ms, in which case the next execution is late
...
}
}
我有一个解决方案,但看起来不太理想。基本上,我只是用线程池替换了默认的单线程执行器,然后我让一个计划方法调用异步方法,因为@Async注释允许并发执行:
@Service
public class MyTask{
@Async
public void doIt(){
// this sometimes takes >1000ms, but the next execution is on time
...
}
}
@Service
public class MyTaskScheduler{
...
@Scheduled(fixedRate = 1000)
public void doIt(){
myTask.doIt();
}
}
@Configuration
@EnableScheduling
@EnableAsync
public class MySpringJavaConfig{
@Bean(destroyMethod = "shutdown")
public Executor taskScheduler() {
return Executors.newScheduledThreadPool(5);
}
}
我的现实场景比较枯燥:在我的生产代码中,有一个任务,根据当前工作负载,需要花费10毫秒到10分钟不等的时间。理想情况下,我希望每1000毫秒从池中捕获一个新线程,以便随着工作负载增加并发线程数量也会增加。显然,我已经设置了线程数上限(包括其他控制)以避免事情失控。