dubbo信息交换
2017-12-26 本文已影响50人
忘净空
信息交换层(Exchange):封装请求响应模式,同步转异步,以Request和Response为中心,扩展接口为Exchanger、ExchangeChannel、ExchangeClient和ExchangeServer。
源码走读
DubboInvoker类的doInvoke方法开始
image.png顺着同步调用的方法往下走!
HeaderExchangeChannel类的request
封装request请求参数,详细看DefaultFuture future = new DefaultFuture(channel, req, timeout)
方法。
如何获取Result呢?请看DefaultFuture的get方法。
其实get方法中处理很简单,就是没有执行完成,线程切换到等到状态,那么线程何时唤醒呢?
HeaderExchangeHandler类received方法顺着方法一直往下追,将在DefaultFuture类中看到下面的代码。
唤醒线程
问题
- 封装request请求的时候为何要将requestId作为key,DefaultFuture作为value塞进Map中。
dubbo协议单一长连接,但是客户端多线程并发请求,为了保证request和response对应需要request标识一个id,同时response也携带这个id。