2012-01-23 5 views
0

サーブレットを使用してデータ転送アプリケーションを作成していて、サーブレット応答が書き込まれた後に問題が発生した場合はエラー応答を送信できます。それは可能ですか?サーブレット応答が書き込まれた後のエラー応答の送信

私の問題は、データベースから読み取ったデータから作成された大きな圧縮CSVファイルを送信することです。すべてがストリームで行われるため、サーブレットの応答が書き込まれた後にcsvファイルを作成する際にエラーが発生する可能性があります。私はそれが起こるのを見ました。

これはサーブレットのOutputStreamがフラッシュされた後にのみ問題であることに気付きました。それがフラッシュされていない場合、私はエラー応答を送信することはできますが、後にはできません。大量のデータを処理しているので、すべてを一度に送信することは現実的ではありません。

答えて

1

私は、サーブレットを使用してデータ転送アプリケーションを書いていますし、サーブレットの応答が書き込まれた後に問題が発生した場合にエラー応答を送信できるようにしたいと思います。それは可能ですか?

サーバー側ではありません。サーバーは既にフラッシュされたバイトをクライアントから戻すことはできません。これは返品のない点です。私はこれが応答のWriterまたはOutputStreamIOExceptionとは異なる例外であると考えています。

それはHTML(これが悪い習慣であっても、HTMLは、JSPに属している)であれば、あなたそうのような場所の変更を強制的にいくつかのJSコード印刷できませんでした:

try { 
    writer.write(someHtml); 
} catch (SomeException e) { 
    writer.write("<script>window.location = 'error.jsp';</script>"); 
    // ... 
} 

しかし、これではありませんがHTML以外の応答でも可能です。あなたは実際に応答全体をメモリまたは(一時)ディスクにバッファリングする必要があります。バッファリングが完璧に行われた場合は、応答に再度パイプ処理することができます。

try { 
    processAndSaveInMemoryOrTempDiskFile(someData, byteArrayOrFileLocation); 
} catch (SomeException e) { 
    throw new ServletException(e, "Processing some data failed."); 
} 

copyFromMemoryOrTempDiskToResponse(byteArrayOrFileLocation, writer); 
関連する問題