在我们的Spring网络应用程序中,我们正在从基于XML的配置转向基于注释的配置。
我坚持使用此XML定义的计划任务
<task:scheduled-tasks scheduler="cacheScheduler">
<task:scheduled ref="currencyExchangeRateTask" method="cacheCurrencyExchangeRates" cron="0 0 8,20 * * *" />
</task:scheduled-tasks>
我们的网络应用程序中有多个调度程序。此任务需要在标识为cacheScheduler
的调度程序上执行。
我现在有以下注释
@Scheduled(cron = "0 0 8,20 * * *")
public void cacheCurrencyExchangeRates() {
...
}
这是在默认调度程序上执行的。
如果没有XML配置,如何解决这个问题?
答案 0 :(得分:4)
您无法直接通过@Scheduled
执行此操作。它没有提供任何注释成员来指定bean引用名称。
相反,您必须使用SchedulingConfigurer
。定义@Configuration
类。对于具有@EnableScheduling
带注释方法的组件类型的包,使用@ComponentScan
和@Scheduled
对其进行注释。然后让类实现SchedulingConfigurer
。
通过ScheduledTaskRegistrar
方法提供的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());
}
}
通过此@Scheduled
课程发现的所有@Configuration
方法现在都将使用其中定义的TaskScheduler
。
如果您需要使用不同的@Scheduled
方法来使用不同的TaskScheduler
个实例,则需要使用不同的@Configuration
类,类似于需要不同的<task:scheduled-tasks .../>
元素。