Dubbo非同步轉同步

2021-10-18 16:28:54 字數 1649 閱讀 2087

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 請看下面 原...