2010-09-08 4 views
9

J'ai une méthode très simple prévue pour exécuter toutes les 10 secondes comme ceci:ressort 3 tâche planifiée en cours d'exécution 3 fois

@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" /> 

Mon problème est que ma méthode est invoquée 3 fois toutes les 10 secondes. Il devrait être invoqué juste une fois. Qu'est-ce que je fais mal? Je utiliser Spring Source ToolSuite avec SpringSource tc serveur 6.

Répondre

21

J'ai eu le même problème. L'une des causes est un bug dans Spring 3.0.0. Je suis passé à 3.0.5 et la répétition est descendue à seulement deux.

L'autre cause était parce que ma classe qui avait la méthode @Scheduled était instanciée deux fois. Cela est arrivé parce que la configuration du contexte était chargée deux fois. En web.xml je montrais mon ContextLoaderListener et DispatcherServlet dans le même fichier de configuration de contexte:

... 
<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 est le contexte de configuration par défaut pour le ContextLoaderListener. Assurez-vous donc que votre ContextLoaderListener et votre ServletDispatcher utilisent des fichiers de contexte différents. J'ai fini par créer un /WEB-INF/spring-servlet.xml sans aucune définition de bean et cela a fonctionné parfaitement.

+0

Je suis tombé sur ceci aussi bien avec mon xml de contexte de servlet chargé dans la config de servlet qu'une configuration Spring Security. – Dan

+0

@jonnysamps incroyable comment j'ai oublié ça aussi! :) Je vous remercie – Eugene

2

vous mixez des annotations avec la configuration et je ne crois pas que vous avez besoin des deux

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

De Documentation

Remarque Assurez-vous que vous n'initialisez pas plusieurs instances de la même classe d'annotations @Scheduled lors de l'exécution, sauf si vous souhaitez sch callback edule à chaque instance. En relation avec ceci, assurez-vous que vous n'utilisez pas @Configurable sur les classes bean qui sont annotées avec @Scheduled et enregistrées en tant que beans Spring réguliers avec le conteneur: Vous auriez une double initialisation sinon, une fois dans le conteneur et une fois via l'aspect @Configurable , avec la conséquence de chaque méthode @Scheduled étant appelée deux fois.

1

pouvez-vous charger applicationContext plusieurs fois?