0

私は次のような Java コードの修正に取り組んでいます -

    connection = (HttpURLConnection) url.openConnection();
    connection.setRequestMethod(POST);
    connection.setRequestProperty("Content-Type", CONTENT_TYPE);
    connection.setReadTimeout(5 * 60 * 1000);
    connection.setUseCaches(false);
    connection.setDoInput(true);
    connection.setDoOutput(true);

    DataOutputStream wr = new DataOutputStream(connection.getOutputStream());
    wr.writeBytes(parameters);
    wr.flush();
    wr.close();

    in = connection.getInputStream();
    connection = null;

少量のデータ交換 (同時要求を含む) では問題なく動作します。データが大きい場合、または同時リクエストがある場合 (大きなデータの場合)、「java.net.SocketTimeoutException: Read timed out」エラーが発生します。このエラーの後、プログラムは追加のデータの読み取りや追加の要求への対応に失敗します。サーバー (JBoss) を再起動する必要があります。

私の最初のアイデアは、setReadTimeOut を 15 に増やすことでした。大きなデータセットに対する同時要求のエラーが引き続き発生します。

他のオプションは何ですか? 読み取りタイムアウト エラーから回復するにはどうすればよいですか?

上記のコードは java.net.* を使用しています。

どんな助けにも感謝..WM

4

1 に答える 1

-1

httpリクエストの本文を書き込むために使用しているDataOutputStreamに関係していると確信しています。DataOutputStream でこれを行っている人を見たことがありません。

DataOutputStream は、Java のプリミティブ型 (int、byte、long など) を OutputStream に書き込むように設計されています。あなたがやっているように、文字列が与えられると、各文字(2バイト)を取り、文字の最上位バイトを無視しながら、それをバイトに変換します。

これは、最上位の 8 ビットが設定されていない一部の文字では機能する可能性がありますが、遅かれ早かれ確実にデータが失われます。これにより、実際のメッセージ本文の長さとは異なる content-length を指定する http 要求が送信される可能性があり、その結果、リモート サーバーは受信されないデータをさらに待機することになります。

DataOutputStream を、文字データを書き込むことができる BufferedWriter などに置き換えます。また、Java の HttpUrlConnection よりもはるかに洗練された apache の HttpClient の使用を検討してください。

乾杯、トム

于 2012-08-06T20:41:43.590 に答える