tasks scheduled minutes examples example every enable create annotation spring scheduler spring-3 crontrigger

minutes - El error @Scheduled de Spring: solo puede existir un AsyncAnnotationBeanPostProcessor dentro del contexto



spring scheduled annotation cron (5)

Estoy probando la anotación @Scheduled de Spring 3. Aquí está mi configuración (app.xml):

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd " > <context:component-scan base-package="destiny.web"/> <context:annotation-config/> // other beans <task:annotation-driven executor="myExecutor" scheduler="myScheduler"/> <task:executor id="myExecutor" pool-size="5"/> <task:scheduler id="myScheduler" pool-size="10"/> </beans>

Y esta es mi clase de servicio:

@Service public class ServiceImpl implements Service , Serializable { //other injections @Override @Transactional public void timeConsumingJob() { try { Thread.sleep(10*1000); } catch (InterruptedException e) { e.printStackTrace(); } } @Override @Scheduled(cron="* * * * * ?") public void secondly() { System.err.println("secondly : it is " + new Date()); } }

Funciona bien cuando se prueba en mi eclispe + junit, cuando se prueba un método timeConsumingJob, puedo ver en segundo lugar () sigue emitiendo el mensaje en segundo lugar.

Pero cuando se implementa en un contenedor (Resin / 4.0.13), arroja:

[11-03-26 12:10:14.834] {main} org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Only one AsyncAnnotationBeanPostProcessor may exist within the context. Offending resource: class path resource [app.xml] at org.springframework.beans.factory.parsing.FailFastProblemReporter.error(FailFastProblemReporter.java:68) at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:85) at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:72) at org.springframework.scheduling.config.AnnotationDrivenBeanDefinitionParser.parse(AnnotationDrivenBeanDefinitionParser.java:82)

Busqué pero rara vez encuentro situaciones similares, creo que es la configuración más básica, pero no sé por qué no funciona.

¿Alguien puede echarle un vistazo? Muchas gracias !

(Primavera 3.0.5, Resina 4.0.13)

------------ actualizado ---------

Después de profundizar, encontré que la aplicación.xml es importada por otro xml. Tal vez esta es la razón que hace que la task:annotation-driven no funcione.

Bueno, después de reorganizar la ubicación de algunos frijoles, se resolvió, pero todavía me siento confundido. (Porque funcionó bien, y other.xml necesita beans en app.xml)


El contexto de la aplicación se inicializa dos veces, pero org.springframework.scheduling.config.AnnotationDrivenBeanDefinitionParser falla al registrar el bean ASYNC_ANNOTATION_PROCESSOR_BEAN_NAME por segunda vez.

Encontré este problema en las pruebas unitarias donde @ContextConfiguration ("/ path / to / applicationContext.xml") estaba accidentalmente en la clase de prueba primaria y en la clase de prueba secundaria (con el valor predeterminado de inheritLocations verdadero).


En mi caso, esto fue causado por el cambio de versiones, por lo que en la ubicación del archivo de salida hay varias versiones de archivos jar (y por lo tanto cada archivo contiene un AnnotationBean):

2018-02-19 13:38:44,913 [RMI TCP Connection(3)-127.0.0.1] ERROR org.springframework.web.context.ContextLoader - Context initialization failed org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Only one ScheduledAnnotationBeanPostProcessor may exist within the context. Offending resource: URL [jar:file:/C:/.../lib/xxx-2.0.jar!/META-INF/spring/xxx.xml]

mientras estoy usando 1.0 en este caso. Así que tengo que eliminar manualmente C:/.../lib/xxx-2.0.jar en esta ubicación, y puedo ver que xxx-1.0.jar también está en este directorio. Después de la eliminación manual, funciona normalmente.


Esto sucede cuando Spring analiza el texto <task:annotation-driven/> dos veces en una configuración XML.

Para mí, esto estaba sucediendo porque applicationContext-root.xml y applicationContext-where-annotation-driven-is-specififed.xml se importaron en mi WEB.xml en la WEB.xml <context-param> .

Dejar solo applicationContext-root.xml en WEB.xml solucionó el problema.


Me enfrenté a esto una vez, después de implementar nuestro propio AsyncTaskExecutor y olvidé eliminar la <task: annotation-driven/> default <task: annotation-driven/>

Compruebe si tiene algo como esto, si es así, elimine una de las tareas.

<task:annotation-driven executor="customAsyncTaskExecutor" scheduler="taskScheduler"/> <task:annotation-driven/>


Tuve este problema cuando copié applicationContext.xml y creé uno nuevo llamado applicationContextAdditional.xml . No intenté encontrar la razón, pero ambas contenían espacio de nombres

<bean ... xmlns:task="http://www.springframework.org/schema/task" ... xsi:schemaLocation=" http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd" > ... </bean>

cuando quité el espacio de nombres del segundo, mi problema se resolvió. Tal vez ayuda a alguien.