リンクが利用可能かどうかを基本的にチェックする単純な URL 可用性チェッカーを実装しようとしています (HTTP 403、404 などは返されません)。
テスト目的でデータベースに (異なるサーバー/Web サイトへの) 20,000 を超えるリンクがありますが、10 を超えるスレッドを作成しようとすると機能しないようです。
これは、接続を開き、各 WorkerThread 内の応答コードを読み取るために使用しているコードです。
URL url = new URL(dto.getUrl());
httpUrlConnection = (HttpURLConnection) url.openConnection();
httpUrlConnection.setUseCaches(false);
// httpUrlConnection.setConnectTimeout(6000);
httpUrlConnection.setDoInput(true);
httpUrlConnection.setDoOutput(false);
httpUrlConnection.setRequestMethod("GET");
httpUrlConnection.setRequestProperty("Host", dto.getUrl().replace("http://", ""));
// httpUrlConnection.setRequestProperty("Connection",
// "Keep-Alive");
httpUrlConnection.setRequestProperty("User-Agent", USER_AGENT);
httpUrlConnection.setRequestProperty("Cache-Control", "no-cache");
httpUrlConnection.connect();
int code = httpUrlConnection.getResponseCode();
複数のスレッドが接続を開いているときに気付いた問題はいくつかあります。
1) 最初の 100 ~ 200 の接続のみが問題なく開くように見えますが、その後、「読み取りタイムアウト」、「接続タイムアウト」、「接続リセット」などを取得し始めます。ただし、コードを再度実行しようとすると、上記の例外がスローされた場合、適切な応答コードが返されます (最初の 100 で処理された場合)。
2) 応答コードが有効でない場合があります (特に、最初の 100 リンクの後にリンクが処理された場合)。実際には 200 を返す必要があるときに 404 が返されることがあることに気付きました (最初の 100 にリンクを入れて確認しました)。
Apache の Http クライアントを使用してみましたが、多くのスレッドでリンクを正しく処理することもできません。
では、この問題の解決策を知っている人はいますか? 複数のスレッドを使用して HttpURLConnection を使用して開くことができる接続の最大数は? 多くの HTTP 接続を開き、応答コードを確認する他の方法はありますか?
よろしくお願いします!