diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/AbstractRegistryFactory.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/AbstractRegistryFactory.java index f04e6d7acda7..24052b15a234 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/AbstractRegistryFactory.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/AbstractRegistryFactory.java @@ -1,183 +1,183 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.dubbo.registry.support; - -import org.apache.dubbo.common.URL; -import org.apache.dubbo.common.URLBuilder; -import org.apache.dubbo.common.logger.Logger; -import org.apache.dubbo.common.logger.LoggerFactory; -import org.apache.dubbo.registry.NotifyListener; -import org.apache.dubbo.registry.Registry; -import org.apache.dubbo.registry.RegistryFactory; -import org.apache.dubbo.registry.RegistryService; - -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.locks.ReentrantLock; - -import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY; -import static org.apache.dubbo.rpc.cluster.Constants.EXPORT_KEY; -import static org.apache.dubbo.rpc.cluster.Constants.REFER_KEY; - -/** - * AbstractRegistryFactory. (SPI, Singleton, ThreadSafe) - * - * @see org.apache.dubbo.registry.RegistryFactory - */ -public abstract class AbstractRegistryFactory implements RegistryFactory { - - // Log output - private static final Logger LOGGER = LoggerFactory.getLogger(AbstractRegistryFactory.class); - - // The lock for the acquisition process of the registry - private static final ReentrantLock LOCK = new ReentrantLock(); - - // Registry Collection Map - private static final Map REGISTRIES = new HashMap<>(); - - private static final AtomicBoolean destroyed = new AtomicBoolean(false); - - /** - * Get all registries - * - * @return all registries - */ - public static Collection getRegistries() { - return Collections.unmodifiableCollection(REGISTRIES.values()); - } - - public static Registry getRegistry(String key) { - return REGISTRIES.get(key); - } - - /** - * Close all created registries - */ - public static void destroyAll() { - if (!destroyed.compareAndSet(false, true)) { - return; - } - - if (LOGGER.isInfoEnabled()) { - LOGGER.info("Close all registries " + getRegistries()); - } - // Lock up the registry shutdown process - LOCK.lock(); - try { - for (Registry registry : getRegistries()) { - try { - registry.destroy(); - } catch (Throwable e) { - LOGGER.error(e.getMessage(), e); - } - } - REGISTRIES.clear(); - } finally { - // Release the lock - LOCK.unlock(); - } - } - - @Override - public Registry getRegistry(URL url) { - if (destroyed.get()) { - LOGGER.warn("All registry instances have been destroyed, failed to fetch any instance. " + - "Usually, this means no need to try to do unnecessary redundant resource clearance, all registries has been taken care of."); - return DEFAULT_NOP_REGISTRY; - } - - url = URLBuilder.from(url) - .setPath(RegistryService.class.getName()) - .addParameter(INTERFACE_KEY, RegistryService.class.getName()) - .removeParameters(EXPORT_KEY, REFER_KEY) - .build(); - String key = url.toServiceStringWithoutResolving(); - // Lock the registry access process to ensure a single instance of the registry - LOCK.lock(); - try { - Registry registry = REGISTRIES.get(key); - if (registry != null) { - return registry; - } - //create registry by spi/ioc - registry = createRegistry(url); - if (registry == null) { - throw new IllegalStateException("Can not create registry " + url); - } - REGISTRIES.put(key, registry); - return registry; - } finally { - // Release the lock - LOCK.unlock(); - } - } - - protected abstract Registry createRegistry(URL url); - - - private static Registry DEFAULT_NOP_REGISTRY = new Registry() { - @Override - public URL getUrl() { - return null; - } - - @Override - public boolean isAvailable() { - return false; - } - - @Override - public void destroy() { - - } - - @Override - public void register(URL url) { - - } - - @Override - public void unregister(URL url) { - - } - - @Override - public void subscribe(URL url, NotifyListener listener) { - - } - - @Override - public void unsubscribe(URL url, NotifyListener listener) { - - } - - @Override - public List lookup(URL url) { - return null; - } - }; - - // for unit test - public static void clearRegistryNotDestroy() { - REGISTRIES.clear(); - } - -} +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.dubbo.registry.support; + +import org.apache.dubbo.common.URL; +import org.apache.dubbo.common.URLBuilder; +import org.apache.dubbo.common.logger.Logger; +import org.apache.dubbo.common.logger.LoggerFactory; +import org.apache.dubbo.registry.NotifyListener; +import org.apache.dubbo.registry.Registry; +import org.apache.dubbo.registry.RegistryFactory; +import org.apache.dubbo.registry.RegistryService; + +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.locks.ReentrantLock; + +import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY; +import static org.apache.dubbo.rpc.cluster.Constants.EXPORT_KEY; +import static org.apache.dubbo.rpc.cluster.Constants.REFER_KEY; + +/** + * AbstractRegistryFactory. (SPI, Singleton, ThreadSafe) + * + * @see org.apache.dubbo.registry.RegistryFactory + */ +public abstract class AbstractRegistryFactory implements RegistryFactory { + + // Log output + private static final Logger LOGGER = LoggerFactory.getLogger(AbstractRegistryFactory.class); + + // The lock for the acquisition process of the registry + private static final ReentrantLock LOCK = new ReentrantLock(); + + // Registry Collection Map + private static final Map REGISTRIES = new ConcurrentHashMap<>(); + + private static final AtomicBoolean destroyed = new AtomicBoolean(false); + + /** + * Get all registries + * + * @return all registries + */ + public static Collection getRegistries() { + return Collections.unmodifiableCollection(REGISTRIES.values()); + } + + public static Registry getRegistry(String key) { + return REGISTRIES.get(key); + } + + /** + * Close all created registries + */ + public static void destroyAll() { + if (!destroyed.compareAndSet(false, true)) { + return; + } + + if (LOGGER.isInfoEnabled()) { + LOGGER.info("Close all registries " + getRegistries()); + } + // Lock up the registry shutdown process + LOCK.lock(); + try { + for (Registry registry : getRegistries()) { + try { + registry.destroy(); + } catch (Throwable e) { + LOGGER.error(e.getMessage(), e); + } + } + REGISTRIES.clear(); + } finally { + // Release the lock + LOCK.unlock(); + } + } + + @Override + public Registry getRegistry(URL url) { + if (destroyed.get()) { + LOGGER.warn("All registry instances have been destroyed, failed to fetch any instance. " + + "Usually, this means no need to try to do unnecessary redundant resource clearance, all registries has been taken care of."); + return DEFAULT_NOP_REGISTRY; + } + + url = URLBuilder.from(url) + .setPath(RegistryService.class.getName()) + .addParameter(INTERFACE_KEY, RegistryService.class.getName()) + .removeParameters(EXPORT_KEY, REFER_KEY) + .build(); + String key = url.toServiceStringWithoutResolving(); + Registry registry = REGISTRIES.get(key); + if (registry != null) { + return registry; + } + // Lock the registry access process to ensure a single instance of the registry + LOCK.lock(); + try { + //create registry by spi/ioc + registry = createRegistry(url); + if (registry == null) { + throw new IllegalStateException("Can not create registry " + url); + } + REGISTRIES.put(key, registry); + return registry; + } finally { + // Release the lock + LOCK.unlock(); + } + } + + protected abstract Registry createRegistry(URL url); + + + private static Registry DEFAULT_NOP_REGISTRY = new Registry() { + @Override + public URL getUrl() { + return null; + } + + @Override + public boolean isAvailable() { + return false; + } + + @Override + public void destroy() { + + } + + @Override + public void register(URL url) { + + } + + @Override + public void unregister(URL url) { + + } + + @Override + public void subscribe(URL url, NotifyListener listener) { + + } + + @Override + public void unsubscribe(URL url, NotifyListener listener) { + + } + + @Override + public List lookup(URL url) { + return null; + } + }; + + // for unit test + public static void clearRegistryNotDestroy() { + REGISTRIES.clear(); + } + +}