2016-12-06 79 views
3

在我们的Spring Web应用程序中,我们正在从基于XML的配置转换为基于Annotation的配置。春季计划任务:从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配置的情况下解决这个问题?

回答

4

你不能直接通过@Scheduled来完成。它不提供任何注释成员来指定bean引用名称。您需要使用SchedulingConfigurer。定义一个@Configuration类。用@EnableScheduling@ComponentScan对包含@Scheduled带注释方法的组件类型的包进行注释。然后让班级执行SchedulingConfigurer

通过configureTasks方法提供的ScheduledTaskRegistrar可让您设置任务调度程序。现在将使用中的TaskScheduler定义

@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类发现方法:

例如。

如果你需要不同的方法@Scheduled使用不同TaskScheduler情况下,你需要不同的@Configuration类,同样需要不同<task:scheduled-tasks .../>元素。