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が必要なので)
アプリケーションコンテキストが2回初期化されていますが、org.springframework.scheduling.config.AnnotationDrivenBeanDefinitionParserは、Bean ASYNC_ANNOTATION_PROCESSOR_BEAN_NAMEの2回目の登録に失敗します。
ユニットテストでこの問題が発生しました。@ ContextConfiguration( "/ path/to/applicationContext.xml")が、親テストクラスと子テストクラスの両方に誤って存在しました(デフォルト値はinheritLocationsがtrue)。
独自のAsyncTaskExecutorを実装し、デフォルトの<task:annotation-driven/>
を削除するのを忘れた後、これに一度直面しました。
このようなものがあるかどうかを確認し、ある場合はタスクの1つを削除します。
<task:annotation-driven executor="customAsyncTaskExecutor" scheduler="taskScheduler"/>
<task:annotation-driven/>
これは、Springが構成XMLの<task:annotation-driven/>
テキストを2回解析するときに発生します。
applicationContext-root.xml
セクションのapplicationContext-where-annotation-driven-is-specififed.xml
にWEB.xml
と<context-param>
の両方がインポートされたため、私にとってこれは起こっていました。
applicationContext-root.xml
にWEB.xml
のみを残すことで、問題は解決しました。
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番目の名前空間から名前空間を削除すると、問題は解決しました。多分それは誰かを助ける。
<task:annotation-driven/>
コンテキストxmlで2回定義されています。それを取り除くことは私のために働きました。
私の場合、これはバージョンの切り替えによって引き起こされたため、出力ファイルの場所に複数のバージョンの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もこのディレクトリにあることがわかります。手動で削除した後、正常に動作します。