You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2010/11/22 15:35:52 UTC
svn commit: r1037735 - in /tomcat/trunk:
java/org/apache/coyote/AsyncStateMachine.java
test/org/apache/catalina/core/TestAsyncContextImpl.java
webapps/docs/changelog.xml
Author: markt
Date: Mon Nov 22 14:35:51 2010
New Revision: 1037735
URL: http://svn.apache.org/viewvc?rev=1037735&view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=50308
Allow asynchronous request processing to call AsyncContext.dispatch() once the asynchronous request has timed out.
Modified:
tomcat/trunk/java/org/apache/coyote/AsyncStateMachine.java
tomcat/trunk/test/org/apache/catalina/core/TestAsyncContextImpl.java
tomcat/trunk/webapps/docs/changelog.xml
Modified: tomcat/trunk/java/org/apache/coyote/AsyncStateMachine.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/AsyncStateMachine.java?rev=1037735&r1=1037734&r2=1037735&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/AsyncStateMachine.java (original)
+++ tomcat/trunk/java/org/apache/coyote/AsyncStateMachine.java Mon Nov 22 14:35:51 2010
@@ -213,7 +213,8 @@ public class AsyncStateMachine {
boolean doDispatch = false;
if (state == AsyncState.STARTING) {
state = AsyncState.MUST_DISPATCH;
- } else if (state == AsyncState.STARTED) {
+ } else if (state == AsyncState.STARTED ||
+ state == AsyncState.TIMING_OUT) {
state = AsyncState.DISPATCHING;
doDispatch = true;
} else {
Modified: tomcat/trunk/test/org/apache/catalina/core/TestAsyncContextImpl.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/core/TestAsyncContextImpl.java?rev=1037735&r1=1037734&r2=1037735&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/core/TestAsyncContextImpl.java (original)
+++ tomcat/trunk/test/org/apache/catalina/core/TestAsyncContextImpl.java Mon Nov 22 14:35:51 2010
@@ -314,14 +314,20 @@ public class TestAsyncContextImpl extend
}
public void testTimeoutListenerComplete() throws Exception {
- doTestTimeout(true);
+ doTestTimeout(true, null);
}
public void testTimeoutListenerNoComplete() throws Exception {
- doTestTimeout(false);
+ doTestTimeout(false, null);
+ }
+
+ public void testTimeoutListenerDispatch() throws Exception {
+ doTestTimeout(true, "/nonasync");
}
- private void doTestTimeout(boolean completeOnTimeout) throws Exception {
+
+ private void doTestTimeout(boolean completeOnTimeout, String dispatchUrl)
+ throws Exception {
// Setup Tomcat instance
Tomcat tomcat = getTomcatInstance();
@@ -336,12 +342,19 @@ public class TestAsyncContextImpl extend
Context ctx = tomcat.addContext("", docBase.getAbsolutePath());
- TimeoutServlet timeout = new TimeoutServlet(completeOnTimeout);
+ TimeoutServlet timeout =
+ new TimeoutServlet(completeOnTimeout, dispatchUrl);
Wrapper wrapper = Tomcat.addServlet(ctx, "time", timeout);
wrapper.setAsyncSupported(true);
ctx.addServletMapping("/async", "time");
+ if (dispatchUrl != null) {
+ NonAsyncServlet nonAsync = new NonAsyncServlet();
+ Tomcat.addServlet(ctx, "nonasync", nonAsync);
+ ctx.addServletMapping(dispatchUrl, "nonasync");
+ }
+
tomcat.start();
ByteChunk res = getUrl("http://localhost:" + getPort() + "/async");
StringBuilder expected = new StringBuilder();
@@ -349,7 +362,11 @@ public class TestAsyncContextImpl extend
if (!completeOnTimeout) {
expected.append("onError-");
}
- expected.append("onComplete-");
+ if (dispatchUrl == null) {
+ expected.append("onComplete-");
+ } else {
+ expected.append("NonAsyncServletGet-");
+ }
assertEquals(expected.toString(), res.toString());
}
@@ -357,9 +374,11 @@ public class TestAsyncContextImpl extend
private static final long serialVersionUID = 1L;
private boolean completeOnTimeout;
-
- public TimeoutServlet(boolean completeOnTimeout) {
+ private String dispatchUrl;
+
+ public TimeoutServlet(boolean completeOnTimeout, String dispatchUrl) {
this.completeOnTimeout = completeOnTimeout;
+ this.dispatchUrl = dispatchUrl;
}
@Override
@@ -370,7 +389,8 @@ public class TestAsyncContextImpl extend
final AsyncContext ac = req.startAsync();
ac.setTimeout(3000);
- ac.addListener(new TrackingListener(false, completeOnTimeout));
+ ac.addListener(new TrackingListener(
+ false, completeOnTimeout, dispatchUrl));
} else
resp.getWriter().print("FAIL: Async unsupported");
}
@@ -463,7 +483,7 @@ public class TestAsyncContextImpl extend
final AsyncContext ctxt = req.startAsync();
if (addTrackingListener) {
TrackingListener listener =
- new TrackingListener(completeOnError, true);
+ new TrackingListener(completeOnError, true, null);
ctxt.addListener(listener);
}
Runnable run = new Runnable() {
@@ -510,7 +530,7 @@ public class TestAsyncContextImpl extend
wrapper.setAsyncSupported(true);
ctx.addServletMapping("/stage1", "tracking");
- TimeoutServlet timeout = new TimeoutServlet(true);
+ TimeoutServlet timeout = new TimeoutServlet(true, null);
Wrapper wrapper2 = Tomcat.addServlet(ctx, "timeout", timeout);
wrapper2.setAsyncSupported(true);
ctx.addServletMapping("/stage2", "timeout");
@@ -546,7 +566,7 @@ public class TestAsyncContextImpl extend
TrackingServlet.first = false;
final AsyncContext ctxt = req.startAsync();
- TrackingListener listener = new TrackingListener(false, true);
+ TrackingListener listener = new TrackingListener(false, true, null);
ctxt.addListener(listener);
ctxt.setTimeout(3000);
@@ -572,11 +592,13 @@ public class TestAsyncContextImpl extend
private boolean completeOnError;
private boolean completeOnTimeout;
+ private String dispatchUrl;
public TrackingListener(boolean completeOnError,
- boolean completeOnTimeout) {
+ boolean completeOnTimeout, String dispatchUrl) {
this.completeOnError = completeOnError;
this.completeOnTimeout = completeOnTimeout;
+ this.dispatchUrl = dispatchUrl;
}
@Override
@@ -592,7 +614,11 @@ public class TestAsyncContextImpl extend
resp.getWriter().write("onTimeout-");
resp.flushBuffer();
if (completeOnTimeout){
- event.getAsyncContext().complete();
+ if (dispatchUrl == null) {
+ event.getAsyncContext().complete();
+ } else {
+ event.getAsyncContext().dispatch(dispatchUrl);
+ }
}
}
Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1037735&r1=1037734&r2=1037735&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Mon Nov 22 14:35:51 2010
@@ -154,6 +154,11 @@
continue to use the version of the web application with which the
session is associated until the session expires. (markt)
</add>
+ <fix>
+ <bug>50308</bug>: Allow asynchronous request processing to call
+ <code>AsyncContext.dispatch()</code> once the asynchronous request has
+ timed out. (markt)
+ </fix>
</changelog>
</subsection>
<subsection name="Coyote">
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org