0

Spring の @Sync アノテーションの使用を検討していますが、風変わりな動作に遭遇しています。非常に単純なテスト ケースをまとめましたが、うまくいきません (私の非同期メソッドは呼び出されません)。テスト ケースを特定の方法で微調整すると、メソッドが呼び出されますが、その理由を理解するのは困難です。とにかく、ここに詳細があります。注釈ベースの構成と自動配線を使用しています。

Spring 3.1.1 および 3.2.3 でテストしました。

a) Spring コンテキスト ファイル:

<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");
}

async メソッドは実行されます。

[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

最初に同期メソッドを呼び出すと非同期メソッド呼び出しが機能する理由がわかりません。

NEXT - さらにややこしい: async メソッドを呼び出した後、単体テストを 1 秒間スリープ状態にすると、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

単純なケースが機能しない理由と、他の 2 つの変更が機能する理由について、私は困惑しています。誰かが私が見逃しているものを見ることができますか?

4

1 に答える 1

2

非同期呼び出しを実行するスレッドが実行される前に Junit の実行が終了する (JVM が停止する) ため、スリープが役立ちます。

于 2013-06-13T13:47:42.910 に答える