diff --git a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ApplicationModel.java b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ApplicationModel.java index 403814609b2..1c415029101 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ApplicationModel.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ApplicationModel.java @@ -25,6 +25,7 @@ import org.apache.dubbo.config.context.ConfigManager; import java.util.Collection; +import java.util.Optional; import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; @@ -112,6 +113,15 @@ public static String getApplication() { return application == null ? getName() : application; } + @Deprecated + public static String tryGetApplication() { + if (application != null) { + return application; + } + Optional appCfgOptional = getConfigManager().getApplication(); + return appCfgOptional.isPresent() ? appCfgOptional.get().getName() : null; + } + // Currently used by UT. @Deprecated public static void setApplication(String application) { 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 987aba7d602..1fe263c1cd5 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 @@ -572,8 +572,13 @@ public void destroy() { } bounds.clear(); + String application = ApplicationModel.tryGetApplication(); + if (application == null) { + // already removed + return; + } ExtensionLoader.getExtensionLoader(GovernanceRuleRepository.class).getDefaultExtension() - .removeListener(ApplicationModel.getApplication() + CONFIGURATORS_SUFFIX, providerConfigurationListener); + .removeListener(application + CONFIGURATORS_SUFFIX, providerConfigurationListener); } @Override @@ -688,7 +693,8 @@ public synchronized void doOverrideIfNecessary() { return; } //The current, may have been merged many times - URL currentUrl = exporter.getInvoker().getUrl(); + Invoker exporterInvoker = exporter.getInvoker(); + URL currentUrl = exporterInvoker == null ? null : exporterInvoker.getUrl(); //Merged with this configuration URL newUrl = getConfiguredInvokerUrl(configurators, originUrl); newUrl = getConfiguredInvokerUrl(providerConfigurationListener.getConfigurators(), newUrl);