我正在考虑使用 Spring 的 @Sync 注释,并且遇到了一些古怪的行为。我整理了一个非常简单的测试用例,但它不起作用(我的异步方法没有被调用)。以某种方式调整测试用例确实会导致方法被调用,但很难理解为什么。无论如何,这里是细节。我正在使用基于注释的配置和自动装配。
我已经用 Spring 3.1.1 和 3.2.3 进行了测试。
a) 弹簧上下文文件:
<context:annotation-config />
<context:component-scan base-package="sample" />
<task:annotation-driven />
b) 包含异步方法的类:
package sample;
@Component
public class SomeServiceImpl {
@Async
public void asynchMethod(String in) {
logger.debug("Starting asynchMethod");
logger.debug("Ending asynchMethod");
}
public void doNothing() {
}
}
c) 单元测试(在 TestSomeService 类中):
@Test
public void testAsynch() throws InterruptedException {
logger.debug("Starting testAsynch");
service.asynchMethod("hello asynch");
logger.debug("Ending testAsynch");
}
这是单元测试结果:
[DEBUG] [2013-06-13 09:18:10,350] [sample.TestSomeService] - Starting testAsynch
[DEBUG] [2013-06-13 09:18:10,353] [sample.TestSomeService] - Ending testAsynch
异步方法没有输出 - 这就是问题 #1。这个例子很简单,我不明白为什么它不起作用。
NEXT - 如果我通过添加对同步方法“doNothing()”的调用来修改测试:
@Test
public void testAsynch() throws InterruptedException {
logger.debug("Starting testAsynch");
service.doNothing();
service.asynchMethod("hello asynch");
logger.debug("Ending testAsynch");
}
异步方法确实被执行:
[DEBUG] [2013-06-13 09:20:59,493] [sample.TestSomeService] - Starting testAsynch
[DEBUG] [2013-06-13 09:20:59,515] [sample.TestSomeService] - Ending testAsynch
[DEBUG] [2013-06-13 09:20:59,515] [sample.SomeServiceImpl] - Starting asynchMethod
[DEBUG] [2013-06-13 09:20:59,515] [sample.SomeServiceImpl] - Ending asynchMethod
我无法理解为什么首先调用同步方法会使异步方法调用起作用。
下一个 - 更令人费解的是:如果我在调用 async 方法后让我的单元测试休眠一秒钟 - async 方法确实会执行。
@Test
public void testAsynch() throws InterruptedException {
logger.debug("Starting testAsynch");
service.asynchMethod("hello asynch");
Thread.sleep(1000);
logger.debug("Ending testAsynch");
}
[DEBUG] [2013-06-13 09:22:21,187] [sample.TestSomeService] - Starting testAsynch
[DEBUG] [2013-06-13 09:22:21,209] [sample.SomeServiceImpl] - Starting asynchMethod
[DEBUG] [2013-06-13 09:22:21,209] [sample.SomeServiceImpl] - Ending asynchMethod
[DEBUG] [2013-06-13 09:22:22,190] [sample.TestSomeService] - Ending testAsynch
我很困惑为什么简单的情况不起作用,为什么其他两个修改起作用。谁能看到我错过了什么?