Dubbo consumer端接收服务端返回结果异步转同步机制及超时处理

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()

猜你喜欢

转载自my.oschina.net/u/3426999/blog/1634268
今日推荐