繁体   English   中英

在同步中调用异步方法[重复]

[英]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 方法不能异步工作。 我知道这是由于它被调用的上下文。 如果您将异步方法移动到另一个服务,那么一切都会开始正常工作。 但是如何让此代码在一项服务中正常工作? 就应用程序架构和代码风格而言,这是否正常?

但是如何让此代码在一项服务中正常工作?

简单地说:你不能。

  1. @Async 注释首先——让我们回顾一下规则——@Async 有两个限制:

    1. 它必须只应用于公共方法
    2. 自调用——从同一个类中调用异步方法——将不起作用

原因很简单——该方法需要是公开的,以便它可以被代理。 并且自调用不起作用,因为它绕过代理并直接调用底层方法。

(来源: 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM