From: fhanik Date: Tue, 21 Jul 2009 23:05:47 +0000 (+0000) Subject: Reorder the start sequence X-Git-Url: https://git.internetallee.de/?a=commitdiff_plain;h=07539be746a11f4165bff4641604ccccc2a5f232;p=tomcat7.0 Reorder the start sequence git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@796575 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/java/org/apache/catalina/connector/AsyncContextImpl.java b/java/org/apache/catalina/connector/AsyncContextImpl.java index daf94429b..cda1ee909 100644 --- a/java/org/apache/catalina/connector/AsyncContextImpl.java +++ b/java/org/apache/catalina/connector/AsyncContextImpl.java @@ -121,10 +121,24 @@ public class AsyncContextImpl implements AsyncContext { return getServletResponse(); } - public void start(Runnable run) { - // TODO SERVLET3 - async - this.dispatch = run; - request.coyoteRequest.action(ActionCode.ACTION_ASYNC_DISPATCH, null ); + public void start(final Runnable run) { + if (state.compareAndSet(AsyncState.STARTED, AsyncState.DISPATCHING) || + state.compareAndSet(AsyncState.DISPATCHED, AsyncState.DISPATCHING)) { + // TODO SERVLET3 - async + Runnable r = new Runnable() { + public void run() { + try { + run.run(); + }catch (Exception x) { + log.error("Unable to run async task.",x); + } + } + }; + this.dispatch = r; + request.coyoteRequest.action(ActionCode.ACTION_ASYNC_DISPATCH, null ); + } else { + throw new IllegalStateException("Dispatch not allowed. Invalid state:"+state.get()); + } } public void addAsyncListener(AsyncListener listener) { diff --git a/java/org/apache/catalina/connector/Request.java b/java/org/apache/catalina/connector/Request.java index 722fe3f66..af0a23c24 100644 --- a/java/org/apache/catalina/connector/Request.java +++ b/java/org/apache/catalina/connector/Request.java @@ -46,6 +46,7 @@ import javax.servlet.ServletInputStream; import javax.servlet.ServletRequest; import javax.servlet.ServletRequestAttributeEvent; import javax.servlet.ServletRequestAttributeListener; +import javax.servlet.ServletRequestWrapper; import javax.servlet.ServletResponse; import javax.servlet.SessionCookieConfig; import javax.servlet.SessionTrackingMode; @@ -1464,9 +1465,9 @@ public class Request if (!isAsyncSupported()) throw new IllegalStateException("Not supported."); if (asyncContext==null) asyncContext = new AsyncContextImpl(this); else if (asyncContext.isStarted()) throw new IllegalStateException("Already started."); + asyncContext.setStarted(getContext()); asyncContext.setServletRequest(getRequest()); asyncContext.setServletResponse(response.getResponse()); - asyncContext.setStarted(getContext()); return asyncContext; } @@ -1474,6 +1475,9 @@ public class Request startAsync(); asyncContext.setServletRequest(request); asyncContext.setServletResponse(response); + //TODO SERVLET3 - async - need to retrieve the ServletContext here + //or just the webapp classloader associated with to do + //run with start(Runnable) asyncContext.setHasOriginalRequestAndResponse(request==getRequest() && response==getResponse().getResponse()); return asyncContext; }