@TargetSE(valueSE=TYPESE) @RetentionSE(valueSE=RUNTIMESE) @DocumentedSE @Import(value=AsyncConfigurationSelector.class) public @interface EnableAsync
<task:*>
XML 名前空間にある機能と同様に、Spring の非同期メソッド実行機能を有効にします。 次のように @Configuration
クラスと一緒に使用して、Spring アプリケーションコンテキスト全体に対してアノテーション駆動型非同期処理を有効にします。
@Configuration @EnableAsync public class AppConfig { }
MyAsyncBean
は、Spring の @Async
アノテーション、EJB 3.1 @javax.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
を返してデフォルト設定を維持できます。可能な場合は、AsyncConfigurerSupport
からの拡張も検討してください。
メモ: 上記の例では、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 がクラスパスに存在する必要があることに注意してください。このようなシナリオに関係するプロキシはありません。ローカルコールもインターセプトされます。
Async
, AsyncConfigurer
, AsyncConfigurationSelector
修飾子と型 | オプションの要素と説明 |
---|---|
ClassSE<? extends AnnotationSE> | annotation クラスレベルまたはメソッドレベルで検出される「非同期」アノテーション型を示します。 |
AdviceMode | mode 非同期アドバイスをどのように適用するかを示します。 |
int | order AsyncAnnotationBeanPostProcessor を適用する順序を示します。 |
boolean | proxyTargetClass 標準の Java インターフェースベースのプロキシではなく、サブクラスベース(CGLIB)のプロキシを作成するかどうかを示します。 |
public abstract ClassSE<? extends AnnotationSE> annotation
デフォルトでは、Spring の @Async
アノテーションと EJB 3.1 @javax.ejb.Asynchronous
アノテーションの両方が検出されます。
この属性は、開発者が独自のカスタムアノテーション型を提供して、メソッド(または特定のクラスのすべてのメソッド)を非同期で呼び出す必要があることを示すために存在します。
public abstract boolean proxyTargetClass
mode()
の場合のみ適用は AdviceMode.PROXY
に設定されます。
デフォルトは false
です。
この属性を true
に設定すると、@Async
でマークされたものだけでなく、プロキシを必要とするすべての Spring 管理 Bean に影響することに注意してください。例: Spring の @Transactional
アノテーションが付いた他の Bean は、同時にサブクラスプロキシにアップグレードされます。たとえば、テストで、ある型のプロキシに対して別の型のプロキシを明示的に期待していない限り、このアプローチは実際には悪影響を及ぼしません。
public abstract AdviceMode mode
デフォルトは AdviceMode.PROXY
です。プロキシモードでは、プロキシを介したコールの代行受信のみが許可されることに注意してください。同じクラス内のローカルコールはそのようにインターセプトできません。ローカル呼び出し内のそのようなメソッドの Async
アノテーションは、Spring のインターセプターがそのようなランタイムシナリオを実行しないため、無視されます。より高度な遮断モードについては、これを AdviceMode.ASPECTJ
に切り替えることを検討してください。
public abstract int order
AsyncAnnotationBeanPostProcessor
を適用する順序を示します。 デフォルトは Ordered.LOWEST_PRECEDENCE
で、他のすべての後処理プログラムの後に実行されるため、ダブルプロキシではなく既存のプロキシにアドバイザを追加できます。