LibraryToggle FramesPrintFeedback

An alternative approach to making an asynchronous operation invocation is to implement a callback class. You then call the asynchronous remote method that takes the callback object as a parameter. The runtime returns the response to the callback object.

To implement an application that uses callbacks, do the following:

  1. Create a callback class that implements the AsyncHandler interface.

    [Note]Note

    Your callback object can perform any amount of response processing required by your application.

  2. Make remote invocations using the operationNameAsync() that takes the callback object as a parameter and returns a Future<?> object.

  3. If your client requires access to the response data, you can poll the returned Future<?> object's isDone() method to see if the remote endpoint has sent the response.

    [Tip]Tip

    If the callback object does all of the response processing, it is not necessary to check if the response has arrived.

The callback class must implement the javax.xml.ws.AsyncHandler interface. The interface defines a single method:

void handleResponse(Response<T> res);

The Fuse Services Framework runtime calls the handleResponse() method to notify the client that the response has arrived. Example 18.8 shows an outline of the AsyncHandler interface that you must implement.


Example 18.9 shows a callback class for the greetMeSometime operation defined in Example 18.1.

Example 18.9. Callback Implementation Class

package demo.hw.client;

import javax.xml.ws.AsyncHandler;
import javax.xml.ws.Response;

import org.apache.hello_world_async_soap_http.types.*;

public class GreeterAsyncHandler implements AsyncHandler<GreetMeSometimeResponse>
{
1  private GreetMeSometimeResponse reply;

2  public void handleResponse(Response<GreetMeSometimeResponse>
                             response)
  {
    try
    {
      reply = response.get();
    }
    catch (Exception ex)
    {
      ex.printStackTrace();
    }
  }

3  public String getResponse()
  {
    return reply.getResponseType();
  }
}

The callback implementation shown in Example 18.9 does the following:

1

Defines a member variable, response, that holds the response returned from the remote endpoint.

2

Implements handleResponse().

This implementation simply extracts the response and assigns it to the member variable reply.

3

Implements an added method called getResponse().

This method is a convenience method that extracts the data from reply and returns it.

Example 18.10 illustrates a client that uses the callback approach to make an asynchronous call to the GreetMeSometime operation defined in Example 18.1.


The code in Example 18.10 does the following:

1

Instantiates a callback object.

2

Invokes the greetMeSometimeAsync() that takes the callback object on the proxy.

The method call returns the Future<?> object to the client immediately. The Fuse Services Framework runtime handles the details of receiving the reply from the remote endpoint, invoking the callback object's handleResponse() method, and populating the Response<GreetMeSometimeResponse> object.

[Note]Note

The runtime transmits the request to the remote endpoint's greetMeSometime() method and handles the details of the asynchronous nature of the call without the remote endpoint's knowledge. The endpoint, and therefore the service implementation, does not need to worry about the details of how the client intends to wait for a response.

3

Uses the returned Future<?> object's isDone() method to check if the response has arrived from the remote endpoint.

4

Invokes the callback object's getResponse() method to get the response data.

Comments powered by Disqus
loading table of contents...