问题 在ServletOutputStream中写入字节时断管


执行此代码时,

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下运行。

这是怎么造成的,如何解决?


2791
2017-08-30 22:55


起源

这意味着servlet的客户端由于某种原因挂断了连接。 - Keith Randall
那是什么原因?例如,这是文件下载的操作。 - gdfbarbosa
是的,也许正在进行文件下载的浏览器中途崩溃了。或者他们的互联网连接断电了。或者无论如何,接收器无法接受您写入的字节。 - Keith Randall
可能重复 使用IE8浏览器部署在jboss上的应用程序的ClientAbortException, JSF1064:无法找到或提供资源,jquery.js Tomcat 7 + RichFaces 4 和更多。 - BalusC
BalusC,谢谢你的回复。一世ll try ignoring the exception since I can控制它。 - gdfbarbosa


答案:


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


8
2017-08-30 23:04





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


2
2017-09-04 13:22