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