最近使用zookeeper实现分布式锁,发现注册的监听事件怎么都监听不到节点删除事件:
@Override
public void process(WatchedEvent event) {
log.info(event.getPath());
log.info(event.getState().name());
log.info(event.getType().name());
if (event.getState() == Event.KeeperState.SyncConnected) {
log.info("连接成功");
//连接完成
connectedSignal.countDown();
}else if (event.getState() == Event.KeeperState.Closed) {
log.info("断开连接");
}else if (event.getType() == Event.EventType.NodeDeleted) {
// && event.getPath().equals(previousLockPath)
log.info(event.getPath());
synchronized (this) {
log.info("监听到有人释放了锁");
// 前一个节点已删除,唤醒等待线程继续尝试获取锁
notifyAll();
}
}
}
这里只演示了process方法。
代码乍一看没毛病吧,是不是非常的逻辑清晰,但是这里有个大坑啊
先给出正确的代码
@Override
public void process(WatchedEvent event) {
log.info(event.getPath());
log.info(event.getState().name());
log.info(event.getType().name());
if (event.getState() == Event.KeeperState.SyncConnected) {
log.info("连接成功");
//连接完成
connectedSignal.countDown();
}
if (event.getState() == Event.KeeperState.Closed) {
log.info("断开连接");
}
if (event.getType() == Event.EventType.NodeDeleted) {
// && event.getPath().equals(previousLockPath)
log.info(event.getPath());
synchronized (this) {
log.info("监听到有人释放了锁");
// 前一个节点已删除,唤醒等待线程继续尝试获取锁
notifyAll();
}
}
}
看到区别了吗,NodeDeleted的那个if分支千万不能写成else if,不然永远进不去这个分支。
就这点问题找了一上午,麻了