7

私は次の構成を持っています:

<?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>

次に、次のクラス

public class SomeClassImpl implements SomeClass {

   @Async
   @Override // overridden from the interface
   public void doSomething(){
      System.out.println("doing something async");
   }
}

テスト:

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

テストを実行すると、すべてが期待どおりに機能しました。しかし、デバッガーをアタッチして、 someClass.doSomething() が呼び出されたときに実際に何が起こっているかをステップ実行すると、次のことに気付きました。

ここに画像の説明を入力

SimpleAsyncTaskExecutor によって 4 つのスレッドが作成されるのはなぜですか? task:annotation-driven xml 要素から executor プロパティを削除すると、AsyncExecutionInterceptor は SimpleAsyncTaskExecutor を使用することがわかっています。しかし、タスク エグゼキューターを宣言し、アノテーション駆動型要素から参照したのに、SimpleAsyncTaskExecutor が作成されるのはなぜですか?

4

1 に答える 1