Tomcat出现org.apache.coyote.CloseNowException写入失败问题求助
Tomcat写入失败异常(CloseNowException: Failed write)排查与解决
报错堆栈
org.apache.coyote.CloseNowException: Failed write at org.apache.coyote.http11.Http11OutputBuffer$SocketOutputBuffer.doWrite(Http11OutputBuffer.java:548)~[tomcat-embed-core-9.0.39.jar!/:9.0.39] at org.apache.coyote.http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java:110)~[tomcat-embed-core-9.0.39.jar!/:9.0.39] at org.apache.coyote.http11.Http11OutputBuffer.doWrite(Http11OutputBuffer.java:193)~[tomcat-embed-core-9.0.39.jar!/:9.0.39] at org.apache.coyote.Response.doWrite(Response.java:601)~[tomcat-embed-core-9.0.39.jar!/:9.0.39] at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:339)~[tomcat-embed-core-9.0.39.jar!/:9.0.39] at org.apache.catalina.connector.OutputBuffer.flushByteBuffer(OutputBuffer.java:776)~[tomcat-embed-core-9.0.39.jar!/:9
可能原因
- 客户端提前断开连接:浏览器或客户端在服务器返回响应前主动关闭请求连接,导致服务器无法继续写入数据
- 网络链路异常:网络波动、防火墙拦截、代理中断等导致TCP连接中途断开
- Tomcat配置不合理:输出缓冲区过小、连接超时设置过短,引发写入失败
- 大响应未优化:一次性输出过大的响应数据,未采用分块传输,导致缓冲区溢出或连接超时
解决与优化方案
- 捕获异常优雅处理:在业务代码中捕获
IOException及子类(包括CloseNowException),仅记录日志即可,无需抛出完整堆栈,避免影响正常服务流程 - 调整Tomcat连接配置:
- 增大输出缓冲区:在
server.xml的Connector标签中添加socketBuffer="65536"(默认8k,可调整为64k) - 延长连接超时:设置
connectionTimeout="30000"(30秒,根据业务场景调整) - Spring Boot环境可在
application.properties中配置:server.tomcat.connection-timeout=30000 server.tomcat.max-swallow-size=-1 # 禁用请求体大小限制,避免截断大请求
- 增大输出缓冲区:在
- 优化客户端请求逻辑:前端避免在请求未完成时关闭页面、跳转路由,确保请求正常完成;大文件下载场景添加进度监听,减少中途中断概率
- 大响应流式处理:返回大文件或大量数据时,使用流式输出(比如Spring的
StreamingResponseBody),分块传输响应,降低内存占用与连接中断风险 - 升级Tomcat版本:9.0.39存在部分连接处理的已知bug,升级到9.x系列稳定版本(如9.0.80及以上),官方已修复多个相关连接异常问题
内容的提问来源于stack exchange,提问作者郭东洋
相关产品推荐
相关产品推荐

