アノテーションインターフェース 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" という名前の ExecutorSE Bean のいずれかの、関連付けられたスレッドプール定義を検索します。どちらも解決できない場合は、非同期メソッド呼び出しを処理するために SimpleAsyncTaskExecutor が使用されます。また、void 戻り値型を持つアノテーション付きメソッドは、呼び出し元に例外を返すことができません。デフォルトでは、このようなキャッチされない例外はログに記録されるだけです。
これらすべてをカスタマイズするには、AsyncConfigurer を実装して以下を提供します。
getAsyncExecutor()メソッドによる独自のExecutorSE、および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 がクラスパスに存在する必要があることに注意してください。このようなシナリオに関係するプロキシはありません。ローカルコールもインターセプトされます。
注: @EnableAsync はローカルアプリケーションコンテキストにのみ適用され、異なるレベルでの選択的なアクティベーションを可能にします。複数のレベルで @EnableAsync の動作を適用する必要がある場合は、共通のルート Web アプリケーションコンテキストと個別の DispatcherServlet アプリケーションコンテキストなど、個々のコンテキストごとに @EnableAsync を再宣言してください。
- 導入:
- 3.1
- 作成者:
- Chris Beams, Juergen Hoeller, Stephane Nicoll, Sam Brannen
- 関連事項:
オプション要素の概要
オプション要素修飾子と型オプションの要素説明ClassSE<? extends AnnotationSE>クラスレベルまたはメソッドレベルで検出される「非同期」アノテーション型を示します。非同期アドバイスをどのように適用するかを示します。intAsyncAnnotationBeanPostProcessorを適用する順序を示します。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