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 in the Server API. For more information about asynchronous processing in 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 Liberty 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.