我需要定期运行任务,所以我查找了@Scheduled
注释。
我使用了以下代码:
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毫秒。除了将它乘以2之外,我还能做些什么来解决这个问题呢?这奇怪的是不可预测。
编辑:评论者是对的: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
所以我必须弄清楚为什么有两个bean实例。
编辑:出于某种原因,有两个网络应用初始化器,一个是webappinitializer,另一个是安全初始化器
public class BackendWebAppInitializer implements WebApplicationInitializer {
....
}
和
public class SecurityWebApplicationInitializer extends
AbstractSecurityWebApplicationInitializer {
public SecurityWebApplicationInitializer() {
super(WebSecurityConfig.class);
}
}
由于某些原因,作为这两个初始化器的结果,启动了两个实例。不知道该怎么做。
答案 0 :(得分:0)
我似乎找到了双重实例化问题的原因。这是以下内容。
我们有以下两种主要配置:
public class SecurityWebApplicationInitializer extends
AbstractSecurityWebApplicationInitializer {
public SecurityWebApplicationInitializer() {
super(WebSecurityConfig.class);
}
}
和
@Configuration
@ComponentScan({ ... })
@EnableWebMvc
@ImportResource({ "classpath:spring-config.xml" })
public class ApplicationConfig {
}
但显然,此设置实例化应用程序上下文两次。解决方案如下:
public class SecurityWebApplicationInitializer extends
AbstractSecurityWebApplicationInitializer {
public SecurityWebApplicationInitializer() {
//super(WebSecurityConfig.class);
}
}
和
@Configuration
@ComponentScan({ ... })
@EnableWebMvc
@ImportResource({ "classpath:spring-config.xml" })
@Import({WebSecurityConfig.class})
public class ApplicationConfig {
}