开发者社区 > 云原生 > 正文

Dubbo3TripleGenerator生成的xxxAsync方法本质上仍然是阻塞的,这样做的意义

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

提问16.png

提问17.png

我当前使用dubbo 3.1.4的triple协议(同时使用了IDL+protobuf),想提供CompletableFuture返回值的异步调用,应该怎么做?

客户端如果不使用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));.如此就会造成阻塞了,没有达到异步的目的

原提问者GitHub用户linsida1

展开
收起
大圣东游 2023-05-11 15:54:15 78 0
1 条回答
写回答
取消 提交回答
  • CompletableFuture.completedFuture(kickOffDevice(request));

    方法并不是给客户端使用的方法,客户端如果使用非 stub 方式,其实是使用 proxy 去发起 rpc 调用的,和 default 的方法无关,这个逻辑只是给服务端的一个默认方法,只是因为他的返回值是 future ,但核心在于,服务端的async 意义不是很大,该方法的逻辑,而且很多人并不需要这个方法,如果强制要求用户重写会很痛苦,所以默认逻辑是包装一下sync 的方法,当然你也可以重写

    原回答者GitHub用户EarthChen

    2023-05-12 10:21:02
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:

阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。

相关电子书

更多
Dubbo开源现状与2.7规划 立即下载
Dubbo分布式服务治理实战 立即下载
《Dubbo 3.0 前瞻》 立即下载