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框架对超时时间的控制。大家可以根据自己的使用场景选择合适的解决方案。
更新补充:
最后给大家留一个小问题吧,在第3种方案中我们使用了异步的方案来实现对超时时间的控制,我们如何阻塞等待异步请求的结果呢?
如果想进一步沟通和讨论的小伙伴,可以加群聊或者微信进一步交流哈。
