このスレッドは未解決です(解決したらこちらで解決済にしてください)
<<戻る

帳票出力について このメッセージに返信する
日時: 2011/02/21 17:54
名前: uta24
URL:
現在、Javaを使用したWebアプリ開発を行っており
下記の処理でローカル環境(開発用PC)では正常にいくが、サーバ環境では異常終了
となる事象が発生しております。
どなたか対応策をご存じな方がいましたらご回答よろしくお願い致します。

また調査方法について不明な点もあり合わせてご回答よろしく
お願い致します。

■処理概要
画面に帳票ボタンがあり、そのボタンを押下すると別ブラウザに
帳票(PDF)が出力される。

■処理内容(帳票ボタン押下)
(1)DBから帳票出力対象となるデータを抽出
(2)(1)で抽出したデータを加工
(3)(2)で加工した帳票データを、帳票定義体とバインド
(4)(3)でバインドした帳票を別ブラウザに表示

■異常終了概要
押下されたボタンによって出力する帳票が異なり、
帳票出力対象データが大量にある場合、ある1つの帳票だけが
1時間ほど待っても出力結果がかえってこなかった。
そのためログを確認すると「java.net.SocketException: Broken pipe」が発生していた。
※それ以外の帳票については正常に帳票出力される。

■異常終了発生箇所について
サーバ環境でログを確認したところ、処理内容の(3)までは正常に処理されており
(4)の別ブラウザに表示する際に異常終了となっていた。

(4)の詳細処理内容として、(3)で作成した帳票データ(バインド済み帳票)を
javax.servlet.HttpServletResponse.getOutputStreamで取得したOutputStreamに
書き込み、そのOutputStreamをflushする処理になっている。
※異常終了は「帳票データをOutputStreamに書き込み」時に発生している。

■異常終了時のログ
/print/ReportForm/Validate.do
ExceptionConverter: ClientAbortException: java.net.SocketException: Broken pipe
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:370)
at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:432)
at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:347)
at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:396)
at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:385)
at org.apache.catalina.connector.CoyoteOutputStream.write

============省略=============

at net.sf.jasperreports.engine.JasperExportManager.exportReportToPdfStream(JasperExportManager.java:167)
at jp.dogsManagement.common.util.PrintUtil.printPreview(PrintUtil.java:79)
at jp.dogsManagement.controller.action.print.ReportAction.pushMainBook(ReportAction.java:845)

============省略=============

Caused by: java.net.SocketException: Broken pipe
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
at org.apache.jk.common.ChannelSocket.send(ChannelSocket.java:538)
at org.apache.jk.common.JkInputStream.doWrite(JkInputStream.java:162)
at org.apache.coyote.Response.doWrite(Response.java:560)
at org.apache.catalina.connector.OutputBuffer.realWrite




=======================================

現在、異常終了となる帳票処理について調査した結果以下の事が判明した。

■調査内容
・大量データ時に異常終了となる帳票は、データを減らすと正常に帳票出力される。

・他帳票と比べ、帳票データ作成時間が長い。
※1.帳票データ作成時間は、帳票データをOutputStreamに書き込む時間は含んでいない。
※2.上記帳票はデータを減らし調査している。

・他帳票と比べ、帳票のファイルサイズは小さい

・1つのPCをWebサーバ、APサーバ、DBサーバとしている。サーバ環境内容として
OS:Linux(CentOS)
Web:Apache
AP:Tomcat
DB:PostgreSQL

・帳票データ作成時間が5分を越える場合、当事象(broken pipeエラー)が発生する。
※1.帳票データ処理にJavaのSleepメソッドで5分超える/越えない時間を設定し調査した。
※2.Tomcat、Apacheの設定ファイル
web.xml:session-timeout
server.xml:connectionTimeout, keepAliveTimeout
httpd.conf:Timeout, KeepAliveTimeout
を確認したが5分(300秒、600000ミリ秒)の記載箇所は見つからなかった。
※3.帳票データ作成時間が5分を超える=サーバからクライアントへの応答が5分以上ない

・IEの仕様で「サーバーからデータが返されるまでのタイムアウト時間(5分)が設定されている」
との記事があり、レジストリを修正しタイムアウト時間を60分にしたが解決しなかった。

・対象データに問題がない(Linuxで扱えない文字などはない)事を確認した。

・PDFを送信する(OutputStreamのflush)処理に時間がかかっても(5分を越える)
問題ない事を確認した。

・Apache側がコネクションを切断していると想定し、Tomcatに
直接アクセス(ポート指定:8080)し帳票出力させた。その結果、
次は「java.net.SocketException: Connection reset」のエラーが発生した。
※これについても「5分」を越える処理でない場合は発生しない。

■調査方法不明点
・Linux側(サーバ)でクライアントへ5分応答がない場合、コネクションを切断しているのでは
ないかと考えた(ネットワークの設定など)が、どの設定ファイルを確認すればよいか分からない。
※もしそれが原因だった場合の対応方法についても

記事編集 編集

Page: | 1 | 2 |

Page: | 1 | 2 |

件名※必須
名前※必須
URL
任意のパスワード (投稿後のコメント修正・削除時に使用)
画像認証※必須 投稿キー(画像で表示されている数字を入力)
コメント※必須

※質問を投稿後に自己解決された場合は、原因と行った対処を具体的に書き込み下さるよう、よろしくお願いします。

- WEB PATIO -