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); } });