如何为基于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的@计划cron作业的时区? 背景: 我有一个工作,每天执行一次,比如下午2点,使用Spring的注释: 问题是2PM在不同的服务器之间不同,因为Spring在内部使用。此外,的JavaDoc 获取此主机的默认时区。默认时区的来源可能因实现而异。 换句话说,时区是不确定的。这可能取决于JVM实现、服务器时区配置、服务器位置和/或其他未知因素。因此,cron作业会在不同服务器
我有一个Spring Boot应用程序,它在一天中的特定时间运行许多作业(由CRON配置)。现在,我发现应用程序正在运行,但计划的作业没有得到执行。有没有办法在Spring中为带有@Scheduled的任务添加超时。 这样即使作业被阻塞或等待,也可以杀死它,这样其他线程就可以顺利执行了。线程可以等待指定的时间,然后如果任务还没有完成,就杀死线程。 我知道我可以通过以下方式增加池容量: execut
问题内容: Spring提供了使用注释按特定间隔计划和执行任务的可能性,例如 @Scheduled 有一种方便的方法来对该行为进行单元测试吗? 当然,我可以自己调用bean的方法,但是我想确保不会因配置错误等而遇到诸如多次执行之类的问题。 其他框架提供了自己快进时间的可能性。Activiti就是一个例子,你可以在其中致电 加快框架使用的时间。 春天有什么可比的吗? 本质上,我想做的是在单元测试(使
我正在使用一个属性PlaceholderConfigrer在Spring调度注释配置中获取java属性 当没有定义覆盖属性值时,有没有办法指定默认值? Spring 3支持${my.property: defaultValue}语法,但注释上不允许,我试图传递变量,但也不允许,注释属性Scheduled.cron的值必须是常量表达式
我有一个用Spring Boot和Maven构建的简单java web应用程序。每次我在pom中修改我的工件版本时。xml my web serviceendpoint更改。 例如,假设在控制器类中我有@Request estMap("/api/v1/")注释,并假设以下pom摘录 webserviceendpoint将是http://localhost/myConv-1.0.0/api/v1/.
如何为Spring AOP方面提供超时执行? MyAspect的记录器方法的执行时间不应超过30秒,如果不是,我会想要停止方法执行。我该怎么做? MyAspect代码: myService接口: MyServiceImpl: