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

标签 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 时。

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

了解在没有来自远程主机的信息的情况下启动的服务器不会像服务器根本不启动那样具有破坏性,这一点也可能很有用。

提前致谢。

最佳答案

您可以setReadTimeout()除了连接超时之外。

关于java - 处理由于远程主机无响应而导致的 DoS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2072725/

相关文章:

java - powermock 1.7.4 和mockito 1.10.19 的 gradle 配置

java - 在 Android Webview 中以编程方式填写表单 - JavaScript

java - 如何设置多个 int 等于相同的数字? java

使用对象的链表的 Java toString 打印错误

java - 修改 HashMap 的输出并解析为 Integer

java - 如何将字节数组写入现有文件的一部分?

java - 如何jUnit测试另一个线程中代码的结果

java - 从 Gradle 运行单个 cucumber-jvm .feature 文件

go - 从 io.Writer 写的内容中读取内容

android - 将文件写入/系统