Java服务器做Excel导出遇到异常

用tomcat做Excel文件导出遇到以下异常。请问该如何解决?

ClientAbortException: java.io.IOException
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:369)
at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:448)
at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:363)
at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:392)
at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:381)
at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:89)
at org.apache.jsp.cems.ssp.tasks.TaskResultDownload_jsp._jspService(org.apache.jsp.cems.ssp.tasks.TaskResultDownload_jsp:85)
... 字数过长省略
Caused by: java.io.IOException
at org.apache.coyote.http11.InternalAprOutputBuffer.flushBuffer(InternalAprOutputBuffer.java:712)
at org.apache.coyote.http11.InternalAprOutputBuffer$SocketOutputBuffer.doWrite(InternalAprOutputBuffer.java:742)
at org.apache.coyote.http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java:126)
at org.apache.coyote.http11.InternalAprOutputBuffer.doWrite(InternalAprOutputBuffer.java:552)
at org.apache.coyote.Response.doWrite(Response.java:560)
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:364)
... 33 more

这个异常产生的常见原因如下:
1、客户端因为网络原因断开连接了(例如拔网线)
2、客户端在服务器向Response的输出流写入内容前就强行中断了连接(例如在下载框出现之前就点了“停止”按钮)
3、Excel文件生成的过程太久了,客户端程序达到超时时间,主动断开了连接。
4、Nginx之类的负载均衡达到超时时间,断开了负载均衡服务器与应用服务器的连接。

建议:
只要能排除第3、4,就不是程序的问题,就没事了。
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-09-07
看样子是下载时间太长,客户端超时断开了
这种下载,建议做成异步,即:用户点击下载时返回一个流水后,后台生成文件,待生成好了前端再生成下载链接。(文件也建议放到web服务器,而不是应用服务器)本回答被网友采纳
第2个回答  2013-11-21
文件读写异常 ,看看你EXECL文件读写那块。追问

追答

你在这块加断点调试一下,很容易就会发现错误,我这儿也没有你EXECl的数据,肉眼是看不出来的

第3个回答  2013-11-21
网上找的,看和你的对不对

楼主。。你这个异常我也遇见过。当时好多人进行了讨论。很严肃地告诉你。这个不是java异常。。而是客户端异常。你能做的就是不要提示这个异常就好了。。
因为这是客户端行为。比如说弹出下载框的时候。但是却点了取消。。就很有可能会出现这个异常了。我说的对吧??

或者弹出下载框的时候,没有直接点击下载,而是选择了其它下载工具下载。

此问题可以忽略,或者将异常输出去除~

异常有2个
ClientAbortException: java.net.SocketException: Connection reset by peer: socket write error

这个是因为客户端取消了下载,而服务器端继续向浏览器写入数据时,抛出这个异常,这个是正常的,比如我正打开你的下载页面,中间我取消,或者换了页面。

java.lang.IllegalStateException: getOutputStream() has already been called for this response
这个异常是因为你在调用 response,getOutputStream()之前,已经有内容输出了,
一般建议这种流操作在servlet里面进行,不要使用jsp来做,如果做就不要在前面些任何东西,并且在jsp代码的第一行加上
<%
out.clearBuffer();
%>本回答被网友采纳
相似回答