2

一部のHTTPサーバーに接続し、ページのHTMLコンテンツをダウンロードしてから、他のHTTPサーバーに移動するクローラーJavaアプリケーションがあります。このタスクでは、Apache HTTP ライブラリを使用しました。

実行の最初の数時間は、かなりスムーズに動作しているように見えます (接続関連の例外がときどきスローされますが、これは想定内です)。それでもしばらくすると、送信するすべてのリクエストで SocketTimeoutException が発生し続けるようです。例外は HttpClient クラスの "execute" メソッドでは発生しませんが、Entity のコンテンツ (HttpResponse オブジェクトから取得) を取得しようとしたとき、またはそのコンテンツをファイルに書き込もうとしたときに発生します。

次に、アプリケーションを停止して最初からやり直すと、正常に動作するように戻ったように見えます-停止した場所から再開したにもかかわらず、対話しようとしたときに SocketTimeoutException を受け取ったのと同じサーバーと対話していることを意味します前と。

不足している可能性があり、このライブラリを使用するときに不可欠である可能性のあるあらゆる種類のクリーンアップを探してみましたが、何も見つかりませんでした.

どんな助けでも大歓迎です。ありがとう。

4

2 に答える 2

1

これは、クライアント ライブラリがプールされた接続の取得を待機している間にタイムアウトが発生した場合、接続プールが完了したときに閉じていないことが原因であると思われます。finallyすべてを適切に (ステートメントで) 閉じていますか?

トラフィックを監視するためにWiresharkを実行している場合、「切断」されている間に発生するネットワーク トラフィックは何ですか?

于 2012-01-08T09:03:39.217 に答える
0

同時に多くの http リクエストを使用していないことを確認してください。たとえば、5 つの http 要求を送信し、最初の応答を待ちます。次に、別のリクエストなどを行うことができます.httpリクエストがあまりにも多くのソケットを開いているようです.

于 2012-01-08T10:12:34.477 に答える