Author: fhanik
Date: Fri Oct 16 00:06:14 2009
New Revision: 825708

URL: http://svn.apache.org/viewvc?rev=825708&view=rev
Log:
Add some modifications to the state machine. Timeout and error are an async 
dispatch, and its unclear what the state should be. Since both those actions 
should stop the event, we set the state to COMPLETING

Modified:
    tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java
    tomcat/trunk/java/org/apache/catalina/core/AsyncContextImpl.java
    tomcat/trunk/webapps/examples/WEB-INF/classes/async/AsyncStockServlet.java

Modified: tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java?rev=825708&r1=825707&r2=825708&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java Fri Oct 
16 00:06:14 2009
@@ -272,7 +272,7 @@
                    //configure settings for timed out
                    asyncConImpl.setTimeoutState();
                 }
-                if (status==SocketStatus.ERROR) {
+                if (status==SocketStatus.ERROR || status==SocketStatus.STOP || 
status==SocketStatus.DISCONNECT) {
                     AsyncContextImpl asyncConImpl = 
(AsyncContextImpl)request.getAsyncContext();
                     //TODO SERVLET3 - async
                     //configure settings for timed out

Modified: tomcat/trunk/java/org/apache/catalina/core/AsyncContextImpl.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/AsyncContextImpl.java?rev=825708&r1=825707&r2=825708&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/AsyncContextImpl.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/AsyncContextImpl.java Fri Oct 16 
00:06:14 2009
@@ -72,7 +72,9 @@
 
     @Override
     public void complete() {
-        if (state.compareAndSet(AsyncState.STARTED, AsyncState.COMPLETING) ||
+        if (state.get()==AsyncState.COMPLETING) {
+            //do nothing
+        } else if (state.compareAndSet(AsyncState.STARTED, 
AsyncState.COMPLETING) ||
             state.compareAndSet(AsyncState.DISPATCHED, AsyncState.COMPLETING)) 
{
             // TODO SERVLET3 - async
             AtomicBoolean dispatched = new AtomicBoolean(false);
@@ -254,7 +256,7 @@
     }
     
     public void doInternalDispatch() throws ServletException, IOException {
-        if (this.state.compareAndSet(AsyncState.TIMING_OUT, 
AsyncState.DISPATCHED)) {
+        if (this.state.compareAndSet(AsyncState.TIMING_OUT, 
AsyncState.COMPLETING)) {
             log.debug("TIMING OUT!");
             boolean listenerInvoked = false;
             for (AsyncListenerWrapper listener : listeners) {
@@ -265,11 +267,17 @@
                 ((HttpServletResponse)servletResponse).setStatus(500);
             }
             doInternalComplete(true);
-        } else if (this.state.compareAndSet(AsyncState.ERROR_DISPATCHING, 
AsyncState.DISPATCHED)) {
+        } else if (this.state.compareAndSet(AsyncState.ERROR_DISPATCHING, 
AsyncState.COMPLETING)) {
             log.debug("ON ERROR!");
             boolean listenerInvoked = false;
             for (AsyncListenerWrapper listener : listeners) {
-                listener.fireOnError(event);
+                try {
+                    listener.fireOnError(event);
+                }catch (IllegalStateException x) {
+                    log.debug("Listener invoked invalid state.",x);
+                }catch (Exception x) {
+                    log.debug("Exception during onError.",x);
+                }
                 listenerInvoked = true;
             }
             if (!listenerInvoked) {

Modified: 
tomcat/trunk/webapps/examples/WEB-INF/classes/async/AsyncStockServlet.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/webapps/examples/WEB-INF/classes/async/AsyncStockServlet.java?rev=825708&r1=825707&r2=825708&view=diff
==============================================================================
--- tomcat/trunk/webapps/examples/WEB-INF/classes/async/AsyncStockServlet.java 
(original)
+++ tomcat/trunk/webapps/examples/WEB-INF/classes/async/AsyncStockServlet.java 
Fri Oct 16 00:06:14 2009
@@ -117,8 +117,7 @@
 
     @Override
     public void onComplete(AsyncEvent event) throws IOException {
-        clients.remove(event.getRequest().getAsyncContext());
-        if (clientcount.decrementAndGet()==0) {
+        if (clients.remove(event.getRequest().getAsyncContext()) && 
clientcount.decrementAndGet()==0) {
             ticker.removeTickListener(this);
         }
     }



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

Reply via email to