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