Apache Curator LeaderSelector:Wie kann man vermeiden, die Führung aufzugeben, indem man die takeLeadership()-Methode nicht verlässt?

StackOverflow https://stackoverflow.com//questions/25030262

Frage

Ich versuche, ein einfaches, auf der Wahl des Anführers basierendes System zu implementieren, bei dem meine Hauptgeschäftslogik der Anwendung auf dem Knoten des gewählten Anführers ausgeführt wird.Im Rahmen der Führungsübernahme startet die Hauptgeschäftslogik verschiedene andere Dienstleistungen.Ich verwende das Apache Curator LeaderSelector-Rezept, um den Leader-Auswahlprozess zu implementieren.

In meinem System behält der Knoten, der als Anführer ausgewählt wird, die Führung, bis ein Fehler die Auswahl eines anderen Anführers erzwingt.Mit anderen Worten: Sobald ich die Führung übernommen habe, möchte ich sie nicht mehr abgeben.

Laut der Dokumentation von Curator LeaderSelection wird die Führung abgegeben, wenn die takeLeadership() Methode gibt zurück.Ich möchte es vermeiden und blockiere im Moment einfach die Rückgabe, indem ich eine Warteschleife einführe.

Meine Frage ist:

  1. Ist das der richtige Weg, Führung umzusetzen?
  2. Ist die Warteschleife (wie im Codebeispiel unten gezeigt) der richtige Weg zum Blockieren?

    public class MainBusinessLogic extends LeaderSelectorListenerAdapter {      
      private static final String ZK_PATH_LEADER_ROOT = "/some-path";
      private final CuratorFramework client;
      private final LeaderSelector leaderSelector;
    
      public MainBusinessLogic() {
        client = CuratorService.getInstance().getCuratorFramework();
        leaderSelector = new LeaderSelector(client, ZK_PATH_LEADER_ROOT, this);
        leaderSelector.autoRequeue();
        leaderSelector.start();
      }
    
      @Override
      public void takeLeadership(CuratorFramework client) throws IOException {
        // Start various other internal services...
        ServiceA serviceA = new ServiceA(...);
        ServiceB serviceB = new ServiceB(...);
        ...
        ...
        serviceA.start();
        serviceB.start();
        ...
        ...
    
        // We are done but need to keep leadership to this instance, else all the business
        // logic and services will start on another node.
        // Is this the right way to prevent relinquishing leadership???
        while (true) {
          synchronized (this) {
            try {
              wait();
            } catch (InterruptedException e) {
              e.printStackTrace();
            }
          }
        }
      }
    }
    
War es hilfreich?

Lösung

LeaderLatchAnstelle von wait() können Sie einfach Folgendes tun:

Thread.currentThread().join();

Aber ja, das ist richtig.

Übrigens – wenn Sie eine andere Methode bevorzugen, können Sie LeaderLatch mit einem LeaderLatchListener verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top