(十七)处理长时间没响应的请求
发布日期:2021-11-18 17:47:37 浏览次数:9 分类:技术文章

本文共 2641 字,大约阅读时间需要 8 分钟。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

Networkclient的poll函数:

//处理超时的请求 handleTimedOutRequests(responses, updatedNow);
private void handleTimedOutRequests(List
responses, long now) {
//获取到请求超时的主机。 List
nodeIds = this.inFlightRequests.getNodesWithTimedOutRequests(now, this.requestTimeoutMs); for (String nodeId : nodeIds) {
// close connection to the node //关闭请求超时的主机的连接 this.selector.close(nodeId); log.debug("Disconnecting from node {} due to request timeout.", nodeId); //我们猜应该是会去修改 连接的状态 processDisconnection(responses, nodeId, now); } // we disconnected, so we should probably refresh our metadata if (nodeIds.size() > 0) metadataUpdater.requestUpdate(); }

其实是不断去查询请求是否超时

public List
getNodesWithTimedOutRequests(long now, int requestTimeout) {
List
nodeIds = new LinkedList<>(); for (Map.Entry
> requestEntry : requests.entrySet()) {
String nodeId = requestEntry.getKey(); Deque
deque = requestEntry.getValue(); if (!deque.isEmpty()) {
ClientRequest request = deque.peekLast(); long timeSinceSend = now - request.sendTimeMs(); //是否超时,如果有主机超时了 if (timeSinceSend > requestTimeout) //把超时的主机的信息加入到nodeIds里面 nodeIds.add(nodeId); } } return nodeIds; }

private void processDisconnection(List
responses, String nodeId, long now) {
//修改连接状态 connectionStates.disconnected(nodeId, now); // for (ClientRequest request : this.inFlightRequests.clearAll(nodeId)) {
log.trace("Cancelled request {} due to node {} being disconnected", request, nodeId); if (!metadataUpdater.maybeHandleDisconnection(request)) //对这些请求进行处理 //大家会看到一个比较有意思的事 //自己封装了一个响应。这个响应里面没有服务端响应消息(服务端没给响应) //失去连接的状态表标识为true responses.add(new ClientResponse(request, now, true, null)); } }

因为长期没有收到请求,设置状态为disconnect,然后希望重新建立连接

public void disconnected(String id, long now) {
NodeConnectionState nodeState = nodeState(id); //修缓存的对应主机的连接转态:DISCONNECTED //sender -> 检查网络是否可以举报发送消息的条件 -> 是否可以尝试建立网络连接。 //如果主机的状态是:DISCONNECTED,可以尝试初始化连接。 //最后调用networkclient的poll方法(Selector 去完成的最后的网络连接) nodeState.state = ConnectionState.DISCONNECTED; nodeState.lastConnectAttemptMs = now; }

转载地址:https://blog.csdn.net/weixin_37850264/article/details/112385646 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:(十八)生产者源码的总结
下一篇:(十六)处理超时批次

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年04月05日 03时26分01秒