2011-08-01 17 views
6

¿Alguien puede explicar cómo lograr una configuración básica de una tarea usando la anotación @Scheduled sin ninguna configuración XML? Todos los ejemplos que puedo encontrar usan al menos una configuración XML mínima. Por ejemplo:Spring @Configuration (configuración no xml) para tareas accionadas por anotación

http://blog.springsource.com/2010/01/05/task-scheduling-simplifications-in-spring-3-0/

Este utiliza un típico:

<context:component-scan base-package="org/springframework/samples/task/basic/annotation"/> 
    <task:annotation-driven/> 

Así que estoy usando una anotación @Configuration con un montón de anotaciones @Bean. Todos son instanciados al inicio, pero el que tiene el @Scheduled no se ejecuta. He utilizado esa anotación con éxito en el pasado al usar la configuración XML, pero nunca con anotaciones solamente.

Respuesta

4

La anotación <task:annotation-driven /> termina declarando un ScheduledAnnotationBeanPostProcessor para leer las anotaciones @Scheduled en su código. Vea aquí: http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/scheduling/annotation/ScheduledAnnotationBeanPostProcessor.html.

Eso se ocupa de la línea <task:annotation-driven />. Para obtener el escaneo de componentes necesitará usar AnnotationConfigApplicationContext. Sin embargo, no estoy seguro si/cómo funciona eso con un contenedor web.

+0

Tenga en cuenta que aunque mi enlace es de 3.1 documentos, el ScheduledAnnotationBeanPostProcessor también existe para 3.0. – Kevin

+0

Sí, declarar el ScheduledAnnotationBeanPostProcessor en la clase \ @Configuration como un \ @Bean parece funcionar, lo que significa que cumple con lo que hizo la tarea: anotado por la anotación. – david

3

En Spring 3.0, aún necesita ese pedacito de XML. Sin embargo, Spring 3.1 (todavía en beta) introduce opciones de anotación adicionales para cerrar la brecha, eliminando cualquier necesidad de configuración XML.

Consulte this blog entry para saber cómo se hace. Sin embargo, tenga mucho cuidado antes de usar las versiones beta de Spring en el código de producción: realmente son inestables.

15

Sólo añadir @EnableScheduling en que la clase WebMvcConfig

@Configuration 
@EnableWebMvc 
@EnableAsync 
@EnableScheduling 
public class WebMvcConfig extends WebMvcConfigurerAdapter { 
    /** Annotations config Stuff ... **/ 
} 
+1

Sí, la pregunta era antes de que Spring 3.1 estuviera disponible. – david

0

Las respuestas hasta el momento son todos útiles para las versiones anteriores de la primavera. Aquí hay uno que es un poco más a la medida de la primavera 4:

Suponga que tiene la clase de aplicación principal anotada para Componente escanear la siguiente manera:

@ComponentScan({"com.my.class"}) 

Y dentro de ese paquete, tiene una clase de trabajo que se parece a esto:

@Configuration 
@EnableScheduling 
public class MyJobClass { 
@Scheduled (cron = "* * * * * *") 
public void runJob() throws DocumentException { 
    thingsToDoOnSchedule(); 
    } 
} 

tenga en cuenta que el método que permite anotar con @Scheduled debe devolver nulo y que su expresión cron debe tener 6 caracteres (el ejemplo que se muestra aquí sale cada segundo, lo que hace que las pruebas lo que su empleo hace más fácil).

También necesita las anotaciones de nivel de clase de @Configuration y @EnableScheduling para que esto funcione. O bien por sí mismos parece ser ignorado.

Para obtener más información aquí está el Spring 4 Enable Scheduling Reference Doc.

Cuestiones relacionadas