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

报错:RpcContext.getContext().getUrl().toFullString()

环境信息

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

提问85.png

原提问者GitHub用户yintiefu

展开
收起
大圣东游 2023-05-11 20:15:19 133 0
1 条回答
写回答
取消 提交回答
  • 好像要使用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

    2023-05-12 12:13:54
    赞同 展开评论 打赏
问答分类:
问答地址:

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

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载