0

我正在考虑使用 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

我很困惑为什么简单的情况不起作用,为什么其他两个修改起作用。谁能看到我错过了什么?

4

1 回答 1

2

The Junit run ends (JVM halts) before the thread executing the async call has a chance to run, hence the sleeps helps.

于 2013-06-13T13:47:42.910 回答