先看下异常信息
o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver - Failure in @ExceptionHandler com.hg.maritime.framework.web.exception.GlobalExceptionHandler#handleException(Exception, HttpServ
org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:348)
at org.apache.catalina.connector.OutputBuffer.flushByteBuffer(OutputBuffer.java:777)
at org.apache.catalina.connector.OutputBuffer.append(OutputBuffer.java:680)
at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:383)
at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:361)
这个日志 还是时不时的会出现
可以看到它是一个IO异常 一开始 我以为是在处理文件流 毕竟有文件上传功能
再仔细看下他竟然是 org.apache.
包下的 所以可以忽略掉我们程序抛出的错误
关键信息:
java.io.IOException: Broken pipe
翻译过来是 断开的管道,英文为:Broken pipe
原因分析:
先来了解下什么是断开的管道?
我简单理解就是 断开的管道意味着客户端与你的服务端建立连接期间 正在读取或者正在写入文件 此时
管道某一端被终止 (可以理解为断开了连接) http正在传输数据的过程中 一旦终止那么服务端将会抛出此异常 Broken pipe
它是如何发生的?
可能的原因有:
- 由于客户端在发送请求后,还没等服务器响应就断开了连接(可能是因为连接超时、网络原因(突然网断了)、或其他原因),导致服务端无返回通道
- 服务端配置导致:tomcat配置 或者 nginx配置的超时时间小了
- 服务端nginx配置导致:连续两次过快的 post 请求就会出现 499 的情况,nginx
- 认为这是不安全的连接,主动断开了客户端的连接。
值得一提的是 我们这个接口确实是会给前端返回大数据 所以很高概率会被客户端主动关闭
解决方案:
(可能的优化方案有 )
要求用户不要在传输过程中意外关闭连接(等于没说,哈哈哈)
优化后端,减少api的响应时间
增加服务器超时时间
通过SpringBoot全局异常处理来优雅的捕获处理异常
只能说这个异常完全不影响业务!! 下次有时间再改emmmmm