![](/img/trans.png)
[英]ClientAbortException: java.net.SocketException: Connection reset by peer: socket write error
[英]ClientAbortException: java.net.SocketException: Connection reset error coming intermittently on jboss server
我的Web應用程序連接到API以從數據庫獲取數據。 通過瀏覽器訪問頁面有時會正確加載數據,但有時會引發連接重置異常。 這是間歇性發生的。
大多數情況下,首次加載無法正常工作,但刷新/重新加載頁面可以暫時解決問題。
我的網頁(UI)部署在Jboss服務器6.4上。 我的前端Web應用程序和后端API之間有一個中間負載均衡器。
Web應用程序的Jboss日志-
ClientAbortException: java.net.SocketException: Connection reset
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:429)
at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:450)
at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:368)
at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:342)
at org.apache.catalina.connector.CoyoteOutputStream.flush(CoyoteOutputStream.java:99)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:141)
at java.io.FilterOutputStream.close(FilterOutputStream.java:158)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:734)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:295)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176)
at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145)
at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92)
at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:389)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:246)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:231)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:149)
at org.jboss.as.web.security.SubjectInfoSetupValve.invoke(SubjectInfoSetupValve.java:34)
at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:169)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:151)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:97)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:102)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:656)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:926)
at java.lang.Thread.run(Thread.java:748)
Suppressed: ClientAbortException: java.net.SocketException: Broken pipe (Write failed)
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:429)
at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:450)
at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:368)
at org.apache.catalina.connector.OutputBuffer.close(OutputBuffer.java:324)
at org.apache.catalina.connector.CoyoteOutputStream.close(CoyoteOutputStream.java:106)
at java.io.FilterOutputStream.close(FilterOutputStream.java:159)
... 25 more
調用API的一段代碼-
private String invokeGetTLS(String apiHost, HttpServletResponse response) throws IOException {
System.out.println("Inside invokeGetTLS");
URL apiURL = null;
Map<String, List<String>> respHeaders = null;
HttpsURLConnection apiURLConnection = null;
try {
apiURL = new URL(apiHost);
apiURLConnection = (HttpsURLConnection) apiURL.openConnection();
apiURLConnection.setDoInput(true);
respHeaders = apiURLConnection.getHeaderFields();
addResponseHeaders(respHeaders, response);
} catch (IOException e) {
System.out.println("Exception in invokeGetTLS " + e.getMessage());
e.printStackTrace();
return e.getMessage();
}
try (BufferedInputStream inputBuffStream = new BufferedInputStream(apiURLConnection.getInputStream());
BufferedOutputStream outBuffStream = new BufferedOutputStream(response.getOutputStream())) {
int i;
while ((i = ((InputStream) inputBuffStream).read()) >= 0) {
outBuffStream.write(i);
}
} catch (IOException e) {
System.out.println("Exception in invokeGetTLS " + e.getMessage());
e.printStackTrace();
return e.getMessage();
}
System.out.println("Leaving invokeGetTLS");
return null;
}
我們正在使用Nginx Web服務器。 流程是這樣的-Nginx-> serve / UI-> Load Balancer-> Api。 我在Nginx上看到以下錯誤-
2019/09/19 11:32:32 [info] 12553#12553: *6 epoll_wait() reported that client prematurely closed connection, so upstream connection is closed too while reading response header from upstream
ClientAbortException: java.net.SocketException: Broken pipe
這意味着客戶端關閉了連接。 如果您有一個負載均衡器按照您的描述充當客戶端,那么負載均衡器會過早關閉連接。 調整您的負載均衡器超時。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.