public interface AsyncResponse
A new instance of AsyncResponse may be injected into a
resource or sub-resource method parameter using
the @Suspend annotation.
Following example demonstrates the use of the AsyncResponse for asynchronous
HTTP request processing:
@Path("/messages/next")
public class MessagingResource {
private static final BlockingQueue<AsyncResponse> suspended =
new ArrayBlockingQueue<AsyncResponse>(5);
@GET
public void readMessage(@Suspended AsyncResponse ar) throws InterruptedException {
suspended.put(ar);
}
@POST
public String postMessage(final String message) throws InterruptedException {
final AsyncResponse ar = suspended.take();
ar.resume(message); // resumes the processing of one GET request
return "Message sent";
}
}
If the asynchronous response was suspended with a positive timeout value, and has not been explicitly resumed before the timeout has expired, the processing will be resumed once the specified timeout threshold is reached, provided a positive timeout value was set on the response.
By default a timed-out asynchronous response is resumed with a WebApplicationException
that has HTTP 503 (Service unavailable)
error response status code set. This default behavior may be overridden by
setting a custom time-out handler.
| Modifier and Type | Field and Description |
|---|---|
static long |
NO_TIMEOUT
Constant specifying no suspend timeout value.
|
| Modifier and Type | Method and Description |
|---|---|
boolean |
cancel()
Cancel the suspended request processing.
|
boolean |
cancel(Date retryAfter)
Cancel the suspended request processing.
|
boolean |
cancel(int retryAfter)
Cancel the suspended request processing.
|
boolean |
isCancelled()
Check if the asynchronous response instance has been cancelled.
|
boolean |
isDone()
Check if the processing of a request this asynchronous response instance belongs to
has finished.
|
boolean |
isSuspended()
Check if the asynchronous response instance is in a suspended state.
|
boolean |
register(Class<?> callback)
Register an asynchronous processing lifecycle callback class to receive lifecycle
events for the asynchronous response based on the implemented callback interfaces.
|
boolean[] |
register(Class<?> callback,
Class<?>... callbacks)
Register asynchronous processing lifecycle callback classes to receive lifecycle
events for the asynchronous response based on the implemented callback interfaces.
|
boolean |
register(Object callback)
Register an asynchronous processing lifecycle callback instance to receive lifecycle
events for the asynchronous response based on the implemented callback interfaces.
|
boolean[] |
register(Object callback,
Object... callbacks)
Register an asynchronous processing lifecycle callback instances to receive lifecycle
events for the asynchronous response based on the implemented callback interfaces.
|
boolean |
resume(Object response)
Resume the suspended request processing using the provided response data.
|
boolean |
resume(Throwable response)
Resume the suspended request processing using the provided throwable.
|
void |
setTimeout(long time,
TimeUnit unit)
Set/update the suspend timeout.
|
void |
setTimeoutHandler(TimeoutHandler handler)
Set/replace a time-out handler for the suspended asynchronous response.
|
static final long NO_TIMEOUT
boolean resume(Object response)
The provided response data can be of any Java type that can be
returned from a JAX-RS resource method.
The processing of the data by JAX-RS framework follows the same path as
it would for the response data returned synchronously by a JAX-RS resource
method.
The asynchronous response must be still in a suspended state
for this method to succeed.
response - data to be sent back in response to the suspended request.true if the request processing has been resumed, returns false in case
the request processing is not suspended and could not be resumed.resume(Throwable)boolean resume(Throwable response)
For the provided throwable same rules apply as for an exception thrown
by a JAX-RS resource method.
The processing of the throwable by JAX-RS framework follows the same path
as it would for any exception thrown by a JAX-RS resource method.
The asynchronous response must be still in a suspended state
for this method to succeed.
response - an exception to be raised in response to the suspended
request.true if the response has been resumed, returns false in case
the response is not suspended and could not be resumed.resume(Object)boolean cancel()
When a request processing is cancelled using this method, the JAX-RS implementation
MUST indicate to the client that the request processing has been cancelled by sending
back a HTTP 503 (Service unavailable)
error response.
Invoking a cancel(...) method multiple times to cancel request processing has the same
effect as canceling the request processing only once. Invoking a cancel(...) method on
an asynchronous response instance that has already been resumed has no effect and the method
call is ignored while returning true.
true if the request processing has been cancelled, returns false in case
the request processing is not suspended and could not be cancelled
and is not cancelled already.cancel(int),
cancel(java.util.Date)boolean cancel(int retryAfter)
When a request processing is cancelled using this method, the JAX-RS implementation
MUST indicate to the client that the request processing has been cancelled by sending
back a HTTP 503 (Service unavailable)
error response with a Retry-After header set to the value provided by the method
parameter.
Invoking a cancel(...) method multiple times to cancel request processing has the same
effect as canceling the request processing only once. Invoking a cancel(...) method on
an asynchronous response instance that has already been resumed has no effect and the method
call is ignored while returning true.
retryAfter - a decimal integer number of seconds after the response is sent to the client that
indicates how long the service is expected to be unavailable to the requesting
client.true if the request processing has been cancelled, returns false in case
the request processing is not suspended and could not be cancelled
and is not cancelled already.cancel(),
cancel(java.util.Date)boolean cancel(Date retryAfter)
When a request processing is cancelled using this method, the JAX-RS implementation
MUST indicate to the client that the request processing has been cancelled by sending
back a HTTP 503 (Service unavailable)
error response with a Retry-After header set to the value provided by the method
parameter.
Invoking a cancel(...) method multiple times to cancel request processing has the same
effect as canceling the request processing only once. Invoking a cancel(...) method on
an asynchronous response instance that has already been resumed has no effect and the method
call is ignored while returning true.
retryAfter - a date that indicates how long the service is expected to be unavailable to the
requesting client.true if the request processing has been cancelled, returns false in case
the request processing is not suspended and could not be cancelled
and is not cancelled already.cancel(),
cancel(int)boolean isSuspended()
true if this asynchronous response is still suspended and has
not finished processing yet (either by resuming or canceling the response).true if this asynchronous response is in a suspend state, false
otherwise.isCancelled(),
isDone()boolean isCancelled()
true if this asynchronous response has been canceled before
completion.true if this task was canceled before completion.isSuspended(),
isDone()boolean isDone()
true if the processing of a request this asynchronous response
is bound to is finished.
The request processing may be finished due to a normal termination, a suspend timeout, or
cancellation -- in all of these cases, this method will return true.
true if this execution context has finished processing.isSuspended(),
isCancelled()void setTimeout(long time,
TimeUnit unit)
throws IllegalStateException
The new suspend timeout values override any timeout value previously specified.
The asynchronous response must be still in a suspended state
for this method to succeed.
time - suspend timeout value in the give time unit. Value lower
or equal to 0 causes the context to suspend indefinitely.unit - suspend timeout value time unit.IllegalStateException - in case the response is not suspended.void setTimeoutHandler(TimeoutHandler handler)
The time-out handler will be invoked when the suspend period of this asynchronous response times out. The job of the time-out handler is to resolve the time-out situation by either
Note that in case the response is suspended indefinitely,
the time-out handler may never be invoked.
handler - response time-out handler.boolean register(Class<?> callback) throws NullPointerException
callback - callback class.true if the callback class was recognized and registered, false
otherwise.NullPointerException - in case the callback class is null.boolean[] register(Class<?> callback, Class<?>... callbacks) throws NullPointerException
callback - callback class.callbacks - additional callback classes.boolean array of the size equal to the number of registered callback classes.
Each value in the array indicate whether the particular callback class was registered
successfully or not.NullPointerException - in case any of the callback classes is null.boolean register(Object callback) throws NullPointerException
callback - callback instance implementing one or more of the recognized callback
interfaces.true if the callback class was recognized and registered, false
otherwise.NullPointerException - in case the callback instance is null.boolean[] register(Object callback, Object... callbacks) throws NullPointerException
callback - callback instance.callbacks - additional callback instances.boolean array of the size equal to the number of registered callbacks.
Each value in the array indicate whether the particular callback was registered
successfully or not.NullPointerException - in case any of the callback instances is null.Copyright © 2013. All Rights Reserved.