Eu tenho uma BaseRestController
classe que controladores de descanso estender. Ele tem um método que eu quero correr de forma assíncrona.
public abstract class BaseRestController {
...
@Async("someThreadPoolTaskExecutor")
public void someAsyncTask() {
...
}
}
@RestController
public class MyRestController extends BaseRestController {
...
@GetMapping("/some/path")
public SomeEntity getSomething() {
...
this.someAsyncTask();
}
}
Tenho habilitado Async
usando anotação, implementou um método que obtém someThreadPoolTaskExecutor
TaskExecutor e tudo. Se eu colocar @Async("someThreadPoolTaskExecutor")
em um de Serviço (classe anotada com @Service
método), ele funciona, mas se eu fizer isso com someAsyncTask () em BaseRestController o código não será executado de forma assíncrona. Decorar a classe com @Component não quer trabalhar.
Guia da mola em Async não quer ajudar. Nele da demo, ele também demonstra Async com classe de serviço.
Enquanto, no processo, percebi que o comportamento que eu queria implementar estava melhor delegada a uma classe de serviço, estou curioso para entender por que o acima não irá funcionar.
Estou usando 2.1.0.RELEASE da Primavera de inicialização.
Existem algumas regras para @Async
, você está fazendo a auto-invocação que não vai funcionar aqui
- ele deve ser aplicado a métodos públicos apenas
- auto-invocação - chamando o método assíncrono de dentro da mesma classe - não vai funcionar
As razões são simples - o método precisa ser tão público que possa ser aproximada. E auto-invocação não funciona porque ele ignora o proxy e chama o método subjacente diretamente.