Куратор LeaderLatch EOFException при выключении - PullRequest
0 голосов
/ 14 апреля 2020

Мы используем LeaderLatch для выбора лидера в моем кластере.

мы используем его так:

leaderLatch.addListener(new LeaderLatchListener() {

                                    @Override
                                    public void isLeader() {
                                      // create leader tasks runner
                                    }

                                    @Override
                                    public void notLeader() {
                                        // shutdown leader tasks runner
                                });

                                leaderLatch.start();
                                leaderLatch.await();

У нас также есть процесс постепенного завершения работы:

                CloseableUtils.closeQuietly(leaderLatch);

теперь проблема в том, что когда я закрываю экземпляр без лидера, метод await() выдает EOFException.

Это код из самого LeaderLatch:

public void await() throws InterruptedException, EOFException
    {
        synchronized(this)
        {
            while ( (state.get() == State.STARTED) && !hasLeadership.get() )
            {
                wait();
            }
        }
        if ( state.get() != State.STARTED )
        {
            throw new EOFException();
        }
    }

, так как у меня есть закрыл его - состояние не НАЧАЛО, а ЗАКРЫТО, поэтому выбрасывается пустое исключение EOFException.

Есть ли лучший способ?

Мы используем curator-recepies-4.2.0

С уважением, Идо

1 Ответ

1 голос
/ 15 апреля 2020

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

...