https://www.cnblogs.com/kaiblog/p/9507642.html
https://github.com/zhangkai253/simpleRPC
public void run() {
while (running) {
try {
try {
// 當Thrift請求傳送的時候,如果請求設定了超時時間,則會被放到
// timeoutWatchSet中
if (timeoutWatchSet.size() == 0) {
// 如果沒有設定了超時時間的請求,則無限期低等待下去
selector.select();
} else {
// 從timeoutWatchSet中取出距離當前最近的過期時間
long nextTimeout = timeoutWatchSet.first().getTimeoutTimestamp();
long selectTime = nextTimeout - System.currentTimeMillis();
if (selectTime > 0) {
// 如果過期時間大於當前時間,則等待剩餘時間
selector.select(selectTime);
} else {
// 如果過期時間小於等於當前時間,則立即返回
selector.selectNow();
}
}
} catch (IOException e) {
LOGGER.error("Caught IOException in TAsyncClientManager!", e);
}
transitionMethods();
timeoutMethods();
startPendingMethods();
} catch (Exception exception) {
LOGGER.error("Ignoring uncaught exception in SelectThread", exception);
}
}
try {
selector.close();
} catch (IOException ex) {
LOGGER.warn("Could not close selector. This may result in leaked resources!", ex);
}
}
上述三種方案都可以很好地實現RPC框架對超時時間的控制。大家可以根據自己的使用場景選擇合適的解決方案。
如果想進一步溝通和討論的小夥伴,可以加群聊或者微信進一步交流哈。