アノテーションインターフェース EnableAsync


Spring の <task:*> XML 名前空間にある機能と同様に、Spring の非同期メソッド実行機能を有効にします。

次のように @Configuration クラスと一緒に使用して、Spring アプリケーションコンテキスト全体に対してアノテーション駆動型非同期処理を有効にします。

 @Configuration
 @EnableAsync
 public class AppConfig {

 }
MyAsyncBean は、Spring の @Async アノテーション、EJB 3.1 @jakarta.ejb.Asynchronous アノテーション、または annotation() 属性を介して指定されたカスタムアノテーションのいずれかでアノテーションが付けられた 1 つ以上のメソッドを持つユーザー定義型です。アスペクトは、登録済みの Bean に対して透過的に追加されます。たとえば、次の構成を使用します。
 @Configuration
 public class AnotherAppConfig {

     @Bean
     public MyAsyncBean asyncBean() {
         return new MyAsyncBean();
     }
 }

デフォルトでは、Spring は関連するスレッドプール定義を検索します。コンテキスト内の一意の TaskExecutor Bean、または "taskExecutor" という名前の ExecutorSE Bean です。2 つとも解決できない場合は、SimpleAsyncTaskExecutor を使用して非同期メソッドの呼び出しを処理します。さらに、void の戻り値の型を持つアノテーション付きメソッドは、呼び出し元に例外を送信できません。デフォルトでは、このようなキャッチされなかった例外のみがログに記録されます。

これらすべてをカスタマイズするには、AsyncConfigurer を実装して以下を提供します。

NOTE: AsyncConfigurer 構成クラスは、アプリケーションコンテキストのブートストラップの早い段階で初期化されます。そこで他の Bean への依存関係が必要な場合は、他の Bean も通過できるように、可能な限り「レイジー」として宣言してください。

 @Configuration
 @EnableAsync
 public class AppConfig implements AsyncConfigurer {

     @Override
     public Executor getAsyncExecutor() {
         ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
         executor.setCorePoolSize(7);
         executor.setMaxPoolSize(42);
         executor.setQueueCapacity(11);
         executor.setThreadNamePrefix("MyExecutor-");
         executor.initialize();
         return executor;
     }

     @Override
     public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
         return new MyAsyncUncaughtExceptionHandler();
     }
 }

カスタマイズが必要な項目が 1 つだけの場合は、null を return してデフォルト設定を維持できます。

メモ: 上記の例では、ThreadPoolTaskExecutor は完全に管理された Spring Bean ではありません。フルマネージドの Bean が必要な場合は、@Bean アノテーションを getAsyncExecutor() メソッドに追加します。このような状況では、Bean が初期化されるときに自動的に呼び出されるため、executor.initialize() メソッドを手動で呼び出す必要はありません。

参考のために、上記の例を次の Spring XML 構成と比較できます。

 <beans>

     <task:annotation-driven executor="myExecutor" exception-handler="exceptionHandler"/>

     <task:executor id="myExecutor" pool-size="7-42" queue-capacity="11"/>

     <bean id="asyncBean" class="com.foo.MyAsyncBean"/>

     <bean id="exceptionHandler" class="com.foo.MyAsyncUncaughtExceptionHandler"/>

 </beans>
 
上記の XML ベースと JavaConfig ベースの例は、Executorスレッド名プレフィックスの設定を除いて同等です。これは、<task:executor> 要素がそのような属性を公開しないためです。これは、JavaConfig ベースのアプローチにより、実際のコンポーネントに直接アクセスすることで構成可能性を最大限に高める方法を示しています。

mode() 属性は、アドバイスの適用方法を制御します。モードが AdviceMode.PROXY(デフォルト)の場合、他の属性がプロキシの動作を制御します。プロキシモードでは、プロキシを介した呼び出しのみのインターセプトが許可されることに注意してください。同じクラス内のローカル呼び出しは、そのようにインターセプトすることはできません。

mode()AdviceMode.ASPECTJ に設定されている場合、proxyTargetClass() 属性の値は無視されることに注意してください。また、この場合、影響を受けるクラスにアスペクトを適用するコンパイル時ウィービングまたはロード時ウィービングを使用して、spring-aspects モジュール JAR がクラスパスに存在する必要があることに注意してください。このようなシナリオに関係するプロキシはありません。ローカルコールもインターセプトされます。

導入:
3.1
作成者:
Chris Beams, Juergen Hoeller, Stephane Nicoll, Sam Brannen
関連事項:
  • オプション要素のサマリー

    オプション要素
    修飾子と型
    オプションの要素
    説明
    クラスレベルまたはメソッドレベルで検出される「非同期」アノテーション型を示します。
    非同期アドバイスをどのように適用するかを示します。
    int
    AsyncAnnotationBeanPostProcessor を適用する順序を示します。
    boolean
    標準の Java インターフェースベースのプロキシではなく、サブクラスベース(CGLIB)のプロキシを作成するかどうかを示します。
  • 要素の詳細

    • annotation

      ClassSE<? extends AnnotationSE> annotation
      クラスレベルまたはメソッドレベルで検出される「非同期」アノテーション型を示します。

      デフォルトでは、Spring の @Async アノテーションと EJB 3.1 @jakarta.ejb.Asynchronous アノテーションの両方が検出されます。

      この属性は、開発者が独自のカスタムアノテーション型を提供して、メソッド(または特定のクラスのすべてのメソッド)を非同期で呼び出す必要があることを示すために存在します。

      デフォルト:
      java.lang.annotation.Annotation.class
    • proxyTargetClass

      boolean proxyTargetClass
      標準の Java インターフェースベースのプロキシではなく、サブクラスベース(CGLIB)のプロキシを作成するかどうかを示します。

      mode() の場合のみ適用AdviceMode.PROXY に設定されます。

      デフォルトは false です。

      この属性を true に設定すると、@Async でマークされたものだけでなく、プロキシを必要とするすべての Spring 管理 Bean に影響することに注意してください。例: Spring の @Transactional アノテーションが付いた他の Bean は、同時にサブクラスプロキシにアップグレードされます。たとえば、テストで、ある型のプロキシに対して別の型のプロキシを明示的に期待していない限り、このアプローチは実際には悪影響を及ぼしません。

      デフォルト:
      false
    • mode

      非同期アドバイスをどのように適用するかを示します。

      デフォルトは AdviceMode.PROXY です。プロキシモードでは、プロキシを介したコールの代行受信のみが許可されることに注意してください。同じクラス内のローカルコールはそのようにインターセプトできません。ローカル呼び出し内のそのようなメソッドの Async アノテーションは、Spring のインターセプターがそのようなランタイムシナリオを実行しないため、無視されます。より高度な遮断モードについては、これを AdviceMode.ASPECTJ に切り替えることを検討してください。

      デフォルト:
      PROXY
    • order

      int order
      AsyncAnnotationBeanPostProcessor を適用する順序を示します。

      デフォルトは Ordered.LOWEST_PRECEDENCE で、他のすべての後処理プログラムの後に実行されるため、ダブルプロキシではなく既存のプロキシにアドバイザを追加できます。

      デフォルト:
      2147483647