# Class OrderInterceptor

java.lang.Object
org.apache.catalina.tribes.group.ChannelInterceptorBase
org.apache.catalina.tribes.group.interceptors.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

- ## Nested Class Summary

  Nested Classes
  Modifier and Type
  Class
  Description
  `protected static class`
  `OrderInterceptor.Counter`
  Counter for tracking message sequence numbers.
  `protected static class`
  `OrderInterceptor.MessageOrder`
  Represents a message in the ordering queue.

  ### Nested classes/interfaces inherited from interface ChannelInterceptor

  `ChannelInterceptor.InterceptorEvent`

- ## Field Summary

  Fields
  Modifier and Type
  Field
  Description
  `protected static final StringManager`
  `sm`
  String manager for internationalization.

  ### Fields inherited from class ChannelInterceptorBase

  `optionFlag`

- ## Constructor Summary

  Constructors
  Constructor
  Description
  `OrderInterceptor()`
  Constructs an OrderInterceptor.

- ## Method Summary

  Modifier and Type
  Method
  Description
  `long`
  `getExpire()`
  Returns the message expiration time in milliseconds.
  `boolean`
  `getForwardExpired()`
  Returns whether expired messages are forwarded.
  `protected OrderInterceptor.Counter`
  `getInCounter(Member mbr)`
  Returns the incoming counter for a member, creating one if needed.
  `int`
  `getMaxQueue()`
  Returns the maximum queue size.
  `protected OrderInterceptor.Counter`
  `getOutCounter(Member mbr)`
  Returns the outgoing counter for a member, creating one if needed.
  `protected int`
  `incCounter(Member mbr)`
  Increments the outgoing message counter for a member.
  `void`
  `memberDisappeared(Member member)`
  A member was removed from the group
  If the member left voluntarily, the Member.getCommand will contain the Member.SHUTDOWN_PAYLOAD data
  `void`
  `messageReceived(ChannelMessage msg)`
  The `messageReceived` is invoked when a message is received.
  `protected boolean`
  `processIncoming(OrderInterceptor.MessageOrder order)`
  Processes incoming messages, handling expiration and ordering.
  `protected void`
  `processLeftOvers(Member member, boolean force)`
  Processes leftover messages for a member.
  `void`
  `sendMessage(Member[] destination, ChannelMessage msg, InterceptorPayload payload)`
  The `sendMessage` method is called when a message is being sent to one more destinations.
  `void`
  `setExpire(long expire)`
  Sets the message expiration time in milliseconds.
  `void`
  `setForwardExpired(boolean forwardExpired)`
  Sets whether expired messages should be forwarded.
  `void`
  `setMaxQueue(int maxQueue)`
  Sets the maximum queue size.

  ### Methods inherited from class ChannelInterceptorBase

  `fireInterceptorEvent, getChannel, getLocalMember, getMember, getMembers, getNext, getOptionFlag, getPrevious, hasMembers, heartbeat, memberAdded, okToProcess, setChannel, setNext, setOptionFlag, setPrevious, start, stop`

  ### Methods inherited from class Object

  `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- ## Field Details

  - ### sm

    protected static final StringManager sm
    String manager for internationalization.

- ## Constructor Details

  - ### OrderInterceptor

    public OrderInterceptor()
    Constructs an OrderInterceptor.

- ## Method Details

  - ### 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`
    Overrides:
      `sendMessage` in class `ChannelInterceptorBase`
    Parameters:
      `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
    Throws:
      `ChannelException` - if a serialization error happens.
    See Also:
      - `ErrorHandler`
      - `InterceptorPayload`

  - ### messageReceived

    public void messageReceived(ChannelMessage msg)
    Description copied from interface: `ChannelInterceptor`
    The `messageReceived` is invoked when a message is received. `ChannelMessage.getAddress()` is the sender, or the reply-to address if it has been overwritten.
    Specified by:
      `messageReceived` in interface `ChannelInterceptor`
    Overrides:
      `messageReceived` in class `ChannelInterceptorBase`
    Parameters:
      `msg` - ChannelMessage

  - ### processLeftOvers

    protected void processLeftOvers(Member member, boolean force)
    Processes leftover messages for a member.
    Parameters:
      `member` - The member
      `force` - Whether to force processing

  - ### processIncoming

    protected boolean processIncoming(OrderInterceptor.MessageOrder order)
    Processes incoming messages, handling expiration and ordering.
    Parameters:
      `order` - The message order to process
    Returns:
      true if a message expired and was processed

  - ### memberDisappeared

    public void memberDisappeared(Member member)
    Description copied from interface: `MembershipListener`
    A member was removed from the group
    If the member left voluntarily, the Member.getCommand will contain the Member.SHUTDOWN_PAYLOAD data
    Specified by:
      `memberDisappeared` in interface `MembershipListener`
    Overrides:
      `memberDisappeared` in class `ChannelInterceptorBase`
    Parameters:
      `member` - Member
    See Also:
      - `Member.SHUTDOWN_PAYLOAD`

  - ### incCounter

    protected int incCounter(Member mbr)
    Increments the outgoing message counter for a member.
    Parameters:
      `mbr` - The member
    Returns:
      The new counter value

  - ### getInCounter

    protected OrderInterceptor.Counter getInCounter(Member mbr)
    Returns the incoming counter for a member, creating one if needed.
    Parameters:
      `mbr` - The member
    Returns:
      The counter

  - ### getOutCounter

    protected OrderInterceptor.Counter getOutCounter(Member mbr)
    Returns the outgoing counter for a member, creating one if needed.
    Parameters:
      `mbr` - The member
    Returns:
      The counter

  - ### setExpire

    public void setExpire(long expire)
    Sets the message expiration time in milliseconds.
    Parameters:
      `expire` - The expiration time

  - ### setForwardExpired

    public void setForwardExpired(boolean forwardExpired)
    Sets whether expired messages should be forwarded.
    Parameters:
      `forwardExpired` - true to forward expired messages

  - ### setMaxQueue

    public void setMaxQueue(int maxQueue)
    Sets the maximum queue size.
    Parameters:
      `maxQueue` - The maximum queue size

  - ### getExpire

    public long getExpire()
    Returns the message expiration time in milliseconds.
    Returns:
      The expiration time

  - ### getForwardExpired

    public boolean getForwardExpired()
    Returns whether expired messages are forwarded.
    Returns:
      true if expired messages are forwarded

  - ### getMaxQueue

    public int getMaxQueue()
    Returns the maximum queue size.
    Returns:
      The maximum queue size