We have implemented Servlet 3.0 AsyncContext in Tomcat Version: 7.0.23.
It runs on RHEL 6.1 using OpenJDK version 1.6.0_24,64-bit
server
The app works great for the most part. If any network violations occur, updating from the server cannot reach the client, because there is an exception " ClientAbortException: java.net.SocketException: Broken pipe
". which is caught and ignored.
It happens on a line,
asyncContext.getResponse().getWriter().println(updateStr);
After that, Tomcat goes crazy and redirects URLs to unexpected servlets. For example, when matching / query with the SessionManager servlet, the URL mysite.com/index.html
directed to the SessionManager servlet. Restarting tomcat solves the problem.
Any guidance on why this is happening and how to solve it?
To add more data, the following exception stack trace.
ClientAbortException: java.net.SocketException: Broken pipe at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:346) at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:306) at org.apache.catalina.connector.Response.flushBuffer(Response.java:568) at org.apache.catalina.connector.ResponseFacade.flushBuffer(ResponseFacade.java:307) at com.management.TestHandler$TestInfo.statusUpdate(TestHandler.java:638) at com.chakra.ipbtt.TestObject.publish(TestObject.java:1626) at com.chakra.ipbtt.TestObject.handlePublish(TestObject.java:1421) at com.chakra.ipbtt.TestObject.executeCommand(TestObject.java:1371) at com.chakra.ipbtt.TestObject.executeCommand(TestObject.java:1388) at com.chakra.ipbtt.TestObject.executeCommand(TestObject.java:1388) at com.chakra.ipbtt.TestObject.executeCommand(TestObject.java:1388) at com.chakra.ipbtt.TestObject.executeCommand(TestObject.java:1388) at com.chakra.ipbtt.TestObject.executeCommand(TestObject.java:1388) at com.chakra.ipbtt.TestObject.executeTest(TestObject.java:1791) at com.management.TestHandler.executeTest(TestHandler.java:420) at com.management.TestHandler.handleNewTest(TestHandler.java:222) at com.management.TestMgr.processRequest(TestMgr.java:71) at com.management.TestMgr.doPost(TestMgr.java:105) at javax.servlet.http.HttpServlet.service(HttpServlet.java:641) at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:690) at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:477) at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:402) at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:329) at com.management.SessionMgr.processRequest(SessionMgr.java:131) at com.management.SessionMgr.doPost(SessionMgr.java:164) at javax.servlet.http.HttpServlet.service(HttpServlet.java:641) at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at com.management.SessionsFilter.doFilter(SessionsFilter.java:127) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) at java.lang.Thread.run(Thread.java:636) Caused by: java.net.SocketException: Broken pipe at java.net.SocketOutputStream.socketWrite0(Native Method) at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109) at java.net.SocketOutputStream.write(SocketOutputStream.java:153) at org.apache.coyote.http11.InternalOutputBuffer.realWriteBytes(InternalOutputBuffer.java:215) at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:462) at org.apache.coyote.http11.InternalOutputBuffer.flush(InternalOutputBuffer.java:119) at org.apache.coyote.http11.AbstractHttp11Processor.action(AbstractHttp11Processor.java:789) at org.apache.coyote.Response.action(Response.java:174) at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:341) ... 48 more`
source share