异步不适用于控制器的抽象超类方法

时间:2019-01-30 03:30:34

标签: java spring spring-boot

我有一个Rest控制器扩展的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注释的类)方法上,它可以工作,但是如果我在 BaseRestController 中的 someAsyncTask()上这样做该代码不会异步运行。用 @Component 装饰类也不起作用。

Spring guide on Async也没有帮助。在该演示中,还演示了带有服务类的 Async

在此过程中,我意识到我想实现的行为最好委托给服务类,但我很好奇为什么不执行上述操作。

我正在使用Spring Boot的 2.1.0.RELEASE

1 个答案:

答案 0 :(得分:8)

@Async有几个规则,您正在执行自调用here

  • 必须仅将其应用于公共方法
  • 自调用–从同一类中调用async方法–不起作用
  

原因很简单–该方法需要公开,以便可以代理。 自调用不起作用,因为它绕过了代理并直接调用了基础方法。