0

レポート Web ページの 1 つに「csv にダウンロード」リンクがあり、.csv ファイルの通常の出力は約 4 MB で、クエリの実行とシングル スレッドを使用した結果の提供を完了するのに通常約 5 分かかります。

ユーザーの 1 人が引き続きこの問題に遭遇します。

[com.jspbook.GZIPResponseWrapper:finishResponse] 例外:java.io.IOException: この出力ストリームは既に閉じられています

サーバー ログにはパイプ破損の例外への参照もあります。

ユーザーがこのエラーに遭遇すると、サーバーの観点からすべてが時間通りに完了することに気付きます。

ユーザーの場合、エクスポート リンクは無限にスピンし、データを返しません。

この問題の原因と、ブラウザとの接続を維持する方法はありますか?

4

2 に答える 2

1

@Bhushan Bhangaleによる回答の続き-

サーバーの応答に時間がかかる場合、接続は閉じられます。そのため、(応答を作成するために) 処理に時間がかかるような場合、オプションの 1 つは次のとおりです。

  1. リクエストを受け取ったら、サーバー上で 2 つのスレッドを開始します
  2. 1 つは、タイムアウト間隔のわずか 2 ~ 3 秒前に出てくる一種のタイマーです。
  3. データベースへのクエリを実際に起動し、.csv ファイルを作成するもう 1 つのファイル

リクエストを受け取ったメイン スレッドは、上記で開始されたスレッドのいずれかから通知されるまで待機する必要があることに注意してください。これは良い方法ではないかもしれませんが、いくつかの奇妙なシナリオでは、他に選択肢はありません。

ここで、

1. 最初の (タイマー) スレッドが応答の準備が整う前に完了すると、フラグが設定され、サーバーがまだ要求を処理中であるというメッセージがユーザーに返されます

2. 2 番目のスレッドについては、 2つの条件-a

。応答 (.csv ファイル) は、フラグが最初のスレッドによって設定される前に準備ができているため、応答 (ファイル) を送り返し、タイマー (最初の) スレッドをキャンセルします
b. フラグが設定されていることがわかった場合 (つまり、応答が既に送信されていることを意味します)、応答を無視するか (ファイルを削除する可能性があります)、電子メールでファイルを送信します (そのような機能を組み込むことができる場合)。

これらのスレッドは、それ自体で応答を返すことはできません。ユーザーに応答を送信するメイン スレッドに通知する必要があります。メインスレッドが送信する応答のタイプを認識できるように、適切なフラグ/値を設定する必要があります。

お役に立てれば。

于 2013-04-18T03:58:21.687 に答える