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 tradicional 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.