Апач-куритор-лидер: Как избежать отказа от лидерства, не выходя из метода Takeleavership ()?

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

Вопрос

Я пытаюсь осуществить простую систему лидера, основанную на выборах, где моя основная бизнес-логика приложения работает на избранном узле лидера.В рамках приобретения лидерства основная деловая логика начинает различные другие услуги.Я использую рецепт лидервектора куратора Apache для реализации процесса выбора лидера.

В моей системе узел, который выбирается в качестве лидера, держит руководство до тех пор, пока неудача не застраховала другого лидера.Другими словами, как только я получу лидерство, я не хочу его отказаться.

Согласно документации на лидерство куратора, руководство отказывается при возврате метода takeLeadership().Я хочу избежать этого, и я сейчас просто блокирую возвращение, представляя петлю ожидания.

Мой вопрос:

  1. это правильный способ реализации лидерства?
  2. - цикла ожидания (как показано в примере кода ниже) правильный путь для блокировки?

    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();
            }
          }
        }
      }
    }
    
Это было полезно?

Решение

leaderlatchinstead of ждать (), вы можете просто сделать:

Thread.currentThread().join();
.

Но да, это правильно.

BTW - если вы предпочитаете другой метод, вы можете использовать Senlelatch с LechnlatchListener.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top