ディリップラジBARAL:
私が持っているBaseRestController
残りのコントローラが拡張するクラスを。それは私が非同期的に実行したいメソッドを持っています。
public abstract class BaseRestController {
...
@Async("someThreadPoolTaskExecutor")
public void someAsyncTask() {
...
}
}
@RestController
public class MyRestController extends BaseRestController {
...
@GetMapping("/some/path")
public SomeEntity getSomething() {
...
this.someAsyncTask();
}
}
私が有効になっているAsync
取得するメソッド実装され、注釈を使用してsomeThreadPoolTaskExecutor
のTaskExecutorし、すべてを。私が入れた場合は@Async("someThreadPoolTaskExecutor")
サービスの(と注釈付きクラス上@Service
)メソッド、それは動作しますが、私がそうするならばsomeAsyncTask()内BaseRestControllerコードは非同期で実行されません。持つクラスを飾る@Componentはどちらか動作しませんでした。
非同期のスプリングガイドは、どちらかの助けにはなりませんでした。それのデモでは、それはまた、実証非同期のサービスクラスで。
プロセスでは、私が実装したかった行動があったことを実現し、一方でサービスクラスに委譲し、より良いオフ、なぜ上記の意志ではない仕事を理解するためとして、私は好奇心旺盛です。
私が使用しています2.1.0.RELEASE春ブーツのを。
デッドプール :
以下のためのルールがいくつかあります@Async
、あなたは動作しません自己呼び出しやっているここでは、
- それはパブリックメソッドのみに適用されなければなりません
- 自己呼び出し - 同じクラス内から非同期メソッドを呼び出す - 動作しません。
理由は単純です-この方法は、それがプロキシすることができ、公共そうする必要があります。それはプロキシをバイパスするため、自己の呼び出しは動作しませんし、直接基本となるメソッドを呼び出します。