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: [email protected]
For additional commands, e-mail: [email protected]