簡體   English   中英

ClientAbortException:java.net.SocketException:連接重置錯誤間歇性地出現在jboss服務器上

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM