# Class McastServiceImpl

java.lang.Object
org.apache.catalina.tribes.membership.MembershipProviderBase
org.apache.catalina.tribes.membership.McastServiceImpl

All Implemented Interfaces:
  `MembershipProvider`

public class McastServiceImpl extends MembershipProviderBase
A membership implementation using simple multicast. This is the representation of a multicast membership service. This class is responsible for maintaining a list of active cluster nodes in the cluster. If a node fails to send out a heartbeat, the node will be dismissed. This is the low level implementation that handles the multicasting sockets. Need to fix this, could use java.nio and only need one thread to send and receive, or just use a timeout on the receive

- ## Nested Class Summary

  Nested Classes
  Modifier and Type
  Class
  Description
  `class`
  `McastServiceImpl.ReceiverThread`
  Thread that receives multicast packets.
  `protected static class`
  `McastServiceImpl.RecoveryThread`
  Thread that handles recovery.
  `class`
  `McastServiceImpl.SenderThread`
  Thread that sends multicast packets.

- ## Field Summary

  Fields
  Modifier and Type
  Field
  Description
  `protected final InetAddress`
  `address`
  The multicast address
  `protected boolean`
  `doRunReceiver`
  Flag to control the receiver thread.
  `protected boolean`
  `doRunSender`
  Flag to control the sender thread.
  `protected final Object`
  `expiredMutex`
  Mutex for expired member checking.
  `protected final boolean`
  `localLoopbackDisabled`
  disable/enable local loopback message
  `protected static final int`
  `MAX_PACKET_SIZE`
  The maximum packet size.
  `protected final InetAddress`
  `mcastBindAddress`
  bind address
  `protected int`
  `mcastSoTimeout`
  Read timeout on the mcast socket
  `protected final int`
  `mcastTTL`
  Time to live for the multicast packets that are being sent out
  `protected final MemberImpl`
  `member`
  The local member that we intend to broadcast over and over again
  `protected final MembershipListener`
  `memberService`
  The actual listener, for callback when stuff goes down
  `protected final MessageListener`
  `msgservice`
  The actual listener for broadcast callbacks
  `protected final int`
  `port`
  The multicast port
  `protected DatagramPacket`
  `receivePacket`
  Reuse the receivePacket, no need to create a new one every time
  `protected McastServiceImpl.ReceiverThread`
  `receiver`
  Thread to listen for pings
  `protected int`
  `recoveryCounter`
  nr of times the system has to fail before a recovery is initiated
  `protected boolean`
  `recoveryEnabled`
  Add the ability to turn on/off recovery
  `protected long`
  `recoverySleepTime`
  The time the recovery thread sleeps between recovery attempts
  `protected McastServiceImpl.SenderThread`
  `sender`
  Thread to send pings
  `protected final long`
  `sendFrequency`
  How often to we send out a broadcast saying we are alive, must be smaller than timeToExpiration
  `protected DatagramPacket`
  `sendPacket`
  Reuse the sendPacket, no need to create a new one every time
  `protected static final StringManager`
  `sm`
  The string manager for this class.
  `protected MulticastSocket`
  `socket`
  Socket that we intend to listen to
  `protected int`
  `startLevel`
  The start level.
  `protected final long`
  `timeToExpiration`
  The time it takes for a member to expire.

  ### Fields inherited from class MembershipProviderBase

  `executor, membership, membershipListener, service`

- ## Constructor Summary

  Constructors
  Constructor
  Description
  `McastServiceImpl(MemberImpl member, long sendFrequency, long expireTime, int port, InetAddress bind, InetAddress mcastAddress, int ttl, int soTimeout, MembershipListener service, MessageListener msgservice, boolean localLoopbackDisabled)`
  Create a new mcast service instance.

- ## Method Summary

  Modifier and Type
  Method
  Description
  `protected void`
  `checkExpired()`
  Check for expired members.
  `Channel`
  `getChannel()`
  Get the channel.
  `int`
  `getRecoveryCounter()`
  Get the recovery counter.
  `long`
  `getRecoverySleepTime()`
  Get the recovery sleep time.
  `long`
  `getServiceStartTime()`
  Get the service start time.
  `void`
  `init()`
  Initialize the mcast service.
  `boolean`
  `isRecoveryEnabled()`
  Check if recovery is enabled.
  `void`
  `receive()`
  Receive a datagram packet, locking wait
  `void`
  `send(boolean checkexpired)`
  Send a ping.
  `void`
  `send(boolean checkexpired, DatagramPacket packet)`
  Send a packet.
  `void`
  `setChannel(Channel channel)`
  Set the channel.
  `void`
  `setRecoveryCounter(int recoveryCounter)`
  Set the recovery counter.
  `void`
  `setRecoveryEnabled(boolean recoveryEnabled)`
  Set whether recovery is enabled.
  `void`
  `setRecoverySleepTime(long recoverySleepTime)`
  Set the recovery sleep time.
  `protected void`
  `setupSocket()`
  Setup the multicast socket.
  `void`
  `start(int level)`
  Start the membership provider.
  `boolean`
  `stop(int level)`
  Stop the membership provider.

  ### Methods inherited from class MembershipProviderBase

  `getMember, getMembers, hasMembers, init, setMembershipListener, setMembershipService`

  ### Methods inherited from class Object

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

- ## Field Details

  - ### MAX_PACKET_SIZE

    protected static final int MAX_PACKET_SIZE
    The maximum packet size.
    See Also:
      - Constant Field Values

  - ### sm

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

  - ### doRunSender

    protected volatile boolean doRunSender
    Flag to control the sender thread.

  - ### doRunReceiver

    protected volatile boolean doRunReceiver
    Flag to control the receiver thread.

  - ### startLevel

    protected volatile int startLevel
    The start level.

  - ### socket

    protected MulticastSocket socket
    Socket that we intend to listen to

  - ### member

    protected final MemberImpl member
    The local member that we intend to broadcast over and over again

  - ### address

    protected final InetAddress address
    The multicast address

  - ### port

    protected final int port
    The multicast port

  - ### timeToExpiration

    protected final long timeToExpiration
    The time it takes for a member to expire.

  - ### sendFrequency

    protected final long sendFrequency
    How often to we send out a broadcast saying we are alive, must be smaller than timeToExpiration

  - ### sendPacket

    protected DatagramPacket sendPacket
    Reuse the sendPacket, no need to create a new one every time

  - ### receivePacket

    protected DatagramPacket receivePacket
    Reuse the receivePacket, no need to create a new one every time

  - ### memberService

    protected final MembershipListener memberService
    The actual listener, for callback when stuff goes down

  - ### msgservice

    protected final MessageListener msgservice
    The actual listener for broadcast callbacks

  - ### receiver

    protected McastServiceImpl.ReceiverThread receiver
    Thread to listen for pings

  - ### sender

    protected McastServiceImpl.SenderThread sender
    Thread to send pings

  - ### mcastTTL

    protected final int mcastTTL
    Time to live for the multicast packets that are being sent out

  - ### mcastSoTimeout

    protected int mcastSoTimeout
    Read timeout on the mcast socket

  - ### mcastBindAddress

    protected final InetAddress mcastBindAddress
    bind address

  - ### recoveryCounter

    protected int recoveryCounter
    nr of times the system has to fail before a recovery is initiated

  - ### recoverySleepTime

    protected long recoverySleepTime
    The time the recovery thread sleeps between recovery attempts

  - ### recoveryEnabled

    protected boolean recoveryEnabled
    Add the ability to turn on/off recovery

  - ### localLoopbackDisabled

    protected final boolean localLoopbackDisabled
    disable/enable local loopback message

  - ### expiredMutex

    protected final Object expiredMutex
    Mutex for expired member checking.

- ## Constructor Details

  - ### McastServiceImpl

    public McastServiceImpl(MemberImpl member, long sendFrequency, long expireTime, int port, InetAddress bind, InetAddress mcastAddress, int ttl, int soTimeout, MembershipListener service, MessageListener msgservice, boolean localLoopbackDisabled) throws IOException
    Create a new mcast service instance.
    Parameters:
      `member` - - the local member
      `sendFrequency` - - the time (ms) in between pings sent out
      `expireTime` - - the time (ms) for a member to expire
      `port` - - the mcast port
      `bind` - - the bind address (not sure this is used yet)
      `mcastAddress` - - the mcast address
      `ttl` - multicast ttl that will be set on the socket
      `soTimeout` - Socket timeout
      `service` - - the callback service
      `msgservice` - Message listener
      `localLoopbackDisabled` - - disable loopbackMode
    Throws:
      `IOException` - Init error

- ## Method Details

  - ### init

    public void init() throws IOException
    Initialize the mcast service.
    Throws:
      `IOException` - if initialization fails

  - ### setupSocket

    protected void setupSocket() throws IOException
    Setup the multicast socket.
    Throws:
      `IOException` - if socket setup fails

  - ### start

    public void start(int level) throws IOException
    Description copied from interface: `MembershipProvider`
    Start the membership provider.
    Parameters:
      `level` - the readiness level
      - Channel.DEFAULT - will start all services
      - Channel.MBR_RX_SEQ - starts the membership receiver
      - Channel.MBR_TX_SEQ - starts the membership broadcaster
    Throws:
      `IOException`

  - ### stop

    public boolean stop(int level) throws IOException
    Description copied from interface: `MembershipProvider`
    Stop the membership provider.
    Parameters:
      `level` - the readiness level
      - Channel.DEFAULT - will stop all services
      - Channel.MBR_RX_SEQ - stops the membership receiver
      - Channel.MBR_TX_SEQ - stops the membership broadcaster
    Returns:
      `true` if successful
    Throws:
      `IOException`

  - ### receive

    public void receive() throws IOException
    Receive a datagram packet, locking wait
    Throws:
      `IOException` - Received failed

  - ### checkExpired

    protected void checkExpired()
    Check for expired members.

  - ### send

    public void send(boolean checkexpired) throws IOException
    Send a ping.
    Parameters:
      `checkexpired` - `true` to check for expiration
    Throws:
      `IOException` - Send error

  - ### send

    public void send(boolean checkexpired, DatagramPacket packet) throws IOException
    Send a packet.
    Parameters:
      `checkexpired` - whether to check for expired members
      `packet` - the packet to send
    Throws:
      `IOException` - if send fails

  - ### getServiceStartTime

    public long getServiceStartTime()
    Get the service start time.
    Returns:
      the service start time

  - ### getRecoveryCounter

    public int getRecoveryCounter()
    Get the recovery counter.
    Returns:
      the recovery counter

  - ### isRecoveryEnabled

    public boolean isRecoveryEnabled()
    Check if recovery is enabled.
    Returns:
      true if recovery is enabled

  - ### getRecoverySleepTime

    public long getRecoverySleepTime()
    Get the recovery sleep time.
    Returns:
      the recovery sleep time

  - ### getChannel

    public Channel getChannel()
    Get the channel.
    Returns:
      the channel

  - ### setChannel

    public void setChannel(Channel channel)
    Set the channel.
    Parameters:
      `channel` - the channel to set

  - ### setRecoveryCounter

    public void setRecoveryCounter(int recoveryCounter)
    Set the recovery counter.
    Parameters:
      `recoveryCounter` - the recovery counter

  - ### setRecoveryEnabled

    public void setRecoveryEnabled(boolean recoveryEnabled)
    Set whether recovery is enabled.
    Parameters:
      `recoveryEnabled` - whether recovery is enabled

  - ### setRecoverySleepTime

    public void setRecoverySleepTime(long recoverySleepTime)
    Set the recovery sleep time.
    Parameters:
      `recoverySleepTime` - the recovery sleep time