tomcat-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Peter Roßbach>
Subject Proposal: Some todo's at AsyncContext detected...
Date Sun, 27 Jun 2010 11:11:40 GMT

I detected some Todo's at AsyncContext

-   AsyncContext.createListener
     We don't make a resource injection or make it configurable!

     Servlet 3.0 API comment:
     "This method supports resource injection if the given clazz  
represents a Managed Bean. See the Java EE platform and JSR 299  
specifications for additional details about Managed Beans and resource  

-   I miss the is[Started,Completed] methods at AsyncContext interface
     The only way to detect a completed state at AsyncContext inside  
an AsyncListener is:
         if (ac.getResponse() != null)
     AsyncListener got an event, with empty state... -- Very strange!

     Can't we clear all AsyncListener after send complete and before  
we refresh the AsyncContext state?
     How can a user handle a completed situation?
         see o.a.c.core.TestAsyncListener

-   AsyncContext.start() dosen't really start a thread!
         We create wrapper of a Runnable, but we don't start a thread...
         Error handling seam a little bit strange.
             We only throw a RuntimeException(ex) and log an error!

         Servlet API comment:
         "Causes the container to dispatch a thread, possibly from a  
managed thread pool, to run the specified Runnable. The container may  
propagate appropriate contextual information to the Runnable."

         How can we implement that?
             Start everytime a new thread without pooling?
             Use the connector executor pool from request?
                 Then we must extend the ProtocolHandler interface  
with getExecutor() signature.
             Use a separate Executor pool per Engine/Host or Context
         How do we have to implemented the error handling?

- JioEndpoint has a timeout detection thread, but we don't start it!
     I easy fix it with revision 958362,
     but the polling strategy is slow and ineffectiv.
     I didn't make a test at NIO/APR-HTTP or AJP-Connectors.

- After the timeout event is emitted, the completed method is  
automatically called!
        Servlet API 3.0 Spec says:
■In the event that an asynchronous operation times out, the container  
must run
through the following steps:
■ Invoke the AsyncListener.onTimeout method on all the AsyncListener
instances registered with the ServletRequest on which the asynchronous
operation was initiated.
■ If none of the listeners called AsyncContext.complete() or any of  
AsyncContext.dispatch methods, perform an error dispatch with a status
code equal to HttpServletResponse.SC_INTERNAL_SERVER_ERROR.
■ If no matching error page was found, or the error page did not call
AsyncContext.complete() or any of the AsyncContext.dispatch
methods, the container MUST call AsyncContext.complete().
         I miss the implementation that we call the error page!

- Currently a AsyncListener can't reinit a async cycle!
     see o.a.c.connector.Request.startAsync
     ... L1555ff
             if (asyncContext==null) {
             asyncContext = new AsyncContextImpl(this);
         } else if (asyncContext.isStarted()) {
             throw new IllegalStateException("Already started.");

What does this spec definition really mean?
=== Ch 2 Page 18
■public void onStartAsync(AsyncEvent event) - Is used to notify the
listener that a new asynchronous cycle is being initiated via a call  
to one of the
ServletRequest.startAsync methods. The AsyncContext corresponding
to the asynchronous operation that is being reinitialized may be  
obtained by
calling AsyncEvent.getAsyncContext on the given event.

-   AsyncListener doesn't receive a onStartAsync event.
     We don't implement it.

     At AsyncListenerWrapper fireOnStartAsync is missing
     As AsyncContext.startAsync method doesn't emit an event

- ContextClassLoader at AsyncContext.dispatch is not set!
     I can't see that we correcly set the application  
ContextClassLoader before
     we dispatch the Request. What must we do at a CrossContext  

- After first complete async cycle, an AsyncListner receive  
onStartAsync as code start next async cycle?

Why doesn't the Servlet 3.0 TCK check basic AsyncContext  
It seams that we better start a open test suite implementation at the  
new Servlet 3.0 API.


To unsubscribe, e-mail:
For additional commands, e-mail:

View raw message