Обработка DoS из-за не отвечающих удаленных хостов - PullRequest
2 голосов
/ 15 января 2010

Во время процедуры запуска сервера я обращаюсь к удаленному хосту за некоторыми данными инициализации. К сожалению, рассматриваемый удаленный хост известен тем, что случайно не реагирует на соединения (скажем, в 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?

Также было бы полезно знать, что сервер, запускаемый без информации с удаленного хоста, не так разрушителен, как сервер, не запускающийся вообще.

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 15 января 2010

Вы можете setReadTimeout () в дополнение к таймауту соединения.

1 голос
/ 15 января 2010

Вы можете поместить эту логику в объект Runnable, а затем создать поток, который связывается со службой. Если поток не завершил заданное количество времени, убейте этот поток и попробуйте снова. Делайте это до тех пор, пока это не сработает, или пока не достигнете предела повторных попыток, а затем продолжите запуск.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...