这个ClientAbortException是从哪里来的?

9

我有一个Spring-Boot应用程序,其日志中不断显示以下错误:

[xec-104]错误 处理 ErrorPage[errorCode=0, location=/error] org.apache.catalina.connector.ClientAbortException: java.io.IOException: 连接被对等方重置 在 org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:340) 在 org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:303) 在 org.apache.catalina.connector.CoyoteOutputStream.flush(CoyoteOutputStream.java:109) 在 com.fasterxml.jackson.core.json.UTF8JsonGenerator.flush(UTF8JsonGenerator.java:1048) 在 com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:953) 在 org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:285) 在 org.springframework.http.converter.AbstractGenericHttpMessageConverter.write(AbstractGenericHttpMessageConverter.java:100) 在 org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:231) 在 org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:203) 在 org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:81) 在 org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:132) 在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) 在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) 在 org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 在 org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) 在 org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) 在 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) 在 org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:622) 在 org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) 在 org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:726) 在 org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:471) 在 org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:394) 在 org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:311) 在 org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:395) 在 org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:254) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:177) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349) 在 org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:784) 在 org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) 在 org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:802) 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1410) 在 org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 在 java.lang.Thread.run(Thread.java:745) 由于:java.io.IOException: 连接被对等方重置 在 sun.nio.ch.FileDispatcherImpl.write0(Native Method) 在 sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:47) 在 sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93) 在 sun.nio.ch.IOUtil.write(IOUtil.java:65) 在 sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:471) 在 org.apache.tomcat.util.net.NioChannel.write(NioChannel.java:134) 在 org.apache.tomcat.util.net.NioBlockingSelector.write(NioBlocking

正如你所看到的,堆栈跟踪没有显示出我应用程序中的任何信息。这个异常纯粹发生在基础设施中。这是什么意思,我该如何重现它?并且我不明白为什么堆栈跟踪中会有Jackson。我的应用程序中没有任何JSON输出。

最后,我想知道我的应用程序是否存在问题。如果有问题,请修复它。如果没有问题,我不想将其作为错误记录在日志中。

Edit: As requested, this is the pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>net.mixclouddownload</groupId>
 <artifactId>downloader</artifactId>
 <version>0.0.1-SNAPSHOT</version>

 <parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>1.4.3.RELEASE</version>
 </parent>

 <properties>
  <java-version>1.8</java-version>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 </properties>

 <dependencies>
  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-actuator</artifactId>
  </dependency>
  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-devtools</artifactId>
   <optional>true</optional>
  </dependency>
  <dependency>
   <groupId>org.springframework.retry</groupId>
   <artifactId>spring-retry</artifactId>
  </dependency>
  <dependency>
   <groupId>org.aspectj</groupId>
   <artifactId>aspectjweaver</artifactId>
  </dependency>
  <dependency>
   <groupId>net.bull.javamelody</groupId>
   <artifactId>javamelody-core</artifactId>
   <version>1.63.0</version>
  </dependency>
  <dependency>
   <groupId>net.sf.jtidy</groupId>
   <artifactId>jtidy</artifactId>
   <version>r938</version>
  </dependency>
  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-thymeleaf</artifactId>
  </dependency>
  <dependency>
   <groupId>org.webjars</groupId>
   <artifactId>bootstrap</artifactId>
   <version>4.0.0-alpha.6</version>
  </dependency>
  <dependency>
   <groupId>org.webjars</groupId>
   <artifactId>font-awesome</artifactId>
   <version>4.7.0</version>
  </dependency>
  <dependency>
   <groupId>commons-io</groupId>
   <artifactId>commons-io</artifactId>
   <version>2.5</version>
  </dependency>
  <dependency>
   <groupId>com.ibm.icu</groupId>
   <artifactId>icu4j</artifactId>
   <version>58.2</version>
  </dependency>
  <dependency>
   <groupId>org.webjars.bower</groupId>
   <artifactId>bootstrap-social</artifactId>
   <version>5.0.0</version>
  </dependency>
  <dependency>
   <groupId>org.apache.httpcomponents</groupId>
   <artifactId>httpclient</artifactId>
  </dependency>
  <dependency>
   <groupId>org.twitter4j</groupId>
   <artifactId>twitter4j-core</artifactId>
   <version>4.0.6</version>
  </dependency>
  <dependency>
   <groupId>org.facebook4j</groupId>
   <artifactId>facebook4j-core</artifactId>
   <version>2.4.8</version>
  </dependency>
  <dependency>
   <groupId>com.google.guava</groupId>
   <artifactId>guava</artifactId>
   <version>21.0</version>
  </dependency>
  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-cache</artifactId>
  </dependency>
  <dependency>
   <groupId>javax.cache</groupId>
   <artifactId>cache-api</artifactId>
  </dependency>
  <dependency>
   <groupId>ca.pjer</groupId>
   <artifactId>logback-awslogs-appender</artifactId>
   <version>0.1.0</version>
  </dependency>
  <dependency>
   <groupId>org.apache.commons</groupId>
   <artifactId>commons-lang3</artifactId>
   <version>3.5</version>
  </dependency>

  <dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <scope>test</scope>
  </dependency>
  <dependency>
   <groupId>org.mockito</groupId>
   <artifactId>mockito-core</artifactId>
   <scope>test</scope>
  </dependency>
  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-test</artifactId>
   <scope>test</scope>
  </dependency>
 </dependencies>
 <build>
  <plugins>
   <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
     <source>${java-version}</source>
     <target>${java-version}</target>
     <compilerArgument>-Xlint:all</compilerArgument>
     <showWarnings>true</showWarnings>
     <showDeprecation>true</showDeprecation>
    </configuration>
   </plugin>
   <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
     <executable>true</executable>
    </configuration>
   </plugin>
   <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <executions>
     <execution>
      <goals>
       <goal>integration-test</goal>
       <goal>verify</goal>
      </goals>
     </execution>
    </executions>
   </plugin>
  </plugins>
 </build>
</project>


您的客户端未正常终止连接。对于堆栈跟踪中的 JSON 信息,您必须能够从堆栈跟踪中找出某些内容,以帮助您理解为什么使用 JSON 生成器。 - Christopher Schultz
@Patrick 我添加了 pom.xml 文件。 - Jessy James
@ChristopherSchultz 我也这么想,但我试图在多个端点(静态资源、控制器)上复现它,而不让这个错误出现在我的日志中。我该如何复现呢? - Jessy James
通常情况下,如果没有编写一个有意破坏的客户端并将其用作单元测试,很难重现这种问题。 - Christopher Schultz
1个回答

14

这是由于客户端在Tomcat有机会写出响应之前关闭了连接而引起的。

造成此异常的主要罪魁祸首往往是“Internet Explorer”,因为它处理资源连接(如下载JavaScript、css、图标等)方式的原因;如果它决定不再需要该资源,它会在服务器有机会写入之前关闭连接。当您在IE中使用Angularjs或其他SPA框架时,我也更容易看到它。您将知道它是由IE引起的,因为请求资源路径是指一个资源文件(如前面所述)。

第二个(或同样)最常见的罪魁祸首可能是用户在页面完成加载之前多次刷新页面,或者用户在页面完成加载之前导航离开。

第三个罪魁祸首较少见,但更加令人恼火,那就是在调用自己网络上的服务时。您将在所调用的服务上看到“ClientAbortException”,并在客户端服务上看到“SocketException:connection reset”。原因通常是防火墙配置不良。我与我的系统管理员交谈,她说上一次发生这种情况是因为在高峰期使用时复制流量太高,因此防火墙无法及时返回数据包。解决方案是在其他基本应用程序的高峰使用期间限制来自特定来源(例如复制)的流量。我想您可以通过模拟重负载和防火墙传输流量来重现此错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接