有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java处理由于远程主机无响应而导致的DoS

在服务器启动过程中,我访问远程主机以获取一些初始化数据。不幸的是,所讨论的远程主机因随机对连接不响应而臭名昭著(假设有3%的时间发生这种情况)。结果是连接无限期地挂起(可能永远挂起),我的服务器无法在合理的时间内启动(如果有的话)。它已经挂了一个小时了

连接超时:

HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(connectionTimeout);

for (int i = 0; i <= connectionRetries; i++) {
  try {
    log.info("Establishing connection to ClassNotes service.");
    conn.connect();
    break;
  } catch (SocketTimeoutException e) {
    log.warn("Timed out connecting to ClassNotes service.");
  }
}

不工作,因为服务器挂起时已与服务器建立连接。问题似乎是当它试图从服务器获取InputStream时

对于任何一个不得不使用disobediant服务的人来说,我是否应该通过有限次数的重试来执行获取InputStream的过程,并且只处理JVM内存中无限期挂起的一个或两个潜在线程?或者,在Java中是否有更常见的处理方法

知道一个服务器启动而没有来自远程主机的信息不会像服务器根本没有启动一样具有破坏性也很有用

提前谢谢


共 (2) 个答案

  1. # 1 楼答案

    您可以将此逻辑放入可运行对象中,然后创建一个与服务联系的线程。如果线程未在指定的时间内完成,请杀死该线程并重试。执行此操作直到它工作或达到重试限制,然后继续启动