私たちの Web アプリケーションでは、ユーザーは URL を送信できます。データを取得し、サーバー側で解析します。リクエストごとに、次の(関連する)設定で HttpClient を使用します
connectionManager.getParams().setConnectionTimeout(10000);
connectionManager.getParams().setSoTimeout(10000);
HttpMethod.getResponseBody を呼び出すと、ステータス コードは既にチェックされており、受け入れ可能です。この時点で、スレッドは次のスタック トレースでハングします。
java.net.SocketInputStream.socketRead0 ( native code )
java.net.SocketInputStream.read ( SocketInputStream.java:150 )
java.net.SocketInputStream.read ( SocketInputStream.java:121 )
java.io.BufferedInputStream.read1 ( BufferedInputStream.java:273 )
java.io.BufferedInputStream.read ( BufferedInputStream.java:334 )
java.io.FilterInputStream.read ( FilterInputStream.java:133 )
org.apache.commons.httpclient.AutoCloseInputStream.read ( AutoCloseInputStream.java:108 )
java.io.FilterInputStream.read ( FilterInputStream.java:107 )
org.apache.commons.httpclient.AutoCloseInputStream.read ( AutoCloseInputStream.java:127 )
org.apache.commons.httpclient.HttpMethodBase.getResponseBody ( HttpMethodBase.java:690 )
これが発生した正確な URL を見つけることができず (ライブ環境でのインシデントでした)、それを再現することもできませんでした。接続しているサーバーの動作がおかしいだけだと思いたいのですが、何かが足りないのかもしれません。どちらの場合でも、ブロッキング メソッドの呼び出しが永久に待機しないようにする方法はありますか? SoTimeout はソケット読み取りタイムアウトでもありますか? 私が見逃している別の設定はありますか?