Library Link To Toggle Frames Print Feedback

Implementing an Asynchronous Client with the Callback Approach

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 you need to 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 needs to access the response data, you can periodically use 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, you do not need to check if the response has arrived.

Implementing the callback

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

void handleResponse(Response<T> res);

The Celtix Enterprise runtime calls the handleResponse() to notify the client that the response has arrived. Example 7.6, “The javax.xml.ws.AsyncHandler Interface” shows an outline of the AsyncHandler interface that you need to implement.

Example 7.6. The javax.xml.ws.AsyncHandler Interface

public interface javax.xml.ws.AsyncHandler
{
  void handleResponse(Response<T> res)
}

Example 7.7, “Callback Implementation Class” shows a callback class for the greetMeSometime operation defined in Example 7.1, “WSDL Contract for Asynchronous Example”.

Example 7.7. 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 7.7, “Callback Implementation Class” does the following:

1

Defines a member variable, response, to hold 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.

Implementing the consumer

Example 7.8, “Callback Approach for an Asynchronous Operation Call” illustrates a client that uses the callback approach to make an asynchronous call to the GreetMeSometime operation defined in Example 7.1, “WSDL Contract for Asynchronous Example”.

Example 7.8. Callback 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 {
  ...

  public static void main(String args[]) throws Exception
  {
    ...
    // Callback approach
1    GreeterAsyncHandler callback = new GreeterAsyncHandler();

2    Future<?> response =
      port.greetMeSometimeAsync(System.getProperty("user.name"),
                                callback);
3    while (!response.isDone())
    {
      // Do some work
    }
4    resp = callback.getResponse();
    ...
    System.exit(0);
  }
}

The code in Example 7.8, “Callback Approach for an Asynchronous Operation Call” 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 Celtix Enterprise 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, never needs 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.