2010-09-08 72 views
9

我計劃每10秒運行這樣一個非常簡單的方法:彈簧3計劃任務運行3次

@Component 
public class SimpleTask { 

    @Scheduled(fixedRate=10000) 
    public void first() { 
     System.out.println("Simple Task " + new Date()); 
    } 
} 

配置:

<task:annotation-driven executor="myExecutor" scheduler="myScheduler" /> 
<task:executor id="myExecutor" pool-size="5" /> 
<task:scheduler id="myScheduler" pool-size="10" /> 

我的問題是被調用我的方法每10秒3次。應該只調用一次。我究竟做錯了什麼? 我用春源工具包與SpringSource的TC服務器6.

回答

21

我有這個相同的問題。其中一個原因是Spring 3.0.0中的一個錯誤。我升級到3.0.5,重複只有兩次。

另一個原因是因爲我的類有@Scheduled方法得到實例化兩次。發生這種情況是因爲上下文配置獲取了兩次。在web.xml中我指着我的ContextLoaderListener和DispatcherServlet的,在同樣情況下的配置文件:

... 
<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

<servlet> 
<servlet-name>spring</servlet-name> 
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
<init-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/applicationContext.xml</param-value> 
</init-param> 
<load-on-startup>1</load-on-startup> 
</servlet> 
... 

WEB-INF/applicationContext.xml的是對的ContextLoaderListener默認的上下文配置。所以確保你的ContextLoaderListener和你的ServletDispatcher使用不同的上下文文件。我最終創建了一個沒有任何bean定義的/WEB-INF/spring-servlet.xml,並且工作完美無瑕。

+0

我遇到了這個以及我的servlet上下文xml被加載到servlet配置以及Spring Security配置中。 – Dan 2012-01-25 17:46:25

+0

@jonnysamps驚人的我怎麼也忘了! :) 謝謝 – Eugene 2012-10-29 09:00:07

2

你與配置混合註釋,我不相信你既需要

http://static.springsource.org/spring/docs/current/spring-framework-reference/html/scheduling.html#scheduling-task-namespace

從文檔

注意 確保您沒有在運行時初始化相同的@Scheduled註記類的多個實例,除非您想要使用sch爲每個這樣的實例調用回調函數。與此相關的是,請確保您沒有在@Scheduled註釋的bean類上使用@Configurable,並將其註冊爲具有容器的常規Spring bean:否則,您將獲得雙重初始化,否則一旦通過容器並通過@Configurable方面,每個@Scheduled方法的結果被調用兩次。

1

可能是你加載applicationContext多次?