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 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).
Example 18.5 illustrates using non-blocking polling to make an asynchronous invocation on the greetMeSometime operation defined in Example 18.1. The client invokes the asynchronous operation and periodically checks to see if the result is returned.
Example 18.5. 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 clientResponse<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 18.5 does the following:
Invokes the The method call returns the
| ||||
Checks to see if a response has arrived by checking the If the response has not arrived, the client continues working before checking again. | ||||
When the response arrives, the client retrieves it from the |
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 |
Example 18.6 shows a client that uses blocking polling.
Example 18.6. 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); } }