gpt4 book ai didi

java - 异步不适用于 Controller 的抽象父类(super class)方法

转载 作者:行者123 更新时间:2023-12-01 17:50:51 31 4
gpt4 key购买 nike

我有一个 Rest Controller 扩展的 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,实现了一个获取someThreadPoolTask​​ExecutorTaskExecutor等的方法。如果我将 @Async("someThreadPoolTask​​Executor") 放在 Service 的(用 @Service 注释的类)方法上,它会起作用,但如果我使用 someAsyncTask() 这样做在BaseRestController中,代码不会异步运行。用@Component 装饰类也不起作用。

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

虽然在此过程中,我意识到我想要实现的行为最好委托(delegate)给服务类,但我很好奇为什么上述方法不起作用。

我正在使用 Spring Boot 的2.1.0.RELEASE

最佳答案

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

  • 它只能应用于公共(public)方法
  • 自调用 - 从同一个类中调用异步方法 - 不起作用

The reasons are simple – the method needs to be public so that it can be proxied. And self-invocation doesn’t work because it bypasses the proxy and calls the underlying method directly.

关于java - 异步不适用于 Controller 的抽象父类(super class)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60796112/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com