环境信息
Dubbo version: 2.7.2 Java version: 1.8
步骤重现
//泛化调用,异步
ref.$invoke(callMethod, typeArrays, objectArrays);
//2.7.1正常,2.7.2出现npe
String uri = RpcContext.getContext().getUrl().toFullString();
event.setTotalUri(uri);
Future<Object> result = RpcContext.getContext().getFuture();
上面同一段代码,2.7.1的时候没有问题, 2.7.2 RpcContext.getContext().getUrl().toFullString();会出现npe
原提问者GitHub用户yintiefu
好像要使用whenCompleteWithContext, 异步调用的RpcContext会在AsyncRpcResult保留下来,调用whenCompleteWithContext时会把保留的RpcContext会恢复到当前线程上
AsyncRpcResult asyncRpcResult = ref.$invokeAsync(callMethod, typeArrays, objectArrays); asyncRpcResult.whenCompleteWithContext((result,t) -> { String uri = RpcContext.getContext().getUrl().toFullString(); event.setTotalUri(uri); });
上面是2.7.3的
2.7.2要这样 asyncRpcResult.thenApplyWithContext((r)->{ String uri = RpcContext.getContext().getUrl().toFullString(); event.setTotalUri(uri); return r; });
// 或者 AsyncRpcResult asyncRpcResult = ref.$invokeAsync(callMethod, typeArrays, objectArrays); String uri = asyncRpcResult.getStoredContext().getUrl().toFullString(); event.setTotalUri(uri);
原回答者GitHub用户jimgreat
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。