【问题标题】:Getting exception ClientAbortException: java.io.IOException while download large zip file下载大型 zip 文件时出现异常 ClientAbortException: java.io.IOException
【发布时间】:2021-05-21 18:20:30
【问题描述】:

我正在尝试从 REST API 下载大型 zip 文件,但得到了

org.apache.catalina.connector.ClientAbortException: java.io.IOException: connection reset by peer.

由于连接关闭 - 下载的 zip 文件已损坏,我无法打开它。我尝试设置超时属性但没有运气。还为服务配置了nginx api 网关。

这是堆栈跟踪:

org.apache.catalina.connector.ClientAbortException: java.io.IOException: Connection reset by peer
    at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:351) ~[tomcat-embed-core-9.0.38.jar!/:9.0.38]
    at org.apache.catalina.connector.OutputBuffer.flushByteBuffer(OutputBuffer.java:776) ~[tomcat-embed-core-9.0.38.jar!/:9.0.38]
    at org.apache.catalina.connector.OutputBuffer.append(OutputBuffer.java:681) ~[tomcat-embed-core-9.0.38.jar!/:9.0.38]
    at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:386) ~[tomcat-embed-core-9.0.38.jar!/:9.0.38]
    at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:364) ~[tomcat-embed-core-9.0.38.jar!/:9.0.38]
    at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:96) ~[tomcat-embed-core-9.0.38.jar!/:9.0.38]
    at org.springframework.util.StreamUtils.copy(StreamUtils.java:166) ~[spring-core-5.2.9.RELEASE.jar!/:5.2.9.RELEASE]
    at org.springframework.http.converter.ResourceHttpMessageConverter.writeContent(ResourceHttpMessageConverter.java:137) ~[spring-web-5.2.9.RELEASE.jar!/:5.2.9.RELEASE]
    at org.springframework.http.converter.ResourceHttpMessageConverter.writeInternal(ResourceHttpMessageConverter.java:129) ~[spring-web-5.2.9.RELEASE.jar!/:5.2.9.RELEASE]
    at org.springframework.http.converter.ResourceHttpMessageConverter.writeInternal(ResourceHttpMessageConverter.java:45) ~[spring-web-5.2.9.RELEASE.jar!/:5.2.9.RELEASE]
    at org.springframework.http.converter.AbstractHttpMessageConverter.write(AbstractHttpMessageConverter.java:227) ~[spring-web-5.2.9.RELEASE.jar!/:5.2.9.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:280) ~[spring-webmvc-5.2.9.RELEASE.jar!/:5.2.9.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.h

配置文件:

server:
  connection-timeout: -1
  tomcat :
    async-timeout: 60000
    connectTimeout: 60000
    requestTimeout: 60000
    socketTimeout: 60000

这是带有 Tomcat 嵌入式服务器版本 9.0.38 的 Spring。

【问题讨论】:

  • 我会检查你的 Nginx 配置。 “Connection reset by peer”表示任何 Tomcat 正在与之交谈的东西都关闭了连接。
  • nginx.ingress.kubernetes.io/proxy-connect-timeout: "180" nginx.ingress.kubernetes.io/proxy-read-timeout: "600" nginx.ingress.kubernetes.io/ proxy-send-timeout: "180" 对 nginx 有这个配置。并使用邮递员下载文件并增加邮递员的请求超时。

标签: spring-boot rest embedded-tomcat


【解决方案1】:

原因 当 Tomcat 服务器尝试向客户端写回响应但发现连接已从客户端关闭时,会发生此异常。在服务器完成请求之前,它可能在客户端发生以下情况: 网络浏览器已关闭 网页被刷新或导航离开 由于客户端发生套接字超时,HTTP 客户端关闭连接

解决方案 从客户端检查 Web 客户端(浏览器或 REST 客户端)的行为或 HTTP 请求调用代码,了解是否发生上述任何情况。 如果在某些负载较重的情况下,例如过多的并发请求密集地撞击 Historian Tomcat 服务器,服务器可能需要很长时间才能完成请求的操作,导致客户端发生超时,并且连接在服务器写入响应之前被客户端关闭.在这种情况下,用户可以考虑增加 HTTP 客户端的套接字超时值,参考下面的 Java 代码示例,该代码设置了 HttpClient 的超时值:

DefaultHttpClient httpClient = new DefaultHttpClient();
HttpParams params = httpClient.getParams();
HttpConnectionParams.setConnectionTimeout(params, connectionTimeoutMillis);
HttpConnectionParams.setSoTimeout(params, socketTimeoutMillis);

希望我能有所帮助。

【讨论】:

    【解决方案2】:

    您的日志显示 ClientAbortException,当您的 HTTP 客户端断开与服务器的连接时发生,并且这发生在服务器可以关闭服务器套接字连接之前。 此外,您的 HTTP 客户端可能已断开连接。

    这可能有几个原因:

    • 响应请求时间过长,客户端放弃
    • 您回复了客户不理解的内容
    • 最终用户实际上取消了请求
    • 发生网络错误
    • ...可能更多

    你可以很容易地模仿这种行为:

    URL url = new URL("http://example.com/path/to/the/file");
    
    int numberOfBytesToRead = 200;
    
    byte[] buffer = new byte[numberOfBytesToRead];
    int numberOfBytesRead = url.openStream().read(buffer);
    

    【讨论】:

    • zip 文件大小约为 80Mb。所以下载需要时间。这就是为什么 nginx.proxy_read_out: "600"。所以这不应该是这样的。事件我也增加了邮递员的读取超时。日志清楚地表明连接被tomcat服务器取消。所以不知道发生了什么。有没有办法自定义 Tomcat 连接器属性?
    猜你喜欢
    • 1970-01-01
    • 2015-03-27
    • 2021-11-18
    • 1970-01-01
    • 2013-01-21
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多