Class RequestCorrelator


  • public class RequestCorrelator
    extends java.lang.Object
    Framework to send requests and receive matching responses (on request ID). Multiple requests can be sent at a time. Whenever a response is received, the correct Request is looked up (key = id) and its method receiveResponse() invoked.
    Author:
    Bela Ban
    • Field Detail

      • transport

        protected Protocol transport
        The protocol layer to use to pass up/down messages. Can be either a Protocol or a Transport
      • requests

        protected final java.util.concurrent.ConcurrentMap<java.lang.Long,​Request> requests
        The table of pending requests (keys=Long (request IDs), values=RequestEntry)
      • REQUEST_ID

        protected static final java.util.concurrent.atomic.AtomicLong REQUEST_ID
        To generate unique request IDs
      • request_handler

        protected RequestHandler request_handler
        The handler for the incoming requests. It is called from inside the dispatcher thread
      • marshaller

        protected Marshaller marshaller
        Possibility for an external marshaller to marshal/unmarshal responses
      • corr_id

        protected short corr_id
        makes the instance unique (together with IDs)
      • local_addr

        protected Address local_addr
        The address of this group member
      • view

        protected volatile View view
      • started

        protected boolean started
      • async_dispatching

        protected boolean async_dispatching
        Whether or not to use async dispatcher
      • wrap_exceptions

        protected boolean wrap_exceptions
      • rpc_stats

        protected final RpcStats rpc_stats
      • log

        protected static final Log log
    • Constructor Detail

      • RequestCorrelator

        public RequestCorrelator​(short corr_id,
                                 Protocol transport,
                                 RequestHandler handler,
                                 Address local_addr)
        Constructor. Uses transport to send messages. If handler is not null, all incoming requests will be dispatched to it (via handle(Message)).
        Parameters:
        corr_id - Used to differentiate between different RequestCorrelators (e.g. in different protocol layers). Has to be unique if multiple request correlators are used.
        transport - Used to send/pass up requests.
        handler - Request handler. Method handle(Message) will be called when a request is received.
    • Method Detail

      • setRequestHandler

        public void setRequestHandler​(RequestHandler handler)
      • getLocalAddress

        public Address getLocalAddress()
      • getMarshaller

        public Marshaller getMarshaller()
      • asyncDispatching

        public boolean asyncDispatching()
      • wrapExceptions

        public boolean wrapExceptions()
      • sendRequest

        public void sendRequest​(java.util.Collection<Address> dest_mbrs,
                                Buffer data,
                                Request req,
                                RequestOptions opts)
                         throws java.lang.Exception
        Sends a request to a group. If no response collector is given, no responses are expected (making the call asynchronous)
        Parameters:
        dest_mbrs - The list of members who should receive the call. Usually a group RPC is sent via multicast, but a receiver drops the request if its own address is not in this list. Will not be used if it is null.
        data - the data to be sent.
        req - A request (usually the object that invokes this method). Its methods receiveResponse() and suspect() will be invoked when a message has been received or a member is suspected.
        Throws:
        java.lang.Exception
      • sendUnicastRequest

        public void sendUnicastRequest​(Address dest,
                                       Buffer data,
                                       Request req,
                                       RequestOptions opts)
                                throws java.lang.Exception
        Sends a request to a single destination
        Throws:
        java.lang.Exception
      • done

        public void done​(long id)
        Used to signal that a certain request may be garbage collected as all responses have been received.
      • receive

        public boolean receive​(Event evt)
        Callback.

        Called by the protocol below when a message has been received. The algorithm should test whether the message is destined for us and, if not, pass it up to the next layer. Otherwise, it should remove the header and check whether the message is a request or response. In the first case, the message will be delivered to the request handler registered (calling its handle() method), in the second case, the corresponding response collector is looked up and the message delivered.

        Parameters:
        evt - The event to be received
        Returns:
        Whether or not the event was consumed. If true, don't pass message up, else pass it up
      • start

        public final void start()
      • stop

        public void stop()
      • registerProbeHandler

        public void registerProbeHandler​(TP transport)
      • unregisterProbeHandler

        public void unregisterProbeHandler​(TP transport)
      • setSiteUnreachable

        public void setSiteUnreachable​(java.lang.String site)
        An entire site is down; mark all requests that point to that site as unreachable (used by RELAY2)
      • receiveView

        public void receiveView​(View new_view)
        View received: mark all responses from members that are not in new_view as suspected
      • receiveMessage

        public boolean receiveMessage​(Message msg)
        Handles a message coming from a layer below
        Returns:
        true if the message was consumed, don't pass it further up, else false
      • receiveMessageBatch

        public void receiveMessageBatch​(MessageBatch batch)
      • handleResponse

        protected void handleResponse​(Request req,
                                      Address sender,
                                      byte[] buf,
                                      int offset,
                                      int length,
                                      boolean is_exception)
      • sendReply

        protected void sendReply​(Message req,
                                 long req_id,
                                 java.lang.Object reply,
                                 boolean is_exception)
      • sendResponse

        protected void sendResponse​(Message rsp,
                                    long req_id,
                                    boolean is_exception)
      • replyToBuffer

        protected static Buffer replyToBuffer​(java.lang.Object obj,
                                              Marshaller marshaller)
                                       throws java.lang.Exception
        Throws:
        java.lang.Exception
      • replyFromBuffer

        protected static java.lang.Object replyFromBuffer​(byte[] buf,
                                                          int offset,
                                                          int length,
                                                          Marshaller marshaller)
                                                   throws java.lang.Exception
        Throws:
        java.lang.Exception