next up previous contents
Next: Example Up: Building Blocks Previous: Example   Contents


MessageDispatcher

Channels are simple patterns to asynchronously send a receive messages. However, a significant number of communication patterns in group communication require synchronous communication. For example, a sender would like to send a message to the group and wait for all responses. Or another application would like to send a message to the group and wait only until the majority of the receivers have sent a response, or until a timeout occurred.

MessageDispatcher offers a combination of the above pattern with other patterns. It provides synchronous (as well as asynchronous) message sending with request-response correlation, e.g. matching responses with the original request. It also offers push-style message reception (by internally using the PullPushAdapter).

An instance of MessageDispatcher is created with a channel as argument. It can now be used in both client and server role: a client sends requests and receives responses and a server receives requests and send responses. MessageDispatcher allows a application to be both at the same time. To be able to serve requests, the RequestHandler.handle() method has to be implemented:

  Object handle(Message msg);

The handle() method is called any time a request is received. It must return a return value (must be serializable, but can be null) or throw an exception. The return value will be returned to the sender (as a null response, see below). The exception will also be propagated to the requester.

The two methods to send requests are:

  public RspList castMessage(Vector dests, Message msg, int mode, long timeout);
  public Object sendMessage(Message msg, int mode, long timeout) throws TimeoutException;

The castMessage() method sends a message to all members defined in dests. If dests is null the message will be sent to all members of the current group. Note that a possible destination set in the message will be overridden. If a message is sent synchronously then the timeout argument defines the maximum amount of time in milliseconds to wait for the responses.

The mode parameter defines whether the message will be sent synchronously or asynchronously. The following values are valid (from org.javagroups.blocks.GroupRequest):

GET_FIRST
Returns the first response received.
GET_ALL
Waits for all responses (minus the ones from suspected members)
GET_MAJORITY
Waits for a majority of all responses (relative to the group size)
GET_ABS_MAJORITY
Waits for the majority (absolute, computed once)
GET_N
Wait for n responses (may block if n > group size)
GET_NONE
Wait for no responses, return immediately (non-blocking). This make the call asynchronous.

The sendMessage() method allows an application programmer to send a unicast message to a receiver and optionally receive the response. The destination of the message has to be non-null (valid address of a receiver). The mode argument is ignored (it is by default set to GroupRequest.GET_FIRST) unless it is set to GET_NONE in which case the request becomes asynchronous, ie. we will not wait for the response.

One advantage of using this building block is that failed members are removed from the set of expected responses. For example, when sending a message to 10 members and waiting for all responses, and 2 members crash before being able to send a response, the call will return with 8 valid responses and 2 marked as failed. The return value of castMessage() is a RspList which contains all responses (not all methods shown):

  public class RspList {
      public boolean isReceived(Address sender);
      public int     numSuspectedMembers();
      public Vector  getResults();
      public Vector  getSuspectedMembers();
      public boolean isSuspected(Address sender);
      public Object  get(Address sender);
      public int     size();
      public Object  elementAt(int i) throws ArrayIndexOutOfBoundsException;
  }

Method isReceived() checks whether a response from sender has already been received. Note that this is only true as long as no response has yet been received, and the member has not been marked as failed. numSuspectedMembers() returns the number of members that failed (e.g. crashed) during the wait for responses. getResults() returns a list of return values. get() returns the return value for a specific member.



Subsections
next up previous contents
Next: Example Up: Building Blocks Previous: Example   Contents
Bela Ban 2002-11-16