0

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

org.apache.catalina.connector.ClientAbortException:java.io.IOException:连接被对等方重置。

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

这是堆栈跟踪:

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。

4

2 回答 2

0

原因 当 Tomcat 服务器尝试向客户端写回响应但发现连接已从客户端关闭时,会发生此异常。在服务器完成请求之前,它可能在客户端发生以下情况: Web 浏览器已关闭 网页刷新或导航离开 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);

希望我有帮助。

于 2021-05-22T06:37:47.213 回答
0

您的日志显示 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);
于 2021-05-22T08:06:47.067 回答