public interface AsyncResponse
A new instance of AsyncResponse
may be injected into a resource or sub-resource
method
parameter using the @Suspended
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(java.util.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.
|
java.util.Collection<java.lang.Class<?>> |
register(java.lang.Class<?> callback)
Register an asynchronous processing lifecycle callback class to receive lifecycle events for the asynchronous
response based on the implemented callback interfaces.
|
java.util.Map<java.lang.Class<?>,java.util.Collection<java.lang.Class<?>>> |
register(java.lang.Class<?> callback,
java.lang.Class<?>... callbacks)
Register asynchronous processing lifecycle callback classes to receive lifecycle events for the asynchronous response
based on the implemented callback interfaces.
|
java.util.Collection<java.lang.Class<?>> |
register(java.lang.Object callback)
Register an asynchronous processing lifecycle callback instance to receive lifecycle events for the asynchronous
response based on the implemented callback interfaces.
|
java.util.Map<java.lang.Class<?>,java.util.Collection<java.lang.Class<?>>> |
register(java.lang.Object callback,
java.lang.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(java.lang.Object response)
Resume the suspended request processing using the provided response data.
|
boolean |
resume(java.lang.Throwable response)
Resume the suspended request processing using the provided throwable.
|
boolean |
setTimeout(long time,
java.util.concurrent.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(java.lang.Object response)
JAX-RS
resource method
.
The asynchronous response must be still in a suspended
state for this method to succeed.
By executing this method, the request is guaranteed to complete either successfully or with an error. The data processing by the JAX-RS runtime follows the same path as it would for the response data returned synchronously by a JAX-RS resource, except that unmapped exceptions are not re-thrown by JAX-RS runtime to be handled by a hosting I/O container. Instead, any unmapped exceptions are propagated to the hosting I/O container via a container-specific callback mechanism. Depending on the container implementation, propagated unmapped exceptions typically result in an error status being sent to the client and/or the connection being closed.
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(java.lang.Throwable response)
JAX-RS
resource method
.
By executing this method, the request is guaranteed to complete either successfully or with an error. The throwable processing by the JAX-RS runtime follows the same path as it would for the response data returned synchronously by a JAX-RS resource, except that unmapped exceptions are not re-thrown by JAX-RS runtime to be handled by a hosting I/O container. Instead, any unmapped exceptions are propagated to the hosting I/O container via a container-specific callback mechanism. Depending on the container implementation, propagated unmapped exceptions typically result in an error status being sent to the client and/or the connection being closed.
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 cancelled or resumed has no effect and the method call is ignored while returning true
, in case
the request has been cancelled previously. Otherwise, in case the request has been resumed regularly (using a
resume(...) method
) or resumed due to a time-out, method returns false
.
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 cancelled or resumed has no effect and the method call is ignored while returning true
, in case
the request has been cancelled previously. Otherwise, in case the request has been resumed regularly (using a
resume(...) method
) or resumed due to a time-out, method returns false
.
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(java.util.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 cancelled or resumed has no effect and the method call is ignored while returning true
, in case
the request has been cancelled previously. Otherwise, in case the request has been resumed regularly (using a
resume(...) method
) or resumed due to a time-out, method returns false
.
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()
boolean setTimeout(long time, java.util.concurrent.TimeUnit unit)
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.true
if the suspend time out has been set, returns false
in case the request processing is
not in the suspended
state.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.java.util.Collection<java.lang.Class<?>> register(java.lang.Class<?> callback)
callback
- callback class.java.lang.NullPointerException
- in case the callback class is null
.java.util.Map<java.lang.Class<?>,java.util.Collection<java.lang.Class<?>>> register(java.lang.Class<?> callback, java.lang.Class<?>... callbacks)
callback
- callback class.callbacks
- additional callback classes.java.lang.NullPointerException
- in case any of the callback classes is null
.java.util.Collection<java.lang.Class<?>> register(java.lang.Object callback)
callback
- callback instance implementing one or more of the recognized callback interfaces.java.lang.NullPointerException
- in case the callback instance is null
.java.util.Map<java.lang.Class<?>,java.util.Collection<java.lang.Class<?>>> register(java.lang.Object callback, java.lang.Object... callbacks)
callback
- callback instance.callbacks
- additional callback instances.java.lang.NullPointerException
- in case any of the callback instances is null
.