我正在使用Spring并且在应用程序中有serveral @Scheduled类:

@Component
public class CheckHealthTask {

    @Scheduled(fixedDelay = 10_000)
    public void checkHealth() {
        //stuff inside
    }
}


@Component
public class ReconnectTask {
    @Scheduled(fixedDelay = 1200_000)
     public void run() {
           //stuff here
      }
}

我希望第一个任务使用2个线程的池,而第二个任务使用单个线程。我不希望第二个任务卡住,因为第一个任务使用了所有可用线程,并且计算速度比fixedDelay时间慢。
当然,我只是一个让您明白这一点的例子。

我可以使用这样的配置类:
@Configuration
@EnableScheduling
public class TaskConfig implements SchedulingConfigurer {

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

    @Bean
    public Executor taskScheduler() {
        ThreadPoolTaskScheduler t = new ThreadPoolTaskScheduler();
        t.setPoolSize(2);
        t.setThreadNamePrefix("taskScheduler - ");
        t.initialize();
        return t;
    }

}

我不明白如何为每个@Scheduled组件定义不同的配置。

最佳答案

第一项任务不需要2个线程的池。

如果所有任务都使用固定的延迟,则无需为不同的任务分配不同的池。 fixedDelay的工作方式如下:

@Scheduled(fixedDelay=5000)
public void doSomething() {
// something that should execute periodically
}

将每隔5秒钟以固定的延迟调用一次,这意味着将从每个先前调用的完成时间开始计算该时间段。

每个任务仅使用一个线程,如果您有两个线程,则一个线程将无法容纳另一个线程以用于另一任务。

10-02 04:55