# Class FragmentationInterceptor

java.lang.Object
org.apache.catalina.tribes.group.ChannelInterceptorBase
org.apache.catalina.tribes.group.interceptors.FragmentationInterceptor

All Implemented Interfaces:
  `ChannelInterceptor, FragmentationInterceptorMBean, Heartbeat, MembershipListener`

public class FragmentationInterceptor extends ChannelInterceptorBase implements FragmentationInterceptorMBean
The fragmentation interceptor splits up large messages into smaller messages and assembles them on the other end. This is very useful when you don't want large messages hogging the sending sockets and smaller messages can make it through.
Configuration Options
FragmentationInterceptor.expire=<milliseconds> - how long do we keep the fragments in memory and wait for the rest to arrive default=60,000ms -> 60seconds This setting is useful to avoid OutOfMemoryErrors
FragmentationInterceptor.maxSize=<max message size> - message size in bytes default=1024*100 (around a tenth of a MB)

- ## Nested Class Summary

  Nested Classes
  Modifier and Type
  Class
  Description
  `static class`
  `FragmentationInterceptor.FragCollection`
  Collection that holds the fragments of a message for reassembly.
  `static class`
  `FragmentationInterceptor.FragKey`
  Key used to identify a set of fragments belonging to the same original message.

  ### Nested classes/interfaces inherited from interface ChannelInterceptor

  `ChannelInterceptor.InterceptorEvent`

- ## Field Summary

  Fields
  Modifier and Type
  Field
  Description
  `protected final boolean`
  `deepclone`
  Flag indicating whether deep cloning is enabled for fragments.
  `protected final Map<FragmentationInterceptor.FragKey, FragmentationInterceptor.FragCollection>`
  `fragpieces`
  Map of fragment keys to their fragment collections for reassembly.
  `protected static final StringManager`
  `sm`
  String manager for internationalization support.

  ### Fields inherited from class ChannelInterceptorBase

  `optionFlag`

- ## Constructor Summary

  Constructors
  Constructor
  Description
  `FragmentationInterceptor()`
  Creates a new FragmentationInterceptor instance.

- ## Method Summary

  Modifier and Type
  Method
  Description
  `void`
  `defrag(ChannelMessage msg)`
  Reassembles a fragmented message from its parts.
  `void`
  `frag(Member[] destination, ChannelMessage msg, InterceptorPayload payload)`
  Fragments a large message into smaller pieces and sends them.
  `long`
  `getExpire()`
  Returns the expiration time for fragments in milliseconds.
  `FragmentationInterceptor.FragCollection`
  `getFragCollection(FragmentationInterceptor.FragKey key, ChannelMessage msg)`
  Gets the fragment collection for the given key, creating one if it does not exist.
  `int`
  `getMaxSize()`
  Returns the maximum size of a fragment in bytes.
  `void`
  `heartbeat()`
  The `heartbeat()` method gets invoked periodically to allow interceptors to clean up resources, time out object and perform actions that are unrelated to sending/receiving data.
  `void`
  `messageReceived(ChannelMessage msg)`
  The `messageReceived` is invoked when a message is received.
  `void`
  `removeFragCollection(FragmentationInterceptor.FragKey key)`
  Removes the fragment collection for the given key.
  `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 expiration time for fragments in milliseconds.
  `void`
  `setMaxSize(int maxSize)`
  Sets the maximum size of a fragment in bytes.

  ### Methods inherited from class ChannelInterceptorBase

  `fireInterceptorEvent, getChannel, getLocalMember, getMember, getMembers, getNext, getOptionFlag, getPrevious, hasMembers, memberAdded, memberDisappeared, 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 support.

  - ### fragpieces

    protected final Map<FragmentationInterceptor.FragKey, FragmentationInterceptor.FragCollection> fragpieces
    Map of fragment keys to their fragment collections for reassembly.

  - ### deepclone

    protected final boolean deepclone
    Flag indicating whether deep cloning is enabled for fragments.
    See Also:
      - Constant Field Values

- ## Constructor Details

  - ### FragmentationInterceptor

    public FragmentationInterceptor()
    Creates a new FragmentationInterceptor instance.

- ## 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

  - ### getFragCollection

    public FragmentationInterceptor.FragCollection getFragCollection(FragmentationInterceptor.FragKey key, ChannelMessage msg)
    Gets the fragment collection for the given key, creating one if it does not exist.
    Parameters:
      `key` - The fragment key
      `msg` - The channel message used to initialize a new collection if needed
    Returns:
      The fragment collection for the given key

  - ### removeFragCollection

    public void removeFragCollection(FragmentationInterceptor.FragKey key)
    Removes the fragment collection for the given key.
    Parameters:
      `key` - The fragment key to remove

  - ### defrag

    public void defrag(ChannelMessage msg)
    Reassembles a fragmented message from its parts.
    Parameters:
      `msg` - The channel message fragment to process

  - ### frag

    public void frag(Member[] destination, ChannelMessage msg, InterceptorPayload payload) throws ChannelException
    Fragments a large message into smaller pieces and sends them.
    Parameters:
      `destination` - The destination members
      `msg` - The channel message to fragment
      `payload` - The interceptor payload
    Throws:
      `ChannelException` - if an error occurs during fragmentation

  - ### heartbeat

    public void heartbeat()
    Description copied from interface: `ChannelInterceptor`
    The `heartbeat()` method gets invoked periodically to allow interceptors to clean up resources, time out object and perform actions that are unrelated to sending/receiving data.
    Specified by:
      `heartbeat` in interface `ChannelInterceptor`
    Specified by:
      `heartbeat` in interface `Heartbeat`
    Overrides:
      `heartbeat` in class `ChannelInterceptorBase`

  - ### getMaxSize

    public int getMaxSize()
    Description copied from interface: `FragmentationInterceptorMBean`
    Returns the maximum size of a fragment in bytes.
    Specified by:
      `getMaxSize` in interface `FragmentationInterceptorMBean`
    Returns:
      The maximum fragment size

  - ### getExpire

    public long getExpire()
    Description copied from interface: `FragmentationInterceptorMBean`
    Returns the expiration time for fragments in milliseconds.
    Specified by:
      `getExpire` in interface `FragmentationInterceptorMBean`
    Returns:
      The fragment expiration time

  - ### setMaxSize

    public void setMaxSize(int maxSize)
    Description copied from interface: `FragmentationInterceptorMBean`
    Sets the maximum size of a fragment in bytes.
    Specified by:
      `setMaxSize` in interface `FragmentationInterceptorMBean`
    Parameters:
      `maxSize` - The maximum fragment size

  - ### setExpire

    public void setExpire(long expire)
    Description copied from interface: `FragmentationInterceptorMBean`
    Sets the expiration time for fragments in milliseconds.
    Specified by:
      `setExpire` in interface `FragmentationInterceptorMBean`
    Parameters:
      `expire` - The fragment expiration time