Author: fhanik Date: Thu Aug 6 16:10:34 2009 New Revision: 801693 URL: http://svn.apache.org/viewvc?rev=801693&view=rev Log: Another use case
Added: tomcat/trunk/webapps/examples/WEB-INF/classes/async/Async2.java (with props) Modified: tomcat/trunk/java/org/apache/catalina/connector/AsyncContextImpl.java tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java tomcat/trunk/webapps/examples/WEB-INF/web.xml tomcat/trunk/webapps/examples/jsp/async/index.jsp 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=801693&r1=801692&r2=801693&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/connector/AsyncContextImpl.java (original) +++ tomcat/trunk/java/org/apache/catalina/connector/AsyncContextImpl.java Thu Aug 6 16:10:34 2009 @@ -257,6 +257,8 @@ dispatch = null; } } + } else if (this.state.get()==AsyncState.COMPLETING) { + doInternalComplete(false); } else { throw new IllegalStateException("Dispatch illegal. Invalid state: "+state.get()); } 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=801693&r1=801692&r2=801693&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java (original) +++ tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java Thu Aug 6 16:10:34 2009 @@ -273,6 +273,12 @@ //configure settings for timed out asyncConImpl.setState(AsyncContextImpl.AsyncState.TIMING_OUT); } + 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; Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java?rev=801693&r1=801692&r2=801693&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java Thu Aug 6 16:10:34 2009 @@ -190,13 +190,6 @@ * Async used */ protected boolean async = false; - /** - * Closed flag, a Comet async thread can - * signal for this Nio processor to be closed and recycled instead - * of waiting for a timeout. - * Closed by HttpServletRequest.getAsyncContext().complete() - */ - protected boolean asyncClose; /** * Content delimitator for the request (if false, the connection will @@ -1135,7 +1128,6 @@ comet = false; cometClose = true; async = false; - asyncClose = false; SelectionKey key = socket.getIOChannel().keyFor(socket.getPoller().getSelector()); if ( key != null ) { NioEndpoint.KeyAttachment attach = (NioEndpoint.KeyAttachment) key.attachment(); @@ -1316,7 +1308,6 @@ } else if (actionCode == ActionCode.ACTION_ASYNC_COMPLETE) { //TODO SERVLET3 - async AtomicBoolean dispatch = (AtomicBoolean)param; - asyncClose = true; RequestInfo rp = request.getRequestProcessor(); if ( rp.getStage() != org.apache.coyote.Constants.STAGE_SERVICE ) { //async handling dispatch.set(true); Added: tomcat/trunk/webapps/examples/WEB-INF/classes/async/Async2.java URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/examples/WEB-INF/classes/async/Async2.java?rev=801693&view=auto ============================================================================== --- tomcat/trunk/webapps/examples/WEB-INF/classes/async/Async2.java (added) +++ tomcat/trunk/webapps/examples/WEB-INF/classes/async/Async2.java Thu Aug 6 16:10:34 2009 @@ -0,0 +1,62 @@ +/* +* 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 Async2 extends HttpServlet { + protected static Log log = LogFactory.getLog(Async2.class); + public Async2() { + } + + @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 { + Thread.currentThread().setName("Async2-Thread"); + log.info("Putting AsyncThread to sleep"); + Thread.sleep(10*1000); + log.info("Writing data."); + actx.getResponse().getWriter().write("Output from background thread. Time:"+System.currentTimeMillis()+"\n"); + actx.complete(); + }catch (InterruptedException x) { + log.error("Async2",x); + }catch (IllegalStateException x) { + log.error("Async2",x); + }catch (IOException x) { + log.error("Async2",x); + } + } + }; + Thread t = new Thread(run); + t.start(); + } + + +} Propchange: tomcat/trunk/webapps/examples/WEB-INF/classes/async/Async2.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: tomcat/trunk/webapps/examples/WEB-INF/web.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/examples/WEB-INF/web.xml?rev=801693&r1=801692&r2=801693&view=diff ============================================================================== --- tomcat/trunk/webapps/examples/WEB-INF/web.xml (original) +++ tomcat/trunk/webapps/examples/WEB-INF/web.xml Thu Aug 6 16:10:34 2009 @@ -312,4 +312,12 @@ <servlet-name>async1</servlet-name> <url-pattern>/async/async1</url-pattern> </servlet-mapping> + <servlet> + <servlet-name>async2</servlet-name> + <servlet-class>async.Async2</servlet-class> + </servlet> + <servlet-mapping> + <servlet-name>async2</servlet-name> + <url-pattern>/async/async2</url-pattern> + </servlet-mapping> </web-app> Modified: tomcat/trunk/webapps/examples/jsp/async/index.jsp URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/examples/jsp/async/index.jsp?rev=801693&r1=801692&r2=801693&view=diff ============================================================================== --- tomcat/trunk/webapps/examples/jsp/async/index.jsp (original) +++ tomcat/trunk/webapps/examples/jsp/async/index.jsp Thu Aug 6 16:10:34 2009 @@ -13,6 +13,12 @@ - background thread calls dispatch(/path/to/jsp) <a href="<%=response.encodeURL("/examples/async/async1")%>"> Async 1 </a> +3. Simple dispatch + - servlet does startAsync() + - background thread calls writes and calls complete() + <a href="<%=response.encodeURL("/examples/async/async2")%>"> Async 2 </a> + + 3. Timeout s1 - servlet does a startAsync() - servlet does a setAsyncTimeout --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org