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)

25
demandé sur smallufo 2011-03-26 08:11:53

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).

13
répondu Tomáš Záluský 2011-11-03 15:08:34

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/>
8
répondu Rajesh 2014-03-28 23:02:47

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.

6
répondu Betlista 2013-07-01 13:40:50

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.xmlWEB.xml résolu le problème.

6
répondu Babken Vardanyan 2016-02-07 13:34:52

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.

0
répondu MewX 2018-02-19 04:10:20