我需要定期运行一个任务,所以我查了一下@Scheduled
注释。Spring @Scheduled fixedRate给出奇怪的结果?
我用下面的代码:
public class MyTask {
@Scheduled(fixedRate = 2000L)
public void testScheduling() {
System.out.println("Run Me ~ " + System.currentTimeMillis());
}
}
而且我得到以下的输出:
Run Me ~ 1419859820512
Run Me ~ 1419859821671
Run Me ~ 1419859822512
Run Me ~ 1419859823670
Run Me ~ 1419859824512
Run Me ~ 1419859825671
Run Me ~ 1419859826513
Run Me ~ 1419859827670
Run Me ~ 1419859828513
Run Me ~ 1419859829671
Run Me ~ 1419859830513
我不明白为什么这是关于1100毫秒和900毫秒,而不是2000毫秒。我能做些什么来解决这个问题,而不是把它乘以二?这是奇怪的不可预测的。
编辑:提意见是正确的:
System.out.println("Run Me (" + this.hashCode() + ") ~ " + System.currentTimeMillis());
给我
Run Me (1315556362) ~ 1419863164220
Run Me (410352054) ~ 1419863164540
Run Me (1315556362) ~ 1419863166221
Run Me (410352054) ~ 1419863166540
所以我必须弄清楚为什么有豆的两个实例。
编辑:出于某种原因,有两个Web应用程序初始化,一个是webappinitializer,另一个是安全初始化
public class BackendWebAppInitializer implements WebApplicationInitializer {
....
}
和
public class SecurityWebApplicationInitializer extends
AbstractSecurityWebApplicationInitializer {
public SecurityWebApplicationInitializer() {
super(WebSecurityConfig.class);
}
}
出于某种原因,结果在这两个初始化器中,启动了两个实例。不知道该怎么办。
我不相信Java的暴露了高精度的调度方法 - 使用'scheduleWithFixedRate'可能春天就委托给一些'ScheduledExecutorService',这不保证毫秒精度。 –
@TomG“不保证毫秒精度”和运行任务的频率应该是两倍。 – EpicPandaForce
你正在创造两个豆吗? –