Spring 计划任务:从 XML 到注释
Spring scheduled tasks: from XML to annotation
在我们的 Spring 网络应用程序中,我们正在从基于 XML 的配置转移到基于注释的配置。
我被这个 XML
定义的计划任务困住了
<task:scheduled-tasks scheduler="cacheScheduler">
<task:scheduled ref="currencyExchangeRateTask" method="cacheCurrencyExchangeRates" cron="0 0 8,20 * * *" />
</task:scheduled-tasks>
我们的网络应用程序中有多个调度程序。而这个任务需要在id为cacheScheduler
.
的调度器上执行
我现在有以下注释
@Scheduled(cron = "0 0 8,20 * * *")
public void cacheCurrencyExchangeRates() {
...
}
这是在默认调度程序上执行的。
如何在没有 XML 配置的情况下解决这个问题?
您不能直接通过 @Scheduled
完成。它不提供任何注释成员来指定 bean 引用名称。
相反,您必须使用 SchedulingConfigurer
。定义一个@Configuration
class。对于具有 @Scheduled
注释方法的组件类型的包,用 @EnableScheduling
和 @ComponentScan
注释它。然后让 class 实现 SchedulingConfigurer
。
ScheduledTaskRegistrar
provided through its configureTasks
方法可让您设置任务计划程序。
例如:
@Configuration
@ComponentScan("com.example.tasks")
@EnableScheduling
class Tasks implements SchedulingConfigurer {
@Bean
public TaskScheduler cacheScheduler() {
return new ThreadPoolTaskScheduler();
}
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setTaskScheduler(cacheScheduler());
}
}
通过此 @Configuration
class 发现的所有 @Scheduled
方法现在将使用其中定义的 TaskScheduler
。
如果您需要不同的 @Scheduled
方法来使用不同的 TaskScheduler
实例,您将需要不同的 @Configuration
classes,类似于需要不同的 <task:scheduled-tasks .../>
元素。
在我们的 Spring 网络应用程序中,我们正在从基于 XML 的配置转移到基于注释的配置。
我被这个 XML
定义的计划任务困住了<task:scheduled-tasks scheduler="cacheScheduler">
<task:scheduled ref="currencyExchangeRateTask" method="cacheCurrencyExchangeRates" cron="0 0 8,20 * * *" />
</task:scheduled-tasks>
我们的网络应用程序中有多个调度程序。而这个任务需要在id为cacheScheduler
.
我现在有以下注释
@Scheduled(cron = "0 0 8,20 * * *")
public void cacheCurrencyExchangeRates() {
...
}
这是在默认调度程序上执行的。
如何在没有 XML 配置的情况下解决这个问题?
您不能直接通过 @Scheduled
完成。它不提供任何注释成员来指定 bean 引用名称。
相反,您必须使用 SchedulingConfigurer
。定义一个@Configuration
class。对于具有 @Scheduled
注释方法的组件类型的包,用 @EnableScheduling
和 @ComponentScan
注释它。然后让 class 实现 SchedulingConfigurer
。
ScheduledTaskRegistrar
provided through its configureTasks
方法可让您设置任务计划程序。
例如:
@Configuration
@ComponentScan("com.example.tasks")
@EnableScheduling
class Tasks implements SchedulingConfigurer {
@Bean
public TaskScheduler cacheScheduler() {
return new ThreadPoolTaskScheduler();
}
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setTaskScheduler(cacheScheduler());
}
}
通过此 @Configuration
class 发现的所有 @Scheduled
方法现在将使用其中定义的 TaskScheduler
。
如果您需要不同的 @Scheduled
方法来使用不同的 TaskScheduler
实例,您将需要不同的 @Configuration
classes,类似于需要不同的 <task:scheduled-tasks .../>
元素。