10

データベース内の 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) 最初は 1 分間に約 50 個の URL をテストできましたが、5 分ほど経つと速度が大幅に低下しました。リリースしていないリソースがいくつかあると思いますが、何が原因かわかりません。

3) 特定の URL (例: www.bhs.org.au) では、接続タイムアウトが設定されていても、上記が数分間ハングします (テストする URL が非常に多い場合は良くありません)。

助けてくれてありがとう、コードを書いてからかなりの年月が経ち、ゼロからやり直しています:-)

4

2 に答える 2

5

これは役立つ場合とそうでない場合がありますがHEAD、デフォルトの を使用する代わりに、リクエスト メソッドを次のように変更することをお勧めしますGET

urlConn.setRequestMethod("HEAD");

これにより、応答コード以外に応答を返す必要がないことがサーバーに伝えられます。

記事「HTTP HEAD リクエストの有効なHEAD用途」では、リンクの検証を含むのいくつかの使用法について説明しています。

[Head] は、GET 要求に対応するものと同じ応答を要求しますが、応答本文はありません。これは、コンテンツ全体を転送することなく、応答ヘッダーに書き込まれたメタ情報を取得するのに役立ちます.... これは、たとえば、より高速なリンク検証サービスを作成するために使用できます。

于 2013-03-05T18:28:59.897 に答える
5

これを行う最も速い方法は、java.nioを使用して、ターゲット ホストへの通常の TCP 接続をポート 80 で開くことです。次に、最小限の HTTP 要求を送信し、結果を自分で処理します。

これの主な利点は、10 または 100 または 1000 の接続のプールを開いて同時にロードできることです。これにより、たとえば、1 つのサーバー (www.bhs.org.au) が応答するのに数分かかっても、あまり問題になりません。プール内の多くの接続の 1 つを占有するだけですが、他の接続は引き続き実行されます。

また、スレッド プールHttpURLConnectionsを使用して複数のスレッドで並列に多くの (現在実行している方法で) 実行することにより、オーバーヘッドを少し増やして複雑なコーディングを大幅に減らして同じことを実現することもできます。

于 2013-03-05T18:29:10.860 に答える