Asynchronous processing
You can use the asynchronous processing technique in JAX-RS 2.0 to process threads. Asynchronous processing is supported both in the Client API and Server APIs. For more information about asynchronous processing in the Client and Server APIs, see Chapter 8 of JSR 339: JAX-RS 2.0: The Java API for RESTful Web Services (the "Specification").
The following two examples show asynchronous processing in the Client and Server
APIs:
- Asynchronous processing in the Client
API:
Client client = ClientBuilder.newClient(); WebTarget target = client.target("http://example.org/customers/{id}"); target.resolveTemplate("id", 123).request().async().get( new InvocationCallbackCustomer() { @Override public void completed(Customer customer) { // Do something } @Override public void failed(Throwable throwable) { // Process error } });
- Asynchronous processing in the Server
API:
@Path("/async") public class MyResource{ @GET public void getAsync(@Suspended final AsyncResponse asyncResponse){ CompletionCallback callBack = new CompletionCallback(){ @Override public void onComplete(Throwable throwable) { ... } }; asyncResponse.register(callBack); asyncResponse.resume("some Response"); } }
The JAX-RS 2.0 implementation in WebSphere® Application Server traditional supports EJB
and the use of stateless and singleton session beans as root resource classes. When
an EJB method is annotated with
@Asynchronous
, the EJB container
automatically allocates the necessary resources for its execution. Thus, in this
scenario, it is unnecessary to use an Executor to generate an asynchronous response.
For example,
@Stateless
@Path("/")
class EJBResource {
@GET @Asynchronous
public void longRunningOp(@Suspended AsyncResponse ar) {
executeLongRunningOp();
ar.resume("Hello async world!");
}
}
Explicit
thread management is not needed in this case because that is under the control of
the EJB container. The response is produced by calling resume on the injected
AsyncResponse
. Hence, the return type of
longRunningOp
is void.