Class LeaderSelector

java.lang.Object
org.apache.curator.framework.recipes.leader.LeaderSelector
All Implemented Interfaces:
Closeable, AutoCloseable

public class LeaderSelector extends Object implements Closeable

Abstraction to select a "leader" amongst multiple contenders in a group of JMVs connected to a Zookeeper cluster. If a group of N thread/processes contends for leadership, one will be assigned leader until it releases leadership at which time another one from the group will be chosen.

Note that this class uses an underlying InterProcessMutex and as a result leader election is "fair" - each user will become leader in the order originally requested (from ZK's point of view).

  • Constructor Details

  • Method Details

    • autoRequeue

      public void autoRequeue()
      By default, when LeaderSelectorListener.takeLeadership(CuratorFramework) returns, this instance is not requeued. Calling this method puts the leader selector into a mode where it will always requeue itself.
    • setId

      public void setId(String id)
      Sets the ID to store for this leader. Will be the value returned when getParticipants() is called. IMPORTANT: must be called prior to start() to have effect.
      Parameters:
      id - ID
    • getId

      public String getId()
      Return the ID that was set via setId(String)
      Returns:
      id
    • start

      public void start()
      Attempt leadership. This attempt is done in the background - i.e. this method returns immediately.

      IMPORTANT: previous versions allowed this method to be called multiple times. This is no longer supported. Use requeue() for this purpose.
    • requeue

      public boolean requeue()
      Re-queue an attempt for leadership. If this instance is already queued, nothing happens and false is returned. If the instance was not queued, it is re-queued and true is returned

      The attempt will finish after session error, leadership release. This method is inherently hard to use as there is no public API to guarantee successful requeue. Try autoRequeue() if you are in doubt.

      Returns:
      true if re-queue is successful
    • close

      public void close()
      Shutdown this selector and remove yourself from the leadership group
      Specified by:
      close in interface AutoCloseable
      Specified by:
      close in interface Closeable
    • getParticipants

      public Collection<Participant> getParticipants() throws Exception

      Returns the set of current participants in the leader selection

      NOTE - this method polls the ZK server. Therefore it can possibly return a value that does not match hasLeadership() as hasLeadership uses a local field of the class.

      Returns:
      participants
      Throws:
      Exception - ZK errors, interruptions, etc.
    • getLeader

      public Participant getLeader() throws Exception

      Return the id for the current leader. If for some reason there is no current leader, a dummy participant is returned.

      NOTE - this method polls the ZK server. Therefore it can possibly return a value that does not match hasLeadership() as hasLeadership uses a local field of the class.

      Returns:
      leader
      Throws:
      Exception - ZK errors, interruptions, etc.
    • hasLeadership

      public boolean hasLeadership()
      Return true if leadership is currently held by this instance
      Returns:
      true/false
    • interruptLeadership

      public void interruptLeadership()
      Attempt to cancel and interrupt the current leadership if this instance has leadership