私のJavaクライアントアプリケーションでは、HttpsURLConnectionを使用して自分のサーバーに接続しています。これは、タイムアウトしない特定の瞬間を除いて、すべて正常に動作します。私は(5000ミリ秒)のような接続のタイムアウトパラメータを設定します。タイムアウトには制限はありませんか? - HttpsURLConnection
HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
// timeouts
con.setConnectTimeout(5000);
con.setReadTimeout(5000);
con.setRequestMethod("put");
con.setDoInput(true);
con.setDoOutput(true);
con.setRequestProperty("Content-length", String.valueOf(output.length()));
OutputStreamWriter os = new OutputStreamWriter(con.getOutputStream(), "UTF-8");
BufferedWriter writer = new BufferedWriter(os);
writer.write(output);
writer.close();
os.close();
con.connect();
int respCode = con.getResponseCode();
if(respCode == 200) {
InputStreamReader is = new InputStreamReader(con.getInputStream());
BufferedReader br = new BufferedReader(is);
String input;
String respBody = "";
while ((input = br.readLine()) != null){
respBody += input;
}
br.close();
is.close();
this.result = respBody;
}
私はすべての例外をキャッチしていますが、どれが登録されていないので、問題がキャッチされない例外にすることはできません。接続は単にタイムアウトしません。私は3分待って応答がなかった。リクエストの実行中にネットワークを切り替えながら、バグを数回再現することができました。
また、約1分後に応答があったこともあります。タイムアウトよりも長い。
タイムアウト後に要求が行われたスレッドに割り込みを試み、HttpsURLConnectionを切断しました。しかしそれ以上の解決策が必要です。私はこの無期限のタイムアウトがどこから来るのか知りたいです。
アイデア?
ありがとうございます!私のコメントから
どのURLに接続していますか?あなたの質問に対する答えは、あなたが叩いているサーバーに依存すると考えられます。このサーバーが無期限のオープン接続を気にしない場合、これはあなたの観察を説明することができます。 –
タイムアウトの場合にスローされる例外は、[java.net.SocketTimeoutException](https://docs.oracle.com/javase/7/docs/api/java/net/SocketTimeoutException.html)である必要があります。実行時の例外ではないので、すでにキャッチしているはずです(あなたのコードでそれをどうやって行うのか分かりません)。また、[API](https://docs.oracle.com/javase/7/docs/api/java/net/URLConnection.html#setConnectTimeout%28int%29)から、次のように注意してください。「これのいくつかの非標準的な実装メソッドは、指定されたタイムアウトを無視することがあります。接続タイムアウトセットを確認するには、getConnectTimeout()を呼び出してください。 "ヒントになるかもしれません... – Mena
@Mena実際にgetConnectTimeout()の結果を出力すると、どの値に割り当てても、常に0(無限)になります。そこで、HttpsURLConnectionにsetConnectTimeout()メソッドの「非標準実装」があることが分かりました。それでも、無限のタイムアウトをどのように制限できますか? – Zxifer