CAL*_*101 5 spring spring-integration spring-annotations
我有以下配置:
<?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: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-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="com.abc" />
<task:annotation-driven executor="executor"/>
<task:executor id="executor" pool-size="2"/>
</beans>
Run Code Online (Sandbox Code Playgroud)
然后是下面的课
public class SomeClassImpl implements SomeClass {
@Async
@Override // overridden from the interface
public void doSomething(){
System.out.println("doing something async");
}
}
Run Code Online (Sandbox Code Playgroud)
一个测试:
@ContextConfiguration("classpath:test-config.xml") // with the xml config above
@RunWith(value = SpringJUnit4ClassRunner.class)
public class SomeClassTest {
@Autowired
private SomeClass someClass;
@Test
public void testSomething() throws Exception {
System.out.println("Calling doSomething");
someClass.doSomething();
Thread.sleep(5000);
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行测试时,一切都按预期工作.但是当我调用someClass.doSomething()时,我附加了调试器以逐步执行实际发生的事情,我注意到以下内容:

为什么SimpleAsyncTaskExecutor正在创建4个线程?我知道如果我从task:annotation-driven xml元素中删除executor属性,AsyncExecutionInterceptor将使用SimpleAsyncTaskExecutor.但是因为我已经声明了一个任务执行器并从注释驱动元素中引用它,为什么要创建一个SimpleAsyncTaskExecutor呢?
首先,如果使用Java 5及更高版本(Java Futures等所需),默认的TaskExecutor实现应该是ThreadPoolTaskExecutor,它与您的调试跟踪输出相匹配.这是实际执行测试代码的线程管理器.
SimpleAsyncTaskExecutor很可能是作为Spring任务执行器框架的一部分启动的,可能来自测试上下文文件中的另一个注释.Spring容器可能正在启动SimpleAsyncTaskExecutor类的四个实例.根据Spring文档,此版本的TaskExecutor永远不会重新使用线程来满足新请求(它将启动一个新线程):
SimpleAsyncTaskExecutor
此实现不会重用任何线程,而是为每次调用启动一个新线程.但是,它确实支持并发限制,该限制将阻止任何超出限制的调用,直到释放一个插槽.如果您正在寻找真正的池,请继续向下滚动页面.
参考:http://docs.spring.io/spring/docs/3.1.x/spring-framework-reference/html/scheduling.html#scheduling-task-executor
因此,这可能是测试上下文和Spring容器之间交互的结果.
我相信在这种情况下你有一个运行测试代码的线程,这是你期望的,基于单个请求.Spring TaskExecutor实现利用一个名为ConcurrencyThrottleSupport的辅助类,它应该限制(限制)执行中的并发线程数.在您的情况下,这应该是2,如pool-size属性所示.但是,要运行这一个测试,它应该永远不需要分配额外的线程,并且跟踪输出与此一致.
| 归档时间: |
|
| 查看次数: |
19864 次 |
| 最近记录: |