繁体   English   中英

Spring计划任务:从XML到注释

[英]Spring scheduled tasks: from XML to annotation

在我们的Spring Web应用程序中,我们正在从基于XML的配置转向基于Annotation的配置。

我坚持使用这个XML定义的计划任务

<task:scheduled-tasks scheduler="cacheScheduler">
    <task:scheduled ref="currencyExchangeRateTask" method="cacheCurrencyExchangeRates" cron="0 0 8,20 * * *" />
</task:scheduled-tasks>

我们的Web应用程序中有多个调度程序。 此任务需要在具有id cacheScheduler的调度程序上执行。

我现在有以下注释

@Scheduled(cron = "0 0 8,20 * * *")
public void cacheCurrencyExchangeRates() {
    ...
}

这是在默认调度程序上执行的。

如果没有XML配置,如何解决这个问题呢?

你不能直接通过@Scheduled来做到这一点。 它不提供任何注释成员来指定bean引用名称。

相反,您必须使用SchedulingConfigurer 定义一个@Configuration类。 使用@EnableScheduling@ComponentScan为包含@Scheduled注释方法的组件类型的包添加注释。 然后让类实现SchedulingConfigurer

通过其configureTasks方法提供的ScheduledTaskRegistrar允许您设置任务计划程序。

例如:

@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类发现的所有@Scheduled方法现在将使用其中定义的TaskScheduler

如果您需要不同的@Scheduled方法来使用不同的TaskScheduler实例,则需要不同的@Configuration类,类似于需要不同的<task:scheduled-tasks .../>元素。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM