# Class SimpleTcpCluster

java.lang.Object
org.apache.catalina.util.LifecycleBase
org.apache.catalina.util.LifecycleMBeanBase
org.apache.catalina.ha.tcp.SimpleTcpCluster

All Implemented Interfaces:
  `MBeanRegistration`, `Cluster`, `Contained`, `CatalinaCluster`, `JmxEnabled`, `Lifecycle`, `ChannelListener`, `MembershipListener`

public class SimpleTcpCluster extends LifecycleMBeanBase implements CatalinaCluster, MembershipListener, ChannelListener
A Cluster implementation using simple multicast. Responsible for setting up a cluster and provides callers with a valid multicast receiver/sender.

Author:
  Remy Maucherat, Peter Rossbach

- ## Nested Class Summary

  ### Nested classes/interfaces inherited from interface org.apache.catalina.Lifecycle

  `Lifecycle.SingleUse`

- ## Field Summary

  Fields
  Modifier and Type
  Field
  Description
  `static final String`
  `AFTER_MANAGERREGISTER_EVENT`
  `static final String`
  `AFTER_MANAGERUNREGISTER_EVENT`
  `static final String`
  `AFTER_MEMBERREGISTER_EVENT`
  `static final String`
  `AFTER_MEMBERUNREGISTER_EVENT`
  `static final String`
  `BEFORE_MANAGERREGISTER_EVENT`
  `static final String`
  `BEFORE_MANAGERUNREGISTER_EVENT`
  `static final String`
  `BEFORE_MEMBERREGISTER_EVENT`
  `static final String`
  `BEFORE_MEMBERUNREGISTER_EVENT`
  `protected Channel`
  `channel`
  Group channel.
  `protected final List<ClusterListener>`
  `clusterListeners`
  Listeners of messages
  `protected String`
  `clusterName`
  The cluster name to join
  `protected Container`
  `container`
  The Container associated with this Cluster.
  `protected boolean`
  `hasMembers`
  has members
  `protected boolean`
  `heartbeatBackgroundEnabled`
  call Channel.heartbeat() at container background thread
  `static final Log`
  `log`
  `protected final Map<String,ClusterManager>`
  `managers`
  The context name <-> manager association for distributed contexts.
  `protected ClusterManager`
  `managerTemplate`
  `static final String`
  `RECEIVE_MESSAGE_FAILURE_EVENT`
  `static final String`
  `SEND_MESSAGE_FAILURE_EVENT`
  `protected static final StringManager`
  `sm`
  The string manager for this package.
  `protected final PropertyChangeSupport`
  `support`
  The property change support for this component.

  ### Fields inherited from class org.apache.catalina.util.LifecycleMBeanBase

  `mserver`

  ### Fields inherited from interface org.apache.catalina.Lifecycle

  `AFTER_DESTROY_EVENT, AFTER_INIT_EVENT, AFTER_START_EVENT, AFTER_STOP_EVENT, BEFORE_DESTROY_EVENT, BEFORE_INIT_EVENT, BEFORE_START_EVENT, BEFORE_STOP_EVENT, CONFIGURE_START_EVENT, CONFIGURE_STOP_EVENT, PERIODIC_EVENT, START_EVENT, STOP_EVENT`

- ## Constructor Summary

  Constructors
  Constructor
  Description
  `SimpleTcpCluster()`

- ## Method Summary

  Modifier and Type
  Method
  Description
  `boolean`
  `accept(Serializable msg, Member sender)`
  notify all listeners from receiving a new message is not ClusterMessage emit Failure Event to LifecycleListener
  `void`
  `addClusterListener(ClusterListener listener)`
  Add cluster message listener and register cluster to this listener.
  `void`
  `addValve(Valve valve)`
  Add cluster valve.
  `void`
  `backgroundProcess()`
  Execute a periodic task, such as reloading, etc.
  `protected void`
  `checkDefaults()`
  `Manager`
  `createManager(String name)`
  Create a new manager which will use this cluster to replicate its sessions.
  `protected void`
  `destroyInternal()`
  Subclasses implement this method to perform any instance destruction required.
  `ClusterListener[]`
  `findClusterListeners()`
  Get the cluster listeners associated with this cluster.
  `Channel`
  `getChannel()`
  `int`
  `getChannelSendOptions()`
  `String`
  `getChannelSendOptionsName()`
  returns the SendOptions as a comma separated list of names for use by JMX
  `int`
  `getChannelStartOptions()`
  `ClusterDeployer`
  `getClusterDeployer()`
  `String`
  `getClusterName()`
  Return the name of the cluster that this Server is currently configured to operate within.
  `Container`
  `getContainer()`
  Get the `Container` with which this instance is associated.
  `protected String`
  `getDomainInternal()`
  Method implemented by subclasses to identify the domain in which MBeans should be registered.
  `Member`
  `getLocalMember()`
  `Manager`
  `getManager(String name)`
  Get Manager
  `String`
  `getManagerName(String name, Manager manager)`
  Get a new cluster name for a manager.
  `Map<String,ClusterManager>`
  `getManagers()`
  `ClusterManager`
  `getManagerTemplate()`
  `Member[]`
  `getMembers()`
  `protected String`
  `getObjectNameKeyProperties()`
  Allow subclasses to specify the key properties component of the `ObjectName` that will be used to register this component.
  `Valve[]`
  `getValves()`
  `boolean`
  `hasMembers()`
  `protected void`
  `initInternal()`
  Subclasses implement this method to perform any instance initialisation required.
  `boolean`
  `isHeartbeatBackgroundEnabled()`
  Return heartbeat enable flag (default false)
  `boolean`
  `isNotifyLifecycleListenerOnFailure()`
  `void`
  `memberAdded(Member member)`
  A member was added to the group
  `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(Serializable message, Member sender)`
  Receive a message from the channel
  `void`
  `messageReceived(ClusterMessage message)`
  `protected void`
  `registerClusterValve()`
  register all cluster valve to host or engine
  `void`
  `registerManager(Manager manager)`
  Register a manager with the cluster.
  `void`
  `removeClusterListener(ClusterListener listener)`
  Remove message listener and deregister Cluster from listener.
  `void`
  `removeManager(Manager manager)`
  Removes a manager from the cluster
  `void`
  `send(ClusterMessage msg)`
  Sends a message to all the members in the cluster
  `void`
  `send(ClusterMessage msg, Member dest)`
  Sends a message to a specific member in the cluster.
  `void`
  `send(ClusterMessage msg, Member dest, int sendOptions)`
  Sends a message with the specified sendOptions to a specific member in the cluster.
  `void`
  `setChannel(Channel channel)`
  Set the channel associated with the cluster.
  `void`
  `setChannelSendOptions(int channelSendOptions)`
  `void`
  `setChannelSendOptions(String channelSendOptions)`
  `void`
  `setChannelStartOptions(int channelStartOptions)`
  `void`
  `setClusterDeployer(ClusterDeployer clusterDeployer)`
  Set a new Deployer, must be set before the cluster started.
  `void`
  `setClusterName(String clusterName)`
  Set the name of the cluster to join, if no cluster with this name is present create one.
  `void`
  `setContainer(Container container)`
  Set the `Container` with which this instance is associated.
  `void`
  `setHeartbeatBackgroundEnabled(boolean heartbeatBackgroundEnabled)`
  enabled that container backgroundThread call heartbeat at channel
  `void`
  `setManagerTemplate(ClusterManager managerTemplate)`
  `void`
  `setNotifyLifecycleListenerOnFailure(boolean notifyListenerOnFailure)`
  `protected void`
  `startInternal()`
  Start Cluster and implement the requirements of `LifecycleBase.startInternal()`.
  `protected void`
  `stopInternal()`
  Stop Cluster and implement the requirements of `LifecycleBase.stopInternal()`.
  `String`
  `toString()`
  `protected void`
  `unregisterClusterValve()`
  unregister all cluster valve to host or engine

  ### Methods inherited from class org.apache.catalina.util.LifecycleMBeanBase

  `getDomain, getObjectName, postDeregister, postRegister, preDeregister, preRegister, register, setDomain, unregister, unregister`

  ### Methods inherited from class org.apache.catalina.util.LifecycleBase

  `addLifecycleListener, destroy, findLifecycleListeners, fireLifecycleEvent, getState, getStateName, getThrowOnFailure, init, removeLifecycleListener, setState, setState, setThrowOnFailure, start, stop`

  ### Methods inherited from class java.lang.Object

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

- ## Field Details

  - ### log

    public static final Log log

  - ### BEFORE_MEMBERREGISTER_EVENT

    public static final String BEFORE_MEMBERREGISTER_EVENT
    See Also:
      - Constant Field Values

  - ### AFTER_MEMBERREGISTER_EVENT

    public static final String AFTER_MEMBERREGISTER_EVENT
    See Also:
      - Constant Field Values

  - ### BEFORE_MANAGERREGISTER_EVENT

    public static final String BEFORE_MANAGERREGISTER_EVENT
    See Also:
      - Constant Field Values

  - ### AFTER_MANAGERREGISTER_EVENT

    public static final String AFTER_MANAGERREGISTER_EVENT
    See Also:
      - Constant Field Values

  - ### BEFORE_MANAGERUNREGISTER_EVENT

    public static final String BEFORE_MANAGERUNREGISTER_EVENT
    See Also:
      - Constant Field Values

  - ### AFTER_MANAGERUNREGISTER_EVENT

    public static final String AFTER_MANAGERUNREGISTER_EVENT
    See Also:
      - Constant Field Values

  - ### BEFORE_MEMBERUNREGISTER_EVENT

    public static final String BEFORE_MEMBERUNREGISTER_EVENT
    See Also:
      - Constant Field Values

  - ### AFTER_MEMBERUNREGISTER_EVENT

    public static final String AFTER_MEMBERUNREGISTER_EVENT
    See Also:
      - Constant Field Values

  - ### SEND_MESSAGE_FAILURE_EVENT

    public static final String SEND_MESSAGE_FAILURE_EVENT
    See Also:
      - Constant Field Values

  - ### RECEIVE_MESSAGE_FAILURE_EVENT

    public static final String RECEIVE_MESSAGE_FAILURE_EVENT
    See Also:
      - Constant Field Values

  - ### channel

    protected Channel channel
    Group channel.

  - ### sm

    protected static final StringManager sm
    The string manager for this package.

  - ### clusterName

    protected String clusterName
    The cluster name to join

  - ### heartbeatBackgroundEnabled

    protected boolean heartbeatBackgroundEnabled
    call Channel.heartbeat() at container background thread
    See Also:
      - `GroupChannel.heartbeat()`

  - ### container

    protected Container container
    The Container associated with this Cluster.

  - ### support

    protected final PropertyChangeSupport support
    The property change support for this component.

  - ### managers

    protected final Map<String,ClusterManager> managers
    The context name <-> manager association for distributed contexts.

  - ### managerTemplate

    protected ClusterManager managerTemplate

  - ### clusterListeners

    protected final List<ClusterListener> clusterListeners
    Listeners of messages

  - ### hasMembers

    protected boolean hasMembers
    has members

- ## Constructor Details

  - ### SimpleTcpCluster

    public SimpleTcpCluster()

- ## Method Details

  - ### isHeartbeatBackgroundEnabled

    public boolean isHeartbeatBackgroundEnabled()
    Return heartbeat enable flag (default false)
    Returns:
      the heartbeatBackgroundEnabled

  - ### setHeartbeatBackgroundEnabled

    public void setHeartbeatBackgroundEnabled(boolean heartbeatBackgroundEnabled)
    enabled that container backgroundThread call heartbeat at channel
    Parameters:
      `heartbeatBackgroundEnabled` - the heartbeatBackgroundEnabled to set

  - ### setClusterName

    public void setClusterName(String clusterName)
    Description copied from interface: `Cluster`
    Set the name of the cluster to join, if no cluster with this name is present create one.
    Specified by:
      `setClusterName` in interface `Cluster`
    Parameters:
      `clusterName` - The clustername to join

  - ### getClusterName

    public String getClusterName()
    Description copied from interface: `Cluster`
    Return the name of the cluster that this Server is currently configured to operate within.
    Specified by:
      `getClusterName` in interface `Cluster`
    Returns:
      The name of the cluster associated with this server

  - ### setContainer

    public void setContainer(Container container)
    Description copied from interface: `Contained`
    Set the `Container` with which this instance is associated.
    Specified by:
      `setContainer` in interface `Contained`
    Parameters:
      `container` - The Container instance with which this instance is to be associated, or `null` to disassociate this instance from any Container

  - ### getContainer

    public Container getContainer()
    Description copied from interface: `Contained`
    Get the `Container` with which this instance is associated.
    Specified by:
      `getContainer` in interface `Contained`
    Returns:
      The Container with which this instance is associated or `null` if not associated with a Container

  - ### isNotifyLifecycleListenerOnFailure

    public boolean isNotifyLifecycleListenerOnFailure()
    Returns:
      Returns the notifyLifecycleListenerOnFailure.

  - ### setNotifyLifecycleListenerOnFailure

    public void setNotifyLifecycleListenerOnFailure(boolean notifyListenerOnFailure)
    Parameters:
      `notifyListenerOnFailure` - The notifyLifecycleListenerOnFailure to set.

  - ### addValve

    public void addValve(Valve valve)
    Description copied from interface: `CatalinaCluster`
    Add cluster valve. Cluster Valves are only add to container when cluster is started.
    Specified by:
      `addValve` in interface `CatalinaCluster`
    Parameters:
      `valve` - The new cluster Valve.

  - ### getValves

    public Valve[] getValves()
    Specified by:
      `getValves` in interface `CatalinaCluster`
    Returns:
      the current cluster valves

  - ### findClusterListeners

    public ClusterListener[] findClusterListeners()
    Get the cluster listeners associated with this cluster. If this Array has no listeners registered, a zero-length array is returned.
    Returns:
      the listener array

  - ### addClusterListener

    public void addClusterListener(ClusterListener listener)
    Description copied from interface: `CatalinaCluster`
    Add cluster message listener and register cluster to this listener.
    Specified by:
      `addClusterListener` in interface `CatalinaCluster`
    Parameters:
      `listener` - The new listener

  - ### removeClusterListener

    public void removeClusterListener(ClusterListener listener)
    Description copied from interface: `CatalinaCluster`
    Remove message listener and deregister Cluster from listener.
    Specified by:
      `removeClusterListener` in interface `CatalinaCluster`
    Parameters:
      `listener` - The listener to remove

  - ### getClusterDeployer

    public ClusterDeployer getClusterDeployer()
    Specified by:
      `getClusterDeployer` in interface `CatalinaCluster`
    Returns:
      the current Deployer

  - ### setClusterDeployer

    public void setClusterDeployer(ClusterDeployer clusterDeployer)
    Description copied from interface: `CatalinaCluster`
    Set a new Deployer, must be set before the cluster started.
    Specified by:
      `setClusterDeployer` in interface `CatalinaCluster`
    Parameters:
      `clusterDeployer` - The associated deployer

  - ### setChannel

    public void setChannel(Channel channel)
    Description copied from interface: `CatalinaCluster`
    Set the channel associated with the cluster.
    Specified by:
      `setChannel` in interface `CatalinaCluster`
    Parameters:
      `channel` - the channel

  - ### setManagerTemplate

    public void setManagerTemplate(ClusterManager managerTemplate)

  - ### setChannelSendOptions

    public void setChannelSendOptions(int channelSendOptions)

  - ### setChannelSendOptions

    public void setChannelSendOptions(String channelSendOptions)

  - ### hasMembers

    public boolean hasMembers()
    Specified by:
      `hasMembers` in interface `CatalinaCluster`
    Returns:
      `true` if the cluster has members.

  - ### getMembers

    public Member[] getMembers()
    Specified by:
      `getMembers` in interface `CatalinaCluster`
    Returns:
      an array containing all the members currently participating in the cluster.

  - ### getLocalMember

    public Member getLocalMember()
    Specified by:
      `getLocalMember` in interface `CatalinaCluster`
    Returns:
      the member that represents this node.

  - ### getManagers

    public Map<String,ClusterManager> getManagers()
    Specified by:
      `getManagers` in interface `CatalinaCluster`
    Returns:
      The map of managers

  - ### getChannel

    public Channel getChannel()
    Specified by:
      `getChannel` in interface `CatalinaCluster`
    Returns:
      the channel associated with the cluster

  - ### getManagerTemplate

    public ClusterManager getManagerTemplate()

  - ### getChannelSendOptions

    public int getChannelSendOptions()

  - ### getChannelSendOptionsName

    public String getChannelSendOptionsName()
    returns the SendOptions as a comma separated list of names for use by JMX
    Returns:
      a comma separated list of the option names

  - ### createManager

    public Manager createManager(String name)
    Description copied from interface: `Cluster`
    Create a new manager which will use this cluster to replicate its sessions.
    Specified by:
      `createManager` in interface `Cluster`
    Parameters:
      `name` - Name (key) of the application with which the manager is associated
    Returns:
      The newly created Manager instance

  - ### registerManager

    public void registerManager(Manager manager)
    Description copied from interface: `Cluster`
    Register a manager with the cluster. If the cluster is not responsible for creating a manager, then the container will at least notify the cluster that this manager is participating in the cluster.
    Specified by:
      `registerManager` in interface `Cluster`
    Parameters:
      `manager` - Manager

  - ### removeManager

    public void removeManager(Manager manager)
    Description copied from interface: `Cluster`
    Removes a manager from the cluster
    Specified by:
      `removeManager` in interface `Cluster`
    Parameters:
      `manager` - Manager

  - ### getManagerName

    public String getManagerName(String name, Manager manager)
    Description copied from interface: `CatalinaCluster`
    Get a new cluster name for a manager.
    Specified by:
      `getManagerName` in interface `CatalinaCluster`
    Parameters:
      `name` - Override name (optional)
      `manager` - The manager
    Returns:
      the manager name in the cluster

  - ### getManager

    public Manager getManager(String name)
    Description copied from interface: `CatalinaCluster`
    Get Manager
    Specified by:
      `getManager` in interface `CatalinaCluster`
    Parameters:
      `name` - The manager name
    Returns:
      The manager

  - ### backgroundProcess

    public void backgroundProcess()
    Description copied from interface: `Cluster`
    Execute a periodic task, such as reloading, etc. This method will be invoked inside the classloading context of this container. Unexpected throwables will be caught and logged.
    Specified by:
      `backgroundProcess` in interface `Cluster`

  - ### initInternal

    protected void initInternal() throws LifecycleException
    Description copied from class: `LifecycleBase`
    Subclasses implement this method to perform any instance initialisation required.
    Overrides:
      `initInternal` in class `LifecycleMBeanBase`
    Throws:
      `LifecycleException` - If the initialisation fails

  - ### startInternal

    protected void startInternal() throws LifecycleException
    Start Cluster and implement the requirements of `LifecycleBase.startInternal()`.
    Specified by:
      `startInternal` in class `LifecycleBase`
    Throws:
      `LifecycleException` - if this component detects a fatal error that prevents this component from being used

  - ### checkDefaults

    protected void checkDefaults()

  - ### registerClusterValve

    protected void registerClusterValve()
    register all cluster valve to host or engine

  - ### unregisterClusterValve

    protected void unregisterClusterValve()
    unregister all cluster valve to host or engine

  - ### stopInternal

    protected void stopInternal() throws LifecycleException
    Stop Cluster and implement the requirements of `LifecycleBase.stopInternal()`.
    Specified by:
      `stopInternal` in class `LifecycleBase`
    Throws:
      `LifecycleException` - if this component detects a fatal error that prevents this component from being used

  - ### destroyInternal

    protected void destroyInternal() throws LifecycleException
    Description copied from class: `LifecycleBase`
    Subclasses implement this method to perform any instance destruction required.
    Overrides:
      `destroyInternal` in class `LifecycleMBeanBase`
    Throws:
      `LifecycleException` - If the destruction fails

  - ### toString

    public String toString()
    Overrides:
      `toString` in class `Object`

  - ### send

    public void send(ClusterMessage msg)
    Description copied from interface: `CatalinaCluster`
    Sends a message to all the members in the cluster
    Specified by:
      `send` in interface `CatalinaCluster`
    Parameters:
      `msg` - ClusterMessage

  - ### send

    public void send(ClusterMessage msg, Member dest)
    Description copied from interface: `CatalinaCluster`
    Sends a message to a specific member in the cluster.
    Specified by:
      `send` in interface `CatalinaCluster`
    Parameters:
      `msg` - ClusterMessage
      `dest` - Member

  - ### send

    public void send(ClusterMessage msg, Member dest, int sendOptions)
    Description copied from interface: `CatalinaCluster`
    Sends a message with the specified sendOptions to a specific member in the cluster.
    Specified by:
      `send` in interface `CatalinaCluster`
    Parameters:
      `msg` - ClusterMessage
      `dest` - Member
      `sendOptions` - sendOptions

  - ### memberAdded

    public void memberAdded(Member member)
    Description copied from interface: `MembershipListener`
    A member was added to the group
    Specified by:
      `memberAdded` in interface `MembershipListener`
    Parameters:
      `member` - Member - the member that was added

  - ### 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`
    Parameters:
      `member` - Member
    See Also:
      - `Member.SHUTDOWN_PAYLOAD`

  - ### accept

    public boolean accept(Serializable msg, Member sender)
    notify all listeners from receiving a new message is not ClusterMessage emit Failure Event to LifecycleListener
    Specified by:
      `accept` in interface `ChannelListener`
    Parameters:
      `msg` - received Message
      `sender` - Member
    Returns:
      boolean

  - ### messageReceived

    public void messageReceived(Serializable message, Member sender)
    Description copied from interface: `ChannelListener`
    Receive a message from the channel
    Specified by:
      `messageReceived` in interface `ChannelListener`
    Parameters:
      `message` - Serializable
      `sender` - - the source of the message

  - ### messageReceived

    public void messageReceived(ClusterMessage message)

  - ### getChannelStartOptions

    public int getChannelStartOptions()

  - ### setChannelStartOptions

    public void setChannelStartOptions(int channelStartOptions)

  - ### getDomainInternal

    protected String getDomainInternal()
    Description copied from class: `LifecycleMBeanBase`
    Method implemented by subclasses to identify the domain in which MBeans should be registered.
    Specified by:
      `getDomainInternal` in class `LifecycleMBeanBase`
    Returns:
      The name of the domain to use to register MBeans.

  - ### getObjectNameKeyProperties

    protected String getObjectNameKeyProperties()
    Description copied from class: `LifecycleMBeanBase`
    Allow subclasses to specify the key properties component of the `ObjectName` that will be used to register this component.
    Specified by:
      `getObjectNameKeyProperties` in class `LifecycleMBeanBase`
    Returns:
      The string representation of the key properties component of the desired `ObjectName`