Dubbo3TripleGenerator生成的xxxAsync方法本质上仍然是阻塞的,这样做的意义是什么?
通过dubbo-compiler的插件生成了接口,会自动生成xxxAsync()方法,但是它只是通过CompletableFuture.completedFuture()包装了同步方法,它仍然会阻塞consumer的业务线程。这么实现的目的是什么?


Ask your question here
我当前使用dubbo 3.1.4的triple协议(同时使用了IDL+protobuf),想提供CompletableFuture<Result>返回值的异步调用,应该怎么做?
客户端如果不使用proxy=“nativestub”,会抛出以下错误:
This serialization only support google protobuf messages, but the actual input type is :java.util.concurrent.CompletableFuture
客户端如果使用proxy=“nativestub”,调用kickOffDeviceAsync(),实际上会调用CompletableFuture.completedFuture(kickOffDevice(request));.如此就会造成阻塞了,没有达到异步的目的
是个 bug 我这边晚点看下
CompletableFuture.completedFuture(kickOffDevice(request));
方法并不是给客户端使用的方法,客户端如果使用非 stub 方式,其实是使用 proxy 去发起 rpc 调用的,和 default 的方法无关,这个逻辑只是给服务端的一个默认方法,只是因为他的返回值是 future ,但核心在于,服务端的async 意义不是很大,该方法的逻辑,而且很多人并不需要这个方法,如果强制要求用户重写会很痛苦,所以默认逻辑是包装一下sync 的方法,当然你也可以重写
hi chen,感谢你的修复。我刚刚测试过,不使用stub方式是可以达到我的目的。我还有两个疑问想向你咨询一下:
- 我想问一下,客户端使用stub和proxy方式有什么不同吗,客户端的stub是不是为了方便stream流接口?
- “服务端的async”,我的目的是为了服务端内部调用其他服务的时候不阻塞业务线程,采用了completableFuture形式返回响应?请问在triple协议下,有什么好的实现方法吗?是不是要采用stream接口呢?
hi chen,感谢你的修复。我刚刚测试过,不使用stub方式是可以达到我的目的。我还有两个疑问想向你咨询一下:
- 我想问一下,客户端使用stub和proxy方式有什么不同吗,客户端的stub是不是为了方便stream流接口?
- “服务端的async”,我的目的是为了服务端内部调用其他服务的时候不阻塞业务线程,采用了completableFuture形式返回响应?请问在triple协议下,有什么好的实现方法吗?是不是要采用stream接口呢?
- stub 模式主要是没有反射的,他是没有 proxy 这层的,纯 native
- 这个问题在于你没有理解 rpc 层面的异步是什么逻辑,在rpc 场景下,所有的异步都是对客户端来说的,你调了服务端的 async 接口,服务端的async 接口其实是对 sync 接口的同步包装,其实也就是调用了sync 接口,对于你的需求,调用其他服务不阻塞业务线程直接调用 async 方法就可以了