Мы используем 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
С уважением, Идо