Spring @Scheduled fixedRate给出了奇怪的结果?

时间:2014-12-29 13:33:12

标签: java spring spring-scheduled

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

由于某些原因,作为这两个初始化器的结果,启动了两个实例。不知道该怎么做。

1 个答案:

答案 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 {

}
相关问题