2013/5/27 Peter Cipov <pci...@kerio.com>:
> Hello
>
> I have the commet application - some sort of event bus where requests are
> turned in async mode then stored in internal cache and when event occures /
> or request times out response is sent back to subscriber (it is handled with
> my executor worker threads).
>
> It worked fine until I have added a line with calling flushBuffer on
> response object. My goal was to mark the connection as commited - I am
> checking whether I have already written to this response
> (response.isCommited()) in some other part of my code.
> Now errors like these pop out in my logs
>
> java.lang.NullPointerException
>         at
> org.apache.coyote.http11.InternalNioOutputBuffer.addToBB(InternalNioOutputBuffer.java:210)
>         at
> org.apache.coyote.http11.InternalNioOutputBuffer.commit(InternalNioOutputBuffer.java:202)
>         at
> org.apache.coyote.http11.AbstractHttp11Processor.action(AbstractHttp11Processor.java:765)
>         at org.apache.coyote.Response.action(Response.java:174)
>         at org.apache.coyote.Response.sendHeaders(Response.java:354)
>         at
> org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:330)
>         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)
>         .... my code calling flushBuffer() on HttpResponse object
>         ....
>         .... worker thread
>
>
> public void send(HttpServletResponse response) { // calling from worker
> threads
>    if (response.isCommitted()) {
>       throw new IOException("ERROR");
>    }
>    response.getWriter().print("RESPONSE");
>    response.flushBuffer(); // <---- FAILED HERE
> }
>
>
> Did I miss some curtial lesson about flushing async responses ?

HttpServletRequest and HttpServletResponse objects
a) are not thread-safe
b) are cached and reused for subsequent incoming requests.

so what are you doing to ensure that you do not access it concurrently
and beyond its life cycle?

I would recommend to configure the following system  property in the
catalina.properties file:

org.apache.catalina.connector.RECYCLE_FACADES=true

It will prevent reuse of those objects.
http://tomcat.apache.org/tomcat-7.0-doc/config/systemprops.html


> PS.
> By the way that NPE should never occur - Is it a BUG ? I am using Tomcat
> 7.0.28 (current in debian 7.0 Wheezy)

It is old, as Chuck noted.

Best regards,
Konstantin Kolinko

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org

Reply via email to