ClientAbortException原因探究

当用户在页面中点击查询并下载Excel文件,然后点击保存对话框的【取消】按钮时,服务器抛出ClientAbortException。该异常由SocketException引起,原因是客户端关闭浏览器时,服务器仍在尝试写入数据。此问题在Tomcat 4.1.31下发生,涉及JNDI、Oracle数据库、Spring框架和BLOB字段的使用。虽然前端无错误显示,但服务器日志会频繁记录异常,可能影响服务器性能。目前尚未找到优雅的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我所遇到的情况是:页面中有个查询选项,当用户选择了查询条件,并提交后,servlet从数据库取出数据写入excel文件并通过

response.getOutputStream()写入页面流,此时页面中弹出一个保存excel的对话框。当点击对话框的【取消】按钮时,抛出异常

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:750)
 at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:432)
 at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:347)
 at org.apache.coyote.http11.InternalOutputBuffer$OutputStreamOutputBuffer.doWrite(InternalOutputBuffer.java:773)
 at org.apache.coyote.http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java:124)
 at org.apache.coyote.http11.InternalOutputBuffer.doWrite(InternalOutputBuffer.java:583)
 at org.apache.coyote.Response.doWrite(Response.java:560)
 at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:361)

 

参考以下引用网址中的异常分析,应该是点击【取消】按钮时,服务器端正在向客户端输出流写数据,而客户端却关闭了页面,导致服务器写中断,抛出以上异常。此种情况即所谓的

     ②:客户关掉了浏览器,而服务器还在给客户端发送数据;

符合此场景

  

   不过,目前为止还没有找到好的解决方案,毕竟客户端的行为是无法预料和控制的。

 

引用网址:http://www.betalog.com/post/54/

WEB是部署在TOMCAT4.1.31下面的,采用JNDI链接Oracle数据库,采用SPRING控制,把SWF和MP3等文件存在数据库中的BLOB字段,JSP中有预览功能,采用:

代码
   

<OBJECT ID="MP1" width="100" height="80" type="application/x-oleobject" CLASSID="CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6">  
       <PARAM NAME="url" VALUE="XXX">  
       <PARAM NAME="AutoStart" VALUE="false">  
       <param name="balance" value="0">    
       <PARAM NAME="EnableContextMenu" VALUE="false">  
       <PARAM NAME="rate" VALUE="1">  
       <PARAM NAME="playCount" VALUE="1">  
       <PARAM NAME="volume" VALUE="100">  
       <PARAM NAME="uiMode" VALUE="full">  
     </OBJECT>  



进行预览,但是每次到这里TOMCAT都会报异常,如下:

引用

org.springframework.jdbc.LobRetrievalFailureException: Couldn't stream LOB content; nested exception is org.aptor.ClientAbortException: null
org.springframework.jdbc.LobRetrievalFailureException: Couldn't stream LOB content; nested exception is org.aptor.ClientAbortException: null
ClientAbortException: java.net.SocketException: Connection reset by peer: socket write error at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:366)
at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:433)
at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:348)



等等,在下面还能看到这样的提示:
Caused by: java.net.SocketException: Connection reset by peer: socket write error

查了下TOMCAT的文档,解释如下:


引用

Wrap an IOException identifying it as being caused by an abort of a request by a remote client.



在BAIDU和GOOGLE上找了下原因,大概归结为:
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
很多人都说是客户端造成的,没有办法控制,是个比较郁闷的问题。



但是,我担心的是:虽然前台没有任何出错的迹象,但是后台会记录这个异常,日志也会疯狂爆满,时间长了,肯定会DOWN掉的,还没找到好的解决办法,若有相同经历,且优雅的解决掉的朋友,望告之,谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值