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); }
