Dubbo 结果返回存在三种形式 1.异步无返回结果 2.异步又返回结果 3.同步有返回结果 //代码在DubboInvoker.java 中的82行起
第三种同步有返回结果的情况下
处理流程如下:
1.currentClient.request(inv, timeout).get() 在同步调用中使用currentClient.request(inv, timeout) 做netty请求发送,返回一个DefaultFuture对象,调用 DefaultFuture的get方法
2.DefaultFuture.get(int timeout) 中 首先通过isDone()方法做了是否有服务提供者端结果返回的判断; 还未有返回时,首先记录当前时间,获取线程锁,使用while(!isDone)做循环判断 , 当提供者仍无返回结果时 done.await(timeout, TimeUnit.MILLISECONDS);出现返回结果或是存在超时的情况下跳出循环 ;当此时仍没有 提供者返回结果时抛TimeoutException,最后做返回结果判断 ,当出现res.getStatus() == Response.CLIENT_TIMEOUT || res.getStatus() == Response.SERVER_TIMEOUT时然后会抛TimeoutException。
3.DefaultFuture中的doReceived方法 负责在接到提供者端的返回后给response,同时done.signal()