Hi all, I'm running into a problem with tomcat, which I believe is self-inflicted. Mostly I just want to confirm my suspicions.
I'm doing some fairly high-rate polling (using JavaScript/XmlHttpRequest/DWR). I'm polling, which is just calling the DWR servlet once every second (using setTimeout on the response callback). Now.. So far nothing should seem out of the ordinary. And indeed many of these polling cycles do run and complete successfully. However after a number of cycles (somewhere around 60), I start to get NullPointerExceptions from the apache tomcat code. Looks like from the Response.recycle method, etc. Full stack trace below. Now.. I don't think there's anything wrong with tomcat here.. I've been using tomcat for years, and it's pretty rock solid. I suspect the problem is in my lack of understanding of the life cycle of the request/response objects. Here's the details in what I'm doing, and what I suspect I'm doing wrong: This poll has the job of batching up "data requests" from the client JavaScript code and passing them off to the server. On the server, each data request is spawned off to a new thread using a thread pool. After the threads are posted to the thread pool, the originating servlet request returns. However, before the response is committed, when the thread is created for the thread pool, I'm assigning the HttpServletRequest and Response (and the HttpSession) as local thread variables. Once the thread is finished, I remove the references by assigning the local variables to null. So.. When I'm trying to preserve the request, response and session objects in a thread, knowing that the response will be committed before the thread dies, am I breaking a cardinal rule? Should I expect that tomcat will throw NullPointerExceptions because of this? Thanks! -darrell Full stack trace:Aug 30, 2013 9:50:51 PM org.apache.coyote.http11.Http11Processor process SEVERE: Error finishing response java.lang.NullPointerException at org.apache.tomcat.util.http.MimeHeaders.setValue(MimeHeaders.java:302) at org.apache.coyote.http11.Http11Processor.prepareResponse(Http11Processor.java:1558) at org.apache.coyote.http11.Http11Processor.action(Http11Processor.java:958) at org.apache.coyote.Response.action(Response.java:181) at org.apache.coyote.http11.InternalOutputBuffer.endRequest(InternalOutputBuffer.java:403) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:903) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) at java.lang.Thread.run(Thread.java:680) Aug 30, 2013 9:50:51 PM org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler process SEVERE: Error reading request, ignored java.lang.NullPointerException at org.apache.tomcat.util.http.MimeHeaders.clear(MimeHeaders.java:152) at org.apache.coyote.Response.recycle(Response.java:579) at org.apache.coyote.http11.InternalOutputBuffer.nextRequest(InternalOutputBuffer.java:373) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:925) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) at java.lang.Thread.run(Thread.java:680)