Assíncrona não funciona no método de classe super-abstract do controlador

Dilip Raj Baral:

Eu tenho uma BaseRestControllerclasse 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 Asyncusando 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 @Servicemé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.

Piscina morta :

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.

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=223008&siteId=1
Recomendado
Clasificación