Dubbo中异步转同步
TCP协议本身就是异步的,在TCP协议层面,我们发完RPC请求后,并不会等待RPC的响应结果,那么框架帮助我们做了,那是怎么做的呢?
我们可以首先想到的就是等待-通知。
private final Lock lock= new ReentrantLock();private final Condition done= lock.newCondition();while(终止条件){done.await(); // 等待}done.sigall();//唤醒
String response = "";// 是我们的返回结果// 创建锁与条件变量private final Lock lock= new ReentrantLock();private final Condition done= lock.newCondition();Boolean isDone(){return respnes != null;}long start = System.nanoTime(); // 开始时间lock.lock(); // 上锁try{while(!isDone){ // 为空一致循环done.await(timeOut); // 等待超时时间long cur=System.nanoTime(); // 当前时间if(isDone || cur - strat > timeOut){ // RPC返回了信息 或 等待超时 就break}final{lock.unlock();}if (!isDone()) {throw new TimeoutException(); // 超时}
dubbo中的实现
// 创建锁与条件变量private final Lock lock= new ReentrantLock();private final Condition done= lock.newCondition();// 调用方通过该方法等待结果Object get(int timeout){long start = System.nanoTime();lock.lock();try {while (!isDone()) {done.await(timeout);long cur=System.nanoTime();if (isDone() ||cur-start > timeout){break;}}} finally {lock.unlock();}if (!isDone()) {throw new TimeoutException();}return returnFromResponse();}// RPC结果是否已经返回boolean isDone() {return response != null;}// RPC结果返回时调用该方法private void doReceived(Response res) {lock.lock();try {response = res;if (done != null) {done.signal();}} finally {lock.unlock();}}
