在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;
}
}
答案 0 :(得分:1)
第二种方法更好,因为您让Spring处理类 TaskScheduler
,然后您可以在其他类中使用@Autowired
来使用它,
@Autowired
TaskScheduler taskScheduler
答案 1 :(得分:1)
为什么在方式2中未调用ThreadPoolTaskScheduler对象的初始化方法?
因为现在,ThreadPoolTaskScheduler是一个Bean,并且遵循Bean生命周期。
您可以看到ThreadPoolTaskScheduler实现了InitializingBean。 因此,在spring构建此bean之后,它将调用afterPropertiesSet()方法。
如果您检查ThreadPoolTaskScheduler的代码,则会看到:
public void afterPropertiesSet() {
this.initialize();
}