Asynchronous RESTful web service client

This section describes the usage of the asynchronous JAX-RS API on the client for calling the RESTful web APIs.

To invoke a REST API asynchronously on the client, you use javax.ws.rs.client.AsyncInvoker. The AsyncInvoker instance is obtained from the call of the Invocation.Builder.async() method, as shown in the following code:

//Other imports are omitted for brevity 
import javax.ws.rs.client.AsyncInvoker; 
import javax.ws.rs.client.Client; 
import javax.ws.rs.client.WebTarget; 
import javax.ws.rs.core.GenericType; 
import javax.ws.rs.core.Response; 
 
String BASE_URI =  
    "http://localhost:8080/hr-services/webresources";  
Client client = ClientBuilder.newClient(); 
WebTarget webTarget = 
client.target(BASE_URI).path("hr").path("departments"); AsyncInvoker asyncInvoker = webTarget.request(APPLICATION_JSON).async(); Future<Response> responseFuture = asyncInvoker.get(); Response response = responseFuture.get(); List<Department> depts = response.readEntity(new GenericType<List<Department>>() { }); response.close(); client.close();

The JAX-RS client-side API allows you to listen to events generated during the asynchronous invocation of the REST APIs by registering the callback handlers. To do this, you may need to implement javax.ws.rs.client.InvocationCallback and pass this instance as a parameter to the appropriate HTTP method call on the AsyncInvoker instance. The following code snippet illustrates how you can implement InvocationCallback for a GET method type. The InvocationCallback::completed() method is called upon the successful completion of a request. The InvocationCallback::failed() method is called upon the failure of a request for any reason:

//Other imports are omitted for brevity 
import javax.ws.rs.client.InvocationCallback; 
 
String BASE_URI =  
    "http://localhost:8080/hr-services/webresources"; 
 
final Client client = 
javax.ws.rs.client.ClientBuilder.newClient(); WebTarget webTarget = client.target(BASE_URI).path("hr").path("departments"); AsyncInvoker asyncInvoker = webTarget. request(javax.ws.rs.core.MediaType.APPLICATION_JSON).async(); Future<List<Department>> entity = asyncInvoker.get( new InvocationCallback<List<Department>>() { @Override public void completed(List<Department> response) { //Call back on request completion //You can process the result here, if required client.close(); } @Override public void failed(Throwable throwable) { //Call back on request failure //Handle the exception //log(...) method definition is not shown here log(throwable); } });
In synchronous web services, the client connection is accepted and processed in a single I/O thread by a server. In asynchronous web services, the container accepts the client connection in a thread and then dispatches the actual processing of the request to a different thread so that it can release the thread used for client connection. In the previous section, we saw the usage of AsyncInvoker.get(..) to asynchronously consume the RESTful service. In this case, although the calling request thread is released by the server, the client keeps waiting until the business logic execution is finished by the server calling the resume method of the injected AsyncResponse object. Behind the scenes, the underlying I/O thread from the client side continues to block until it gets a response from the server or a timeout occurs.
..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset
18.191.235.176