27

我正在尝试 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() 继续输出消息。

但是当部署到容器 (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)

我搜索了但很少找到类似的情况,我认为这是最基本的设置,但不知道为什么它不起作用。

有人可以看看吗?非常感谢 !

(弹簧 3.0.5,树脂 4.0.13)

------------更新了 ---------

在我深入挖掘之后,我发现 app.xml 是由另一个 xml 导入的。也许这就是task:annotation-driven无法正常工作的原因。

嗯,重新安排了一些豆子的位置后,解决了,但我还是觉得不解。(因为它运行良好,并且 other.xml 需要 app.xml 中的 bean)

4

7 回答 7

15

应用程序上下文被初始化了两次,但 org.springframework.scheduling.config.AnnotationDrivenBeanDefinitionParser 第二次注册 bean ASYNC_ANNOTATION_PROCESSOR_BEAN_NAME 失败。

我在单元测试中遇到了这个问题,其中 @ContextConfiguration("/path/to/applicationContext.xml") 意外地出现在父测试类和子测试类上(默认值为 inheritLocations true)。

于 2011-11-03T15:08:34.013 回答
8

在实现我们自己的 AsyncTaskExecutor 并忘记删除默认值之后,我曾经遇到过这个问题<task:annotation-driven/>

检查您是否有类似的东西,如果有,请删除其中一项任务。

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

<task:annotation-driven/>
于 2014-03-28T22:56:59.823 回答
7

当 spring<task:annotation-driven/>在配置 XML 中解析文本两次时,就会发生这种情况。

对我来说,发生这种情况是因为两者都applicationContext-root.xmlapplicationContext-where-annotation-driven-is-specififed.xml导入了我WEB.xml的 in<context-param>部分。

只留下解决applicationContext-root.xmlWEB.xml这个问题。

于 2016-02-07T13:34:52.520 回答
6

当我复制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>

当我从第二个中删除命名空间时,我的问题就解决了。也许它可以帮助某人。

于 2013-07-01T13:40:50.487 回答
1

<task:annotation-driven/>在上下文 xml 中定义了两次。删除对我有用。

于 2019-04-24T18:10:15.157 回答
1

就我而言,这是由切换版本引起的,因此在输出文件位置有多个版本的 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也在这个目录中。手动删除后,正常工作。

于 2018-02-19T04:10:20.370 回答
0

那个错误,关于

Only one AsyncAnnotationBeanPostProcessor may exist within the context

, 可以出现在另一种情况下。我不坚持,那一定对你有帮助,也许你真的有一些复杂的问题,在其他帖子中有所描述,但没有人帮助我。

有什么帮助,很简单

mvn clean

,因为该项目以某种方式创建了一些重复的文件并且导致了问题。一个简单的清洁已经……嗯……清洁了它们。

例如,这种情况可能发生在与具有更高版本项目的分支合并之后。

于 2020-04-16T19:37:51.223 回答