Dubbo源码分析----DefaultFuture

本文深入分析了Dubbo中异步请求的处理机制,特别是DefaultFuture的角色。首先,通过HeaderExchangeHandler的received方法处理Response,利用request的id确保请求与响应的一一对应。其次,DefaultFuture在每次请求时创建,用于存储Request信息和Channel信息,方便通过id找到对应请求的响应。当调用Future的get方法时,会不断检查isDone状态直到响应返回,实现同步效果。最后,当response到达时,它会被设置到对应的Future中,唤醒阻塞的线程,处理超时请求的机制也在DefaultFuture中得以实现。
摘要由CSDN通过智能技术生成

前面两篇文章已经分析了provider和consumer之间的通信过程,那么还有几个问题:

  1. 由于请求是异步的,provider返回结果到客户端之后,consumer怎么知道该结果是哪个请求的?
  2. 由于请求是异步的,为何Dubbo能同步等待结果?

由于请求是异步的,provider返回结果到客户端之后,consumer怎么知道该结果是哪个请求的?

先看下第一个问题,因为provider返回结果也是一次网络请求,那么切入点自然也是Handler,看下哪个Handler处理了Response,从上篇文章中的NettyServer结构图中一个个Handler查看,发现HeaderExchangeHandler有做处理,主要是received方法

    public void received(Channel channel, Object message) throws RemotingException {
        channel.setAttribute(KEY_READ_TIMESTAMP, System.currentTimeMillis());
        ExchangeChannel exchangeChannel = HeaderExchangeChannel.getOrAddChannel(channel);
        try {
            if (message instanceof Request) {
                //....
            } else if (message instanceof Response) {
                handleResponse(channel, (Response) message);
            } else if (message instanceof String) {
                //....
            } else {
                handler.received(exchangeChannel, message);
            }
        }catch (Exception e){
            logger.error(e);
        }finally {
            HeaderExchangeChannel.removeChannelIfDisconnected(channel);
        }
    }

如果接收到的对象是Response类型的,那么交由handleResponse进行处理

    static void handleResponse(Channel channel, Response response) throws RemotingException {
        if (response != null && !response.isHeartbeat()) {
  // 如果不是心跳信息
            DefaultFuture.received(channel, response);
        }
    }

DefaultFuture

    public static void received(Channel channel, Response 
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值