
[英]What is the best way to convert a synchronous method call to an asynchronous one?
[英]Call an asynchronous method in a synchronous [duplicate]
这是我的代码:
@Service
public class ServiceImpl implements Service {
@Override
public Document updateFiasByFileName(String fileName){
startUpdate(fileName);
}
@Async("threadPoolTaskExecutor")
public void startUpdate(String fileName) {
// A lot of code....
}
}
startUpdate 方法不能异步工作。 我知道这是由于它被调用的上下文。 如果您将异步方法移动到另一个服务,那么一切都会开始正常工作。 但是如何让此代码在一项服务中正常工作? 就应用程序架构和代码风格而言,这是否正常?
但是如何让此代码在一项服务中正常工作?
简单地说:你不能。
@Async 注释首先——让我们回顾一下规则——@Async 有两个限制:
- 它必须只应用于公共方法
- 自调用——从同一个类中调用异步方法——将不起作用
原因很简单——该方法需要是公开的,以便它可以被代理。 并且自调用不起作用,因为它绕过代理并直接调用底层方法。
(来源: https : //www.baeldung.com/spring-async )
对于此类问题,我通常的解决方案是创建第二个类,调用它,例如AsyncServiceImplFacade
,它只包含对原始方法的调用,类似于
@Service
public class ServiceImpl implements Service {
@Override
public Document updateFiasByFileName(String fileName){
// A lot of code...
}
}
@Service
public class AsyncServiceImplFacade {
@Autowired
ServiceImpl serviceImpl;
@Async("threadPoolTaskExecutor")
public void startUpdate(String fileName) {
this.serviceImpl.updateFiasByFileName(fileName);
}
}
为需要异步执行的客户端充当异步门面,而其他人则可以使用原始服务进行同步执行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.