2010-09-08 7 views
9

Ich habe eine sehr einfache Methode geplant alle 10 Sekunden wie folgt auszuführen:Feder 3 geplante Aufgabe ausgeführt wird 3 mal

@Component 
public class SimpleTask { 

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

Config:

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

Mein Problem ist, dass meine Methode aufgerufen wird 3 mal alle 10 Sekunden. Es sollte nur einmal aufgerufen werden. Was mache ich falsch? Ich benutze Frühling Quelle Toolsuite mit Springsource tc Server 6.

Antwort

21

Ich hatte das gleiche Problem. Eine der Ursachen ist ein Bug in Spring 3.0.0. Ich verbesserte auf 3.0.5 und die Wiederholung ging auf nur zwei zurück.

Die andere Ursache war, weil meine Klasse, die die @Scheduled-Methode hatte, zweimal instanziiert wurde. Dies geschah, weil die Kontextkonfiguration zweimal geladen wurde. In web.xml ich zeigte meine Context und DispatcherServlet im selben Kontext Konfigurationsdatei:

... 
<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 ist der Standardkontext Config für die Context. Stellen Sie daher sicher, dass Ihr ContextLoaderListener und Ihr ServletDispatcher verschiedene Kontextdateien verwenden. Am Ende habe ich eine /WEB-INF/spring-servlet.xml ohne Bean Definitionen erstellt und es funktionierte einwandfrei.

+0

Ich lief auch dies mit meinem Servlet Kontext XML in der Servlet-Konfiguration sowie eine Spring Security Config geladen wird. – Dan

+0

@jonnysamps erstaunlich, wie ich das auch vergessen habe! :) Danke – Eugene

2

Sie Anmerkungen mit Konfiguration mischen und ich glaube nicht, dass Sie brauchen beides

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

Von Dokumentation

Hinweis Stellen Sie sicher, dass Sie zur Laufzeit nicht mehrere Instanzen derselben Annotationsklasse @Scheduled initialisieren, es sei denn, Sie möchten dies tun Redires Callbacks für jede solche Instanz. Stellen Sie im Zusammenhang damit sicher, dass Sie @Configurable nicht für Bean-Klassen verwenden, die mit @Scheduled versehen und als reguläre Spring-Beans mit dem Container registriert sind: Sie erhalten ansonsten eine doppelte Initialisierung, einmal durch den Container und einmal durch den @Configurable-Aspekt mit der Folge, dass jede @Scheduled-Methode zweimal aufgerufen wird.

1

können Sie ApplicationContext mehrmals laden?

Verwandte Themen