我有一个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 。
答案 0 :(得分:8)
@Async
有几个规则,您正在执行自调用here
原因很简单–该方法需要公开,以便可以代理。 自调用不起作用,因为它绕过了代理并直接调用了基础方法。