Spring 引导 - 调度程序配置

Spring Boot - Scheduler configuration

在Spring启动应用程序中我有几个计划任务。我希望它们同时 运行,所以在我的配置中我应该创建 ThreadPoolTaskScheduler 对象并将其注册到 ScheduledTaskRegistrar 中。 我找到了两种方法:

方式 1

@Configuration
@EnableScheduling
public class SchedulerConfig implements SchedulingConfigurer {

    private final int POOL_SIZE = 10;

    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {

        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();

        scheduler.setPoolSize(POOL_SIZE);
        scheduler.setThreadNamePrefix("name");
        scheduler.initialize();

        scheduledTaskRegistrar.setTaskScheduler(scheduler);
    }
}

方式 2

@Configuration
@EnableScheduling
public class SchedulerConfig implements SchedulingConfigurer {

    private final int POOL_SIZE = 10;

    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {

        scheduledTaskRegistrar.setTaskScheduler(this.poolScheduler());
    }

    @Bean
    public TaskScheduler poolScheduler() {

        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();

        scheduler.setPoolSize(POOL_SIZE);
        scheduler.setThreadNamePrefix("name");

        return scheduler;
    }
}
  1. 哪种方式更好或者他们做的完全一样?
  2. 为什么方式2中没有调用ThreadPoolTask​​Scheduler对象的initialize方法?

第二种方法更好,因为你 让 Spring 处理 class TaskScheduler 以后你可以在其他 classes 使用 @Autowired 作为:

@Autowired
TaskScheduler taskScheduler  

为什么方式2中没有调用ThreadPoolTask​​Scheduler对象的initialize方法?

因为现在,ThreadPoolTask​​Scheduler 是一个 bean,它遵循 Bean 生命周期。

可以看到ThreadPoolTask​​Scheduler实现了InitializingBean。 所以在 spring 构建这个 bean 之后,它会调用 afterPropertiesSet() 方法。

如果您检查 ThreadPoolTask​​Scheduler 的代码,您会看到:

public void afterPropertiesSet() {
    this.initialize();
}