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的配置;