提供Spring @Scheduled的时区?

如何为基于Spring的@Scheduled cron作业配置时区?

我有一份使用Spring的@Scheduled注释每天执行一次的工作,例如下午2点:

@Scheduled(cron = "0 0 14 * * *")

public void execute() {

// do scheduled job

}

问题是2PM在不同服务器之间不同,因为Spring在TimeZone.getDefault()

内部使用。此外,JavaDoc中的TimeZone.getDefault()

规定:

获取此主机的默认TimeZone。默认TimeZone的来源可能会因实现方式而异。

换句话说,未确定时区。它可能取决于JVM实现,服务器时区配置,服务器位置和/或其他未知因素。因此,除非有一种方法可以明确设置应使用的时区,否则cron作业会在不同服务器上的不同时间触发。

我正在使用Spring 3.2.2。


从Spring 4开始,Spring

Jira问题SPR-10456已解决。因此,正是出于这个目的,@Scheduled注释具有新的zone属性。

回答:

原来,我不能使用@Scheduled注释,但是我实现了一种解决方法。SchedulingConfigurer的JavaDoc中指出:

[SchedulingConfigurer是]通常用于设置要执行计划任务时使用的特定TaskScheduler

Bean,或用于以编程方式注册计划任务,而不是使用@Scheduled批注的声明方法。

接下来,我更改了cron作业以实现Runnable接口,然后更新了配置文件以实现SchedulingConfigurer,如下所示:

@Configuration

@EnableScheduling

@ComponentScan("package.that.contains.the.runnable.job.bean")

public class JobConfiguration implements SchedulingConfigurer {

private static final String cronExpression = "0 0 14 * * *";

private static final String timeZone = "CET";

@Autowired

private Runnable cronJob;

@Bean

CronTrigger cronTrigger() {

return new CronTrigger(cronExpression, TimeZone.getTimeZone(timeZone));

}

@Override

public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {

taskRegistrar.addCronTask(new CronTask(job, cronTrigger()));

}

}

请阅读@EnableScheduling的JavaDoc

了解更多信息。


从Spring 4开始,Spring

Jira问题SPR-10456已解决。因此,正是出于这个目的,@Scheduled注释具有新的zone属性,例如

@Scheduled(cron = "0 0 14 * * *", zone = "CET")

public void execute() {

// do scheduled job

}

以上是 提供Spring @Scheduled的时区? 的全部内容, 来源链接: utcz.com/qa/422636.html

回到顶部