关于Client_Abort_Exception异常的分析和解决

1、什么情况下会出现“ClientAbortException:  java.net.socketException:  Broken pipe”?

   答:客户端非正常(标准握手协议)退出连接,体现在http请求,可能是用户等待页面响应过程中,关闭浏览器,或停止了请求。

 

2、为什么有的应用报这个问题,有的应用确没有打错误日志?

   答: 分析发现,其实其他应用也会有这个错误,但是tomcat的专门coyoteWriter的写方法,已经替你忽略掉写的时候发生的异常。因此,异常其实是产生的,只不过被吞了。 

          但为什么有的还打印出日志呢?发现有些场景,有些工具会拿取response.getOutputStream()来构造的writer,没有忽略异常,而是选择了抛出,因此你看到了这个问题;

          所以,你使用tomcat为servlet容器他帮忙你忽略了这个问题; 

 

3、会抛ClientAbortException,但我发现有的时候提交正常?(即问题本质是啥?

   答: 分析很久,排除眼花,后来发现,对一个对端已经关闭的socket调用两次write(和tcp 关闭握手有关), 第二次将会生成SIGPIPE信号, 该信号默认结束进程,会抛出Broken pipe的exception.

 

其他的解决方案: 如果也不愿意产生异常,我们可以借助nginx,http请求有个proxy_ingnore_client_abort:on的配置;

原文地址:https://www.cnblogs.com/luyi/p/4379002.html