diff --git a/registry/base_registry.go b/registry/base_registry.go
index 04694da25a38899cfc6f56a8092a15547f142e9c..cfc8f39bbc502db813afea02b82896d39503ebdd 100644
--- a/registry/base_registry.go
+++ b/registry/base_registry.go
@@ -178,7 +178,10 @@ func (r *BaseRegistry) RestartCallBack() bool {
 		}
 		logger.Infof("success to re-register service :%v", confIf.Key())
 	}
-	r.facadeBasedRegistry.InitListeners()
+
+	if flag {
+		r.facadeBasedRegistry.InitListeners()
+	}
 
 	return flag
 }
diff --git a/registry/zookeeper/listener.go b/registry/zookeeper/listener.go
index 5f398047a66a8de35857029207798b30ef5369f7..45ffa31722fa5232b6b6e3c00250942e277f9abc 100644
--- a/registry/zookeeper/listener.go
+++ b/registry/zookeeper/listener.go
@@ -38,7 +38,6 @@ import (
 // RegistryDataListener ...
 type RegistryDataListener struct {
 	subscribed map[*common.URL]config_center.ConfigurationListener
-	listener   config_center.ConfigurationListener
 	mutex      sync.Mutex
 	closed     bool
 }
diff --git a/registry/zookeeper/registry.go b/registry/zookeeper/registry.go
index 9a59d811622d4d7bd6d9ac90493cd1f408a88b44..37cf20149dd9f5b8c18ffd855d045ae9e24a9770 100644
--- a/registry/zookeeper/registry.go
+++ b/registry/zookeeper/registry.go
@@ -120,8 +120,12 @@ func newMockZkRegistry(url *common.URL, opts ...zookeeper.Option) (*zk.TestClust
 
 func (r *zkRegistry) InitListeners() {
 	r.listener = zookeeper.NewZkEventListener(r.client)
-
-	r.dataListener = NewRegistryDataListener()
+	recoverd := r.dataListener.subscribed
+	newDataListener := NewRegistryDataListener()
+	for url, _ := range recoverd {
+		newDataListener.SubscribeURL(url, NewRegistryConfigurationListener(r.client, r))
+	}
+	r.dataListener = newDataListener
 }
 
 func (r *zkRegistry) CreatePath(path string) error {
@@ -174,8 +178,9 @@ func (r *zkRegistry) registerTempZookeeperNode(root string, node string) error {
 	}
 	zkPath, err = r.client.RegisterTemp(root, node)
 	if err != nil {
-		if err == zk.ErrNodeExists {
-			logger.Warnf("RegisterTempNode(root{%s}, node{%s}) = error{%v}", root, node, perrors.WithStack(err))
+		if perrors.Cause(err) == zk.ErrNodeExists {
+			logger.Warnf("RegisterTempNode(root{%s}, node{%s}) = error{%v}, ignore!", root, node, perrors.WithStack(err))
+			return nil
 		} else {
 			logger.Errorf("RegisterTempNode(root{%s}, node{%s}) = error{%v}", root, node, perrors.WithStack(err))
 		}
@@ -222,6 +227,5 @@ func (r *zkRegistry) getListener(conf *common.URL) (*RegistryConfigurationListen
 	go r.listener.ListenServiceEvent(fmt.Sprintf("/dubbo/%s/"+constant.DEFAULT_CATEGORY, url.QueryEscape(conf.Service())), r.dataListener)
 
 
-
 	return zkListener, nil
 }