Java Spring @Scheduled任务执行两次

KS1*_*KS1 30 java spring schedule

我有一个简单的测试方法,设置为每5秒运行一次,但是看看System.out,你可以看到它似乎做了一些奇怪的事情.

@Scheduled(cron="*/5 * * * * ?")
public void testScheduledMethod() {
     System.out.println(new Date()+" > Running testScheduledMethod...");
}
Run Code Online (Sandbox Code Playgroud)

输出:

Wed Jan 09 16:49:15 GMT 2013 > Running testScheduledMethod...
Wed Jan 09 16:49:15 GMT 2013 > Running testScheduledMethod...
Wed Jan 09 16:49:20 GMT 2013 > Running testScheduledMethod...
Wed Jan 09 16:49:20 GMT 2013 > Running testScheduledMethod...
Wed Jan 09 16:49:25 GMT 2013 > Running testScheduledMethod...
Wed Jan 09 16:49:25 GMT 2013 > Running testScheduledMethod...
Wed Jan 09 16:49:30 GMT 2013 > Running testScheduledMethod...
Wed Jan 09 16:49:30 GMT 2013 > Running testScheduledMethod...
Run Code Online (Sandbox Code Playgroud)

为什么每次都运行TWICE (出现)

nic*_*ild 26

如果你查看文档,就会有一个明确指出这种现象的说明.

该说明在此链接的第25.5.1节下,并写着:

确保您没有在运行时初始化同一个@Scheduled注释类的多个实例,除非您确实要为每个此类实例安排回调.与此相关,请确保不要对使用@Scheduled注释并使用容器注册为常规Spring bean的bean类使用@Configurable:否则将获得双初始化,一次通过容器,一次通过@Configurable方面,每个@Scheduled方法的结果被调用两次.

我知道这只是目前的建议,但我认为我们没有足够的信息来进一步诊断问题.

  • 好的,那么究竟应该在哪个类中声明预定方法呢?如果我在一个用@Service注释的类中,我得到这个行为/ (3认同)

Che*_*han 8

我将我的类声明为“服务”,并使用 @Scheduled 注释将其声明为调度程序。调度程序正常调用它,但是当我们将类声明为服务时。该活动已启动两次。

我删除了服务注释。并在我维护的上下文 XML 中将该类声明为 bean。(在 web.xml 中声明的自定义上下文 XML)。这为我解决了这个问题。希望它能帮助某人。


小智 6

这是因为上下文侦听器而发生的

只需删除

<听众>

<监听器类>org.springframework.web.context.ContextLoaderListener</监听器类>

</监听器>

从 web.xml 来看它应该可以工作。

  • 这就像删除 system32 以使计算机运行得更快一样吗? (61认同)

小智 5

我知道答案!!

不要两次初始化您的计划

掠夺您的网络日志:

WebApplicationContext 一次和servlet一次

所以你servlet.xml别这样

import resource="classpath:applicationContext.xml"
Run Code Online (Sandbox Code Playgroud)