The polling approach is the more straightforward of the two approaches to developing an asynchronous application. The client invokes the asynchronous method called
and is returned a OperationName
Async()Response<T>
object that it can poll for a response. What the client does while it is waiting for a response is up to the requirements of the application. There are two basic patterns for how to handle the 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 can process it. If it not, the client can continue doing other things.
You call Response<T>.get()
right away and block until the response arrives (optionally specifying a timeout).
Example 7.4, “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 7.1, “WSDL Contract for Asynchronous Example”. The client invokes the asynchronous operation and periodically checks to see if the result has returned.
Example 7.4. 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 Response<GreetMeSometimeResponse> greetMeSomeTimeResp = port.greetMeSometimeAsync(System.getProperty("user.name")); while (!greetMeSomeTimeResp.isDone()) { // client does some work } GreetMeSometimeResponse reply = greetMeSomeTimeResp.get(); // process the response System.exit(0); } }
The code in Example 7.4, “Non-Blocking Polling Approach for an Asynchronous Operation Call” does the following:
Using blocking polling to make asynchronous invocations on a remote operation follows the same steps as non-blocking polling. However, instead of using the Response
object's isDone()
to check if a response has been returned before calling the get()
to retrieve the response, you immediately call the get()
. The get()
blocks until the response is available.
Tip | |
---|---|
You can also pass a timeout limit to the |
Example 7.5, “Blocking Polling Approach for an Asynchronous Operation Call” shows a client that uses blocking polling.
Example 7.5. 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); } }