38.4. Implementing an Asynchronous Client with the Polling Approach
Overview
The polling approach is the more straightforward of the two approaches to developing an asynchronous application. The client invokes the asynchronous method called
OperationNameAsync()
and is returned a Response<T>
object that it polls for a response. What the client does while it is waiting for a response is depends on the requirements of the application. There are two basic patterns for handling the polling:
- Non-blocking polling— You periodically check to see if the result is ready by calling the non-blocking
Response<T>.isDone()
method. If the result is ready, the client processes it. If it not, the client continues doing other things. - Blocking polling— You call
Response<T>.get()
right away, and block until the response arrives (optionally specifying a timeout).
Using the non-blocking pattern
Example 38.6, “Non-Blocking Polling Approach for an Asynchronous Operation Call” illustrates using non-blocking polling to make an asynchronous invocation on the greetMeSometime operation defined in Example 38.1, “WSDL Contract for Asynchronous Example”. The client invokes the asynchronous operation and periodically checks to see if the result is returned.
Example 38.6. Non-Blocking Polling Approach for an Asynchronous Operation Call
package demo.hw.client; import java.io.File; import java.util.concurrent.Future; import javax.xml.namespace.QName; import javax.xml.ws.Response; import org.apache.hello_world_async_soap_http.*; public final class Client { private static final QName SERVICE_NAME = new QName("http://apache.org/hello_world_async_soap_http", "SOAPService"); private Client() {} public static void main(String args[]) throws Exception { // set up the proxy for the client 1 Response<GreetMeSometimeResponse> greetMeSomeTimeResp = port.greetMeSometimeAsync(System.getProperty("user.name")); 2 while (!greetMeSomeTimeResp.isDone()) { // client does some work } 3 GreetMeSometimeResponse reply = greetMeSomeTimeResp.get(); // process the response System.exit(0); } }
The code in Example 38.6, “Non-Blocking Polling Approach for an Asynchronous Operation Call” does the following:
- 1
- Invokes the
greetMeSometimeAsync()
on the proxy.The method call returns theResponse<GreetMeSometimeResponse>
object to the client immediately. The Apache CXF runtime handles the details of receiving the reply from the remote endpoint and populating theResponse<GreetMeSometimeResponse>
object.NoteThe runtime transmits the request to the remote endpoint'sgreetMeSometime()
method and handles the details of the asynchronous nature of the call transparently. The endpoint, and therefore the service implementation, never worries about the details of how the client intends to wait for a response. - 2
- Checks to see if a response has arrived by checking the
isDone()
of the returnedResponse
object.If the response has not arrived, the client continues working before checking again. - 3
- When the response arrives, the client retrieves it from the
Response
object using theget()
method.
Using the blocking pattern
When using the block polling pattern, the
Response
object's isDone()
is never called. Instead, the Response
object's get()
method is called immediately after invoking the remote operation. The get()
blocks until the response is available.
Tip
You can also pass a timeout limit to the
get()
method.
Example 38.7, “Blocking Polling Approach for an Asynchronous Operation Call” shows a client that uses blocking polling.
Example 38.7. Blocking Polling Approach for an Asynchronous Operation Call
package demo.hw.client; import java.io.File; import java.util.concurrent.Future; import javax.xml.namespace.QName; import javax.xml.ws.Response; import org.apache.hello_world_async_soap_http.*; public final class Client { private static final QName SERVICE_NAME = new QName("http://apache.org/hello_world_async_soap_http", "SOAPService"); private Client() {} public static void main(String args[]) throws Exception { // set up the proxy for the client Response<GreetMeSometimeResponse> greetMeSomeTimeResp = port.greetMeSometimeAsync(System.getProperty("user.name")); GreetMeSometimeResponse reply = greetMeSomeTimeResp.get(); // process the response System.exit(0); } }