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

albumenj pushed a commit to branch 3.0-multi-instances
in repository https://gitbox.apache.org/repos/asf/dubbo.git

commit 6c65c312e4b8ba6dc9e403029edef6150efd0d56
Author: Albumen Kevin <[email protected]>
AuthorDate: Tue Aug 31 17:19:40 2021 +0800

    Fix NPE when destroy
---
 .../registry/integration/RegistryProtocol.java     | 30 ++++++++++++++--------
 .../dubbo/rpc/protocol/dubbo/DubboInvoker.java     |  5 +++-
 2 files changed, 23 insertions(+), 12 deletions(-)

diff --git 
a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java
 
b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java
index 6667cdb..9651696 100644
--- 
a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java
+++ 
b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java
@@ -574,11 +574,21 @@ public class RegistryProtocol implements Protocol, 
ScopeModelAware {
 
     @Override
     public void destroy() {
-        List<RegistryProtocolListener> listeners = 
frameworkModel.getExtensionLoader(RegistryProtocolListener.class)
-            .getLoadedExtensionInstances();
-        if (CollectionUtils.isNotEmpty(listeners)) {
-            for (RegistryProtocolListener listener : listeners) {
-                listener.onDestroy();
+        for (ApplicationModel applicationModel : 
frameworkModel.getApplicationModels()) {
+            List<RegistryProtocolListener> listeners = 
applicationModel.getExtensionLoader(RegistryProtocolListener.class)
+                .getLoadedExtensionInstances();
+            if (CollectionUtils.isNotEmpty(listeners)) {
+                for (RegistryProtocolListener listener : listeners) {
+                    listener.onDestroy();
+                }
+            }
+        }
+
+        for (ApplicationModel applicationModel : 
frameworkModel.getApplicationModels()) {
+            if 
(applicationModel.getApplicationEnvironment().getConfiguration().convert(Boolean.class,
 org.apache.dubbo.registry.Constants.ENABLE_CONFIGURATION_LISTEN, true)) {
+                
applicationModel.getExtensionLoader(GovernanceRuleRepository.class).getDefaultExtension()
+                    .removeListener(applicationModel.getApplicationName() + 
CONFIGURATORS_SUFFIX,
+                        getProviderConfigurationListener(applicationModel));
             }
         }
 
@@ -587,12 +597,6 @@ public class RegistryProtocol implements Protocol, 
ScopeModelAware {
             exporter.unexport();
         }
         bounds.clear();
-
-        //TODO  destroy registry protocol
-//        if 
(applicationModel.getEnvironment().getConfiguration().convert(Boolean.class, 
org.apache.dubbo.registry.Constants.ENABLE_CONFIGURATION_LISTEN, true)) {
-//            
frameworkModel.getExtensionLoader(GovernanceRuleRepository.class).getDefaultExtension()
-//                .removeListener(applicationModel.getName() + 
CONFIGURATORS_SUFFIX, providerConfigurationListener);
-//        }
     }
 
     @Override
@@ -742,6 +746,10 @@ public class RegistryProtocol implements Protocol, 
ScopeModelAware {
 
     private ProviderConfigurationListener getProviderConfigurationListener(URL 
url) {
         ApplicationModel applicationModel = 
getApplicationModel(url.getScopeModel());
+        return getProviderConfigurationListener(applicationModel);
+    }
+
+    private ProviderConfigurationListener 
getProviderConfigurationListener(ApplicationModel applicationModel) {
         return 
applicationModel.getBeanFactory().registerBeanIfAbsent(ProviderConfigurationListener.class,
             type -> new ProviderConfigurationListener(applicationModel) );
     }
diff --git 
a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboInvoker.java
 
b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboInvoker.java
index aa3c1fb..a63f56f 100644
--- 
a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboInvoker.java
+++ 
b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboInvoker.java
@@ -69,6 +69,8 @@ public class DubboInvoker<T> extends AbstractInvoker<T> {
 
     private final Set<Invoker<?>> invokers;
 
+    private final int serverShutdownTimeout;
+
     public DubboInvoker(Class<T> serviceType, URL url, ExchangeClient[] 
clients) {
         this(serviceType, url, clients, null);
     }
@@ -79,6 +81,7 @@ public class DubboInvoker<T> extends AbstractInvoker<T> {
         // get version.
         this.version = url.getVersion(DEFAULT_VERSION);
         this.invokers = invokers;
+        this.serverShutdownTimeout = 
ConfigurationUtils.getServerShutdownTimeout(getUrl().getScopeModel());
     }
 
     @Override
@@ -151,7 +154,7 @@ public class DubboInvoker<T> extends AbstractInvoker<T> {
                 }
                 for (ExchangeClient client : clients) {
                     try {
-                        
client.close(ConfigurationUtils.getServerShutdownTimeout(getUrl().getScopeModel()));
+                        client.close(serverShutdownTimeout);
                     } catch (Throwable t) {
                         logger.warn(t.getMessage(), t);
                     }

Reply via email to