如何强制Spring Scheduled运行单个方法的并行执行?

时间:2019-06-26 14:50:28

标签: java spring concurrency parallel-processing spring-scheduled

我正在尝试使用@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));
    }
}

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

1 个答案:

答案 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   
    }
}