在服务器启动过程中,我访问远程主机以获取一些初始化数据。不幸的是,有问题的远程主机因随机对连接无响应而臭名昭著(假设这种情况发生的概率为 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 时。
对于任何不得不使用不服从服务的人来说,我是否应该通过有限次数的重试来线程化获取 InputStream 的过程,并且只处理无限期地卡在 JVM 内存中的一两个潜在线程?或者,在 Java 中是否有更常见的方法来处理这个问题?
了解在没有来自远程主机的信息的情况下启动的服务器不会像服务器根本不启动那样具有破坏性,这一点也可能很有用。
提前致谢。
最佳答案
您可以setReadTimeout()除了连接超时之外。
关于java - 处理由于远程主机无响应而导致的 DoS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2072725/