- n.w
- 大ベテラン
- 会議室デビュー日: 2003/07/15
- 投稿数: 126
- お住まい・勤務地: 神奈川
|
投稿日時: 2004-07-01 16:17
お世話になってます、何度も書き込んでいいものが
悩みましたが、行き詰ってしまい書き込んでみました。
Servletクラスにて、responseにてOutputStreamを取得し、
以下のようにバイト単位でOutputStreamへ書き込んだ際
書き込みのwriteでSocketExceptionが発生してしまいます。
Javadocでは使用しているプロトコルでエラー (TCP エラーなど)
となっているのですが、問題がどうしてもわかりません。
どなたかご存知のかたご教授または、調べるのに適した
サイトなどお教え願います。
コード: |
|
FileInputStream fis = null;
OutputStream out = response.getOutputStream();
try {
fis = new FileInputStream(
"c:\\ereport\\pdf" + "\\" + sessionId + "\\" + pdfFilename);
byte[] buf = new byte[4 * 1024];
int bytesRead;
while ((bytesRead = fis.read(buf)) != -1) {
out.write(buf, 0, bytesRead);
}
} finally {
if (fis != null)
fis.close();
}
java.net.SocketException: Software caused connection abort: socket write error
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.coyote.http11.InternalOutputBuffer$OutputStreamOutputBuffer.doWrite(InternalOutputBuffer.java:668)
at org.apache.coyote.http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java:171)
at org.apache.coyote.http11.InternalOutputBuffer.doWrite(InternalOutputBuffer.java:523)
at org.apache.coyote.Response.doWrite(Response.java:524)
at org.apache.coyote.tomcat4.OutputBuffer.realWriteBytes(OutputBuffer.java:384)
at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:360)
at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:338)
at org.apache.coyote.tomcat4.OutputBuffer.writeBytes(OutputBuffer.java:411)
at org.apache.coyote.tomcat4.OutputBuffer.write(OutputBuffer.java:398)
at org.apache.coyote.tomcat4.CoyoteOutputStream.write(CoyoteOutputStream.java:110)
at astest.ASServlet2.processRequest(ASServlet2.java:96)
at astest.ASServlet2.doPost(ASServlet2.java:139)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:260)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2415)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:223)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:432)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:386)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:534)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:530)
at java.lang.Thread.run(Thread.java:536)
|
|
- みゅう
- 会議室デビュー日: 2004/07/01
- 投稿数: 2
|
投稿日時: 2004-07-01 17:07
状況がよく分からないのでなんとも言えませんが、
1.コンテントタイプを設定していないから。
2.出力ストリームに対してflush()していないから。
このような原因が考えられるかもしれません。
私の場合、以下のようなソースで処理してます。
(かなり省略してます)--------------------------------------
HttpServletResponse prmRes;
// ファイルの種類を設定する
//ファイル名から判定したコンテントタイプを設定する
prmRes.setContentType(contentType);
// ヘッダー情報の設定を行う。
prmRes.setHeader( DEFAULT_RESPONSE_HEADER_NAME, getResponseHeaderValue(fName) );
baos = new ByteArrayOutputStream();
while( download_fis.read( buff ) > 0 ) {
// そのまま内容を転送する。
baos.write(buff);
baos.flush();
}
baos.writeTo( prmRes.getOutputStream() );
baos.close();
baos = null;
download_fis.close();
download_fis = null;
--------------------------------------------------
なお、プラットフォームによっては、
flush()を行なわないと、エラーになることがあるようです。
(WebLogic8.1Jでは必須でした)
ご参考になればよいのですが...
|
- uk
- ぬし
- 会議室デビュー日: 2003/05/20
- 投稿数: 1155
- お住まい・勤務地: 東京都
|
投稿日時: 2004-07-01 17:44
引用: |
|
みゅうさんの書き込み (2004-07-01 17:07) より:
なお、プラットフォームによっては、
flush()を行なわないと、エラーになることがあるようです。
(WebLogic8.1Jでは必須でした)
|
flush必須というのは、Servletから取得したOutputStreamに対してですか?
であれば、flush「しない」のが原則だと思いますが。少なくともWebLogicでは以下のように
明示されています。
http://edocs.beasys.co.jp/e-docs/wls/docs81/servlet/progtasks.html#159442
|
- みゅう
- 会議室デビュー日: 2004/07/01
- 投稿数: 2
|
投稿日時: 2004-07-01 18:10
UKさんへ
-------------------------------------------------------------------------------
flush必須というのは、Servletから取得したOutputStreamに対してですか?
であれば、flush「しない」のが原則だと思いますが。少なくともWebLogicでは以下のように
明示されています。
------------------------------------------------------------------------------
すみません。
手元の資料をよく確認したところ、WebLogicの件は全く関係なく、この箇所のコードは別の現象を回避するためのものでした。
(このコードは参考になりませんでしたね)
混乱させてしまい、誠に申し訳ありません。
発言は訂正させていただきます。
ご指摘いただき誠にありがとうございました。
|
- uk
- ぬし
- 会議室デビュー日: 2003/05/20
- 投稿数: 1155
- お住まい・勤務地: 東京都
|
投稿日時: 2004-07-01 19:23
「Tomcat "socket write error" "Software caused connection abort"」で検索すると
いくつか出てくるのですが、セキュリティ絡みやApacheとの連携絡みが多いようです。
・クライアントは何か(ブラウザ? アプレット?)
・送ろうとしているファイルサイズはどれくらいか
・Apacheと連携していないか
など情報をできるだけ詳しく出してください。
|
- n.w
- 大ベテラン
- 会議室デビュー日: 2003/07/15
- 投稿数: 126
- お住まい・勤務地: 神奈川
|
投稿日時: 2004-07-01 19:31
みなさん御意見ありがとうございます。
ukさん
色々試して少しわかった事があります。
SokectExceptionが出る際、ブラウザ(IE)が上がって
いないと落ちてしまいます。 IEが上がっているとException
は出ず、while文も普通に通過しています。
クライアントはFacadoというツールを使っていまして
デバッグ環境の為Appletのイメージになります。
ファイルサイズ的には18KBのPDFで、Tomcat単独でApacheとの
連携は行っていません。
現状ブラウザをあげているとSocketExceptionは発生しないのですが
ひどく不安定な状態です
|
- uk
- ぬし
- 会議室デビュー日: 2003/05/20
- 投稿数: 1155
- お住まい・勤務地: 東京都
|
投稿日時: 2004-07-01 20:09
アプレット絡みだと、そのものズバリではないですが
http://www.freeml.com/message/jboss-fan@freeml.com/0002003
とか似たような現象が起きているものが見当たりますね。
まず、原因の切り分けのために件のサーブレットが通常のHTTP POSTで動作することを
確認し、それから先はお使いのツールベンダに問い合わせるのがよいのではないでしょうか。
|