in pkg/adapter/dubboregistry/remoting/zookeeper/client.go [145:200]
func (z *ZooKeeperClient) HandleZkEvent(s <-chan zk.Event) {
var (
state int
event zk.Event
)
defer func() {
z.Wait.Done()
logger.Infof("zk{path:%v, name:%s} connection goroutine game over.", z.ZkAddrs, z.name)
}()
for {
select {
case <-z.exit:
return
case event = <-s:
logger.Infof(
"client{%s} get a zookeeper event{type:%s, server:%s, path:%s, state:%d-%s, err:%v}",
z.name, event.Type, event.Server, event.Path, event.State, StateToString(event.State), event.Err,
)
switch event.State {
case zk.StateDisconnected:
logger.Warnf("zk{addr:%s} state is StateDisconnected, so close the zk client{name:%s}.", z.ZkAddrs, z.name)
z.Destroy()
return
case zk.StateConnected:
logger.Infof("zkClient{%s} get zk node changed event{path:%s}", z.name, event.Path)
z.eventRegistryLock.RLock()
for path, a := range z.eventRegistry {
if strings.HasPrefix(event.Path, path) {
logger.Infof(
"send event{state:zk.EventNodeDataChange, Path:%s} notify event to path{%s} related listener",
event.Path, path,
)
for _, e := range a {
e <- event
}
}
}
z.eventRegistryLock.RUnlock()
case zk.StateConnecting, zk.StateHasSession:
if state == (int)(zk.StateHasSession) {
continue
}
z.eventRegistryLock.RLock()
if a, ok := z.eventRegistry[event.Path]; ok && 0 < len(a) {
for _, e := range a {
e <- event
}
}
z.eventRegistryLock.RUnlock()
}
state = (int)(event.State)
}
}
}