2010-09-08 28 views
9

Tengo un método muy simple programado para ejecutarse cada 10 segundos como esto:primavera 3 tarea programada ejecuta 3 veces

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

Mi problema es que se invoca mi método 3 veces cada 10 segundos. Debe invocarse solo una vez. ¿Qué estoy haciendo mal? utilizo primavera Fuente ToolSuite con SpringSource tc servidor 6.

Respuesta

21

Tuve este mismo problema. Una de las causas es un error en Spring 3.0.0. Actualicé a 3.0.5 y la repetición bajó a solo dos.

La otra causa fue porque mi clase que tenía el método @Scheduled estaba siendo instanciado dos veces. Esto sucedió porque la configuración de contexto se estaba cargando dos veces. En Web.xml me estaba señalando mi ContextLoaderListener y DispatcherServlet en el mismo archivo de configuración contexto:

... 
<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/config applicationContext.xml es el contexto predeterminado para la ContextLoaderListener. Así que asegúrese de que su ContextLoaderListener y su ServletDispatcher están usando diferentes archivos de contexto. Terminé creando un /WEB-INF/spring-servlet.xml sin ninguna definición de bean y funcionó a la perfección.

+0

Me encontré con esto también con mi contexto de servlet xml cargado en la configuración de servlet, así como una configuración de Spring Security. – Dan

+0

@jonnysamps ¡increíble cómo lo olvidé también! :) gracias – Eugene

2

está mezclando con anotaciones de configuración y yo no cree que necesita tanto

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

De Documentación

Nota Asegúrese de no inicializar varias instancias de la misma clase de anotación @Scheduled en tiempo de ejecución, a menos que desee edule callbacks a cada una de esas instancias. Relacionado con esto, asegúrese de no utilizar @Configurable en las clases de bean que están anotadas con @Scheduled y registradas como beans Spring regulares con el contenedor: De lo contrario, obtendría la inicialización doble, una vez en el contenedor y una vez en el aspecto @Configurable , con la consecuencia de que cada método @Scheduled se invoque dos veces.

1

puede que cargue applicationContext varias veces?

Cuestiones relacionadas