牛骨文教育服务平台(让学习变的简单)
博文笔记

dubbo异步调用传递性问题的解决方案

创建时间:2016-07-27 投稿人: 浏览次数:4408
      最近在重构代码时发现,原本的一个查询返回List的方法,改成dubbo接口后,调用这个方法一直返回null。
后听同事说起,原来dubbo异步调用具有传递性,不过只会传递一次。
就是ServiceA异步调ServiceB,ServiceB再同步调ServiceC,此时ServiceC会当异步调用。
但是,如果后续还有同步调用,则因B调C为同步,则就会正常同步调用了。

解决这个问题的话,有几种情况考虑:

1. dubbo调用都改为同步调用或都改为异步调用;

2. 如果ServiceC是查询方法,则ServiceB中调两次ServiceC,取第二次调的结果;(因为第二次已是同步调用)

3. 修改com.alibaba.dubbo.rpc.protocol.AbstractInvoker中的Line137-139代码,每次都对async进行实际赋值:

if (getUrl().getMethodParameter(invocation.getMethodName(), Constants.ASYNC_KEY, false)){
    invocation.setAttachment(Constants.ASYNC_KEY, Boolean.TRUE.toString());
}
改为:

boolean isAsync = getUrl().getMethodParameter(invocation.getMethodName(), Constants.ASYNC_KEY, false);
invocation.setAttachment(Constants.ASYNC_KEY, String.valueOf(isAsync));
即可。
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。