2014-12-29 202 views
0

我需要定期运行一个任务,所以我查了一下@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); 
    } 
} 

出于某种原因,结果在这两个初始化器中,启动了两个实例。不知道该怎么办。

+0

我不相信Java的暴露了高精度的调度方法 - 使用'scheduleWithFixedRate'可能春天就委托给一些'ScheduledExecutorService',这不保证毫秒精度。 –

+0

@TomG“不保证毫秒精度”和运行任务的频率应该是两倍。 – EpicPandaForce

+4

你正在创造两个豆吗? –

回答

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 { 

} 
+0

请注意,这给了一个关于缺少'ContextLoaderListener'的错误,所以我正在寻找原因。 – EpicPandaForce