This is an automated email from the ASF dual-hosted git repository.

yangyang pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/dubbo-rust.git


The following commit(s) were added to refs/heads/main by this push:
     new 4aabde8  Imp: remove GAT in the Registry trait‘s definition (#117)
4aabde8 is described below

commit 4aabde88e718c04bd0e6cf87455f3b010655d423
Author: 毛文超 <[email protected]>
AuthorDate: Thu Feb 23 23:42:56 2023 +0800

    Imp: remove GAT in the Registry trait‘s definition (#117)
    
    Close #115
---
 dubbo/src/cluster/directory.rs               |  4 ++--
 dubbo/src/registry/memory_registry.rs        |  8 +++-----
 dubbo/src/registry/mod.rs                    | 22 +++++++++++++--------
 dubbo/src/registry/types.rs                  | 10 +++++-----
 registry-nacos/src/nacos_registry.rs         | 12 +++++++-----
 registry-zookeeper/src/zookeeper_registry.rs | 29 +++++++++++-----------------
 6 files changed, 42 insertions(+), 43 deletions(-)

diff --git a/dubbo/src/cluster/directory.rs b/dubbo/src/cluster/directory.rs
index 02946a9..2879de4 100644
--- a/dubbo/src/cluster/directory.rs
+++ b/dubbo/src/cluster/directory.rs
@@ -136,9 +136,9 @@ impl Directory for RegistryDirectory {
             .expect("msg")
             .subscribe(
                 url,
-                MemoryNotifyListener {
+                Arc::new(MemoryNotifyListener {
                     service_instances: Arc::clone(&self.service_instances),
-                },
+                }),
             )
             .expect("subscribe");
 
diff --git a/dubbo/src/registry/memory_registry.rs 
b/dubbo/src/registry/memory_registry.rs
index 61d3e41..b41a0e0 100644
--- a/dubbo/src/registry/memory_registry.rs
+++ b/dubbo/src/registry/memory_registry.rs
@@ -25,7 +25,7 @@ use tracing::debug;
 
 use crate::common::url::Url;
 
-use super::{NotifyListener, Registry};
+use super::{NotifyListener, Registry, RegistryNotifyListener};
 
 // 从url中获取服务注册的元数据
 /// rawURL = fmt.Sprintf("%s://%s%s?%s", c.Protocol, host, c.Path, s)
@@ -47,8 +47,6 @@ impl MemoryRegistry {
 }
 
 impl Registry for MemoryRegistry {
-    type NotifyListener = MemoryNotifyListener;
-
     fn register(&mut self, mut url: Url) -> Result<(), crate::StdError> {
         // define provider label: ${registry.group}/${service_name}/provider
         let registry_group = match url.get_param(REGISTRY_GROUP_KEY) {
@@ -91,7 +89,7 @@ impl Registry for MemoryRegistry {
     fn subscribe(
         &self,
         url: crate::common::url::Url,
-        listener: Self::NotifyListener,
+        listener: RegistryNotifyListener,
     ) -> Result<(), crate::StdError> {
         todo!()
     }
@@ -99,7 +97,7 @@ impl Registry for MemoryRegistry {
     fn unsubscribe(
         &self,
         url: crate::common::url::Url,
-        listener: Self::NotifyListener,
+        listener: RegistryNotifyListener,
     ) -> Result<(), crate::StdError> {
         todo!()
     }
diff --git a/dubbo/src/registry/mod.rs b/dubbo/src/registry/mod.rs
index 6352cf1..4483588 100644
--- a/dubbo/src/registry/mod.rs
+++ b/dubbo/src/registry/mod.rs
@@ -21,18 +21,24 @@ pub mod memory_registry;
 pub mod protocol;
 pub mod types;
 
-use std::fmt::{Debug, Formatter};
+use std::{
+    fmt::{Debug, Formatter},
+    sync::Arc,
+};
 
-use crate::{common::url::Url, registry::memory_registry::MemoryNotifyListener};
+use crate::common::url::Url;
 
+pub type RegistryNotifyListener = Arc<dyn NotifyListener + Send + Sync + 
'static>;
 pub trait Registry {
-    type NotifyListener;
-
     fn register(&mut self, url: Url) -> Result<(), crate::StdError>;
     fn unregister(&mut self, url: Url) -> Result<(), crate::StdError>;
 
-    fn subscribe(&self, url: Url, listener: Self::NotifyListener) -> 
Result<(), crate::StdError>;
-    fn unsubscribe(&self, url: Url, listener: Self::NotifyListener) -> 
Result<(), crate::StdError>;
+    fn subscribe(&self, url: Url, listener: RegistryNotifyListener) -> 
Result<(), crate::StdError>;
+    fn unsubscribe(
+        &self,
+        url: Url,
+        listener: RegistryNotifyListener,
+    ) -> Result<(), crate::StdError>;
 }
 
 pub trait NotifyListener {
@@ -47,7 +53,7 @@ pub struct ServiceEvent {
     pub service: Vec<Url>,
 }
 
-pub type BoxRegistry = Box<dyn Registry<NotifyListener = MemoryNotifyListener> 
+ Send + Sync>;
+pub type BoxRegistry = Box<dyn Registry + Send + Sync>;
 
 impl Debug for BoxRegistry {
     fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
@@ -57,7 +63,7 @@ impl Debug for BoxRegistry {
 
 #[derive(Default)]
 pub struct RegistryWrapper {
-    pub registry: Option<Box<dyn Registry<NotifyListener = 
MemoryNotifyListener>>>,
+    pub registry: Option<Box<dyn Registry>>,
 }
 
 impl Clone for RegistryWrapper {
diff --git a/dubbo/src/registry/types.rs b/dubbo/src/registry/types.rs
index 77d253a..8b97864 100644
--- a/dubbo/src/registry/types.rs
+++ b/dubbo/src/registry/types.rs
@@ -25,10 +25,12 @@ use tracing::info;
 
 use crate::{
     common::url::Url,
-    registry::{memory_registry::MemoryNotifyListener, BoxRegistry, Registry},
+    registry::{BoxRegistry, Registry},
     StdError,
 };
 
+use super::RegistryNotifyListener;
+
 pub type SafeRegistry = Arc<Mutex<BoxRegistry>>;
 pub type Registries = Arc<Mutex<HashMap<String, SafeRegistry>>>;
 
@@ -66,8 +68,6 @@ impl RegistriesOperation for Registries {
 }
 
 impl Registry for SafeRegistry {
-    type NotifyListener = MemoryNotifyListener;
-
     fn register(&mut self, url: Url) -> Result<(), StdError> {
         info!("register {}.", url);
         self.lock().unwrap().register(url).expect("registry err.");
@@ -79,12 +79,12 @@ impl Registry for SafeRegistry {
         Ok(())
     }
 
-    fn subscribe(&self, url: Url, listener: Self::NotifyListener) -> 
Result<(), StdError> {
+    fn subscribe(&self, url: Url, listener: RegistryNotifyListener) -> 
Result<(), StdError> {
         self.lock().unwrap().register(url).expect("registry err.");
         Ok(())
     }
 
-    fn unsubscribe(&self, url: Url, listener: Self::NotifyListener) -> 
Result<(), StdError> {
+    fn unsubscribe(&self, url: Url, listener: RegistryNotifyListener) -> 
Result<(), StdError> {
         self.lock().unwrap().register(url).expect("registry err.");
         Ok(())
     }
diff --git a/registry-nacos/src/nacos_registry.rs 
b/registry-nacos/src/nacos_registry.rs
index 042d6f2..888382f 100644
--- a/registry-nacos/src/nacos_registry.rs
+++ b/registry-nacos/src/nacos_registry.rs
@@ -23,7 +23,7 @@ use std::{
 use anyhow::anyhow;
 use dubbo::{
     common::url::Url,
-    registry::{NotifyListener, Registry, ServiceEvent},
+    registry::{NotifyListener, Registry, RegistryNotifyListener, ServiceEvent},
 };
 use nacos_sdk::api::naming::{NamingService, NamingServiceBuilder, 
ServiceInstance};
 use tracing::{error, info, warn};
@@ -139,8 +139,6 @@ impl NacosRegistry {
 }
 
 impl Registry for NacosRegistry {
-    type NotifyListener = Arc<dyn NotifyListener + Sync + Send + 'static>;
-
     fn register(&mut self, url: Url) -> Result<(), dubbo::StdError> {
         let side = url.get_param(SIDE_KEY).unwrap_or_default();
         let register_consumer = url
@@ -205,7 +203,7 @@ impl Registry for NacosRegistry {
         Ok(())
     }
 
-    fn subscribe(&self, url: Url, listener: Self::NotifyListener) -> 
Result<(), dubbo::StdError> {
+    fn subscribe(&self, url: Url, listener: RegistryNotifyListener) -> 
Result<(), dubbo::StdError> {
         let service_name = NacosServiceName::new(&url);
         let url_str = url.to_url();
 
@@ -252,7 +250,11 @@ impl Registry for NacosRegistry {
         Ok(())
     }
 
-    fn unsubscribe(&self, url: Url, listener: Self::NotifyListener) -> 
Result<(), dubbo::StdError> {
+    fn unsubscribe(
+        &self,
+        url: Url,
+        listener: RegistryNotifyListener,
+    ) -> Result<(), dubbo::StdError> {
         let service_name = NacosServiceName::new(&url);
         let url_str = url.to_url();
         info!("unsubscribe: {}", &url_str);
diff --git a/registry-zookeeper/src/zookeeper_registry.rs 
b/registry-zookeeper/src/zookeeper_registry.rs
index a9fc9ec..b31d25c 100644
--- a/registry-zookeeper/src/zookeeper_registry.rs
+++ b/registry-zookeeper/src/zookeeper_registry.rs
@@ -37,9 +37,8 @@ use dubbo::{
         url::Url,
     },
     registry::{
-        integration::ClusterRegistryIntegration,
-        memory_registry::{MemoryNotifyListener, MemoryRegistry},
-        NotifyListener, Registry, ServiceEvent,
+        integration::ClusterRegistryIntegration, 
memory_registry::MemoryRegistry, NotifyListener,
+        Registry, RegistryNotifyListener, ServiceEvent,
     },
     StdError,
 };
@@ -61,7 +60,7 @@ impl Watcher for LoggingWatcher {
 pub struct ZookeeperRegistry {
     root_path: String,
     zk_client: Arc<ZooKeeper>,
-    listeners: RwLock<HashMap<String, Arc<<ZookeeperRegistry as 
Registry>::NotifyListener>>>,
+    listeners: RwLock<HashMap<String, RegistryNotifyListener>>,
     memory_registry: Arc<Mutex<MemoryRegistry>>,
 }
 
@@ -103,7 +102,7 @@ impl ZookeeperRegistry {
         &self,
         path: String,
         service_name: String,
-        listener: Arc<<ZookeeperRegistry as Registry>::NotifyListener>,
+        listener: RegistryNotifyListener,
     ) -> ServiceInstancesChangedListener {
         let mut service_names = HashSet::new();
         service_names.insert(service_name.clone());
@@ -240,8 +239,6 @@ impl Default for ZookeeperRegistry {
 }
 
 impl Registry for ZookeeperRegistry {
-    type NotifyListener = MemoryNotifyListener;
-
     fn register(&mut self, url: Url) -> Result<(), StdError> {
         println!("register url: {}", url);
         let zk_path = format!(
@@ -268,7 +265,7 @@ impl Registry for ZookeeperRegistry {
     }
 
     // for consumer to find the changes of providers
-    fn subscribe(&self, url: Url, listener: Self::NotifyListener) -> 
Result<(), StdError> {
+    fn subscribe(&self, url: Url, listener: RegistryNotifyListener) -> 
Result<(), StdError> {
         let service_name = url.get_service_name();
         let zk_path = format!("/{}/{}/{}", DUBBO_KEY, &service_name, 
PROVIDERS_KEY);
         if self
@@ -281,17 +278,13 @@ impl Registry for ZookeeperRegistry {
             return Ok(());
         }
 
-        let arc_listener = Arc::new(listener);
         self.listeners
             .write()
             .unwrap()
-            .insert(service_name.to_string(), Arc::clone(&arc_listener));
+            .insert(service_name.to_string(), listener.clone());
 
-        let zk_listener = self.create_listener(
-            zk_path.clone(),
-            service_name.to_string(),
-            Arc::clone(&arc_listener),
-        );
+        let zk_listener =
+            self.create_listener(zk_path.clone(), service_name.to_string(), 
listener.clone());
 
         let zk_changed_paths = self.zk_client.get_children_w(&zk_path, 
zk_listener);
         let result = match zk_changed_paths {
@@ -312,7 +305,7 @@ impl Registry for ZookeeperRegistry {
                 .collect(),
         };
         info!("notifying {}->{:?}", service_name, result);
-        arc_listener.notify(ServiceEvent {
+        listener.notify(ServiceEvent {
             key: service_name,
             action: String::from("ADD"),
             service: result,
@@ -320,7 +313,7 @@ impl Registry for ZookeeperRegistry {
         Ok(())
     }
 
-    fn unsubscribe(&self, url: Url, listener: Self::NotifyListener) -> 
Result<(), StdError> {
+    fn unsubscribe(&self, url: Url, listener: RegistryNotifyListener) -> 
Result<(), StdError> {
         todo!()
     }
 }
@@ -329,7 +322,7 @@ pub struct ServiceInstancesChangedListener {
     zk_client: Arc<ZooKeeper>,
     path: String,
     service_name: String,
-    listener: Arc<MemoryNotifyListener>,
+    listener: RegistryNotifyListener,
 }
 
 impl Watcher for ServiceInstancesChangedListener {

Reply via email to