func()

in pkg/adapter/springcloud/servicediscovery/zookeeper/service_listener.go [110:152]


func (asl *applicationServiceListener) handleEvent(children []string) {

	fetchChildren, err := asl.ds.getClient().GetChildren(asl.servicePath)
	if err != nil {
		// todo refactor gost zk, make it return the definite err
		if strings.Contains(err.Error(), "none children") {
			logger.Debugf("%s get nodes from zookeeper fail: %s", common.ZKLogDiscovery, err.Error())
		} else {
			logger.Warnf("%s Error when retrieving service node [%s] in path: %s, Error:%s", common.ZKLogDiscovery, asl.serviceName, asl.servicePath, err.Error())
		}
	}
	discovery := asl.ds
	serviceMap := discovery.getServiceMap()
	instanceMap := discovery.instanceMap

	func() {
		for _, id := range fetchChildren {
			serviceInstance, err := discovery.queryForInstance(asl.serviceName, id)
			if err != nil {
				logger.Errorf("add service: %s, instance: %s has error: ", asl.serviceName, id, err.Error())
				continue
			}
			if instanceMap[id] == nil {
				_, _ = discovery.addServiceInstance(serviceInstance)
			} else {
				_, _ = discovery.updateServiceInstance(serviceInstance)
			}
		}
	}()

	func() {
		serviceInstances := serviceMap[asl.serviceName]
		oldInsId := []string{}
		for _, instance := range serviceInstances {
			oldInsId = append(oldInsId, instance.ID)
		}
		if delInstanceIds := Diff(oldInsId, fetchChildren); delInstanceIds != nil {
			for _, id := range delInstanceIds {
				_, _ = discovery.delServiceInstance(instanceMap[id])
			}
		}
	}()
}