Caused by: java.net.SocketException: Connection reset by peer: socket write erro

今天做了个过滤图片的servlet,功能是用来匹配自定义的文件后缀,如果是该后缀,则通过该文件的id到数据库的附件中将文件读出并将byte[]写入response的out流中,但经常会报错,初步排查原因是由于浏览器的Aborted,阻止了请求的响应,异常如下:
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)

在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掉的,还没找到好的解决办法。

暂时HACK式的解决方法:
把下载文件的代码放在try……catch块中,在catch部分使用判断避免让系统抛出ClientAbortException,具体方法可以这样:

try{
...
}catch(Exception ex){
   String simplename = ex.getClass().getSImpleName();
   if(!"ClientAbortException".equals(simplename)){
         ex.printStackTrace();
    }
}

这样可以解决该异常的发生,进而不让日志文件暴涨

转载于:https://my.oschina.net/darkness/blog/802223

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值