8

クライアント サーバー アーキテクチャのアプリケーションがあります。クライアントは Java Swing / AWT で Java Web Start を使用し、sert は Tomcat で HTTP サーバー / サーブレットを使用します。通信はオブジェクトのシリアル化から行われ、ObjectOutput を作成してバイト配列をシリアル化し、それぞれ ObjectInputStream と呼ばれるサーバーに送信し、逆シリアル化します。

アプリケーションは、「SocketException read timeout」というエラーを表示し始める特定の同時実行時間まで正しく通信します。サーバーがサーブレット doPost メソッドでメソッド ObjectInputStream.getObject() を呼び出すと、エラーが発生します。

Tomcat が遅くなり、サーバーを再起動する必要があるクラッシュ時まで、すべてが機能した後、エラーによってサーバーの応答時間が減少し始めます。

誰かがこの問題を経験しましたか?

クライアントコード

URLConnection conn =  url.openConnection();
conn.setDoOutput(true);

OutputStream os = conn.getOutputStream();
ObjectOutputStream oss = new ObjectOutputStream(os);

oss.writeUTF("protocol header sample");

oss.writeObject(_parameters);
oss.flush();
oss.close();

サーバーコード

ObjectInputStream input = new ObjectInputStream(_request.getInputStream());
String method = input.readUTF();

parameters = input.readObject();

input.readObject() はエラーのある場所です

4

2 に答える 2

10

特にクライアント側について、先に進むための多くの情報を提供してくれませんでした。しかし、私の疑いでは、クライアント側は次のとおりです。

  • Content-length ヘッダーの設定に失敗した (または間違った値に設定した)、
  • 出力ストリームのフラッシュに失敗した、および/または
  • ソケットの出力側を閉じていません。

神秘的。

更新された質問に基づくと、上記のどれにも当てはまらないようです。他にもいくつかの可能性があります。

  • 何らかの理由で、シリアル化中にクライアント側が完全にロックアップしているか、非常に長い時間がかかっています。
  • クライアントとサーバーの間に問題を引き起こしているプロキシがあります。
  • 負荷関連のネットワークの問題、またはネットワーク ハードウェアの問題が発生しています。

もう 1 つの考えられる説明は、メモリ リークがあり、メモリが不足するにつれて GC に時間がかかることによってスローダウンが発生することです。有効にしている場合、これは GC ログに表示されます。

于 2010-03-20T03:11:09.160 に答える
0

同時実行性が高い間、Tomcat で設定されたソケット タイムアウトが期限切れになり、接続が閉じられると思います。その接続に対する Tomcat による次の読み取りが、サーバーで指定されたサーバー ソケット タイムアウトを超えています。
この問題を回避したい場合は、サーバー側で期限切れになっているタイムアウトを増やす必要があります。しかし、お勧めできません。
ところで、あなたは十分な情報を提供しませんでした。Tomcat で接続するスレッドの数を増やしましたか? そうすれば、きっとこうなる。

于 2012-08-29T13:15:13.303 に答える