gpt4 book ai didi

java - 如果其中一个调度程序需要更多时间来运行,Spring Boot 应用程序调度程序将无法工作

转载 作者:行者123 更新时间:2023-12-02 08:51:09 29 4
gpt4 key购买 nike

我在 Spring Boot 应用程序中有调度程序,如果任何一个调度程序需要时间来执行进程,则其余调度程序将无法在给定时间或特定时间间隔后工作。

    @Component
public class ScheduledTask(){

@Scheduled(cron ="0 00 01 1/1 * ? ")
public void method1(){
//process 1 do something.

}

@Scheduled(initialDelay =5000, fixedRate=900000)
public void method2(){
//process 2 do something.

}

@Scheduled(cron ="0 10 00 1/1 * ? ")
public void method3(){
//process 3 do something.

}

@Scheduled(cron ="0 10 00 1/1 * ? ")
public void method4(){
//process 4 do something.

}

@Scheduled(initialDelay =5000, fixedRate=900000)
public void method5(){
//process 5 do something.

}


}

说明:方法 5 和方法 2 每 15 分钟运行一次。但假设如果我的方法 5 需要更长的时间来处理,那么我的调度程序(方法 2)将不会在接下来的 15 分钟内启动。同样的方式,如果我的方法 5 花费太多时间来处理,并且方法 1、方法 3 和方法 4 的调度时间到了(例如上午 1 点),但此时调度程序仍然不会运行。

请让我知道如何使调度程序完美运行而不会出现任何失败。

最佳答案

默认情况下,Spring Boot Context 中的调度程序是单线程的。当您需要运行并行任务时,可以使用@Configuration类来实现SchedulingConfigurer接口(interface)。这允许访问底层的 ScheduledTaskRegistrar 实例。例如下面的例子演示了如何自定义Executor来执行并行计划任务。

@Configuration
@EnableScheduling
public class AppConfig implements SchedulingConfigurer {

@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(taskExecutor());
}

@Bean(destroyMethod="shutdown")
public Executor taskExecutor() {
return Executors.newScheduledThreadPool(100);
}
}

请阅读:https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/scheduling/annotation/EnableScheduling.html

关于java - 如果其中一个调度程序需要更多时间来运行,Spring Boot 应用程序调度程序将无法工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60763271/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com