[apache/dubbo]dubbo3.0.9异步调用传递性导致嵌套调用返回null值

2023-12-13 994 views
3

image 调用链路如下:

  1. serviceA 异步调用serviceB
  2. serviceB 同步调用serviceC
  3. serviceA 接收到serviceB的响应结果是null

尝试这个解决办法 image 贴上实际的代码:

@Activate(group = "provider", order = -999)
public class DubboSyncFilter implements Filter {
    protected final Logger logger = LoggerFactory.getLogger(this.getClass());
    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        logger.info("RPC调用之前,处理参数.....");
        //避免RpcContext透传,使用配置文件的async
        boolean isAsync = invoker.getUrl().getMethodParameter(invocation.getMethodName(), Constants.ASYNC_KEY, false);
        RpcContext.getContext().setAttachment(Constants.ASYNC_KEY, String.valueOf(isAsync));
        return invoker.invoke(invocation);
    }
}

但是并没有得到解决 @AlbumenJ

回答

9

serviceA(上游) publict List serviceAtest(){ CompletableFuture<List> future = CompletableFuture.completedFuture(new ArrayList<>()); // 这里异步RPC调用serviceB服务 future = CompletableFuture.supplyAsync(() -> queryRealtime()); return future.get(); // 这里始终返回null。 }

private List queryRealtime() { return serviceB.getBRealtime(); }

-----------------下游---------------------

serviceB(下游) private List getBRealtime() { // 这里同步PRC调用serviceC return serviceC.getCRealtime(); // 这里是有数据返回的 } @AlbumenJ

2

image 这里走的是 Java 异步

serviceB 是不是配置过 async 类似的参数

1

这个跟走Java异步没什么关系,使用RPC提供的异步调用也是一样的出现这个问题,而且这个问题不是我遇到,网上可以搜到很多人都遇到这个异步传递RPC调都出现返回null的问题 @AlbumenJ

4

目前可以确定的是具体的原因肯定不是你截图的这里

而且这个问题不是我遇到,网上可以搜到很多人都遇到这个异步传递RPC调都出现返回null的问题

目前遇到的都是 A -> B -> C,由于 A -> B 是异步的,导致 B -> C 也变成异步的了,如果不是请提供具体的可复现 case,只提一个现象没人能帮你解决问题的