Consumers making asynchronous requests will not receive the same exceptions returned than when they make synchronous requests. Any
exceptions returned to the consumer asynchronously are wrapped in an ExecutionException
exception.
The actual exception thrown by the service is stored in the ExecutionException
exception's
cause
field.
Exceptions generated by a remote service are thrown locally by the method that passes the response to the consumer's business logic.
When the consumer makes a synchronous request, the method making the remote invocation throws the exception. When the consumer makes
an asynchronous request, the Response<T>
object's get()
method
throws the exception. The consumer will not discover that an error was encountered in processing the request until it attempts to retrieve
the response message.
Unlike the methods generated by the JAX-WS framework, the Response<T>
object's get()
method does not throw either user modeled exceptions nor the generic JAX-WS exceptions.
Instead, it throws a java.util.concurrent.ExecutionException
exception.
The framework stores the exception returned from the remote service in the ExecutionException
exception's cause
field. The details about the remote exception are extracted by getting the value of the
cause
field and examining the stored exception. The stored exception can be any user defined exception or one
of the generic JAX-WS exceptions.
Example 18.10 shows an example of catching an exception using the polling approach.
Example 18.10. Catching an Exception using the Polling Approach
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 { ... // port is a previously established proxy object. Response<GreetMeSometimeResponse> resp = port.greetMeSometimeAsync(System.getProperty("user.name")); while (!resp.isDone()) { // client does some work } try{ GreetMeSometimeResponse reply = greetMeSomeTimeResp.get(); // process the response } catch (ExecutionException ee)
{ Throwable cause = ee.getCause();
System.out.println("Exception "+cause.getClass().getName()+" thrown by the remote service."); } } }
The code in Example 18.10 does the following:
Wraps the call to the | |
Catches a | |
Extracts the |
If the consumer was using the callback approach the code used to catch the exception would be placed in the callback object where the service's response is extracted.