我正在尝试使用@Scheduled
方法来处理一些常规工作(每秒)。该方法的主体可以在超过一秒钟的时间内进行处理,我发现如果发生这种情况,下一次执行将不会开始。 Spring是否支持它,或者我应该将其更改为任何其他并行解决方案?
我试图将Scheduler更改为ConcurrentTaskScheduler
,但是看起来只有在我们很少使用schedules方法时,它才有帮助。
@Service
public class MainService {
@Scheduled(cron = "* * * * * *")
public void doSomething() {
//some logic which can takes more than 1 second
}
}
@Configuration
public class SchedulingConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(taskExecutor());
}
@Bean
public Executor taskExecutor() {
return new ConcurrentTaskScheduler(
Executors.newScheduledThreadPool(100));
}
}
第一次执行将花费额外的时间,第二次执行将不会开始。否则,一切正常。如何设置一种调度方法的并行执行?
答案 0 :(得分:1)
您可以引入一个异步组件,因此它不需要一秒钟的时间https://www.baeldung.com/spring-async
@Service
public class MainService {
@Autowired
private SomethingService somethingService;
@Scheduled(cron = "* * * * * *")
public void doSomething() {
somethingService.doSomething();
}
}
//Introduce an async component so it does not take 1 second. runs doSomething() in a separate thread
@Component
public class SomethingService {
@Async
public void doSomething() {
//some logic which can takes more than 1 second
}
}