关闭时馆长 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()
的结果。如果需要,请循环执行此操作。
我们使用 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()
的结果。如果需要,请循环执行此操作。