Package org.apache.catalina.tribes.membership

## 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` |
    `protected static class` | `McastServiceImpl.RecoveryThread` |
    `class` | `McastServiceImpl.SenderThread` |

  - ### Field Summary

    Fields
    Modifier and Type | Field | Description
    --- | --- | ---
    `protected InetAddress` | `address` | The multicast address
    `protected boolean` | `doRunReceiver` |
    `protected boolean` | `doRunSender` | Internal flag used for the listen thread that listens to the multicasting socket.
    `protected Object` | `expiredMutex` |
    `protected boolean` | `localLoopbackDisabled` | disable/enable local loopback message
    `protected static int` | `MAX_PACKET_SIZE` |
    `protected InetAddress` | `mcastBindAddress` | bind address
    `protected int` | `mcastSoTimeout` | Read timeout on the mcast socket
    `protected int` | `mcastTTL` | Time to live for the multicast packets that are being sent out
    `protected MemberImpl` | `member` | The local member that we intend to broad cast over and over again
    `protected MessageListener` | `msgservice` | The actual listener for broadcast callbacks
    `protected 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 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 MembershipListener` | `service` | The actual listener, for callback when stuff goes down
    `protected static StringManager` | `sm` |
    `protected MulticastSocket` | `socket` | Socket that we intend to listen to
    `protected int` | `startLevel` |
    `protected long` | `timeToExpiration` | The time it takes for a member to expire.

    - ### Fields inherited from class org.apache.catalina.tribes.membership.MembershipProviderBase

      `executor, membership, membershipListener`

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

    All Methods Instance Methods Concrete Methods
    Modifier and Type | Method | Description
    --- | --- | ---
    `protected void` | `checkExpired()` |
    `Channel` | `getChannel()` |
    `int` | `getRecoveryCounter()` |
    `long` | `getRecoverySleepTime()` |
    `long` | `getServiceStartTime()` |
    `void` | `init()` |
    `boolean` | `isRecoveryEnabled()` |
    `void` | `receive()` | Receive a datagram packet, locking wait
    `void` | `send​(boolean checkexpired)` | Send a ping.
    `void` | `send​(boolean checkexpired, DatagramPacket packet)` |
    `void` | `setChannel​(Channel channel)` |
    `void` | `setRecoveryCounter​(int recoveryCounter)` |
    `void` | `setRecoveryEnabled​(boolean recoveryEnabled)` |
    `void` | `setRecoverySleepTime​(long recoverySleepTime)` |
    `protected void` | `setupSocket()` |
    `void` | `start​(int level)` | Start the service
    `boolean` | `stop​(int level)` | Stops the service.

    - ### Methods inherited from class org.apache.catalina.tribes.membership.MembershipProviderBase

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

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

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

- - ### Field Detail

    - #### MAX_PACKET_SIZE

          protected static final int MAX_PACKET_SIZE

      See Also:
        Constant Field Values

    - #### sm

          protected static final StringManager sm

    - #### doRunSender

          protected volatile boolean doRunSender

      Internal flag used for the listen thread that listens to the multicasting socket.

    - #### doRunReceiver

          protected volatile boolean doRunReceiver

    - #### startLevel

          protected volatile int startLevel

    - #### socket

          protected MulticastSocket socket

      Socket that we intend to listen to

    - #### member

          protected final MemberImpl member

      The local member that we intend to broad cast 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

    - #### service

          protected final MembershipListener service

      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

  - ### Constructor Detail

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

    - #### init

          public void init()
                    throws IOException

      Throws:
        `IOException`

    - #### setupSocket

          protected void setupSocket()
                              throws IOException

      Throws:
        `IOException`

    - #### start

          public void start​(int level)
                     throws IOException

      Start the service
      Parameters:
        `level` - 1 starts the receiver, level 2 starts the sender
      Throws:
        `IOException` - if the service fails to start
        `IllegalStateException` - if the service is already started

    - #### stop

          public boolean stop​(int level)
                       throws IOException

      Stops the service.
      Parameters:
        `level` - Stop status
      Returns:
        `true` if the stop is complete
      Throws:
        `IOException` - if the service fails to disconnect from the sockets

    - #### receive

          public void receive()
                       throws IOException

      Receive a datagram packet, locking wait
      Throws:
        `IOException` - Received failed

    - #### checkExpired

          protected void checkExpired()

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

      Throws:
        `IOException`

    - #### getServiceStartTime

          public long getServiceStartTime()

    - #### getRecoveryCounter

          public int getRecoveryCounter()

    - #### isRecoveryEnabled

          public boolean isRecoveryEnabled()

    - #### getRecoverySleepTime

          public long getRecoverySleepTime()

    - #### getChannel

          public Channel getChannel()

    - #### setChannel

          public void setChannel​(Channel channel)

    - #### setRecoveryCounter

          public void setRecoveryCounter​(int recoveryCounter)

    - #### setRecoveryEnabled

          public void setRecoveryEnabled​(boolean recoveryEnabled)

    - #### setRecoverySleepTime

          public void setRecoverySleepTime​(long recoverySleepTime)