Куратор LeaderLatch EOFException при завершении работы

Мы используем 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

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


person Ido Barash    schedule 14.04.2020    source источник


Ответы (1)


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

person Randgalt    schedule 14.04.2020