Самый эффективный способ java для тестирования 300 000+ URL-адресов

Я пытаюсь найти наиболее эффективный способ тестирования 300 000 + URL-адресов в базе данных, чтобы в основном проверить, действительно ли URL-адреса остаются действительными. Осмотрев сайт, я нашел много отличных ответов и теперь использую что-то вроде:

Прочитать URL из файла.... Тестовый URL:

        final URL url = new URL("http://" + address);
        final HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
        urlConn.setConnectTimeout(1000 * 10);
        urlConn.connect();
        urlConn.getResponseCode(); // Do something with the code
        urlConn.disconnect();

Напишите подробности в файл....

Итак, пару вопросов: 1) Есть ли более эффективный способ проверки URL-адресов и получения кодов ответов?

2) Первоначально я могу протестировать около 50 URL-адресов в минуту, но через 5 или около того вещи действительно замедляются - я думаю, есть некоторые ресурсы, которые я не выпускаю, но не уверен, что

3) Некоторые URL-адреса (например, www.bhs.org.au) приведут к тому, что вышеуказанное значение будет зависеть в течение нескольких минут (это не очень хорошо, когда у меня так много URL-адресов для тестирования) даже при установленном тайм-ауте подключения, все равно я могу затянуть это вверх?

Заранее спасибо за любую помощь, прошло уже несколько лет с тех пор, как я написал любой код, и я начинаю с нуля: -)

Ответ 1

Это может или не поможет, но вы можете изменить свой метод запроса на HEAD вместо того, чтобы использовать значение по умолчанию, которое равно GET:

urlConn.setRequestMethod("HEAD");

Это говорит серверу, что вам действительно не нужен ответ, отличный от кода ответа.

В статье Что такое HTTP HEAD Request Good для описывает некоторые применения для HEAD, включая проверку ссылок:

[Head] запрашивает ответ, идентичный тому, который соответствует запросу GET, но без тела ответа. Это полезно для извлечения метаинформации, написанной в заголовках ответов, без переноса всего содержимого.... Это может быть использовано, например, для создания более быстрой службы проверки ссылок.

Ответ 2

Скорее всего, самый быстрый способ сделать это - использовать java.nio, чтобы открыть обычное TCP-соединение с вашим целевым хостом на порту 80 Затем просто отправьте ему минимальный HTTP-запрос и обработайте результат самостоятельно.

Основное преимущество этого состоит в том, что вы можете одновременно открывать и загружать пул из 10 или 100 или даже 1000 подключений, а не делать их один за другим. При этом, например, не имеет большого значения, если один сервер (www.bhs.org.au) занимает несколько минут, чтобы ответить. Это просто вызовет одно из ваших многочисленных подключений в пуле, но другие будут продолжать работать.

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