Author: fhanik Date: Wed Aug 5 23:20:57 2009 New Revision: 801463 URL: http://svn.apache.org/viewvc?rev=801463&view=rev Log: Start by working on use cases
Added: tomcat/trunk/webapps/examples/WEB-INF/classes/async/Async0.java (with props) Modified: tomcat/trunk/java/javax/servlet/AsyncContext.java tomcat/trunk/java/org/apache/catalina/connector/AsyncContextImpl.java tomcat/trunk/webapps/examples/WEB-INF/classes/async/Async1.java tomcat/trunk/webapps/examples/WEB-INF/web.xml tomcat/trunk/webapps/examples/jsp/async/async1.jsp tomcat/trunk/webapps/examples/jsp/async/index.jsp Modified: tomcat/trunk/java/javax/servlet/AsyncContext.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/javax/servlet/AsyncContext.java?rev=801463&r1=801462&r2=801463&view=diff ============================================================================== --- tomcat/trunk/java/javax/servlet/AsyncContext.java (original) +++ tomcat/trunk/java/javax/servlet/AsyncContext.java Wed Aug 5 23:20:57 2009 @@ -16,6 +16,8 @@ */ package javax.servlet; +import org.apache.catalina.connector.AsyncContextImpl.AsyncState; + /** * @since Servlet 3.0 * $Id$ @@ -63,4 +65,8 @@ void complete(); void start(Runnable run); + + public long getAsyncTimeout(); + + public void setAsyncTimeout(long timeout); } Modified: tomcat/trunk/java/org/apache/catalina/connector/AsyncContextImpl.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/AsyncContextImpl.java?rev=801463&r1=801462&r2=801463&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/connector/AsyncContextImpl.java (original) +++ tomcat/trunk/java/org/apache/catalina/connector/AsyncContextImpl.java Wed Aug 5 23:20:57 2009 @@ -56,7 +56,8 @@ private boolean hasOriginalRequestAndResponse = true; private volatile Runnable dispatch = null; private Context context = null; - private AtomicReference<AsyncState> state = new AtomicReference<AsyncState>(); + private AtomicReference<AsyncState> state = new AtomicReference<AsyncState>(AsyncState.NOT_STARTED); + private long timeout = -1; private Request request; @@ -67,12 +68,16 @@ @Override public void complete() { - if (state.compareAndSet(AsyncState.STARTED, AsyncState.COMPLETING)) { + if (state.compareAndSet(AsyncState.STARTED, AsyncState.COMPLETING) || + state.compareAndSet(AsyncState.DISPATCHED, AsyncState.COMPLETING)) { // TODO SERVLET3 - async AtomicBoolean dispatched = new AtomicBoolean(false); request.coyoteRequest.action(ActionCode.ACTION_ASYNC_COMPLETE,dispatched); if (!dispatched.get()) doInternalComplete(false); + } else { + throw new IllegalStateException("Complete not allowed. Invalid state:"+state.get()); } + } @Override @@ -178,6 +183,7 @@ hasOriginalRequestAndResponse = true; state.set(AsyncState.NOT_STARTED); context = null; + timeout = -1; } public boolean isStarted() { @@ -227,6 +233,7 @@ public void doInternalDispatch() throws ServletException, IOException { if (this.state.compareAndSet(AsyncState.TIMING_OUT, AsyncState.DISPATCHED)) { + log.info("TIMING OUT!"); boolean listenerInvoked = false; for (AsyncListenerWrapper listener : listeners) { listener.fireOnTimeout(); @@ -260,7 +267,8 @@ //this is the same as //request.startAsync().complete(); recycle(); - } else if (state.compareAndSet(AsyncState.DISPATCHED, AsyncState.NOT_STARTED)) { + } else if (state.compareAndSet(AsyncState.DISPATCHED, AsyncState.NOT_STARTED) || + state.compareAndSet(AsyncState.COMPLETING, AsyncState.NOT_STARTED)) { for (AsyncListenerWrapper wrapper : listeners) { try { wrapper.fireOnComplete(); @@ -290,5 +298,14 @@ protected void setState(AsyncState st) { state.set(st); } + + public long getAsyncTimeout() { + return timeout; + } + + public void setAsyncTimeout(long timeout) { + this.timeout = timeout; + request.coyoteRequest.action(ActionCode.ACTION_ASYNC_SETTIMEOUT,new Long(timeout)); + } } Added: tomcat/trunk/webapps/examples/WEB-INF/classes/async/Async0.java URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/examples/WEB-INF/classes/async/Async0.java?rev=801463&view=auto ============================================================================== --- tomcat/trunk/webapps/examples/WEB-INF/classes/async/Async0.java (added) +++ tomcat/trunk/webapps/examples/WEB-INF/classes/async/Async0.java Wed Aug 5 23:20:57 2009 @@ -0,0 +1,65 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package async; + +import java.io.IOException; + +import javax.servlet.AsyncContext; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.juli.logging.Log; +import org.apache.juli.logging.LogFactory; + +public class Async0 extends HttpServlet { + protected static Log log = LogFactory.getLog(Async0.class); + public Async0() { + } + + @Override + protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + if (req.isAsyncStarted()) { + log.info("Received dispatch, completing on the worker thread."); + req.getAsyncContext().complete(); + log.info("After complete called started:"+req.isAsyncStarted()); + resp.getWriter().write("Async dispatch worked\n"); + } else { + resp.setContentType("text/plain"); + final AsyncContext actx = req.startAsync(); + actx.setAsyncTimeout(30*1000); + Runnable run = new Runnable() { + public void run() { + try { + Thread.currentThread().setName("Async0-Thread"); + log.info("Putting AsyncThread to sleep"); + Thread.sleep(10*1000); + log.info("Dispatching"); + actx.dispatch(); + }catch (InterruptedException x) { + log.error("Async1",x); + }catch (IllegalStateException x) { + log.error("Async1",x); + } + } + }; + Thread t = new Thread(run); + t.start(); + } + } +} Propchange: tomcat/trunk/webapps/examples/WEB-INF/classes/async/Async0.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: tomcat/trunk/webapps/examples/WEB-INF/classes/async/Async1.java URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/examples/WEB-INF/classes/async/Async1.java?rev=801463&r1=801462&r2=801463&view=diff ============================================================================== --- tomcat/trunk/webapps/examples/WEB-INF/classes/async/Async1.java (original) +++ tomcat/trunk/webapps/examples/WEB-INF/classes/async/Async1.java Wed Aug 5 23:20:57 2009 @@ -35,6 +35,7 @@ @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { final AsyncContext actx = req.startAsync(); + actx.setAsyncTimeout(30*1000); Runnable run = new Runnable() { public void run() { try { Modified: tomcat/trunk/webapps/examples/WEB-INF/web.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/examples/WEB-INF/web.xml?rev=801463&r1=801462&r2=801463&view=diff ============================================================================== --- tomcat/trunk/webapps/examples/WEB-INF/web.xml (original) +++ tomcat/trunk/webapps/examples/WEB-INF/web.xml Wed Aug 5 23:20:57 2009 @@ -297,6 +297,14 @@ <!-- Async examples --> <servlet> + <servlet-name>async0</servlet-name> + <servlet-class>async.Async0</servlet-class> + </servlet> + <servlet-mapping> + <servlet-name>async0</servlet-name> + <url-pattern>/async/async0</url-pattern> + </servlet-mapping> + <servlet> <servlet-name>async1</servlet-name> <servlet-class>async.Async1</servlet-class> </servlet> Modified: tomcat/trunk/webapps/examples/jsp/async/async1.jsp URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/examples/jsp/async/async1.jsp?rev=801463&r1=801462&r2=801463&view=diff ============================================================================== --- tomcat/trunk/webapps/examples/jsp/async/async1.jsp (original) +++ tomcat/trunk/webapps/examples/jsp/async/async1.jsp Wed Aug 5 23:20:57 2009 @@ -7,3 +7,4 @@ request.getAsyncContext().complete(); } %> +Completed async request. \ No newline at end of file Modified: tomcat/trunk/webapps/examples/jsp/async/index.jsp URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/examples/jsp/async/index.jsp?rev=801463&r1=801462&r2=801463&view=diff ============================================================================== --- tomcat/trunk/webapps/examples/jsp/async/index.jsp (original) +++ tomcat/trunk/webapps/examples/jsp/async/index.jsp Wed Aug 5 23:20:57 2009 @@ -1,2 +1,25 @@ <%...@page session="false"%> -<a href="<%=response.encodeURL("/examples/async/async1")%>"> Async 1 </a> + + +Use cases: + +1. Simple dispatch + - servlet does startAsync() + - background thread calls ctx.dispatch() + + +2. Simple dispatch + - servlet does startAsync() + - background thread calls dispatch(/path/to/jsp) + <a href="<%=response.encodeURL("/examples/async/async1")%>"> Async 1 </a> + +3. Timeout s1 + - servlet does a startAsync() + - servlet does a setAsyncTimeout + - returns - waits for timeout to happen should return error page + +4. Timeout s2 + - servlet does a startAsync() + - servlet does a setAsyncTimeout + - servlet does a addAsyncListener + - returns - waits for timeout to happen and listener invoked --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org