web-dev-qa-db-ja.com

Springの@Scheduledエラー:AsyncAnnotationBeanPostProcessorはコンテキスト内に1つしか存在できません

Spring 3の@Scheduledアノテーションを試しています。これが私の設定(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>

そして、これは私のサービスクラスです:

@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());
  }
}

私のeclispe + junitでテストすると正常に動作し、timeConsumingJobメソッドをテストすると、secondly()が2番目にメッセージを出力し続けることがわかります。

しかし、コンテナ(Resin/4.0.13)にデプロイすると、次のようにスローされます。

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

私は検索しましたが、同様の状況を見つけることはめったにありません。これが最も基本的な設定だと思いますが、それが機能しない理由がわかりません。

誰かがそれを見ることができますか?どうもありがとう !

(Spring 3.0.5、Resin 4.0.13)

------------ pdated ---------

さらに詳しく調べたところ、app.xmlが別のxmlによってインポートされていることがわかりました。たぶんこれがtask:annotation-driven機能していません。

さて、豆の場所を整理し直したところ解決しましたが、まだ戸惑います。 (それがうまくいったので、other.xmlはapp.xmlにBeanが必要なので)

25
smallufo

アプリケーションコンテキストが2回初期化されていますが、org.springframework.scheduling.config.AnnotationDrivenBeanDefinitionParserは、Bean ASYNC_ANNOTATION_PROCESSOR_BEAN_NAMEの2回目の登録に失敗します。

ユニットテストでこの問題が発生しました。@ ContextConfiguration( "/ path/to/applicationContext.xml")が、親テストクラスと子テストクラスの両方に誤って存在しました(デフォルト値はinheritLocationsがtrue)。

15

独自のAsyncTaskExecutorを実装し、デフォルトの<task:annotation-driven/>を削除するのを忘れた後、これに一度直面しました。

このようなものがあるかどうかを確認し、ある場合はタスクの1つを削除します。

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

<task:annotation-driven/>
8
Rajesh

これは、Springが構成XMLの<task:annotation-driven/>テキストを2回解析するときに発生します。

applicationContext-root.xmlセクションのapplicationContext-where-annotation-driven-is-specififed.xmlWEB.xml<context-param>の両方がインポートされたため、私にとってこれは起こっていました。

applicationContext-root.xmlWEB.xmlのみを残すことで、問題は解決しました。

7

applicationContext.xmlをコピーしてapplicationContextAdditional.xmlという新しいファイルを作成したときに、この問題が発生しました。私は理由を見つけようとしませんでしたが、両方に名前空間が含まれていました

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

2番目の名前空間から名前空間を削除すると、問題は解決しました。多分それは誰かを助ける。

6
Betlista

<task:annotation-driven/>コンテキストxmlで2回定義されています。それを取り除くことは私のために働きました。

1
smitha1003

私の場合、これはバージョンの切り替えによって引き起こされたため、出力ファイルの場所に複数のバージョンのjarが存在します(したがって、各jarには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]

この場合は1.0を使用しています。だから私は手動で削除する必要がありますC:/.../lib/xxx-2.0.jarこの場所にあり、xxx-1.0.jarもこのディレクトリにあることがわかります。手動で削除した後、正常に動作します。

0
MewX