在Spring @Async中,如果我想拥有具有不同队列容量的多个执行器池 - 我得到错误"在上下文中只有一个AsyncAnnotationBeanPostProcessor"。
从以下链接我发现这是不可行的。
Only one AsyncAnnotationBeanPostProcessor may exist within the context
Spring's @Scheduled error : Only one AsyncAnnotationBeanPostProcessor may exist within the context
http://forum.spring.io/forum/spring-projects/container/79086-multiple-executor-possible
有没有其他选择(除了使用弹簧整合)
以下是我的配置
我的配置如下
<!- Executor A -->
<task:annotation-driven executor="executor_A"/>
<task:executor id="executor_A" pool-size="100"/>
<!- Executor B -->
<task:annotation-driven executor="executor_B"/>
<task:executor id="executor_B" pool-size="100"/>
以上两种配置在不同的xml上下文文件中定义,并且所有配置都加载到相同的应用程序上下文
从源代码中,我映射到特定执行程序
@Async("executor_A")
public void testExecutorA()
{
}
@Async("executor_B")
public void testExecutorB()
{
}
部署时,我收到以下错误
2014-07-22 09:41:26.644 [localhost-startStop-1] ERROR o.s.web.context.ContextLoader U:SC:TX: - 上下文初始化失败 org.springframework.beans.factory.parsing.BeanDefinitionParsingException:配置问题:无法从URL位置导入bean定义[classpath *:/ META-INF / domainconfig / * - domain-context.xml] 违规资源:ServletContext资源[/WB-INF/spring/root-context.xml];嵌套异常是org.springframework.beans.factory.parsing.BeanDefinitionParsingException:配置问题:上下文中只能存在一个AsyncAnnotationBeanPostProcessor。 违规资源:URL [jar:file:/ D:/tomcat/apache-tomcat-7.0.29/webapps/myapp/WEB-INF/lib/myapp-domain-1.0.0.jar!/ META-INF / domainconfig /我的域-context.xml中]
由于
住
答案 0 :(得分:2)
您没有详细说明您的配置是什么样的,但可以在同一个上下文中使用不同的ExecutorService
。您对论坛的最后一个链接实际上有一条评论,其中提到the issue that implements this feature。
只需定义它们并使用您要用于特定调用的服务限定 @Async
注释,例如:
@Async("myExecutor")
public Future<Foo> handle() { ... }
当您有多个匹配的候选者时,如果没有明确指定(即定义要使用的默认服务),则需要指定将使用哪个候选者。为此,请使用<task:annotation-driven/>
元素
<task:annotation-driven executor="myExecutor"
或
@EnableAsync
@Configuration
public class AppConfig implements AsyncConfigurer {
public Executor getAsynchExecutor() { ... }
}
查看the documentation了解详情。
(注意,从Spring框架4.1开始,AsyncConfigurer
有一个额外的方法,你应该更喜欢从AsyncConfigurerSupport
扩展。