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;
}
}
- 哪种方式更好或者他们做的完全一样?
- 为什么方式2中没有调用ThreadPoolTaskScheduler对象的initialize方法?
第二种方法更好,因为你 让 Spring 处理 class TaskScheduler
以后你可以在其他 classes 使用 @Autowired
作为:
@Autowired
TaskScheduler taskScheduler
为什么方式2中没有调用ThreadPoolTaskScheduler对象的initialize方法?
因为现在,ThreadPoolTaskScheduler 是一个 bean,它遵循 Bean 生命周期。
可以看到ThreadPoolTaskScheduler实现了InitializingBean。
所以在 spring 构建这个 bean 之后,它会调用 afterPropertiesSet() 方法。
如果您检查 ThreadPoolTaskScheduler 的代码,您会看到:
public void afterPropertiesSet() {
this.initialize();
}
在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;
}
}
- 哪种方式更好或者他们做的完全一样?
- 为什么方式2中没有调用ThreadPoolTaskScheduler对象的initialize方法?
第二种方法更好,因为你 让 Spring 处理 class TaskScheduler
以后你可以在其他 classes 使用 @Autowired
作为:
@Autowired
TaskScheduler taskScheduler
为什么方式2中没有调用ThreadPoolTaskScheduler对象的initialize方法?
因为现在,ThreadPoolTaskScheduler 是一个 bean,它遵循 Bean 生命周期。
可以看到ThreadPoolTaskScheduler实现了InitializingBean。 所以在 spring 构建这个 bean 之后,它会调用 afterPropertiesSet() 方法。
如果您检查 ThreadPoolTaskScheduler 的代码,您会看到:
public void afterPropertiesSet() {
this.initialize();
}