我们使用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
你好,伊藤
发布于 2020-04-14 23:25:46
await()的合同是在拥有锁之前不返回。除了抛出异常之外,它无法指示您不拥有该锁。我建议您使用“等待”的版本,该版本需要超时并返回布尔值。然后您可以关闭锁并检查await()的结果。如果你愿意的话,可以在一个循环中完成这个任务。
https://stackoverflow.com/questions/61205855
复制相似问题