dubbo是一款開源rpc框架,底層使用netty作為預設的資料傳輸方式,那麼請求處理理論上是非同步的,但是我們在使用dubbo時,是同步拿到結果的,這是因為dubbo框架幫我們做了非同步轉同步的操作。
構造乙個defaultfuture,並將defaultfuture放在map中,key為請求是生成的唯一id。
private static final mapchannels = new concurrenthashmap<>();
// 每次請求都會生成乙個defaultfuture物件,然後儲存到futures中,
// 請求返回結果時,根據id從futures中找到對應的defaultfuture物件,並刪除
private static final mapfutures = new concurrenthashmap<>();
public static final timer time_out_timer = new hashedwheeltimer(
new namedthreadfactory("dubbo-future-timeout", true),
30,timeunit.milliseconds);
// invoke id.
private final long id;
private final channel channel;
// 請求物件
private final request request;
// 超時時間
private final int timeout;
private final long start = system.currenttimemillis();
private volatile long sent;
private timeout timeoutchecktask;
private defaultfuture(channel channel, request request, int timeout)
獲取結果,如果結果未返回就休眠等待。
public object get(int timeout) throws remotingexception
// isdone()方法就是判斷response是否有值(即是否有返回結果)
if (!isdone())
}} catch (interruptedexception e) finally
// 如果是超時了,就丟擲異常
if (!isdone())
}// 遠端服務正常返回結果,則返回給呼叫方
return returnfromresponse();
}
服務提供者處理完成將結果寫回,並喚醒消費者。
public static void received(channel channel, response response) else
} finally
}
private void doreceived(response res)
} finally
if (callback != null)
}
同步轉非同步
countdownlatch 乙個同步輔助類,在完成一組正在其他執行緒中執行的操作之前,它允許乙個或多個執行緒一直等待。初始化物件 數字1自己定,一般有幾個需要同步的非同步執行緒就設定為幾 countdownlatch countdownlatch new countdownlatch 1 讓非同步...
Dubbo 同步 非同步呼叫的幾種方式
我們知道,dubbo 預設協議採用單一長連線,底層實現是 netty 的 nio 非同步通訊機制 基於這種機制,dubbo 實現了以下幾種呼叫方式 同步呼叫是一種阻塞式的呼叫方式,即 consumer 端 一直阻塞等待,直到 provider 端返回為止 通常,乙個典型的同步呼叫過程如下 consu...
2019 9 2 C 同步方法轉非同步
title author date createtime categories c 同步方法轉非同步 lindexi 2019 09 02 12 57 37 0800 2018 2 13 17 23 3 0800 c 最簡單的方法是建立乙個新的執行緒,建立的方法是使用 task.run 請看下面 原...