首页 > 解决方案 > 如何强制 Spring Scheduled 并行执行单个方法?

问题描述

我正在尝试使用@Scheduled方法来处理一些常规工作(每秒)。此方法的主体可以处理超过一秒钟,我看到如果发生这种情况,下一次执行不会开始。Spring 是否支持它,或者我应该将其更改为任何其他并发解决方案?

我曾尝试将 Scheduler 更改为ConcurrentTaskScheduler,但看起来只有在我们的 scheduler 方法很少时才有帮助。

@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));
    }
}

一旦第一次执行花费了额外的时间,第二次执行将不会开始。否则,一切正常。如何设置一种计划方法的并行执行?

标签: javaspringconcurrencyparallel-processingspring-scheduled

解决方案


您可以引入一个异步组件,这样它就不需要 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   
    }
}

推荐阅读