Erreur @Scheduled de Spring: un seul AsyncAnnotationBeanPostProcessor peut exister dans le contexte
je suis en train de Printemps 3 @Prévue annotation . Voici ma configuration (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>
Et c'est ma classe de service :
@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());
}
}
ça marche très bien quand je teste dans mon eclispe + junit, quand je teste une méthode timeConsumingJob, je peux voir secundo () continue à diffuser le message secundo.
Mais lorsqu'il est déployé dans un récipient (Résine/4.0.13) , il lance :
[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)
j'ai cherché mais rarement trouver des situations similaires , je pense que c'est le réglage de base , mais ne sais pas pourquoi ça ne fonctionne pas .
Quelqu'un peut-il y jeter un oeil ? Merci beaucoup !
(Printemps 3.0.5 , De La Résine 4.0.13)
------------ mise à jour ---------
après avoir creusé plus profondément, j'ai trouvé l'application.xml est importé par un autre xml. Peut-être que c'est la raison fait task:annotation-driven
ne fonctionne pas.
Eh bien , après avoir réarrangé l'emplacement de quelques haricots, il est résolu, mais je me sens encore perplexe. (Parce qu'il a bien fonctionné , et d'autres.xml doit haricots dans l'app.xml)
5 réponses
le contexte de l'application est initialisé deux fois mais org.springframework.programmer.config.AnnotationDrivenBeanDefinitionParser échoue à enregistrer bean ASYNC_ANNOTATION_PROCESSOR_BEAN_NAME pour la deuxième fois.
j'ai rencontré ce problème dans les tests unitaires où @ContextConfiguration("/chemin/vers/applicationContext.xml") était accidentellement à la fois sur la classe de test parent et la classe de test child (avec la valeur par défaut de inheritLocations true).
j'ai affronté cela une fois après avoir implémenté notre propre AsyncTaskExecutor et avoir oublié de supprimer la valeur par défaut <task: annotation-driven/>
vérifiez si vous avez quelque chose comme ça, si oui, supprimez une des tâches.
<task:annotation-driven executor="customAsyncTaskExecutor" scheduler="taskScheduler"/>
<task:annotation-driven/>
j'ai eu ce problème lorsque j'ai copié applicationContext.xml
et créé de nouveaux appelé applicationContextAdditional.xml
. Je n'ai pas essayé de trouver la raison, mais les deux contiennent namespace
<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>
quand j'ai supprimé l'espace de noms du second, mon problème a été résolu. Peut-être que ça aide quelqu'un.
cela se produit lorsque le printemps passe le <task:annotation-driven/>
texte deux fois dans une configuration XML.
Pour moi ce qui se passait, parce que les deux applicationContext-root.xml
et applicationContext-where-annotation-driven-is-specififed.xml
ont été importées dans mon WEB.xml
<context-param>
section.
ne Laissant que applicationContext-root.xml
WEB.xml
résolu le problème.
dans mon cas, cela a été causé par la commutation des versions, donc dans l'emplacement du fichier de sortie il y a plusieurs versions de pots (et donc chaque pot contient une 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]
alors que j'utilise 1.0 dans ce cas. J'ai donc supprimer manuellement C:/.../lib/xxx-2.0.jar
en cet endroit, et je suis capable de voir la xxx-1.0.jar est aussi dans ce répertoire. Après la suppression manuelle, il fonctionne normalement.