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

时间:2010-01-15 15:35:19

标签: java io

在服务器启动过程中,我访问远程主机以获取一些初始化数据。不幸的是,有问题的远程主机因连接无法响应而臭名昭着(比如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 个答案:

答案 0 :(得分:2)

除连接超时外,您还可以setReadTimeout()

答案 1 :(得分:1)

您可以将此逻辑放在Runnable对象中,然后创建一个联系该服务的Thread。如果线程尚未在指定的时间内完成,则终止该线程并再次尝试。这样做直到它工作或直到你达到重试限制,然后继续启动。