Class OrderInterceptor

  • All Implemented Interfaces:
    ChannelInterceptor, Heartbeat, MembershipListener

    public class OrderInterceptor
    extends ChannelInterceptorBase
    The order interceptor guarantees that messages are received in the same order they were sent. This interceptor works best with the ack=true setting.
    There is no point in using this with the replicationMode="fastasynchqueue" as this mode guarantees ordering.
    If you are using the mode ack=false replicationMode=pooled, and have a lot of concurrent threads, this interceptor can really slow you down, as many messages will be completely out of order and the queue might become rather large. If this is the case, then you might want to set the value OrderInterceptor.maxQueue = 25 (meaning that we will never keep more than 25 messages in our queue)
    Configuration Options
    OrderInterceptor.expire=<milliseconds> - if a message arrives out of order, how long before we act on it default=3000ms
    OrderInterceptor.maxQueue=<max queue size> - how much can the queue grow to ensure ordering. This setting is useful to avoid OutOfMemoryErrorsdefault=Integer.MAX_VALUE
    OrderInterceptor.forwardExpired=<boolean> - this flag tells the interceptor what to do when a message has expired or the queue has grown larger than the maxQueue value. true means that the message is sent up the stack to the receiver that will receive and out of order message false means, forget the message and reset the message counter. default=true
    • Constructor Detail

      • OrderInterceptor

        public OrderInterceptor()
    • Method Detail

      • sendMessage

        public void sendMessage​(Member[] destination,
                                ChannelMessage msg,
                                InterceptorPayload payload)
                         throws ChannelException
        Description copied from interface: ChannelInterceptor
        The sendMessage method is called when a message is being sent to one more destinations. The interceptor can modify any of the parameters and then pass on the message down the stack by invoking getNext().sendMessage(destination,msg,payload)
        Alternatively the interceptor can stop the message from being sent by not invoking getNext().sendMessage(destination,msg,payload)
        If the message is to be sent asynchronous the application can be notified of completion and errors by passing in an error handler attached to a payload object.
        The ChannelMessage.getAddress contains Channel.getLocalMember, and can be overwritten to simulate a message sent from another node.
        Specified by:
        sendMessage in interface ChannelInterceptor
        sendMessage in class ChannelInterceptorBase
        destination - Member[] - the destination for this message
        msg - ChannelMessage - the message to be sent
        payload - InterceptorPayload - the payload, carrying an error handler and future useful data, can be null
        ChannelException - if a serialization error happens.
        See Also:
        ErrorHandler, InterceptorPayload
      • processLeftOvers

        protected void processLeftOvers​(Member member,
                                        boolean force)
      • processIncoming

        protected boolean processIncoming​(OrderInterceptor.MessageOrder order)
        order - MessageOrder
        boolean - true if a message expired and was processed
      • incCounter

        protected int incCounter​(Member mbr)
      • setExpire

        public void setExpire​(long expire)
      • setForwardExpired

        public void setForwardExpired​(boolean forwardExpired)
      • setMaxQueue

        public void setMaxQueue​(int maxQueue)
      • getExpire

        public long getExpire()
      • getForwardExpired

        public boolean getForwardExpired()
      • getMaxQueue

        public int getMaxQueue()