From 06fded5fa68ca9e5fec772b6ae500d7c92e53c55 Mon Sep 17 00:00:00 2001 From: fhanik Date: Fri, 7 Aug 2009 14:49:19 +0000 Subject: [PATCH] Refactor location of AsyncContextImpl to o.a.catalina.core git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@802026 13f79535-47bb-0310-9956-ffa450edef68 --- java/javax/servlet/AsyncContext.java | 2 +- java/javax/servlet/AsyncEvent.java | 2 +- .../apache/catalina/connector/CoyoteAdapter.java | 9 ++---- java/org/apache/catalina/connector/Request.java | 14 ++++----- .../{connector => core}/AsyncContextImpl.java | 34 +++++++++++++--------- .../{connector => core}/AsyncListenerWrapper.java | 31 +++++--------------- .../apache/catalina/core/StandardWrapperValve.java | 1 - webapps/examples/WEB-INF/classes/async/Async0.java | 2 +- webapps/examples/WEB-INF/classes/async/Async1.java | 2 +- webapps/examples/WEB-INF/classes/async/Async2.java | 2 +- 10 files changed, 42 insertions(+), 57 deletions(-) rename java/org/apache/catalina/{connector => core}/AsyncContextImpl.java (93%) rename java/org/apache/catalina/{connector => core}/AsyncListenerWrapper.java (64%) diff --git a/java/javax/servlet/AsyncContext.java b/java/javax/servlet/AsyncContext.java index b944388cf..200c764c1 100644 --- a/java/javax/servlet/AsyncContext.java +++ b/java/javax/servlet/AsyncContext.java @@ -16,7 +16,7 @@ */ package javax.servlet; -import org.apache.catalina.connector.AsyncContextImpl.AsyncState; +import org.apache.catalina.core.AsyncContextImpl.AsyncState; /** * @since Servlet 3.0 diff --git a/java/javax/servlet/AsyncEvent.java b/java/javax/servlet/AsyncEvent.java index 3012de9af..6ba2f0c74 100644 --- a/java/javax/servlet/AsyncEvent.java +++ b/java/javax/servlet/AsyncEvent.java @@ -25,7 +25,7 @@ public class AsyncEvent { private ServletRequest request; private ServletResponse response; - AsyncEvent(ServletRequest request, ServletResponse response) { + public AsyncEvent(ServletRequest request, ServletResponse response) { this.request = request; this.response = response; } diff --git a/java/org/apache/catalina/connector/CoyoteAdapter.java b/java/org/apache/catalina/connector/CoyoteAdapter.java index 9571b80fa..2771dca3b 100644 --- a/java/org/apache/catalina/connector/CoyoteAdapter.java +++ b/java/org/apache/catalina/connector/CoyoteAdapter.java @@ -29,6 +29,7 @@ import org.apache.catalina.Context; import org.apache.catalina.Globals; import org.apache.catalina.Wrapper; import org.apache.tomcat.util.res.StringManager; +import org.apache.catalina.core.AsyncContextImpl; import org.apache.catalina.util.URLEncoder; import org.apache.coyote.ActionCode; import org.apache.coyote.Adapter; @@ -269,14 +270,8 @@ public class CoyoteAdapter AsyncContextImpl asyncConImpl = (AsyncContextImpl)request.getAsyncContext(); //TODO SERVLET3 - async //configure settings for timed out - asyncConImpl.setState(AsyncContextImpl.AsyncState.TIMING_OUT); + asyncConImpl.setTimeoutState(); } - if (status==SocketStatus.TIMEOUT) { - AsyncContextImpl asyncConImpl = (AsyncContextImpl)request.getAsyncContext(); - //TODO SERVLET3 - async - //configure settings for timed out - asyncConImpl.setState(AsyncContextImpl.AsyncState.TIMING_OUT); - } connector.getContainer().getPipeline().getFirst().invoke(request, response); }catch (RuntimeException x) { success = false; diff --git a/java/org/apache/catalina/connector/Request.java b/java/org/apache/catalina/connector/Request.java index 847d6f201..9a5c0c3b3 100644 --- a/java/org/apache/catalina/connector/Request.java +++ b/java/org/apache/catalina/connector/Request.java @@ -36,6 +36,7 @@ import java.util.TreeMap; import javax.security.auth.Subject; import javax.servlet.AsyncContext; +import javax.servlet.AsyncEvent; import javax.servlet.AsyncListener; import javax.servlet.DispatcherType; import javax.servlet.FilterChain; @@ -62,6 +63,7 @@ import org.apache.catalina.Manager; import org.apache.catalina.Realm; import org.apache.catalina.Session; import org.apache.catalina.Wrapper; +import org.apache.catalina.core.AsyncContextImpl; import org.apache.catalina.realm.GenericPrincipal; import org.apache.catalina.util.Enumerator; import org.apache.catalina.util.ParameterMap; @@ -1465,19 +1467,17 @@ public class Request public AsyncContext startAsync() { // TODO SERVLET3 - async + return startAsync(getRequest(),response.getResponse()); + } + + public AsyncContext startAsync(ServletRequest request, ServletResponse response) { 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()); - return asyncContext; - } - - public AsyncContext startAsync(ServletRequest request, ServletResponse response) { - startAsync(); asyncContext.setServletRequest(request); asyncContext.setServletResponse(response); + asyncContext.initEvent(); //TODO SERVLET3 - async - need to retrieve the ServletContext here //or just the webapp classloader associated with to do //run with start(Runnable) diff --git a/java/org/apache/catalina/connector/AsyncContextImpl.java b/java/org/apache/catalina/core/AsyncContextImpl.java similarity index 93% rename from java/org/apache/catalina/connector/AsyncContextImpl.java rename to java/org/apache/catalina/core/AsyncContextImpl.java index 95909b896..be4d6f126 100644 --- a/java/org/apache/catalina/connector/AsyncContextImpl.java +++ b/java/org/apache/catalina/core/AsyncContextImpl.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.catalina.connector; +package org.apache.catalina.core; import java.io.IOException; import java.util.ArrayList; @@ -23,6 +23,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; import javax.servlet.AsyncContext; +import javax.servlet.AsyncEvent; import javax.servlet.AsyncListener; import javax.servlet.DispatcherType; import javax.servlet.RequestDispatcher; @@ -35,6 +36,7 @@ import javax.servlet.http.HttpServletResponse; import org.apache.catalina.Context; import org.apache.catalina.Globals; +import org.apache.catalina.connector.Request; import org.apache.coyote.ActionCode; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; @@ -59,6 +61,7 @@ public class AsyncContextImpl implements AsyncContext { private Context context = null; private AtomicReference state = new AtomicReference(AsyncState.NOT_STARTED); private long timeout = -1; + private AsyncEvent event = null; private Request request; @@ -73,7 +76,7 @@ public class AsyncContextImpl implements AsyncContext { state.compareAndSet(AsyncState.DISPATCHED, AsyncState.COMPLETING)) { // TODO SERVLET3 - async AtomicBoolean dispatched = new AtomicBoolean(false); - request.coyoteRequest.action(ActionCode.ACTION_ASYNC_COMPLETE,dispatched); + request.getCoyoteRequest().action(ActionCode.ACTION_ASYNC_COMPLETE,dispatched); if (!dispatched.get()) doInternalComplete(false); } else { throw new IllegalStateException("Complete not allowed. Invalid state:"+state.get()); @@ -129,7 +132,7 @@ public class AsyncContextImpl implements AsyncContext { }; this.dispatch = run; AtomicBoolean dispatched = new AtomicBoolean(false); - request.coyoteRequest.action(ActionCode.ACTION_ASYNC_DISPATCH, dispatched ); + request.getCoyoteRequest().action(ActionCode.ACTION_ASYNC_DISPATCH, dispatched ); if (!dispatched.get()) { try { doInternalDispatch(); @@ -174,7 +177,7 @@ public class AsyncContextImpl implements AsyncContext { }; this.dispatch = r; AtomicBoolean dispatched = new AtomicBoolean(false); - request.coyoteRequest.action(ActionCode.ACTION_ASYNC_DISPATCH, dispatched ); + request.getCoyoteRequest().action(ActionCode.ACTION_ASYNC_DISPATCH, dispatched ); if (!dispatched.get()) { try { doInternalDispatch(); @@ -192,21 +195,17 @@ public class AsyncContextImpl implements AsyncContext { public void addAsyncListener(AsyncListener listener) { AsyncListenerWrapper wrapper = new AsyncListenerWrapper(); wrapper.setListener(listener); - wrapper.setServletRequest(getServletRequest()); - wrapper.setServletResponse(getServletResponse()); listeners.add(wrapper); } public void addAsyncListener(AsyncListener listener, ServletRequest servletRequest, ServletResponse servletResponse) { AsyncListenerWrapper wrapper = new AsyncListenerWrapper(); wrapper.setListener(listener); - wrapper.setServletRequest(servletRequest); - wrapper.setServletResponse(servletResponse); listeners.add(wrapper); } - protected void recycle() { + public void recycle() { servletRequest = null; servletResponse = null; listeners.clear(); @@ -214,6 +213,7 @@ public class AsyncContextImpl implements AsyncContext { state.set(AsyncState.NOT_STARTED); context = null; timeout = -1; + event = null; } public boolean isStarted() { @@ -263,10 +263,10 @@ public class AsyncContextImpl implements AsyncContext { public void doInternalDispatch() throws ServletException, IOException { if (this.state.compareAndSet(AsyncState.TIMING_OUT, AsyncState.DISPATCHED)) { - log.info("TIMING OUT!"); + log.debug("TIMING OUT!"); boolean listenerInvoked = false; for (AsyncListenerWrapper listener : listeners) { - listener.fireOnTimeout(); + listener.fireOnTimeout(event); listenerInvoked = true; } if (!listenerInvoked) { @@ -302,7 +302,7 @@ public class AsyncContextImpl implements AsyncContext { } else if (state.compareAndSet(AsyncState.COMPLETING, AsyncState.NOT_STARTED)) { for (AsyncListenerWrapper wrapper : listeners) { try { - wrapper.fireOnComplete(); + wrapper.fireOnComplete(event); }catch (IOException x) { //how does this propagate, or should it? //TODO SERVLET3 - async @@ -336,7 +336,15 @@ public class AsyncContextImpl implements AsyncContext { public void setAsyncTimeout(long timeout) { this.timeout = timeout; - request.coyoteRequest.action(ActionCode.ACTION_ASYNC_SETTIMEOUT,new Long(timeout)); + request.getCoyoteRequest().action(ActionCode.ACTION_ASYNC_SETTIMEOUT,new Long(timeout)); + } + + public void setTimeoutState() { + state.set(AsyncState.TIMING_OUT); + } + + public void initEvent() { + event = new AsyncEvent(getRequest(),getResponse()); } } diff --git a/java/org/apache/catalina/connector/AsyncListenerWrapper.java b/java/org/apache/catalina/core/AsyncListenerWrapper.java similarity index 64% rename from java/org/apache/catalina/connector/AsyncListenerWrapper.java rename to java/org/apache/catalina/core/AsyncListenerWrapper.java index ffdad5783..0f4085a9b 100644 --- a/java/org/apache/catalina/connector/AsyncListenerWrapper.java +++ b/java/org/apache/catalina/core/AsyncListenerWrapper.java @@ -14,10 +14,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.catalina.connector; +package org.apache.catalina.core; import java.io.IOException; +import javax.servlet.AsyncEvent; import javax.servlet.AsyncListener; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; @@ -29,34 +30,16 @@ import javax.servlet.ServletResponse; public class AsyncListenerWrapper { private AsyncListener listener = null; - private ServletRequest servletRequest = null; - private ServletResponse servletResponse = null; - public void fireOnComplete() throws IOException { - // TODO SERVLET 3 - async - + public void fireOnComplete(AsyncEvent event) throws IOException { + // TODO SERVLET 3 - async + listener.onComplete(event); } - public void fireOnTimeout() throws IOException { + public void fireOnTimeout(AsyncEvent event) throws IOException { // TODO SERVLET 3 - async - - } - - public ServletRequest getServletRequest() { - return servletRequest; - } - - public void setServletRequest(ServletRequest servletRequest) { - this.servletRequest = servletRequest; - } - - public ServletResponse getServletResponse() { - return servletResponse; - } - - public void setServletResponse(ServletResponse servletResponse) { - this.servletResponse = servletResponse; + listener.onTimeout(event); } public AsyncListener getListener() { diff --git a/java/org/apache/catalina/core/StandardWrapperValve.java b/java/org/apache/catalina/core/StandardWrapperValve.java index 2f0b266ba..74522f062 100644 --- a/java/org/apache/catalina/core/StandardWrapperValve.java +++ b/java/org/apache/catalina/core/StandardWrapperValve.java @@ -33,7 +33,6 @@ import org.apache.catalina.CometEvent; import org.apache.catalina.CometProcessor; import org.apache.catalina.Context; import org.apache.catalina.Globals; -import org.apache.catalina.connector.AsyncContextImpl; import org.apache.catalina.connector.ClientAbortException; import org.apache.catalina.connector.Request; import org.apache.catalina.connector.Response; diff --git a/webapps/examples/WEB-INF/classes/async/Async0.java b/webapps/examples/WEB-INF/classes/async/Async0.java index 777f077be..6929141f4 100644 --- a/webapps/examples/WEB-INF/classes/async/Async0.java +++ b/webapps/examples/WEB-INF/classes/async/Async0.java @@ -48,7 +48,7 @@ public class Async0 extends HttpServlet { try { Thread.currentThread().setName("Async0-Thread"); log.info("Putting AsyncThread to sleep"); - Thread.sleep(10*1000); + Thread.sleep(2*1000); log.info("Dispatching"); actx.dispatch(); }catch (InterruptedException x) { diff --git a/webapps/examples/WEB-INF/classes/async/Async1.java b/webapps/examples/WEB-INF/classes/async/Async1.java index 98708e5b0..497bfb26b 100644 --- a/webapps/examples/WEB-INF/classes/async/Async1.java +++ b/webapps/examples/WEB-INF/classes/async/Async1.java @@ -42,7 +42,7 @@ public class Async1 extends HttpServlet { String path = "/jsp/async/async1.jsp"; Thread.currentThread().setName("Async1-Thread"); log.info("Putting AsyncThread to sleep"); - Thread.sleep(10*1000); + Thread.sleep(2*1000); log.info("Dispatching to "+path); actx.dispatch(path); }catch (InterruptedException x) { diff --git a/webapps/examples/WEB-INF/classes/async/Async2.java b/webapps/examples/WEB-INF/classes/async/Async2.java index 5cda1ec28..0ef07ad9c 100644 --- a/webapps/examples/WEB-INF/classes/async/Async2.java +++ b/webapps/examples/WEB-INF/classes/async/Async2.java @@ -41,7 +41,7 @@ public class Async2 extends HttpServlet { try { Thread.currentThread().setName("Async2-Thread"); log.info("Putting AsyncThread to sleep"); - Thread.sleep(10*1000); + Thread.sleep(2*1000); log.info("Writing data."); actx.getResponse().getWriter().write("Output from background thread. Time:"+System.currentTimeMillis()+"\n"); actx.complete(); -- 2.11.0