在 ServletOutputStream 中写入字节时管道断开

2022-09-03 15:00:26

执行此代码时,

ServletOutputStream out = response.getOutputStream();
out.write(bytes, 0, bytes.length);
out.flush();  
out.close();  

我经常遇到这个异常,我不知道为什么会发生这种情况。

Caused by: ClientAbortException:  java.net.SocketException: Broken pipe
    at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:358)
    at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:354)
    at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:381)
    at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:370)
    at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:89)

我有一个在Linux服务器中运行的Web应用程序,在JBoss 4.2.3和MySQL下。

这是如何引起的,我该如何解决?


答案 1

通常,这是由于客户端断开连接。客户端断开连接的原因可能有多种(超时、浏览器已关闭等)。此外,作为一般做法,如果您没有打开流,请不要关闭。有关在此处关闭流的更多信息 我应该关闭 servlet 输出流吗?


答案 2

这可以通过添加适当的 response.setBufferSize(bufferSizeneed+200) 来改进;默认缓冲区大小为8124,未必适用于所有用户!和 response.setHeader(“Content-Length”, String.valueOf(exportData.length));


推荐