mat*_*sev 41 java cron timezone spring scheduling
如何为基于Spring的@Scheduled cron作业配置时区?
背景:
我有一份工作,每天执行一次,比如说下午2点,使用Spring的@Scheduled
注释:
@Scheduled(cron = "0 0 14 * * *")
public void execute() {
// do scheduled job
}
Run Code Online (Sandbox Code Playgroud)
问题是不同服务器之间的下午2点不同,因为Spring在TimeZone.getDefault()
内部使用.而且,JavaDoc的TimeZone.getDefault()
状态表明:
获取此主机的默认TimeZone.默认TimeZone的来源可能因实施而异.
换句话说,不确定时区.它可能取决于JVM实现,服务器时区配置,服务器位置和/或其他未知因素.因此,cron作业在不同服务器上的不同时间触发,除非有办法明确设置应该使用哪个时区?
我使用的是Spring 3.2.2.
更新
截至春季4,Spring Jira问题SPR-10456已经解决.因此,@Scheduled
注释具有新的区域属性,正是出于此目的.
mat*_*sev 31
事实证明我无法使用@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()));
}
}
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请阅读@EnableScheduling的JavaDoc .
更新
截至春季4,Spring Jira问题SPR-10456已经解决.因此,@Scheduled
注释具有新的区域属性,正是出于此目的.
Vla*_*sec 19
zone
注释中有元素@Scheduled
,从4.0版开始.
您可以将时区插入可以接受的字符串java.util.TimeZone
.
你的代码应该是这样的:
@Scheduled(cron = "0 0 14 * * *", zone = "GMT-5")
public void execute() {
// do scheduled job
}
Run Code Online (Sandbox Code Playgroud)
“Zone”将是所需国家/地区的时区。
这是一个关于 Spring 计划任务的很好的教程:
归档时间: |
|
查看次数: |
23946 次 |
最近记录: |