アノテーションインターフェース EnableAsync
<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" という名前の Executor
SE Bean のいずれかの、関連付けられたスレッドプール定義を検索します。どちらも解決できない場合は、非同期メソッド呼び出しを処理するために SimpleAsyncTaskExecutor
が使用されます。また、void
戻り値型を持つアノテーション付きメソッドは、呼び出し元に例外を返すことができません。デフォルトでは、このようなキャッチされない例外はログに記録されるだけです。
これらすべてをカスタマイズするには、AsyncConfigurer
を実装して以下を提供します。
getAsyncExecutor()
メソッドによる独自のExecutor
SE、およびgetAsyncUncaughtExceptionHandler()
メソッドを介して独自のAsyncUncaughtExceptionHandler
。
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
- 関連事項:
オプション要素のサマリー
修飾子と型オプションの要素説明ClassSE<? extends AnnotationSE>
クラスレベルまたはメソッドレベルで検出される「非同期」アノテーション型を示します。非同期アドバイスをどのように適用するかを示します。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 mode非同期アドバイスをどのように適用するかを示します。デフォルトは
AdviceMode.PROXY
です。プロキシモードでは、プロキシを介したコールの代行受信のみが許可されることに注意してください。同じクラス内のローカルコールはそのようにインターセプトできません。ローカル呼び出し内のそのようなメソッドのAsync
アノテーションは、Spring のインターセプターがそのようなランタイムシナリオを実行しないため、無視されます。より高度な遮断モードについては、これをAdviceMode.ASPECTJ
に切り替えることを検討してください。- デフォルト:
- PROXY
order
int orderAsyncAnnotationBeanPostProcessor
を適用する順序を示します。デフォルトは
Ordered.LOWEST_PRECEDENCE
で、他のすべての後処理プログラムの後に実行されるため、ダブルプロキシではなく既存のプロキシにアドバイザを追加できます。- デフォルト:
- 2147483647