@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" という名前の 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(5);
executor.setMaxPoolSize(10);
executor.setQueueCapacity(25);
executor.setThreadNamePrefix("MyExecutor-");
executor.initialize();
return executor;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return 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="5-10" queue-capacity="25"/>
<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 | orderAsyncAnnotationBeanPostProcessor を適用する順序を示します。 |
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 で、他のすべての後処理プログラムの後に実行されるため、ダブルプロキシではなく既存のプロキシにアドバイザを追加できます。