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) else if (_partial)
{ {
PartialContinuation c = (PartialContinuation) request.getAttribute(Continuation.ATTRIBUTE); Continuation c = (Continuation) request.getAttribute(Continuation.ATTRIBUTE);
try try
{ {
if (c==null || c.enter()) if (c==null || !(c instanceof PartialContinuation) || ((PartialContinuation)c).enter())
chain.doFilter(request,response); chain.doFilter(request,response);
} }
finally finally
{ {
if (c==null) if (c==null)
c = (PartialContinuation) request.getAttribute(Continuation.ATTRIBUTE); c = (Continuation) request.getAttribute(Continuation.ATTRIBUTE);
if (c!=null) if (c!=null && c instanceof PartialContinuation)
c.exit(); ((PartialContinuation)c).exit();
} }
} }
else else

View File

@ -28,10 +28,10 @@ import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.thread.Timeout; 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: // STATES:
private static final int __IDLE=0; // Idle request private static final int __IDLE=0; // Idle request
@ -73,7 +73,7 @@ public class AsyncRequest implements AsyncContext, Continuation
// private StringBuilder _history = new StringBuilder(); // private StringBuilder _history = new StringBuilder();
/* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */
protected AsyncRequest() protected AsyncContinuation()
{ {
_state=__IDLE; _state=__IDLE;
_initial=true; _initial=true;
@ -829,7 +829,7 @@ public class AsyncRequest implements AsyncContext, Continuation
public void suspend() public void suspend()
{ {
// TODO simplify? // 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() public void expired()
{ {
AsyncRequest.this.expired(); AsyncContinuation.this.expired();
} }
}; };

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -53,7 +53,7 @@ public abstract class ContinuationBase extends TestCase
assertContains("history: onTimeout",response); assertContains("history: onTimeout",response);
assertContains("history: onComplete",response); assertContains("history: onComplete",response);
response=process("suspend=200&resume=100",null); response=process("suspend=200&resume=10",null);
assertContains("RESUMED",response); assertContains("RESUMED",response);
assertNotContains("history: onTimeout",response); assertNotContains("history: onTimeout",response);
assertContains("history: onComplete",response); assertContains("history: onComplete",response);
@ -63,7 +63,7 @@ public abstract class ContinuationBase extends TestCase
assertNotContains("history: onTimeout",response); assertNotContains("history: onTimeout",response);
assertContains("history: onComplete",response); assertContains("history: onComplete",response);
response=process("suspend=200&complete=100",null); response=process("suspend=200&complete=10",null);
assertContains("COMPLETED",response); assertContains("COMPLETED",response);
assertNotContains("history: onTimeout",response); assertNotContains("history: onTimeout",response);
assertContains("history: onComplete",response); assertContains("history: onComplete",response);
@ -72,8 +72,82 @@ public abstract class ContinuationBase extends TestCase
assertContains("COMPLETED",response); assertContains("COMPLETED",response);
assertNotContains("history: onTimeout",response); assertNotContains("history: onTimeout",response);
assertContains("history: onComplete",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) protected void assertContains(String content,String response)
{ {
assertEquals("HTTP/1.1 200 OK",response.substring(0,15)); assertEquals("HTTP/1.1 200 OK",response.substring(0,15));
@ -135,8 +209,11 @@ public abstract class ContinuationBase extends TestCase
int read_before=0; int read_before=0;
long sleep_for=-1; long sleep_for=-1;
long suspend_for=-1; long suspend_for=-1;
long suspend2_for=-1;
long resume_after=-1; long resume_after=-1;
long resume2_after=-1;
long complete_after=-1; long complete_after=-1;
long complete2_after=-1;
if (request.getParameter("read")!=null) if (request.getParameter("read")!=null)
read_before=Integer.parseInt(request.getParameter("read")); read_before=Integer.parseInt(request.getParameter("read"));
@ -144,10 +221,16 @@ public abstract class ContinuationBase extends TestCase
sleep_for=Integer.parseInt(request.getParameter("sleep")); sleep_for=Integer.parseInt(request.getParameter("sleep"));
if (request.getParameter("suspend")!=null) if (request.getParameter("suspend")!=null)
suspend_for=Integer.parseInt(request.getParameter("suspend")); suspend_for=Integer.parseInt(request.getParameter("suspend"));
if (request.getParameter("suspend2")!=null)
suspend2_for=Integer.parseInt(request.getParameter("suspend2"));
if (request.getParameter("resume")!=null) if (request.getParameter("resume")!=null)
resume_after=Integer.parseInt(request.getParameter("resume")); resume_after=Integer.parseInt(request.getParameter("resume"));
if (request.getParameter("resume2")!=null)
resume2_after=Integer.parseInt(request.getParameter("resume2"));
if (request.getParameter("complete")!=null) if (request.getParameter("complete")!=null)
complete_after=Integer.parseInt(request.getParameter("complete")); complete_after=Integer.parseInt(request.getParameter("complete"));
if (request.getParameter("complete2")!=null)
complete2_after=Integer.parseInt(request.getParameter("complete2"));
if (continuation.isInitial()) if (continuation.isInitial())
{ {
@ -169,6 +252,7 @@ public abstract class ContinuationBase extends TestCase
if (suspend_for>0) if (suspend_for>0)
continuation.setTimeout(suspend_for); continuation.setTimeout(suspend_for);
continuation.addContinuationListener(__listener); continuation.addContinuationListener(__listener);
((HttpServletResponse)continuation.getServletResponse()).addHeader("history","suspend");
continuation.suspend(); continuation.suspend();
if (complete_after>0) if (complete_after>0)
@ -206,6 +290,7 @@ public abstract class ContinuationBase extends TestCase
{ {
public void run() public void run()
{ {
((HttpServletResponse)continuation.getServletResponse()).addHeader("history","resume");
continuation.resume(); continuation.resume();
} }
}; };
@ -216,6 +301,7 @@ public abstract class ContinuationBase extends TestCase
} }
else if (resume_after==0) else if (resume_after==0)
{ {
((HttpServletResponse)continuation.getServletResponse()).addHeader("history","resume");
continuation.resume(); continuation.resume();
} }
} }
@ -238,6 +324,67 @@ public abstract class ContinuationBase extends TestCase
response.getOutputStream().println("NORMAL\n"); 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()) else if (continuation.isExpired())
{ {
response.setStatus(200); response.setStatus(200);

View File

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