public class Servlet3Continuation extends Object implements Continuation, AsyncListener
ContinuationSupport
when it detects that the application has been deployed in a Servlet 3
server.ATTRIBUTE
Constructor and Description |
---|
Servlet3Continuation(ServletRequest request) |
Modifier and Type | Method and Description |
---|---|
void |
addContinuationListener(ContinuationListener listener)
Add a ContinuationListener.
|
void |
complete()
Complete a suspended request.
|
Object |
getAttribute(String name)
Get a request attribute.
|
ServletResponse |
getServletResponse()
Get the suspended response.
|
boolean |
isExpired() |
boolean |
isInitial() |
boolean |
isResponseWrapped()
Is the suspended response wrapped.
|
boolean |
isResumed() |
boolean |
isSuspended() |
void |
keepWrappers() |
void |
onComplete(AsyncEvent event) |
void |
onError(AsyncEvent event) |
void |
onStartAsync(AsyncEvent event) |
void |
onTimeout(AsyncEvent event) |
void |
removeAttribute(String name)
Remove a request attribute.
|
void |
resume()
Resume a suspended request.
|
void |
setAttribute(String name,
Object attribute)
Set a request attribute.
|
void |
setTimeout(long timeoutMs)
Set the continuation timeout.
|
void |
suspend()
Suspend the processing of the request and associated
ServletResponse . |
void |
suspend(ServletResponse response)
Suspend the processing of the request and associated
ServletResponse . |
void |
undispatch()
Undispatch the request.
|
public Servlet3Continuation(ServletRequest request)
public void addContinuationListener(ContinuationListener listener)
Continuation
addContinuationListener
in interface Continuation
public void complete()
Continuation
This method can be called by any thread that has been passed a reference to a suspended request. When a request is completed, the associated response object committed and flushed. The request is not redispatched.
If complete is called before a suspended request is returned to the
container (ie the thread that called Continuation.suspend()
is still
within the filter chain and/or servlet service method), then the complete
does not take effect until the call to the filter chain and/or servlet
returns to the container. In this case both Continuation.isSuspended()
and
Continuation.isResumed()
return true.
Typically resume() is used after a call to Continuation.suspend(ServletResponse)
with
a possibly wrapped response. The async handler should use the response
provided by Continuation.getServletResponse()
to write the response before
calling Continuation.complete()
. If the request was suspended with a
call to Continuation.suspend()
then no response object will be available via
Continuation.getServletResponse()
.
Once complete has been called and any thread calling the filter chain and/or servlet chain has returned to the container, the request lifecycle is complete. The container is able to recycle request objects, so it is not valid hold a request or continuation reference after the end of the life cycle.
complete
in interface Continuation
Continuation.suspend()
public ServletResponse getServletResponse()
Continuation
getServletResponse
in interface Continuation
ServletResponse
passed to Continuation.suspend(ServletResponse)
.public boolean isExpired()
isExpired
in interface Continuation
public boolean isInitial()
isInitial
in interface Continuation
public boolean isResumed()
isResumed
in interface Continuation
Continuation.resume()
. Returns false after any subsequent call to
suspendpublic boolean isSuspended()
isSuspended
in interface Continuation
Continuation.suspend()
has been called and before the
request has been redispatched due to being resumed, completed or
timed out.public void keepWrappers()
public void resume()
Continuation
This method can be called by any thread that has been passed a reference
to a continuation. When called the request is redispatched to the
normal filter chain and servlet processing with Continuation.isInitial()
false.
If resume is called before a suspended request is returned to the
container (ie the thread that called Continuation.suspend()
is still
within the filter chain and/or servlet service method), then the resume
does not take effect until the call to the filter chain and/or servlet
returns to the container. In this case both Continuation.isSuspended()
and
Continuation.isResumed()
return true. Multiple calls to resume are ignored.
Typically resume() is used after a call to Continuation.suspend()
with
no arguments. The dispatch after a resume call will use the original
request and response objects, even if Continuation.suspend(ServletResponse)
had been passed a wrapped response.
resume
in interface Continuation
Continuation.suspend()
public void setTimeout(long timeoutMs)
Continuation
setTimeout
in interface Continuation
timeoutMs
- The time in milliseconds to wait before expiring this
continuation after a call to Continuation.suspend()
or Continuation.suspend(ServletResponse)
.
A timeout of <=0 means the continuation will never expire.public void suspend(ServletResponse response)
Continuation
ServletResponse
.
After this method has been called, the lifecycle of the request will be
extended beyond the return to the container from the
Servlet#service(ServletRequest, ServletResponse)
method and
Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
calls. When a suspended request is returned to the container after
a dispatch, then the container will not commit the associated response
(unless an exception other than ContinuationThrowable
is thrown).
When the thread calling the filter chain and/or servlet has returned to the container with a suspended request, the thread is freed for other tasks and the request is held until either:
Continuation.resume()
.Continuation.complete()
.
Typically suspend with a response argument is uses when a call to Continuation.complete()
is expected. If a call to Continuation.resume()
is expected, then the
Continuation.suspend()
method should be used instead of this method.
Filters that may wrap the response object should check Continuation.isResponseWrapped()
to decide if they should destroy/finish the wrapper. If Continuation.isResponseWrapped()
returns true, then the wrapped request has been passed to the asynchronous
handler and the wrapper should not be destroyed/finished until after a call to
Continuation.complete()
(potentially using a ContinuationListener.onComplete(Continuation)
listener).
suspend
in interface Continuation
response
- The response to return via a call to Continuation.getServletResponse()
public void suspend()
Continuation
ServletResponse
.
After this method has been called, the lifecycle of the request will be
extended beyond the return to the container from the
Servlet#service(ServletRequest, ServletResponse)
method and
Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
calls. When a suspended request is returned to the container after
a dispatch, then the container will not commit the associated response
(unless an exception other than ContinuationThrowable
is thrown).
When the thread calling the filter chain and/or servlet has returned to the container with a suspended request, the thread is freed for other tasks and the request is held until either:
Continuation.resume()
.Continuation.complete()
.
Typically suspend with no arguments is uses when a call to Continuation.resume()
is expected. If a call to Continuation.complete()
is expected, then the
Continuation.suspend(ServletResponse)
method should be used instead of this method.
suspend
in interface Continuation
public boolean isResponseWrapped()
Continuation
Filters that wrap the response object should check this method to
determine if they should destroy/finish the wrapped response. If
the request was suspended with a call to Continuation.suspend(ServletResponse)
that passed the wrapped response, then the filter should register
a ContinuationListener
to destroy/finish the wrapped response
during a call to ContinuationListener.onComplete(Continuation)
.
isResponseWrapped
in interface Continuation
Continuation.suspend(ServletResponse)
has been passed a
ServletResponseWrapper
instance.public Object getAttribute(String name)
Continuation
ServletRequest#getAttribute(String)
method on the associated request object.
This is a thread safe call and may be called by any thread.getAttribute
in interface Continuation
name
- the attribute nameContinuation.getAttribute(java.lang.String)
public void removeAttribute(String name)
Continuation
ServletRequest#removeAttribute(String)
method on the associated request object.
This is a thread safe call and may be called by any thread.removeAttribute
in interface Continuation
name
- the attribute nameContinuation.removeAttribute(java.lang.String)
public void setAttribute(String name, Object attribute)
Continuation
ServletRequest#setAttribute(String, Object)
method on the associated request object.
This is a thread safe call and may be called by any thread.setAttribute
in interface Continuation
name
- the attribute nameattribute
- the attribute valueContinuation.setAttribute(java.lang.String, java.lang.Object)
public void undispatch()
Continuation
This method can be called on a suspended continuation in order
to exit the dispatch to the filter/servlet by throwing a ContinuationThrowable
which is caught either by the container or the ContinuationFilter
.
This is an alternative to simply returning from the dispatch in the case
where filters in the filter chain may not be prepared to handle a suspended
request.
undispatch
in interface Continuation
Continuation.undispatch()
public void onComplete(AsyncEvent event) throws IOException
onComplete
in interface AsyncListener
IOException
public void onError(AsyncEvent event) throws IOException
onError
in interface AsyncListener
IOException
public void onStartAsync(AsyncEvent event) throws IOException
onStartAsync
in interface AsyncListener
IOException
public void onTimeout(AsyncEvent event) throws IOException
onTimeout
in interface AsyncListener
IOException
Copyright © 1995-2015 Webtide. All Rights Reserved.