ClientAbortException: java.net.SocketException: Connection reset by peer: socket write error
一.異常說明:
用JFreeChart 往瀏覽器輸出圖表圖片時,如果重新整理太快,就有如下異常
ClientAbortException: java.net.SocketException: Connection reset by peer: socket write error
代碼如下:
ClientAbortException: java.net.SocketException: Connection reset by peer: socket write error
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:358)
at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:434)
at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:349)
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)
at javax.imageio.stream.FileCacheImageOutputStream.flushBefore(FileCacheImageOutputStream.java:230)
at javax.imageio.stream.ImageInputStreamImpl.flush(ImageInputStreamImpl.java:811)
at com.sun.imageio.plugins.jpeg.JPEGImageWriter.write(JPEGImageWriter.java:1027)
at org.jfree.chart.encoders.SunJPEGEncoderAdapter.encode(SunJPEGEncoderAdapter.java:173)
at org.jfree.chart.encoders.EncoderUtil.writeBufferedImage(EncoderUtil.java:137)
at org.jfree.chart.ChartUtilities.writeChartAsJPEG(ChartUtilities.java:443)
at org.jfree.chart.ChartUtilities.writeChartAsJPEG(ChartUtilities.java:389)
Caused by: java.net.SocketException: Connection reset by peer: 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.realWriteBytes(InternalOutputBuffer.java:741)
at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:434)
at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:349)
at org.apache.coyote.http11.InternalOutputBuffer$OutputStreamOutputBuffer.doWrite(InternalOutputBuffer.java:765)
at org.apache.coyote.http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java:126)
at org.apache.coyote.http11.InternalOutputBuffer.doWrite(InternalOutputBuffer.java:574)
at org.apache.coyote.Response.doWrite(Response.java:560)
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:353)
... 47 more
二.原因分析
在BAIDU找了下原因,大概歸結為:
ClientAbortException: java.net.SocketException: Connection reset by peer: socket write error的原因是由於處理http串連時,正在輸出內容時,使用者關閉了IE,會出現一個"ClientAbortException",屬於I/O處理中出現的一個異常,應用伺服器應該會捕捉。
Connection reset by peer的原因:
經常出現的Connection reset by peer: 原因可能是多方面的,不過更常見的原因是:
①:伺服器的並發串連數超過了其承載量,伺服器會將其中一些串連Down掉;
②:客戶關掉了瀏覽器,而伺服器還在給用戶端發送資料;
③:瀏覽器端按了Stop
很多人都說是用戶端造成的,沒有辦法控制,是個比較鬱悶的問題。
但是有個哥們說的很好,如果ClientAbortException:是可以不輸出這些異常
具體辦法
Code:
- try {
-
- //處理代碼放在try……catch塊中,在catch部分使用判斷避免讓系統拋出ClientAbortException,
-
- ChartUtilities.writeChartAsJPEG(response.getOutputStream(), chart, 600, 400);
-
- } catch (Exception e) {
- String simplename = e.getClass().getSimpleName();
- if("ClientAbortException".equals(simplename)){
- System.out.println("用戶端重新整理太快了");
- }else
- e.printStackTrace();
-
- }
- return mapping.findForward("succ");
- }
-
-
三.結論
這樣做是可以的。