特定の@Asyncメソッドの専用実行を目的として@Beanとして初期化されたスレッドプールがあります
class MyConfig {
@Bean(name="myPool")
public static TaskExecutor getExecutor(){
ThreadPooltaskExecutor exec = new ThreadPoolTaskExecutor();
exec.setCorePoolSize(1);
exec.setMaxPoolSize(1);
exec.setThreadNamePrefix("my-thread");
exec.initialize();
return exec;
}
}
Beanとしての上記のスレッドプールは、以下のようにAsyncメソッド呼び出しで使用されます。
public class MyHandler {
...
@Async("myPool")
public void handle(){
...
logger.INFO("do my thing");
...
}
...
}
次のように、デフォルトのSpring @ Asyncプールを使用している他のクラスもあります。
public class OtherScheduledTask {
...
@Async
public void doThat() {
logger.INFO("doing that thing");
}
...
}
アプリケーションを実行すると、ログに次の情報が表示されます。
[pool-1-thread-1] [] c.c.a.m.p.e.c.OtherScheduledTask - do my thing
[myPool] [] c.c.a.m.p.e.c.MyHandler - doing that thing
....
上記のログスニペットがランダムに出力され、非同期メソッドがデフォルトでスレッドプールとカスタムスレッドプールを断続的に実行されているのがわかります
非非同期メソッドから@Asyncメソッドを呼び出すシナリオがあります
ただし、カスタムスレッドプールは、MyHandlerの@Asyncメソッドhandle()を1つだけ使用し、他の場所では使用していません。
@asyncメソッドを実行するためにSpringがスレッドプール(カスタムとデフォルトの両方)を混合しているのはなぜですか?
@AsyncメソッドアノテーションでBean名を渡すことの使用法は何ですか?
1つの特定の非同期メソッドで専用のスレッドプールを使用して、実行されていないときにスレッドプールをアイドル状態にし、デフォルトのスプリングスレッドプールでのみ実行される他の非同期メソッドに使用されないようにする方法
私の環境に関する詳細:Springブートバージョン1.4.2 RELEASE JDK 1.8.0
Springとプロキシに関する重要な点の1つは、多くの注釈付き機能がプロキシを使用して機能を提供することです。つまり@Transactional
、@Cacheable
および@Async
すべては、それらの注釈を検出し、プロキシ豆でこれらの豆を包む春に依存しています。
その場合、プロキシメソッドはクラスで呼び出された場合にのみ使用でき、クラス内からは使用できません。参照してください。これをトピックについて。
コメントから引用するには:
@Dovmo同じクラスの非非同期メソッドからカスタムプールを使用して1つの非同期メソッドを呼び出しています。他の非同期メソッドはそれぞれのクラスから呼び出されており、他のクラスからこれらのメソッド間での呼び出しはありません
@Async
コンテキスト内の別のクラスからこれらのメソッドをリファクタリングして呼び出すか、クラスをそれ自体に自己自動配線して、その方法で非同期メソッドを呼び出してみてください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加