在相同的上下文中支持多个线程池

时间:2014-07-22 06:54:26

标签: spring threadpool executorservice

在Spring @Async中,如果我想拥有具有不同队列容量的多个执行器池 - 我得到错误"在上下文中只有一个AsyncAnnotationBeanPostProcessor"。

从以下链接我发现这是不可行的。

Only one AsyncAnnotationBeanPostProcessor may exist within the context

Spring's @Scheduled error : Only one AsyncAnnotationBeanPostProcessor may exist within the context

https://stackoverflow.com/questions/17367572/how-to-configure-multiple-threadpooltaskexecutors-within-the-same-application-co

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

由于

1 个答案:

答案 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扩展。