private boolean checkIsSurvive(Node node) { if (node.getChannel() == null || node.getStatus() != NodeStatusEnum.CONNECTABLE || node.getConnectStatus() != NodeConnectStatusEnum.AVAILABLE) { if(node.getChannel() != null) { node.getChannel().close(); } return false; } return true; } }
private int doProbe(Node node) { if(node == null) { return PROBE_STATUS_FAIL; } CompletableFuture<Integer> future = new CompletableFuture<>(); node.setConnectedListener(() -> { node.setConnectStatus(NodeConnectStatusEnum.CONNECTED); node.getChannel().close(); }); node.setDisconnectListener(() -> { node.setChannel(null); if (node.getConnectStatus() == NodeConnectStatusEnum.CONNECTED) { future.complete(PROBE_STATUS_SUCCESS); } else if (nodeManager.getAvailableNodesCount() == 0) { future.complete(PROBE_STATUS_IGNORE); } else { future.complete(PROBE_STATUS_FAIL); } }); boolean result = connectionManager.connection(node); if (!result) { return PROBE_STATUS_FAIL; } try { return future.get(); } catch (Exception e) { Log.error(e); return PROBE_STATUS_IGNORE; } }
public void nodeConnectDisconnect(Node node) { if (node.getChannel() != null) { node.setChannel(null); } //连接断开后,判断是否是为连接成功,还是连接成功后断开 if (node.getConnectStatus() == NodeConnectStatusEnum.CONNECTED || node.getConnectStatus() == NodeConnectStatusEnum.AVAILABLE) { node.setFailCount(0); node.setConnectStatus(NodeConnectStatusEnum.DISCONNECT); nodesContainer.getDisconnectNodes().put(node.getId(), node); nodesContainer.getConnectedNodes().remove(node.getId()); // Log.info("node {} disconnect !", node.getId()); } else { // 如果是未连接成功,标记为连接失败,失败次数+1,记录当前失败时间,供下次尝试连接使用 nodeConnectFail(node); nodesContainer.getCanConnectNodes().remove(node.getId()); nodesContainer.getFailNodes().put(node.getId(), node); } }
public static NodePo toPojo(Node node) { NodePo po = new NodePo(); po.setId(node.getId()); po.setIp(node.getIp()); po.setPort(node.getPort()); po.setLastTime(node.getLastTime()); po.setLastFailTime(node.getLastFailTime()); po.setFailCount(node.getFailCount()); po.setStatus(node.getStatus()); po.setConnectStatus(node.getConnectStatus()); return po; }