Asíncrono que no trabaja en el método de superclase abstracta del controlador

Dilip Raj Baral:

Tengo una BaseRestControllerclase que se extienden controladores de descanso. Tiene un método que quiero ejecutar de forma asincrónica.

public abstract class BaseRestController {
    ...

    @Async("someThreadPoolTaskExecutor")
    public void someAsyncTask() {
        ...
    }

}
@RestController
public class MyRestController extends BaseRestController {
    ...

    @GetMapping("/some/path")
    public SomeEntity getSomething() {
        ...
        this.someAsyncTask();
    }        
}

He permitido Asyncel uso de anotación, implementado un método que consigue someThreadPoolTaskExecutor TaskExecutor y todo. Si pongo @Async("someThreadPoolTaskExecutor")el de un servicio (clase anotada con el @Servicemétodo), que funciona, pero si lo hago con someAsyncTask () en BaseRestController el código no se ejecutará de forma asíncrona. Decorar la clase con @Component tampoco funcionó.

Guía del muelle en asíncrono tampoco ayudó. En ella está la demostración, sino que también demuestra asíncrono con la clase de servicio.

Mientras que, en el proceso, me di cuenta de que el comportamiento que quería aplicar era mejor delegada a una clase de servicio, estoy curioso en cuanto a entender por qué el anterior no funcionará.

Estoy usando 2.1.0.RELEASE de la primavera de arranque.

Consorcio inactivo :

Hay un par de reglas para @Async, que está haciendo la propia invocación que no funcionará aquí

  • se debe aplicar sólo a los métodos públicos
  • auto-invocación - llamando al método asincrónico desde dentro de la misma clase - no funcionará

Las razones son simples - el método tiene que ser tan público que puede ser un servidor proxy. Y auto-invocación no funciona porque no pasa por el proxy y llama al método subyacente directamente.

Supongo que te gusta

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