关闭时馆长 LeaderLatch EOFException

Curator LeaderLatch EOFException on shutdown

我们使用 LeaderLatch 作为我集群上的 select 领导者。

我们这样使用它:

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

此致, 伊多

await() 的合同是 return 直到它拥有锁。除了抛出异常之外,它无法表明您不拥有锁。我建议您使用需要超时和 returns 布尔值的 await 版本。然后您可以关闭锁并检查 await() 的结果。如果需要,请循环执行此操作。