Spring Boot-Scheduler配置

时间:2018-12-05 10:41:09

标签: java spring multithreading spring-boot spring-scheduled

在Spring Boot应用程序中,我有几个计划任务。我希望它们同时运行,因此在我的配置中,我应该创建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对象的初始化方法?

2 个答案:

答案 0 :(得分:1)

第二种方法更好,因为您让Spring处理类 TaskScheduler,然后您可以在其他类中使用@Autowired来使用它,

@Autowired
TaskScheduler taskScheduler  

答案 1 :(得分:1)

为什么在方式2中未调用ThreadPoolTask​​Scheduler对象的初始化方法?

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

您可以看到ThreadPoolTask​​Scheduler实现了InitializingBean。 因此,在spring构建此bean之后,它将调用afterPropertiesSet()方法。

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

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