今天現場報了以下問題:
Cannot forward to error page for request [/order/search] as the response has already been committed. As a result,
the response may have the wrong status code. If your application is running on WebSphere Application Server you may be
able to resolve this problem by setting com.ibm.ws.webcontainer.invokeFlushAfterService to false"
從這個錯誤信息中,我們可以看到,信息提示我們無法前進到錯誤頁面,在請求:/order/search這個url時。后面又提示我們,可以返回了一個錯誤的狀態編碼,然后提示我們去設置一個環境變量。
從這個情況中,我們可以預想到以下幾種原因:
1.forward的url關聯的視圖存在問題,導致無法展現
2.forward的url錯誤
3.在執行這個請求中,出現了相關的邏輯錯誤,導致返回錯誤的狀態碼
第一個和第二個錯誤很好排查,但是第三個錯誤,需要查看該url關聯的所有邏輯,找出導致出現錯誤碼的原因。
我的現場錯誤還出現了以下信息:
2018-11-01T06:46:30.891Z,paas-03,org.apache.catalina.connector.ClientAbortException: java.io.IOException: Connection reset by peer 2018-11-01T06:46:30.892Z,paas-03,#011at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:96) ~[catalina.jar:8.5.13] 2018-11-01T06:46:30.893Z,paas-03,#011at net.bull.javamelody.internal.web.CounterResponseStream.write(CounterResponseStream.java:81) ~[javamelody-core-1.68.0.jar:1.68.0] 2018-11-01T06:46:30.893Z,paas-03,#011at com.fasterxml.jackson.core.json.UTF8JsonGenerator.flush(UTF8JsonGenerator.java:1047) ~[jackson-core-2.8.7.jar:2.8.7] 2018-11-01T06:46:30.893Z,paas-03,#011at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:285) ~[spring-web-4.3.7.RELEASE.jar:4.3.7.RELEASE] 2018-11-01T06:46:30.894Z,paas-03,#011at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:81) ~[spring-web-4.3.7.RELEASE.jar:4.3.7.RELEASE] 2018-11-01T06:46:30.894Z,paas-03,#011at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:132) ~[spring-webmvc-4.3.7.RELEASE.jar:4.3.7.RELEASE] 2018-11-01T06:46:30.895Z,paas-03,#011at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) ~[servlet-api.jar:na] 2018-11-01T06:46:30.897Z,paas-03,#011at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) [catalina.jar:8.5.13] 2018-11-01T06:46:30.899Z,paas-03,#011at org.springframework.boot.web.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:115) [spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE] 2018-11-01T06:46:30.900Z,paas-03,#011at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [catalina.jar:8.5.13] 2018-11-01T06:46:30.900Z,paas-03,#011at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) [catalina.jar:8.5.13] 2018-11-01T06:46:30.900Z,paas-03,#011at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80) [catalina.jar:8.5.13] 2018-11-01T06:46:30.901Z,paas-03,#011at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799) [tomcat-coyote.jar:8.5.13] 2018-11-01T06:46:30.901Z,paas-03,#011at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-coyote.jar:8.5.13] 2018-11-01T06:46:30.901Z,paas-03,#011at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861) [tomcat-coyote.jar:8.5.13] 2018-11-01T06:46:30.901Z,paas-03,#011at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-coyote.jar:8.5.13] 2018-11-01T06:46:30.902Z,paas-03,#011at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:47) ~[na:1.8.0_102] 2018-11-01T06:46:30.903Z,paas-03,#011at org.apache.tomcat.util.net.NioBlockingSelector.write(NioBlockingSelector.java:101) ~[tomcat-coyote.jar:8.5.13] 2018-11-01T06:46:30.904Z,paas-03,#011at org.apache.coyote.Response.doWrite(Response.java:518) ~[tomcat-coyote.jar:8.5.13]
“Connection reset by peer”表示當前服務器接受到了通信對端發送的TCP RST信號,即通信對端已經關閉了連接,通過RST信號希望接收方關閉連接。
很明顯相關聯的服務,主動關閉了連接,我尋思這可能存在以下情況:
1.關聯服務出現錯誤或者崩潰
2.關聯服務長時間未返回,比如數據查詢時間過長,但設置了超時時間,超過規定時間關閉連接
我看下關聯服務的日志,發現有sql查詢時間過長的情況,大概40秒,試着增加過濾條件,sql查詢時間變少了,上述的bug就不出現了。