2017-08-19 13 views
2

私は2つのクラスでSpring @Asyncを使用しています。どちらも最終的にインターフェースを実装しています。私は2つの別々のThreadPoolTask​​Executorを作成しているので、各クラスには独自のThreadPoolが用意されています。しかし、私はプロキシで何かを考え、SpringがAsyncクラスを実装する方法を考えるので、@Asyncアノテーションをベースインターフェイスに配置する必要があります。このため、両方のクラスは同じThreadPoolTask​​Executorを使用して終了します。 このBean(この場合は、そのインタフェースを実装するクラスを呼び出して呼び出しています)に対して、このThreadPoolTask​​Executorを使用してSpringに伝えることは可能ですか?Async Spring用に複数のthreadPoolExecutorを使用する方法

答えて

3

デフォルトでは、@Asyncをメソッドに指定する場合、使用されるエグゼキュータは、hereのように '注釈駆動型'要素に提供されるものです。

ただし、特定のメソッドを実行するときにデフォルト以外のエグゼキュータを使用する必要がある場合には、@Asyncアノテーションのvalue属性を使用できます。この場合

@Async("otherExecutor") 
void doSomething(String s) { 
    // this will be executed asynchronously by "otherExecutor" 
} 

、「otherExecutor」Springコンテナ内の任意の執行Beanの名前であってもよいし、例えば任意の執行、関連付けられた修飾子の名前であってもよいです要素やSpringの@Qualifierアノテーションで指定されているよう

https://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html

そして、おそらくあなたが望むプールの設定とアプリあなたにotherExecutor Beanを指定する必要があります。

@Bean 
public TaskExecutor otherExecutor() { 
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); 
    executor.setCorePoolSize(5); 
    executor.setMaxPoolSize(10); 
    executor.setQueueCapacity(25); 

    return executor; 
} 
+0

修飾子を使用しても、実装されたクラスはどのTaskExecutorを使用するかを知ることができます。 TaskExecutorのインタフェースレベルで「名前」または「修飾子」を1つだけ指定することにより、両方のクラスメソッドが呼び出されると、同じTaskExecutorが呼び出されます。理想的には、実装されたクラスで非同期を定義することですが、この場合は期待通りに動作しません – Kirit

+0

いいえ、実装クラスにアノテーションを入れない理由は何ですか?もちろん、余分なコーディングでそれを行うことはできますが、私はそれについて何の理由も見ません。これはどういう意味ですか?「プロキシを使って何かを考えて、SpringがAsyncクラスを実装する方法のために、@Asyncアノテーションをベースインターフェイスに配置する必要があります。 – Imran

+0

私のミス@Imran、私はimplementaitonクラスでそれを置くことができますが、私はそれも私が望んだThreadPoolを呼び出していたことに気づいた。私はなぜ思った。私はいくつかのメソッドを実装した中で抽象クラスを持っていました。 super.method()を呼び出すだけでも、最後に実装されたクラスがこれらのメソッドをオーバーライドしない限り、指定されたクラスの代わりにデフォルトのプールが使用されます。ありがとう – Kirit

関連する問題