org.apache.catalina.connector.ClientAbortException: java.io.IOException: Connection reset by peer 원인

2019. 3. 8. 17:28etc/error

 

org.apache.catalina.connector.ClientAbortException: java.io.IOException: Connection reset by peer 원인

 

다음과 같은 오류가 발생한 경우 여러 상황이 있지만

 

그 중 필자가 처한 상황에 대해서 기술한다.

 

 

org.apache.catalina.connector.ClientAbortException: java.io.IOException: Connection reset by peer
 at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:321)
 at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:284)
 at org.apache.catalina.connector.CoyoteOutputStream.flush(CoyoteOutputStream.java:118)
 at com.fasterxml.jackson.core.json.UTF8JsonGenerator.flush(UTF8JsonGenerator.java:1043)
 at com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:2244)
 at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:231)
 at org.springframework.http.converter.AbstractHttpMessageConverter.write(AbstractHttpMessageConverter.java:208)
 at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:161)
 at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:101)
 at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:202)
 at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:71)
 at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:126)
 at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:777)
 at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:706)
 at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
 at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943)
 at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
 at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
 at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:868)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
 at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
 at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
 at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
 at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
 at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
 at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:496)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
 at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
 at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803)
 at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
 at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790)
 at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459)
 at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
 at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
 at java.lang.Thread.run(Thread.java:748)
Caused by: java.io.IOException: Connection reset by peer
 at sun.nio.ch.FileDispatcherImpl.write0(Native Method)
 at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:47)
 at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93)
 at sun.nio.ch.IOUtil.write(IOUtil.java:65)
 at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:471)
 at org.apache.tomcat.util.net.NioChannel.write(NioChannel.java:134)
 at org.apache.tomcat.util.net.NioBlockingSelector.write(NioBlockingSelector.java:101)
 at org.apache.tomcat.util.net.NioSelectorPool.write(NioSelectorPool.java:157)
 at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.doWrite(NioEndpoint.java:1267)
 at org.apache.tomcat.util.net.SocketWrapperBase.doWrite(SocketWrapperBase.java:670)
 at org.apache.tomcat.util.net.SocketWrapperBase.flushBlocking(SocketWrapperBase.java:607)
 at org.apache.tomcat.util.net.SocketWrapperBase.flush(SocketWrapperBase.java:597)
 at org.apache.coyote.http11.Http11OutputBuffer$SocketOutputBuffer.flush(Http11OutputBuffer.java:646)
 at org.apache.coyote.http11.filters.ChunkedOutputFilter.flush(ChunkedOutputFilter.java:169)
 at org.apache.coyote.http11.Http11OutputBuffer.flush(Http11OutputBuffer.java:252)
 at org.apache.coyote.http11.Http11Processor.flush(Http11Processor.java:1560)
 at org.apache.coyote.AbstractProcessor.action(AbstractProcessor.java:285)
 at org.apache.coyote.Response.action(Response.java:173)
 at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:317)
 ... 51 more

 



 

먼저 org.apache.catalina.connector.ClientAbortException 에 대해서 살펴보자

 

 

출처 : 아파치 톰켓

 

위 오류는 외부에 의해 톰켓에서 발생한 오류이다.

 

즉 어플리케이션에서 발생하는 오류가 아니다.

 

그래서 로그상에서 표시되는 오류 위치가 프로젝트 내부를 가르키지 않는다.

 

내가 해석한게 맞다면 클라이언트의 요청을 톰켓이 처리하는데 어디선가 연결이 끊으져서 발생하는 경우가 있는것 같다.

 

여러 사례를 찾아보니 위 오류가 발생하는 경우가 한가지가 아닌가 보다.

 

일단 오류를 발생시키는 것으로 예상되는 것들을 모조리 찾아보자.

 

간헐적으로 발생하는 오류다 보니 생각보다 그 상황을 찾기가 쉽지가 않았다.

 

그래서 exception handler를 만들고 오류가 발생할 때의 request 의 url 을 로그로 남겼더니 쉽게 찾을 수 있었다.

 



 

특정 페이지에 출력하는 데이터중에 한 녀석이 조회하는데 시간이 꽤 걸리는 녀석이여서

 

비동기로 바꿔 페이지가 뜬 후에 로딩되게 한 것 문제가 되었다.

 

특정 데이터를 비동기로 로딩했기 때문에 화면을 사용하는데는 문제가 없었는데 조회가 오래 걸리다 보니 조회가 완료되기 전에 다른페이지로 이동하는 경우도 있었다.

 

 

 

정리하자면 jsp 에서 ajax로 통신하는데 통신이 끝나기도 전에 다른페이지로 이동하는 경우가 발생했고 그럴때마다 위와 같은 오류가 발생한 것으로 파악됬다.

 

클라이언트의 요청을 톰켓이 받고서 다시 클라이언트에게 전해줘야 하는데 이때 요청한 즉 톰켓이 전달해 줄 클라이언트가 사라진 상황이다.

 

 

 

원인은 찾았으니 해결방법을 고민해야겠다.