2.9.2.1. Message Dispatcher Building Block

public class MessageDispatcher implements ... {

    // Message dispatcher needs channel for communication and request handler for message delivery.
    public MessageDispatcher (JChannel channel) { ... }
    public MessageDispatcher (JChannel channel, RequestHandler req_handler) { ... }

    // Casting sends to multiple destinations or all members when none specified.
    public <T> RspList<T> castMessage (final Collection<Address> dests, Message msg, RequestOptions opts) { ... }
    public <T> CompletableFuture<RspList<T>> castMessageWithFuture (final Collection<Address> dests, Message msg, RequestOptions opts) { ... }

    // Sending sends to single destination.
    public <T> T sendMessage (Message msg, RequestOptions opts) { ... }
    public <T> CompletableFuture<T> sendMessageWithFuture (Message msg, RequestOptions opts) { ... }

    // Request handler interface if none provided externally.
    @Override public Object handle (Message msg) { ... }
    @Override public void handle (Message request, Response response) { ... }

    ...
}

public class RequestOptions {

    // Can wait for none, one or all responses.
    public ResponseMode getMode () { ... }
    public RequestOptions setMode (ResponseMode mode) { ... }

    // Can specify response filter if response expected.
    public RspFilter getRspFilter () { ... }
    public RequestOptions setRspFilter (RspFilter filter) { ... }

    // Can specify response timeout if response expected.
    public long getTimeout () { ... }
    public RequestOptions setTimeout (long timeout) { ... }

    ...
}

public class RspList<T> extends HashMap<Address,Rsp<T>> implements Iterable<Rsp<T>> {

    public int numReceived () { ... }
    public boolean isReceived (Address sender) { ... }

    // Standard get inherited.
    public T getFirst () { ... }
    public List<T> getResults () { ... }

    // Response is not expected from failed members.
    public int numSuspectedMembers () { ... }
    public List<Address> getSuspectedMembers () { ... }
    public boolean isSuspected (Address sender) { ... }

    ...
}