通过dubbo-compiler的插件生成了接口,会自动生成xxxAsync()方法,但是它只是通过CompletableFuture.completedFuture()包装了同步方法,它仍然会阻塞consumer的业务线程。这么实现的目的是什么?
我当前使用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
CompletableFuture.completedFuture(kickOffDevice(request));
方法并不是给客户端使用的方法,客户端如果使用非 stub 方式,其实是使用 proxy 去发起 rpc 调用的,和 default 的方法无关,这个逻辑只是给服务端的一个默认方法,只是因为他的返回值是 future ,但核心在于,服务端的async 意义不是很大,该方法的逻辑,而且很多人并不需要这个方法,如果强制要求用户重写会很痛苦,所以默认逻辑是包装一下sync 的方法,当然你也可以重写
原回答者GitHub用户EarthChen
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。