renamed AsyncRequest to AsyncContinuation

git-svn-id: svn+ssh://dev.eclipse.org/svnroot/rt/org.eclipse.jetty/jetty/trunk@308 7e9141cc-0065-0410-87d8-b60c137991c4
This commit is contained in:
Greg Wilkins 2009-05-28 01:30:36 +00:00
parent fc726f598c
commit 0ef6db092a
10 changed files with 172 additions and 24 deletions

View File

@ -91,19 +91,19 @@ public class ContinuationFilter implements Filter
}
else if (_partial)
{
PartialContinuation c = (PartialContinuation) request.getAttribute(Continuation.ATTRIBUTE);
Continuation c = (Continuation) request.getAttribute(Continuation.ATTRIBUTE);
try
{
if (c==null || c.enter())
if (c==null || !(c instanceof PartialContinuation) || ((PartialContinuation)c).enter())
chain.doFilter(request,response);
}
finally
{
if (c==null)
c = (PartialContinuation) request.getAttribute(Continuation.ATTRIBUTE);
if (c!=null)
c.exit();
c = (Continuation) request.getAttribute(Continuation.ATTRIBUTE);
if (c!=null && c instanceof PartialContinuation)
((PartialContinuation)c).exit();
}
}
else

View File

@ -28,10 +28,10 @@ import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.thread.Timeout;
/* ------------------------------------------------------------ */
/** Asyncrhonous Request.
/** Implementation of Continuation and AsyncContext interfaces.
*
*/
public class AsyncRequest implements AsyncContext, Continuation
public class AsyncContinuation implements AsyncContext, Continuation
{
// STATES:
private static final int __IDLE=0; // Idle request
@ -73,7 +73,7 @@ public class AsyncRequest implements AsyncContext, Continuation
// private StringBuilder _history = new StringBuilder();
/* ------------------------------------------------------------ */
protected AsyncRequest()
protected AsyncContinuation()
{
_state=__IDLE;
_initial=true;
@ -829,7 +829,7 @@ public class AsyncRequest implements AsyncContext, Continuation
public void suspend()
{
// TODO simplify?
AsyncRequest.this.suspend(_connection.getRequest().getServletContext(),_connection.getRequest(),_connection.getResponse());
AsyncContinuation.this.suspend(_connection.getRequest().getServletContext(),_connection.getRequest(),_connection.getResponse());
}
/* ------------------------------------------------------------ */
@ -865,7 +865,7 @@ public class AsyncRequest implements AsyncContext, Continuation
{
public void expired()
{
AsyncRequest.this.expired();
AsyncContinuation.this.expired();
}
};

View File

@ -114,7 +114,7 @@ public class Request implements HttpServletRequest
return HttpConnection.getCurrentConnection().getRequest();
}
protected final AsyncRequest _async = new AsyncRequest();
protected final AsyncContinuation _async = new AsyncContinuation();
private boolean _asyncSupported=true;
private Attributes _attributes;
private Authentication _authentication;
@ -299,7 +299,7 @@ public class Request implements HttpServletRequest
}
/* ------------------------------------------------------------ */
public AsyncRequest getAsyncRequest()
public AsyncContinuation getAsyncRequest()
{
return _async;
}

View File

@ -338,8 +338,8 @@ public class Server extends HandlerWrapper implements Attributes
*/
public void handleAsync(HttpConnection connection) throws IOException, ServletException
{
final AsyncRequest async = connection.getRequest().getAsyncRequest();
final AsyncRequest.AsyncEventState state = async.getAsyncEventState();
final AsyncContinuation async = connection.getRequest().getAsyncRequest();
final AsyncContinuation.AsyncEventState state = async.getAsyncEventState();
final Request baseRequest=connection.getRequest();
final String path=state.getPath();

View File

@ -22,7 +22,7 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.http.PathMap;
import org.eclipse.jetty.server.AsyncRequest;
import org.eclipse.jetty.server.AsyncContinuation;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.HandlerContainer;
import org.eclipse.jetty.server.HttpConnection;
@ -172,7 +172,7 @@ public class ContextHandlerCollection extends HandlerCollection
if (handlers==null || handlers.length==0)
return;
AsyncRequest async = baseRequest.getAsyncRequest();
AsyncContinuation async = baseRequest.getAsyncRequest();
if (async.isAsync())
{
ContextHandler context=async.getContextHandler();

View File

@ -19,7 +19,7 @@ import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.server.AsyncRequest;
import org.eclipse.jetty.server.AsyncContinuation;
import org.eclipse.jetty.server.HttpConnection;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Response;
@ -90,7 +90,7 @@ public class StatisticsHandler extends HandlerWrapper implements CompleteHandler
{
synchronized(this)
{
AsyncRequest asyncContextState=baseRequest.getAsyncRequest();
AsyncContinuation asyncContextState=baseRequest.getAsyncRequest();
if(asyncContextState==null)
{

View File

@ -238,7 +238,7 @@ public class AsyncStressTest extends TestCase
System.err.println(uri+"=="+br.getUri());
System.err.println(asyncContext+"=="+br.getAsyncRequest());
System.err.println(((AsyncRequest)asyncContext).getHistory());
System.err.println(((AsyncContinuation)asyncContext).getHistory());
Log.warn(e);
System.exit(1);
}

View File

@ -139,6 +139,7 @@
<module>jetty-plus</module>
<module>jetty-rewrite</module>
<module>jetty-start</module>
<module>test-continuation</module>
<module>test-jetty-servlet</module>
<module>test-jetty-webapp</module>
<module>jetty-aggregate</module>

View File

@ -53,7 +53,7 @@ public abstract class ContinuationBase extends TestCase
assertContains("history: onTimeout",response);
assertContains("history: onComplete",response);
response=process("suspend=200&resume=100",null);
response=process("suspend=200&resume=10",null);
assertContains("RESUMED",response);
assertNotContains("history: onTimeout",response);
assertContains("history: onComplete",response);
@ -63,7 +63,7 @@ public abstract class ContinuationBase extends TestCase
assertNotContains("history: onTimeout",response);
assertContains("history: onComplete",response);
response=process("suspend=200&complete=100",null);
response=process("suspend=200&complete=10",null);
assertContains("COMPLETED",response);
assertNotContains("history: onTimeout",response);
assertContains("history: onComplete",response);
@ -72,8 +72,82 @@ public abstract class ContinuationBase extends TestCase
assertContains("COMPLETED",response);
assertNotContains("history: onTimeout",response);
assertContains("history: onComplete",response);
response=process("suspend=1000&resume=10&suspend2=1000&resume2=10",null);
assertEquals(2,count(response,"history: suspend"));
assertEquals(2,count(response,"history: resume"));
assertEquals(0,count(response,"history: onTimeout"));
assertEquals(1,count(response,"history: onComplete"));
assertContains("RESUMED",response);
response=process("suspend=1000&resume=10&suspend2=1000&resume2=10",null);
assertEquals(2,count(response,"history: suspend"));
assertEquals(2,count(response,"history: resume"));
assertEquals(0,count(response,"history: onTimeout"));
assertEquals(1,count(response,"history: onComplete"));
assertContains("RESUMED",response);
response=process("suspend=1000&resume=10&suspend2=1000&complete2=10",null);
assertEquals(2,count(response,"history: suspend"));
assertEquals(1,count(response,"history: resume"));
assertEquals(0,count(response,"history: onTimeout"));
assertEquals(1,count(response,"history: onComplete"));
assertContains("COMPLETED",response);
response=process("suspend=1000&resume=10&suspend2=10",null);
assertEquals(2,count(response,"history: suspend"));
assertEquals(1,count(response,"history: resume"));
assertEquals(1,count(response,"history: onTimeout"));
assertEquals(1,count(response,"history: onComplete"));
assertContains("TIMEOUT",response);
response=process("suspend=10&suspend2=1000&resume2=10",null);
assertEquals(2,count(response,"history: suspend"));
assertEquals(1,count(response,"history: resume"));
assertEquals(1,count(response,"history: onTimeout"));
assertEquals(1,count(response,"history: onComplete"));
assertContains("RESUMED",response);
response=process("suspend=10&suspend2=1000&resume2=10",null);
assertEquals(2,count(response,"history: suspend"));
assertEquals(1,count(response,"history: resume"));
assertEquals(1,count(response,"history: onTimeout"));
assertEquals(1,count(response,"history: onComplete"));
assertContains("RESUMED",response);
response=process("suspend=10&suspend2=1000&complete2=10",null);
assertEquals(2,count(response,"history: suspend"));
assertEquals(0,count(response,"history: resume"));
assertEquals(1,count(response,"history: onTimeout"));
assertEquals(1,count(response,"history: onComplete"));
assertContains("COMPLETED",response);
response=process("suspend=10&suspend2=10",null);
assertEquals(2,count(response,"history: suspend"));
assertEquals(0,count(response,"history: resume"));
assertEquals(2,count(response,"history: onTimeout"));
assertEquals(1,count(response,"history: onComplete"));
assertContains("TIMEOUT",response);
}
private int count(String responses,String substring)
{
int count=0;
int i=responses.indexOf(substring);
while (i>=0)
{
count++;
i=responses.indexOf(substring,i+substring.length());
}
return count;
}
protected void assertContains(String content,String response)
{
assertEquals("HTTP/1.1 200 OK",response.substring(0,15));
@ -135,8 +209,11 @@ public abstract class ContinuationBase extends TestCase
int read_before=0;
long sleep_for=-1;
long suspend_for=-1;
long suspend2_for=-1;
long resume_after=-1;
long resume2_after=-1;
long complete_after=-1;
long complete2_after=-1;
if (request.getParameter("read")!=null)
read_before=Integer.parseInt(request.getParameter("read"));
@ -144,10 +221,16 @@ public abstract class ContinuationBase extends TestCase
sleep_for=Integer.parseInt(request.getParameter("sleep"));
if (request.getParameter("suspend")!=null)
suspend_for=Integer.parseInt(request.getParameter("suspend"));
if (request.getParameter("suspend2")!=null)
suspend2_for=Integer.parseInt(request.getParameter("suspend2"));
if (request.getParameter("resume")!=null)
resume_after=Integer.parseInt(request.getParameter("resume"));
if (request.getParameter("resume2")!=null)
resume2_after=Integer.parseInt(request.getParameter("resume2"));
if (request.getParameter("complete")!=null)
complete_after=Integer.parseInt(request.getParameter("complete"));
if (request.getParameter("complete2")!=null)
complete2_after=Integer.parseInt(request.getParameter("complete2"));
if (continuation.isInitial())
{
@ -169,6 +252,7 @@ public abstract class ContinuationBase extends TestCase
if (suspend_for>0)
continuation.setTimeout(suspend_for);
continuation.addContinuationListener(__listener);
((HttpServletResponse)continuation.getServletResponse()).addHeader("history","suspend");
continuation.suspend();
if (complete_after>0)
@ -206,6 +290,7 @@ public abstract class ContinuationBase extends TestCase
{
public void run()
{
((HttpServletResponse)continuation.getServletResponse()).addHeader("history","resume");
continuation.resume();
}
};
@ -216,6 +301,7 @@ public abstract class ContinuationBase extends TestCase
}
else if (resume_after==0)
{
((HttpServletResponse)continuation.getServletResponse()).addHeader("history","resume");
continuation.resume();
}
}
@ -238,6 +324,67 @@ public abstract class ContinuationBase extends TestCase
response.getOutputStream().println("NORMAL\n");
}
}
else if (suspend2_for>=0 && request.getAttribute("2nd")==null)
{
request.setAttribute("2nd","cycle");
if (suspend2_for>0)
continuation.setTimeout(suspend2_for);
// continuation.addContinuationListener(__listener);
((HttpServletResponse)continuation.getServletResponse()).addHeader("history","suspend");
continuation.suspend();
if (complete2_after>0)
{
TimerTask complete = new TimerTask()
{
public void run()
{
try
{
response.setStatus(200);
response.getOutputStream().println("COMPLETED\n");
continuation.complete();
}
catch(Exception e)
{
e.printStackTrace();
}
}
};
synchronized (_timer)
{
_timer.schedule(complete,complete2_after);
}
}
else if (complete2_after==0)
{
response.setStatus(200);
response.getOutputStream().println("COMPLETED\n");
continuation.complete();
}
else if (resume2_after>0)
{
TimerTask resume = new TimerTask()
{
public void run()
{
((HttpServletResponse)continuation.getServletResponse()).addHeader("history","resume");
continuation.resume();
}
};
synchronized (_timer)
{
_timer.schedule(resume,resume2_after);
}
}
else if (resume2_after==0)
{
((HttpServletResponse)continuation.getServletResponse()).addHeader("history","resume");
continuation.resume();
}
return;
}
else if (continuation.isExpired())
{
response.setStatus(200);

View File

@ -59,7 +59,7 @@ public class ContinuationTest extends ContinuationBase
_server.start();
_port=_connector.getLocalPort();
doit("AsyncRequest");
doit("AsyncContinuation");
}
public void testNotJetty6() throws Exception
@ -70,7 +70,7 @@ public class ContinuationTest extends ContinuationBase
_server.start();
_port=_connector.getLocalPort();
doit("AsyncRequest");
doit("AsyncContinuation");
}
public void testNoFilter() throws Exception
@ -78,7 +78,7 @@ public class ContinuationTest extends ContinuationBase
_server.start();
_port=_connector.getLocalPort();
doit("AsyncRequest");
doit("AsyncContinuation");
}
protected String toString(InputStream in) throws IOException