This is an automated email from the ASF dual-hosted git repository.
albumenj pushed a commit to branch 3.2
in repository https://gitbox.apache.org/repos/asf/dubbo.git
The following commit(s) were added to refs/heads/3.2 by this push:
new d2eb0ef458 [ISSUE #11294] Optimize ConcurrentHashMap#computeIfAbsent
have performance problem in jdk1.8 (#11326)
d2eb0ef458 is described below
commit d2eb0ef4589b956d1648d6809cffd0a9966f5eb6
Author: mxsm <[email protected]>
AuthorDate: Thu Jan 19 23:07:12 2023 +0800
[ISSUE #11294] Optimize ConcurrentHashMap#computeIfAbsent have performance
problem in jdk1.8 (#11326)
---
.../dubbo/rpc/cluster/CacheableRouterFactory.java | 3 +-
.../cluster/loadbalance/RoundRobinLoadBalance.java | 9 ++--
.../loadbalance/ShortestResponseLoadBalance.java | 3 +-
.../router/mesh/util/MeshRuleDispatcher.java | 8 +--
.../cluster/router/script/ScriptStateRouter.java | 15 +++---
.../router/state/CacheableStateRouterFactory.java | 3 +-
.../common/beans/factory/ScopeBeanFactory.java | 6 +--
.../org/apache/dubbo/common/bytecode/Wrapper.java | 16 +++---
.../dubbo/common/cache/FileCacheStoreFactory.java | 8 +--
.../AbstractDynamicConfigurationFactory.java | 6 +--
.../apache/dubbo/common/convert/ConverterUtil.java | 9 ++--
.../apache/dubbo/common/logger/LoggerFactory.java | 9 ++--
.../collector/stat/MetricsStatComposite.java | 49 +++++++++++--------
.../common/store/support/SimpleDataStore.java | 5 +-
.../manager/DefaultExecutorRepository.java | 5 +-
.../common/url/component/ServiceConfigURL.java | 24 ++++-----
.../dubbo/common/utils/ConcurrentHashMapUtils.java | 57 ++++++++++++++++++++++
.../org/apache/dubbo/config/AbstractConfig.java | 10 ++--
.../rpc/model/FrameworkServiceRepository.java | 5 +-
.../dubbo/rpc/model/ModuleServiceRepository.java | 9 ++--
.../common/utils/ConcurrentHashMapUtilsTest.java | 31 ++++++------
.../dubbo/config/bootstrap/DubboBootstrap.java | 12 +++--
.../dubbo/config/utils/SimpleReferenceCache.java | 13 ++---
.../spring/reference/ReferenceBeanManager.java | 12 +++--
.../config/spring/AbstractRegistryService.java | 7 +--
.../dubbo/config/spring/SimpleRegistryService.java | 21 ++++----
.../support/nacos/NacosDynamicConfiguration.java | 7 +--
.../support/zookeeper/CacheListener.java | 6 ++-
.../store/zookeeper/ZookeeperMetadataReport.java | 6 ++-
.../collector/AggregateMetricsCollector.java | 39 +++++++--------
.../dubbo/monitor/support/MonitorFilter.java | 3 +-
.../apache/dubbo/monitor/dubbo/DubboMonitor.java | 3 +-
.../client/AbstractServiceDiscoveryFactory.java | 3 +-
.../client/ReflectionBasedServiceDiscovery.java | 3 +-
.../registry/client/ServiceDiscoveryRegistry.java | 3 +-
.../client/ServiceDiscoveryRegistryDirectory.java | 6 ++-
.../DefaultMigrationAddressComparator.java | 6 ++-
.../client/migration/MigrationRuleListener.java | 6 ++-
.../support/CacheableFailbackRegistry.java | 14 +++---
.../multiple/MultipleServiceDiscovery.java | 6 ++-
.../registry/nacos/NacosNamingServiceWrapper.java | 16 +++---
.../registry/zookeeper/ZookeeperRegistry.java | 9 ++--
.../MultiplexProtocolConnectionManager.java | 3 +-
.../exchange/PortUnificationExchanger.java | 5 +-
.../dubbo/remoting/transport/CodecSupport.java | 6 ++-
.../zookeeper/AbstractZookeeperClient.java | 9 ++--
.../java/org/apache/dubbo/rpc/AdaptiveMetrics.java | 32 ++++++------
.../main/java/org/apache/dubbo/rpc/RpcStatus.java | 11 +++--
.../apache/dubbo/rpc/filter/AccessLogFilter.java | 8 +--
.../dubbo/rpc/protocol/AbstractProtocol.java | 3 +-
.../dubbo/rpc/protocol/grpc/GrpcProtocol.java | 21 ++++----
.../dubbo/rpc/protocol/rest/RestProtocol.java | 8 +--
.../rpc/protocol/tri/SingleProtobufUtils.java | 4 +-
.../xds/util/protocol/AbstractProtocol.java | 3 +-
.../rpc/cluster/router/xds/EdsEndpointManager.java | 5 +-
.../cluster/router/xds/RdsRouteRuleManager.java | 8 +--
56 files changed, 378 insertions(+), 239 deletions(-)
diff --git
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/CacheableRouterFactory.java
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/CacheableRouterFactory.java
index 4d4b9eb5e0..c3a69374df 100644
---
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/CacheableRouterFactory.java
+++
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/CacheableRouterFactory.java
@@ -17,6 +17,7 @@
package org.apache.dubbo.rpc.cluster;
import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
@@ -30,7 +31,7 @@ public abstract class CacheableRouterFactory implements
RouterFactory {
@Override
public Router getRouter(URL url) {
- return routerMap.computeIfAbsent(url.getServiceKey(), k ->
createRouter(url));
+ return ConcurrentHashMapUtils.computeIfAbsent(routerMap,
url.getServiceKey(), k -> createRouter(url));
}
protected abstract Router createRouter(URL url);
diff --git
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/loadbalance/RoundRobinLoadBalance.java
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/loadbalance/RoundRobinLoadBalance.java
index b3e5adb9e6..4d4f7bfbf2 100644
---
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/loadbalance/RoundRobinLoadBalance.java
+++
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/loadbalance/RoundRobinLoadBalance.java
@@ -17,6 +17,7 @@
package org.apache.dubbo.rpc.cluster.loadbalance;
import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.rpc.Invocation;
import org.apache.dubbo.rpc.Invoker;
@@ -35,6 +36,8 @@ public class RoundRobinLoadBalance extends
AbstractLoadBalance {
private static final int RECYCLE_PERIOD = 60000;
+ private ConcurrentMap<String, ConcurrentMap<String, WeightedRoundRobin>>
methodWeightMap = new ConcurrentHashMap<>();
+
protected static class WeightedRoundRobin {
private int weight;
private AtomicLong current = new AtomicLong(0);
@@ -66,8 +69,6 @@ public class RoundRobinLoadBalance extends
AbstractLoadBalance {
}
}
- private ConcurrentMap<String, ConcurrentMap<String, WeightedRoundRobin>>
methodWeightMap = new ConcurrentHashMap<String, ConcurrentMap<String,
WeightedRoundRobin>>();
-
/**
* get invoker addr list cached for specified invocation
* <p>
@@ -89,7 +90,7 @@ public class RoundRobinLoadBalance extends
AbstractLoadBalance {
@Override
protected <T> Invoker<T> doSelect(List<Invoker<T>> invokers, URL url,
Invocation invocation) {
String key = invokers.get(0).getUrl().getServiceKey() + "." +
invocation.getMethodName();
- ConcurrentMap<String, WeightedRoundRobin> map =
methodWeightMap.computeIfAbsent(key, k -> new ConcurrentHashMap<>());
+ ConcurrentMap<String, WeightedRoundRobin> map =
ConcurrentHashMapUtils.computeIfAbsent(methodWeightMap, key, k -> new
ConcurrentHashMap<>());
int totalWeight = 0;
long maxCurrent = Long.MIN_VALUE;
long now = System.currentTimeMillis();
@@ -98,7 +99,7 @@ public class RoundRobinLoadBalance extends
AbstractLoadBalance {
for (Invoker<T> invoker : invokers) {
String identifyString = invoker.getUrl().toIdentityString();
int weight = getWeight(invoker, invocation);
- WeightedRoundRobin weightedRoundRobin =
map.computeIfAbsent(identifyString, k -> {
+ WeightedRoundRobin weightedRoundRobin =
ConcurrentHashMapUtils.computeIfAbsent(map, identifyString, k -> {
WeightedRoundRobin wrr = new WeightedRoundRobin();
wrr.setWeight(weight);
return wrr;
diff --git
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/loadbalance/ShortestResponseLoadBalance.java
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/loadbalance/ShortestResponseLoadBalance.java
index 37717daec2..906c49642f 100644
---
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/loadbalance/ShortestResponseLoadBalance.java
+++
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/loadbalance/ShortestResponseLoadBalance.java
@@ -18,6 +18,7 @@ package org.apache.dubbo.rpc.cluster.loadbalance;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.threadpool.manager.FrameworkExecutorRepository;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.rpc.Invocation;
import org.apache.dubbo.rpc.Invoker;
import org.apache.dubbo.rpc.RpcStatus;
@@ -116,7 +117,7 @@ public class ShortestResponseLoadBalance extends
AbstractLoadBalance implements
for (int i = 0; i < length; i++) {
Invoker<T> invoker = invokers.get(i);
RpcStatus rpcStatus = RpcStatus.getStatus(invoker.getUrl(),
invocation.getMethodName());
- SlideWindowData slideWindowData =
methodMap.computeIfAbsent(rpcStatus, SlideWindowData::new);
+ SlideWindowData slideWindowData =
ConcurrentHashMapUtils.computeIfAbsent(methodMap, rpcStatus,
SlideWindowData::new);
// Calculate the estimated response time from the product of
active connections and succeeded average elapsed time.
long estimateResponse = slideWindowData.getEstimateResponse();
diff --git
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/mesh/util/MeshRuleDispatcher.java
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/mesh/util/MeshRuleDispatcher.java
index 03f68ddbab..713c44bd1b 100644
---
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/mesh/util/MeshRuleDispatcher.java
+++
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/mesh/util/MeshRuleDispatcher.java
@@ -20,12 +20,14 @@ package org.apache.dubbo.rpc.cluster.router.mesh.util;
import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
import org.apache.dubbo.common.logger.LoggerFactory;
import org.apache.dubbo.common.utils.CollectionUtils;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.common.utils.ConcurrentHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
import static
org.apache.dubbo.common.constants.LoggerCodeConstants.CLUSTER_NO_RULE_LISTENER;
@@ -34,7 +36,7 @@ public class MeshRuleDispatcher {
private static final ErrorTypeAwareLogger logger =
LoggerFactory.getErrorTypeAwareLogger(MeshRuleDispatcher.class);
private final String appName;
- private final Map<String, Set<MeshRuleListener>> listenerMap = new
ConcurrentHashMap<>();
+ private final ConcurrentMap<String, Set<MeshRuleListener>> listenerMap =
new ConcurrentHashMap<>();
public MeshRuleDispatcher(String appName) {
this.appName = appName;
@@ -57,7 +59,7 @@ public class MeshRuleDispatcher {
listener.onRuleChange(appName, entry.getValue());
}
} else {
- logger.warn(CLUSTER_NO_RULE_LISTENER,"Receive mesh rule
but none of listener has been registered","","Receive rule but none of listener
has been registered. Maybe type not matched. Rule Type: " + ruleType);
+ logger.warn(CLUSTER_NO_RULE_LISTENER, "Receive mesh rule
but none of listener has been registered", "", "Receive rule but none of
listener has been registered. Maybe type not matched. Rule Type: " + ruleType);
}
}
// clear rule listener not being notified in this time
@@ -75,7 +77,7 @@ public class MeshRuleDispatcher {
if (listener == null) {
return;
}
- listenerMap.computeIfAbsent(listener.ruleSuffix(), (k) -> new
ConcurrentHashSet<>())
+ ConcurrentHashMapUtils.computeIfAbsent(listenerMap,
listener.ruleSuffix(), (k) -> new ConcurrentHashSet<>())
.add(listener);
}
diff --git
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/script/ScriptStateRouter.java
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/script/ScriptStateRouter.java
index 174ecb9e0d..ac01380be1 100644
---
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/script/ScriptStateRouter.java
+++
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/script/ScriptStateRouter.java
@@ -19,6 +19,7 @@ package org.apache.dubbo.rpc.cluster.router.script;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
import org.apache.dubbo.common.logger.LoggerFactory;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.common.utils.Holder;
import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.rpc.Invocation;
@@ -45,8 +46,8 @@ import java.security.cert.Certificate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
-import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
import java.util.stream.Collectors;
import static
org.apache.dubbo.common.constants.LoggerCodeConstants.CLUSTER_SCRIPT_EXCEPTION;
@@ -64,7 +65,7 @@ public class ScriptStateRouter<T> extends
AbstractStateRouter<T> {
private static final int SCRIPT_ROUTER_DEFAULT_PRIORITY = 0;
private static final ErrorTypeAwareLogger logger =
LoggerFactory.getErrorTypeAwareLogger(ScriptStateRouter.class);
- private static final Map<String, ScriptEngine> ENGINES = new
ConcurrentHashMap<>();
+ private static final ConcurrentMap<String, ScriptEngine> ENGINES = new
ConcurrentHashMap<>();
private final ScriptEngine engine;
@@ -93,8 +94,8 @@ public class ScriptStateRouter<T> extends
AbstractStateRouter<T> {
Compilable compilable = (Compilable) engine;
function = compilable.compile(rule);
} catch (ScriptException e) {
- logger.error(CLUSTER_SCRIPT_EXCEPTION,"script route rule
invalid","","script route error, rule has been ignored. rule: " + rule +
- ", url: " + RpcContext.getServiceContext().getUrl(),e);
+ logger.error(CLUSTER_SCRIPT_EXCEPTION, "script route rule
invalid", "", "script route error, rule has been ignored. rule: " + rule +
+ ", url: " + RpcContext.getServiceContext().getUrl(), e);
}
}
@@ -115,7 +116,7 @@ public class ScriptStateRouter<T> extends
AbstractStateRouter<T> {
private ScriptEngine getEngine(URL url) {
String type = url.getParameter(TYPE_KEY, DEFAULT_SCRIPT_TYPE_KEY);
- return ENGINES.computeIfAbsent(type, t -> {
+ return ConcurrentHashMapUtils.computeIfAbsent(ENGINES, type, t -> {
ScriptEngine scriptEngine = new
ScriptEngineManager().getEngineByName(type);
if (scriptEngine == null) {
throw new IllegalStateException("unsupported route engine
type: " + type);
@@ -137,8 +138,8 @@ public class ScriptStateRouter<T> extends
AbstractStateRouter<T> {
try {
return function.eval(bindings);
} catch (ScriptException e) {
- logger.error(CLUSTER_SCRIPT_EXCEPTION,"Scriptrouter exec
script error","","Script route error, rule has been ignored. rule: " + rule +
", method:" +
- invocation.getMethodName() + ", url: " +
RpcContext.getContext().getUrl(),e);
+ logger.error(CLUSTER_SCRIPT_EXCEPTION, "Scriptrouter exec
script error", "", "Script route error, rule has been ignored. rule: " + rule +
", method:" +
+ invocation.getMethodName() + ", url: " +
RpcContext.getContext().getUrl(), e);
return invokers;
}
}, accessControlContext));
diff --git
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/state/CacheableStateRouterFactory.java
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/state/CacheableStateRouterFactory.java
index 422c77e635..91d28bbbbc 100644
---
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/state/CacheableStateRouterFactory.java
+++
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/state/CacheableStateRouterFactory.java
@@ -17,6 +17,7 @@
package org.apache.dubbo.rpc.cluster.router.state;
import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
@@ -31,7 +32,7 @@ public abstract class CacheableStateRouterFactory implements
StateRouterFactory
@Override
public <T> StateRouter<T> getRouter(Class<T> interfaceClass, URL url) {
- return routerMap.computeIfAbsent(url.getServiceKey(), k ->
createRouter(interfaceClass, url));
+ return ConcurrentHashMapUtils.computeIfAbsent(routerMap,
url.getServiceKey(), k -> createRouter(interfaceClass, url));
}
protected abstract <T> StateRouter<T> createRouter(Class<T>
interfaceClass, URL url);
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/beans/factory/ScopeBeanFactory.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/beans/factory/ScopeBeanFactory.java
index 04448401a1..e549016703 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/common/beans/factory/ScopeBeanFactory.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/common/beans/factory/ScopeBeanFactory.java
@@ -24,12 +24,12 @@ import
org.apache.dubbo.common.extension.ExtensionPostProcessor;
import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
import org.apache.dubbo.common.logger.LoggerFactory;
import org.apache.dubbo.common.resource.Disposable;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.rpc.model.ScopeModelAccessor;
import java.util.ArrayList;
import java.util.List;
-import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -49,7 +49,7 @@ public class ScopeBeanFactory {
private final ScopeBeanFactory parent;
private ExtensionAccessor extensionAccessor;
private List<ExtensionPostProcessor> extensionPostProcessors;
- private Map<Class, AtomicInteger> beanNameIdCounterMap = new
ConcurrentHashMap<>();
+ private ConcurrentHashMap<Class, AtomicInteger> beanNameIdCounterMap = new
ConcurrentHashMap<>();
private List<BeanInfo> registeredBeanInfos = new CopyOnWriteArrayList<>();
private InstantiationStrategy instantiationStrategy;
private AtomicBoolean destroyed = new AtomicBoolean();
@@ -183,7 +183,7 @@ public class ScopeBeanFactory {
}
private int getNextId(Class<?> beanClass) {
- return beanNameIdCounterMap.computeIfAbsent(beanClass, key -> new
AtomicInteger()).incrementAndGet();
+ return ConcurrentHashMapUtils.computeIfAbsent(beanNameIdCounterMap,
beanClass, key -> new AtomicInteger()).incrementAndGet();
}
public <T> T getBean(Class<T> type) {
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/Wrapper.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/Wrapper.java
index c1b6699574..bde471afae 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/Wrapper.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/Wrapper.java
@@ -17,6 +17,7 @@
package org.apache.dubbo.common.bytecode;
import org.apache.dubbo.common.utils.ClassUtils;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.common.utils.ReflectUtils;
import javassist.ClassPool;
@@ -34,6 +35,7 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicLong;
import java.util.regex.Matcher;
import java.util.stream.Collectors;
@@ -42,7 +44,7 @@ import java.util.stream.Collectors;
* Wrapper.
*/
public abstract class Wrapper {
- private static final Map<Class<?>, Wrapper> WRAPPER_MAP = new
ConcurrentHashMap<Class<?>, Wrapper>(); //class wrapper map
+ private static final ConcurrentMap<Class<?>, Wrapper> WRAPPER_MAP = new
ConcurrentHashMap<Class<?>, Wrapper>(); //class wrapper map
private static final String[] EMPTY_STRING_ARRAY = new String[0];
private static final String[] OBJECT_METHODS = new String[]{"getClass",
"hashCode", "toString", "equals"};
private static final Wrapper OBJECT_WRAPPER = new Wrapper() {
@@ -119,7 +121,7 @@ public abstract class Wrapper {
return OBJECT_WRAPPER;
}
- return WRAPPER_MAP.computeIfAbsent(c, Wrapper::makeWrapper);
+ return ConcurrentHashMapUtils.computeIfAbsent(WRAPPER_MAP, c,
Wrapper::makeWrapper);
}
private static Wrapper makeWrapper(Class<?> c) {
@@ -171,16 +173,16 @@ public abstract class Wrapper {
}
Method[] methods = Arrays.stream(c.getMethods())
- .filter(method ->
allMethod.contains(ReflectUtils.getDesc(method)))
- .collect(Collectors.toList())
- .toArray(new Method[] {});
+ .filter(method -> allMethod.contains(ReflectUtils.getDesc(method)))
+ .collect(Collectors.toList())
+ .toArray(new Method[]{});
// get all public method.
boolean hasMethod = ClassUtils.hasMethods(methods);
if (hasMethod) {
Map<String, Integer> sameNameMethodCount = new HashMap<>((int)
(methods.length / 0.75f) + 1);
for (Method m : methods) {
sameNameMethodCount.compute(m.getName(),
- (key, oldValue) -> oldValue == null ? 1 : oldValue +
1);
+ (key, oldValue) -> oldValue == null ? 1 : oldValue + 1);
}
c3.append(" try{");
@@ -200,7 +202,7 @@ public abstract class Wrapper {
if (len > 0) {
for (int l = 0; l < len; l++) {
c3.append(" && ").append("
$3[").append(l).append("].getName().equals(\"")
-
.append(m.getParameterTypes()[l].getName()).append("\")");
+
.append(m.getParameterTypes()[l].getName()).append("\")");
}
}
}
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/cache/FileCacheStoreFactory.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/cache/FileCacheStoreFactory.java
index 773be9f546..154e59658b 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/common/cache/FileCacheStoreFactory.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/common/cache/FileCacheStoreFactory.java
@@ -19,6 +19,7 @@ package org.apache.dubbo.common.cache;
import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
import org.apache.dubbo.common.logger.LoggerFactory;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import java.io.File;
import java.io.IOException;
@@ -33,6 +34,7 @@ import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
import static
org.apache.dubbo.common.constants.LoggerCodeConstants.COMMON_CACHE_PATH_INACCESSIBLE;
@@ -50,11 +52,11 @@ public final class FileCacheStoreFactory {
}
private static final ErrorTypeAwareLogger logger =
LoggerFactory.getErrorTypeAwareLogger(FileCacheStoreFactory.class);
- private static final Map<String, FileCacheStore> cacheMap = new
ConcurrentHashMap<>();
+ private static final ConcurrentMap<String, FileCacheStore> cacheMap = new
ConcurrentHashMap<>();
private static final String SUFFIX = ".dubbo.cache";
private static final char ESCAPE_MARK = '%';
- private static final Set<Character> LEGAL_CHARACTERS =
Collections.unmodifiableSet(new HashSet<Character>(){{
+ private static final Set<Character> LEGAL_CHARACTERS =
Collections.unmodifiableSet(new HashSet<Character>() {{
// - $ . _ 0-9 a-z A-Z
add('-');
add('$');
@@ -108,7 +110,7 @@ public final class FileCacheStoreFactory {
String cacheFilePath = basePath + File.separator + cacheName;
- return cacheMap.computeIfAbsent(cacheFilePath, k -> getFile(k,
enableFileCache));
+ return ConcurrentHashMapUtils.computeIfAbsent(cacheMap, cacheFilePath,
k -> getFile(k, enableFileCache));
}
/**
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/AbstractDynamicConfigurationFactory.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/AbstractDynamicConfigurationFactory.java
index db53e7317f..5ebf0ce867 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/AbstractDynamicConfigurationFactory.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/AbstractDynamicConfigurationFactory.java
@@ -17,8 +17,8 @@
package org.apache.dubbo.common.config.configcenter;
import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
-import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_KEY;
@@ -31,12 +31,12 @@ import static
org.apache.dubbo.common.constants.CommonConstants.DEFAULT_KEY;
*/
public abstract class AbstractDynamicConfigurationFactory implements
DynamicConfigurationFactory {
- private volatile Map<String, DynamicConfiguration> dynamicConfigurations =
new ConcurrentHashMap<>();
+ private volatile ConcurrentHashMap<String, DynamicConfiguration>
dynamicConfigurations = new ConcurrentHashMap<>();
@Override
public final DynamicConfiguration getDynamicConfiguration(URL url) {
String key = url == null ? DEFAULT_KEY : url.toServiceString();
- return dynamicConfigurations.computeIfAbsent(key, k ->
createDynamicConfiguration(url));
+ return ConcurrentHashMapUtils.computeIfAbsent(dynamicConfigurations,
key, k -> createDynamicConfiguration(url));
}
protected abstract DynamicConfiguration createDynamicConfiguration(URL
url);
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/convert/ConverterUtil.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/convert/ConverterUtil.java
index 260c980daf..7e5c8b65fc 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/common/convert/ConverterUtil.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/common/convert/ConverterUtil.java
@@ -17,16 +17,17 @@
package org.apache.dubbo.common.convert;
import org.apache.dubbo.common.extension.ExtensionLoader;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.rpc.model.FrameworkModel;
import java.util.List;
-import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
import java.util.stream.Collectors;
public class ConverterUtil {
private final FrameworkModel frameworkModel;
- private final Map<Class<?>, Map<Class<?>, List<Converter>>> converterCache
= new ConcurrentHashMap<>();
+ private final ConcurrentMap<Class<?>, ConcurrentMap<Class<?>,
List<Converter>>> converterCache = new ConcurrentHashMap<>();
public ConverterUtil(FrameworkModel frameworkModel) {
this.frameworkModel = frameworkModel;
@@ -41,8 +42,8 @@ public class ConverterUtil {
* @see ExtensionLoader#getSupportedExtensionInstances()
*/
public Converter<?, ?> getConverter(Class<?> sourceType, Class<?>
targetType) {
- Map<Class<?>, List<Converter>> toTargetMap =
converterCache.computeIfAbsent(sourceType, (k) -> new ConcurrentHashMap<>());
- List<Converter> converters = toTargetMap.computeIfAbsent(targetType,
(k) -> frameworkModel.getExtensionLoader(Converter.class)
+ ConcurrentMap<Class<?>, List<Converter>> toTargetMap =
ConcurrentHashMapUtils.computeIfAbsent(converterCache, sourceType, (k) -> new
ConcurrentHashMap<>());
+ List<Converter> converters =
ConcurrentHashMapUtils.computeIfAbsent(toTargetMap, targetType, (k) ->
frameworkModel.getExtensionLoader(Converter.class)
.getSupportedExtensionInstances()
.stream()
.filter(converter -> converter.accept(sourceType, targetType))
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/logger/LoggerFactory.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/logger/LoggerFactory.java
index 56b2ddb74c..c718ae9e79 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/common/logger/LoggerFactory.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/common/logger/LoggerFactory.java
@@ -23,6 +23,7 @@ import
org.apache.dubbo.common.logger.log4j2.Log4j2LoggerAdapter;
import org.apache.dubbo.common.logger.slf4j.Slf4jLoggerAdapter;
import org.apache.dubbo.common.logger.support.FailsafeErrorTypeAwareLogger;
import org.apache.dubbo.common.logger.support.FailsafeLogger;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.rpc.model.FrameworkModel;
import java.io.File;
@@ -145,7 +146,7 @@ public class LoggerFactory {
* @return logger
*/
public static Logger getLogger(Class<?> key) {
- return LOGGERS.computeIfAbsent(key.getName(), name -> new
FailsafeLogger(loggerAdapter.getLogger(name)));
+ return ConcurrentHashMapUtils.computeIfAbsent(LOGGERS, key.getName(),
name -> new FailsafeLogger(loggerAdapter.getLogger(name)));
}
/**
@@ -155,7 +156,7 @@ public class LoggerFactory {
* @return logger provider
*/
public static Logger getLogger(String key) {
- return LOGGERS.computeIfAbsent(key, k -> new
FailsafeLogger(loggerAdapter.getLogger(k)));
+ return ConcurrentHashMapUtils.computeIfAbsent(LOGGERS, key, k -> new
FailsafeLogger(loggerAdapter.getLogger(k)));
}
/**
@@ -165,7 +166,7 @@ public class LoggerFactory {
* @return error type aware logger
*/
public static ErrorTypeAwareLogger getErrorTypeAwareLogger(Class<?> key) {
- return ERROR_TYPE_AWARE_LOGGERS.computeIfAbsent(key.getName(), name ->
new FailsafeErrorTypeAwareLogger(loggerAdapter.getLogger(name)));
+ return
ConcurrentHashMapUtils.computeIfAbsent(ERROR_TYPE_AWARE_LOGGERS, key.getName(),
name -> new FailsafeErrorTypeAwareLogger(loggerAdapter.getLogger(name)));
}
/**
@@ -175,7 +176,7 @@ public class LoggerFactory {
* @return error type aware logger
*/
public static ErrorTypeAwareLogger getErrorTypeAwareLogger(String key) {
- return ERROR_TYPE_AWARE_LOGGERS.computeIfAbsent(key, k -> new
FailsafeErrorTypeAwareLogger(loggerAdapter.getLogger(k)));
+ return
ConcurrentHashMapUtils.computeIfAbsent(ERROR_TYPE_AWARE_LOGGERS, key, k -> new
FailsafeErrorTypeAwareLogger(loggerAdapter.getLogger(k)));
}
/**
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/metrics/collector/stat/MetricsStatComposite.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/metrics/collector/stat/MetricsStatComposite.java
index baed0ad4cc..dc75962b52 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/common/metrics/collector/stat/MetricsStatComposite.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/common/metrics/collector/stat/MetricsStatComposite.java
@@ -20,6 +20,7 @@ package org.apache.dubbo.common.metrics.collector.stat;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.LongAccumulator;
@@ -29,20 +30,22 @@ import org.apache.dubbo.common.metrics.event.RTEvent;
import org.apache.dubbo.common.metrics.event.RequestEvent;
import org.apache.dubbo.common.metrics.listener.MetricsListener;
import org.apache.dubbo.common.metrics.model.MethodMetric;
-public class MetricsStatComposite{
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
+
+public class MetricsStatComposite {
public Map<RequestEvent.Type, MetricsStatHandler> stats = new
ConcurrentHashMap<>();
- private final Map<MethodMetric, AtomicLong> lastRT = new
ConcurrentHashMap<>();
- private final Map<MethodMetric, LongAccumulator> minRT = new
ConcurrentHashMap<>();
- private final Map<MethodMetric, LongAccumulator> maxRT = new
ConcurrentHashMap<>();
- private final Map<MethodMetric, AtomicLong> avgRT = new
ConcurrentHashMap<>();
- private final Map<MethodMetric, AtomicLong> totalRT = new
ConcurrentHashMap<>();
- private final Map<MethodMetric, AtomicLong> rtCount = new
ConcurrentHashMap<>();
+ private final ConcurrentMap<MethodMetric, AtomicLong> lastRT = new
ConcurrentHashMap<>();
+ private final ConcurrentMap<MethodMetric, LongAccumulator> minRT = new
ConcurrentHashMap<>();
+ private final ConcurrentMap<MethodMetric, LongAccumulator> maxRT = new
ConcurrentHashMap<>();
+ private final ConcurrentMap<MethodMetric, AtomicLong> avgRT = new
ConcurrentHashMap<>();
+ private final ConcurrentMap<MethodMetric, AtomicLong> totalRT = new
ConcurrentHashMap<>();
+ private final ConcurrentMap<MethodMetric, AtomicLong> rtCount = new
ConcurrentHashMap<>();
private final String applicationName;
private final List<MetricsListener> listeners;
private DefaultMetricsCollector collector;
- public MetricsStatComposite(String applicationName,
DefaultMetricsCollector collector){
+ public MetricsStatComposite(String applicationName,
DefaultMetricsCollector collector) {
this.applicationName = applicationName;
this.listeners = collector.getListener();
this.collector = collector;
@@ -53,23 +56,27 @@ public class MetricsStatComposite{
return stats.get(statType);
}
- public Map<MethodMetric, AtomicLong> getLastRT(){
+ public Map<MethodMetric, AtomicLong> getLastRT() {
return this.lastRT;
}
- public Map<MethodMetric, LongAccumulator> getMinRT(){
+
+ public Map<MethodMetric, LongAccumulator> getMinRT() {
return this.minRT;
}
- public Map<MethodMetric, LongAccumulator> getMaxRT(){
+ public Map<MethodMetric, LongAccumulator> getMaxRT() {
return this.maxRT;
}
- public Map<MethodMetric, AtomicLong> getAvgRT(){
+
+ public Map<MethodMetric, AtomicLong> getAvgRT() {
return this.avgRT;
}
- public Map<MethodMetric, AtomicLong> getTotalRT(){
+
+ public Map<MethodMetric, AtomicLong> getTotalRT() {
return this.totalRT;
}
- public Map<MethodMetric, AtomicLong> getRtCount(){
+
+ public Map<MethodMetric, AtomicLong> getRtCount() {
return this.rtCount;
}
@@ -77,29 +84,29 @@ public class MetricsStatComposite{
if (collector.isCollectEnabled()) {
MethodMetric metric = new MethodMetric(applicationName,
interfaceName, methodName, group, version);
- AtomicLong last = lastRT.computeIfAbsent(metric, k -> new
AtomicLong());
+ AtomicLong last = ConcurrentHashMapUtils.computeIfAbsent(lastRT,
metric, k -> new AtomicLong());
last.set(responseTime);
- LongAccumulator min = minRT.computeIfAbsent(metric, k -> new
LongAccumulator(Long::min, Long.MAX_VALUE));
+ LongAccumulator min =
ConcurrentHashMapUtils.computeIfAbsent(minRT, metric, k -> new
LongAccumulator(Long::min, Long.MAX_VALUE));
min.accumulate(responseTime);
- LongAccumulator max = maxRT.computeIfAbsent(metric, k -> new
LongAccumulator(Long::max, Long.MIN_VALUE));
+ LongAccumulator max =
ConcurrentHashMapUtils.computeIfAbsent(maxRT, metric, k -> new
LongAccumulator(Long::max, Long.MIN_VALUE));
max.accumulate(responseTime);
- AtomicLong total = totalRT.computeIfAbsent(metric, k -> new
AtomicLong());
+ AtomicLong total = ConcurrentHashMapUtils.computeIfAbsent(totalRT,
metric, k -> new AtomicLong());
total.addAndGet(responseTime);
- AtomicLong count = rtCount.computeIfAbsent(metric, k -> new
AtomicLong());
+ AtomicLong count = ConcurrentHashMapUtils.computeIfAbsent(rtCount,
metric, k -> new AtomicLong());
count.incrementAndGet();
- avgRT.computeIfAbsent(metric, k -> new AtomicLong());
+ ConcurrentHashMapUtils.computeIfAbsent(avgRT, metric, k -> new
AtomicLong());
publishEvent(new RTEvent(metric, responseTime));
}
}
private void init() {
- stats.put(RequestEvent.Type.TOTAL, new
DefaultMetricsStatHandler(applicationName){
+ stats.put(RequestEvent.Type.TOTAL, new
DefaultMetricsStatHandler(applicationName) {
@Override
public void doNotify(MethodMetric metric) {
publishEvent(new RequestEvent(metric,
RequestEvent.Type.TOTAL));
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/store/support/SimpleDataStore.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/store/support/SimpleDataStore.java
index e9709b0416..d511ebd513 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/common/store/support/SimpleDataStore.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/common/store/support/SimpleDataStore.java
@@ -18,6 +18,7 @@
package org.apache.dubbo.common.store.support;
import org.apache.dubbo.common.store.DataStore;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import java.util.HashMap;
import java.util.Map;
@@ -28,7 +29,7 @@ public class SimpleDataStore implements DataStore {
// <component name or id, <data-name, data-value>>
private ConcurrentMap<String, ConcurrentMap<String, Object>> data =
- new ConcurrentHashMap<String, ConcurrentMap<String, Object>>();
+ new ConcurrentHashMap<String, ConcurrentMap<String, Object>>();
@Override
public Map<String, Object> get(String componentName) {
@@ -50,7 +51,7 @@ public class SimpleDataStore implements DataStore {
@Override
public void put(String componentName, String key, Object value) {
- Map<String, Object> componentData =
data.computeIfAbsent(componentName, k -> new ConcurrentHashMap<>());
+ Map<String, Object> componentData =
ConcurrentHashMapUtils.computeIfAbsent(data, componentName, k -> new
ConcurrentHashMap<>());
componentData.put(key, value);
}
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/manager/DefaultExecutorRepository.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/manager/DefaultExecutorRepository.java
index 5abc993d01..fd2c9aacb2 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/manager/DefaultExecutorRepository.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/manager/DefaultExecutorRepository.java
@@ -23,6 +23,7 @@ import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
import org.apache.dubbo.common.logger.LoggerFactory;
import org.apache.dubbo.common.store.DataStore;
import org.apache.dubbo.common.threadpool.ThreadPool;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.common.utils.ExecutorUtil;
import org.apache.dubbo.common.utils.NamedThreadFactory;
import org.apache.dubbo.common.utils.StringUtils;
@@ -93,14 +94,14 @@ public class DefaultExecutorRepository implements
ExecutorRepository, ExtensionA
@Override
public synchronized ExecutorService createExecutorIfAbsent(URL url) {
String executorKey = getExecutorKey(url);
- Map<String, ExecutorService> executors =
data.computeIfAbsent(executorKey, k -> new ConcurrentHashMap<>());
+ ConcurrentMap<String, ExecutorService> executors =
ConcurrentHashMapUtils.computeIfAbsent(data, executorKey, k -> new
ConcurrentHashMap<>());
String executorCacheKey = getExecutorSecondKey(url);
url = setThreadNameIfAbsent(url, executorCacheKey);
URL finalUrl = url;
- ExecutorService executor = executors.computeIfAbsent(executorCacheKey,
k -> createExecutor(finalUrl));
+ ExecutorService executor =
ConcurrentHashMapUtils.computeIfAbsent(executors, executorCacheKey, k ->
createExecutor(finalUrl));
// If executor has been shut down, create a new one
if (executor.isShutdown() || executor.isTerminated()) {
executors.remove(executorCacheKey);
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/url/component/ServiceConfigURL.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/url/component/ServiceConfigURL.java
index 95bdb75110..9b73daf1c6 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/common/url/component/ServiceConfigURL.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/common/url/component/ServiceConfigURL.java
@@ -18,18 +18,20 @@ package org.apache.dubbo.common.url.component;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.utils.CollectionUtils;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.common.utils.StringUtils;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
public class ServiceConfigURL extends URL {
- private volatile transient Map<String, URL> urls;
- private volatile transient Map<String, Number> numbers;
- private volatile transient Map<String, Map<String, Number>> methodNumbers;
+ private volatile transient ConcurrentMap<String, URL> urls;
+ private volatile transient ConcurrentMap<String, Number> numbers;
+ private volatile transient ConcurrentMap<String, Map<String, Number>>
methodNumbers;
private volatile transient String full;
private volatile transient String string;
private volatile transient String identity;
@@ -77,12 +79,12 @@ public class ServiceConfigURL extends URL {
}
public ServiceConfigURL(String protocol,
- String username,
- String password,
- String host,
- int port,
- String path,
- Map<String, String> parameters) {
+ String username,
+ String password,
+ String host,
+ int port,
+ String path,
+ Map<String, String> parameters) {
this(new PathURLAddress(protocol, username, password, path, host,
port), URLParam.parse(parameters), null);
}
@@ -551,11 +553,11 @@ public class ServiceConfigURL extends URL {
}
private void updateCachedNumber(String method, String key, Number n) {
- Map<String, Number> keyNumber =
getMethodNumbers().computeIfAbsent(method, m -> new HashMap<>());
+ Map<String, Number> keyNumber =
ConcurrentHashMapUtils.computeIfAbsent(getMethodNumbers(), method, m -> new
HashMap<>());
keyNumber.put(key, n);
}
- protected Map<String, Map<String, Number>> getMethodNumbers() {
+ protected ConcurrentMap<String, Map<String, Number>> getMethodNumbers() {
if (methodNumbers == null) { // concurrent initialization is tolerant
methodNumbers = new ConcurrentHashMap<>();
}
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/ConcurrentHashMapUtils.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/ConcurrentHashMapUtils.java
new file mode 100644
index 0000000000..0b71d673d6
--- /dev/null
+++
b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/ConcurrentHashMapUtils.java
@@ -0,0 +1,57 @@
+/*
+ * 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.common.utils;
+
+import java.util.concurrent.ConcurrentMap;
+import java.util.function.Function;
+
+/**
+ * ConcurrentHashMap util
+ */
+
+public class ConcurrentHashMapUtils {
+
+ private static boolean IS_JAVA8;
+
+ static {
+ try {
+ IS_JAVA8 = System.getProperty("java.version").startsWith("1.8.");
+ } catch (Exception ignore) {
+ // exception is ignored
+ IS_JAVA8 = true;
+ }
+ }
+
+ /**
+ * A temporary workaround for Java 8 ConcurrentHashMap#computeIfAbsent
specific performance issue: JDK-8161372.</br>
+ * @see <a
href="https://bugs.openjdk.java.net/browse/JDK-8161372">https://bugs.openjdk.java.net/browse/JDK-8161372</a>
+ *
+ */
+ public static <K, V> V computeIfAbsent(ConcurrentMap<K, V> map, K key,
Function<? super K, ? extends V> func) {
+ if (IS_JAVA8) {
+ V v = map.get(key);
+ if (null == v) {
+ v = map.computeIfAbsent(key, func);
+ }
+ return v;
+ } else {
+ return map.computeIfAbsent(key, func);
+ }
+ }
+
+}
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/config/AbstractConfig.java
b/dubbo-common/src/main/java/org/apache/dubbo/config/AbstractConfig.java
index 413521cf91..6ee6307560 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/config/AbstractConfig.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/config/AbstractConfig.java
@@ -36,6 +36,7 @@ import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicBoolean;
import org.apache.dubbo.common.URL;
@@ -48,6 +49,7 @@ import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
import org.apache.dubbo.common.logger.LoggerFactory;
import org.apache.dubbo.common.utils.ClassUtils;
import org.apache.dubbo.common.utils.CollectionUtils;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.common.utils.FieldUtils;
import org.apache.dubbo.common.utils.MethodUtils;
import org.apache.dubbo.common.utils.ReflectUtils;
@@ -81,12 +83,12 @@ public abstract class AbstractConfig implements
Serializable {
/**
* tag name cache, speed up get tag name frequently
*/
- private static final Map<Class, String> tagNameCache = new
ConcurrentHashMap<>();
+ private static final ConcurrentMap<Class, String> tagNameCache = new
ConcurrentHashMap<>();
/**
* attributed getter method cache for equals(), hashCode() and toString()
*/
- private static final Map<Class, List<Method>> attributedMethodCache = new
ConcurrentHashMap<>();
+ private static final ConcurrentMap<Class, List<Method>>
attributedMethodCache = new ConcurrentHashMap<>();
/**
* The suffix container
@@ -122,7 +124,7 @@ public abstract class AbstractConfig implements
Serializable {
}
public static String getTagName(Class<?> cls) {
- return tagNameCache.computeIfAbsent(cls, (key) -> {
+ return ConcurrentHashMapUtils.computeIfAbsent(tagNameCache, cls, (key)
-> {
String tag = cls.getSimpleName();
for (String suffix : SUFFIXES) {
if (tag.endsWith(suffix)) {
@@ -1031,7 +1033,7 @@ public abstract class AbstractConfig implements
Serializable {
private List<Method> getAttributedMethods() {
Class<? extends AbstractConfig> cls = this.getClass();
- return attributedMethodCache.computeIfAbsent(cls, (key) ->
computeAttributedMethods());
+ return ConcurrentHashMapUtils.computeIfAbsent(attributedMethodCache,
cls, (key) -> computeAttributedMethods());
}
/**
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/FrameworkServiceRepository.java
b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/FrameworkServiceRepository.java
index d858fc1398..9f217ccaab 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/FrameworkServiceRepository.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/FrameworkServiceRepository.java
@@ -17,6 +17,7 @@
package org.apache.dubbo.rpc.model;
import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.common.utils.StringUtils;
import java.util.ArrayList;
@@ -58,7 +59,7 @@ public class FrameworkServiceRepository {
// throw new IllegalStateException("Register duplicate provider
for key: " + key);
}
String keyWithoutGroup = keyWithoutGroup(key);
- providersWithoutGroup.computeIfAbsent(keyWithoutGroup, (k) -> new
CopyOnWriteArrayList<>()).add(providerModel);
+ ConcurrentHashMapUtils.computeIfAbsent(providersWithoutGroup,
keyWithoutGroup, (k) -> new CopyOnWriteArrayList<>()).add(providerModel);
}
public void unregisterProvider(ProviderModel providerModel) {
@@ -82,7 +83,7 @@ public class FrameworkServiceRepository {
}
public void registerProviderUrl(URL url) {
-
providerUrlsWithoutGroup.computeIfAbsent(keyWithoutGroup(url.getServiceKey()),
(k) -> new CopyOnWriteArrayList<>()).add(url);
+ ConcurrentHashMapUtils.computeIfAbsent(providerUrlsWithoutGroup,
keyWithoutGroup(url.getServiceKey()), (k) -> new
CopyOnWriteArrayList<>()).add(url);
}
public ProviderModel lookupExportedService(String serviceKey) {
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ModuleServiceRepository.java
b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ModuleServiceRepository.java
index 748b21deef..c3b1d446c7 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ModuleServiceRepository.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ModuleServiceRepository.java
@@ -17,6 +17,7 @@
package org.apache.dubbo.rpc.model;
import org.apache.dubbo.common.utils.CollectionUtils;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.config.ReferenceConfigBase;
import org.apache.dubbo.config.ServiceConfigBase;
@@ -81,7 +82,7 @@ public class ModuleServiceRepository {
}
public void registerConsumer(ConsumerModel consumerModel) {
- consumers.computeIfAbsent(consumerModel.getServiceKey(), (serviceKey)
-> new CopyOnWriteArrayList<>()).add(consumerModel);
+ ConcurrentHashMapUtils.computeIfAbsent(consumers,
consumerModel.getServiceKey(), (serviceKey) -> new
CopyOnWriteArrayList<>()).add(consumerModel);
}
/**
@@ -119,7 +120,7 @@ public class ModuleServiceRepository {
}
public ServiceDescriptor registerService(Class<?> interfaceClazz,
ServiceDescriptor serviceDescriptor) {
- List<ServiceDescriptor> serviceDescriptors =
services.computeIfAbsent(interfaceClazz.getName(),
+ List<ServiceDescriptor> serviceDescriptors =
ConcurrentHashMapUtils.computeIfAbsent(services, interfaceClazz.getName(),
k -> new CopyOnWriteArrayList<>());
synchronized (serviceDescriptors) {
Optional<ServiceDescriptor> previous = serviceDescriptors.stream()
@@ -149,7 +150,7 @@ public class ModuleServiceRepository {
ServiceDescriptor serviceDescriptor = registerService(interfaceClass);
// if path is different with interface name, add extra path mapping
if (!interfaceClass.getName().equals(path)) {
- List<ServiceDescriptor> serviceDescriptors =
services.computeIfAbsent(path,
+ List<ServiceDescriptor> serviceDescriptors =
ConcurrentHashMapUtils.computeIfAbsent(services, path,
_k -> new CopyOnWriteArrayList<>());
synchronized (serviceDescriptors) {
Optional<ServiceDescriptor> previous =
serviceDescriptors.stream()
@@ -179,7 +180,7 @@ public class ModuleServiceRepository {
public void reRegisterConsumer(String newServiceKey, String serviceKey) {
List<ConsumerModel> consumerModel = this.consumers.get(serviceKey);
consumerModel.forEach(c -> c.setServiceKey(newServiceKey));
- this.consumers.computeIfAbsent(newServiceKey, (k) -> new
CopyOnWriteArrayList<>()).addAll(consumerModel);
+ ConcurrentHashMapUtils.computeIfAbsent(this.consumers, newServiceKey,
(k) -> new CopyOnWriteArrayList<>()).addAll(consumerModel);
this.consumers.remove(serviceKey);
}
diff --git
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/CacheableRouterFactory.java
b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/ConcurrentHashMapUtilsTest.java
similarity index 54%
copy from
dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/CacheableRouterFactory.java
copy to
dubbo-common/src/test/java/org/apache/dubbo/common/utils/ConcurrentHashMapUtilsTest.java
index 4d4b9eb5e0..3fc895497f 100644
---
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/CacheableRouterFactory.java
+++
b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/ConcurrentHashMapUtilsTest.java
@@ -14,24 +14,27 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.dubbo.rpc.cluster;
-import org.apache.dubbo.common.URL;
+package org.apache.dubbo.common.utils;
+
+import org.junit.jupiter.api.Test;
import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-/**
- * If you want to provide a router implementation based on design of v2.7.0,
please extend from this abstract class.
- * For 2.6.x style router, please implement and use RouterFactory directly.
- */
-public abstract class CacheableRouterFactory implements RouterFactory {
- private ConcurrentMap<String, Router> routerMap = new
ConcurrentHashMap<>();
+import static org.junit.jupiter.api.Assertions.assertEquals;
- @Override
- public Router getRouter(URL url) {
- return routerMap.computeIfAbsent(url.getServiceKey(), k ->
createRouter(url));
- }
- protected abstract Router createRouter(URL url);
+class ConcurrentHashMapUtilsTest {
+
+ @Test
+ public void testComputeIfAbsent() {
+ ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>();
+ String ifAbsent = ConcurrentHashMapUtils.computeIfAbsent(map, "mxsm",
k -> "mxsm");
+ assertEquals("mxsm", ifAbsent);
+ ifAbsent = ConcurrentHashMapUtils.computeIfAbsent(map, "mxsm", k ->
"mxsm1");
+ assertEquals("mxsm", ifAbsent);
+ map.remove("mxsm");
+ ifAbsent = ConcurrentHashMapUtils.computeIfAbsent(map, "mxsm", k ->
"mxsm1");
+ assertEquals("mxsm1", ifAbsent);
+ }
}
diff --git
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/DubboBootstrap.java
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/DubboBootstrap.java
index ea88fd99d7..8eda1a9845 100644
---
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/DubboBootstrap.java
+++
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/DubboBootstrap.java
@@ -25,6 +25,7 @@ import org.apache.dubbo.common.logger.Logger;
import org.apache.dubbo.common.logger.LoggerFactory;
import org.apache.dubbo.common.threadpool.manager.ExecutorRepository;
import org.apache.dubbo.common.utils.CollectionUtils;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.config.ApplicationConfig;
import org.apache.dubbo.config.ConfigCenterConfig;
import org.apache.dubbo.config.ConsumerConfig;
@@ -53,8 +54,8 @@ import org.apache.dubbo.rpc.model.FrameworkModel;
import org.apache.dubbo.rpc.model.ModuleModel;
import java.util.List;
-import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.Future;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.Condition;
@@ -80,7 +81,7 @@ public final class DubboBootstrap {
private static final Logger logger =
LoggerFactory.getLogger(DubboBootstrap.class);
- private static volatile Map<ApplicationModel, DubboBootstrap> instanceMap
= new ConcurrentHashMap<>();
+ private static volatile ConcurrentMap<ApplicationModel, DubboBootstrap>
instanceMap = new ConcurrentHashMap<>();
private static volatile DubboBootstrap instance;
private final AtomicBoolean awaited = new AtomicBoolean(false);
@@ -116,7 +117,7 @@ public final class DubboBootstrap {
}
public static DubboBootstrap getInstance(ApplicationModel
applicationModel) {
- return instanceMap.computeIfAbsent(applicationModel, _k -> new
DubboBootstrap(applicationModel));
+ return ConcurrentHashMapUtils.computeIfAbsent(instanceMap,
applicationModel, _k -> new DubboBootstrap(applicationModel));
}
public static DubboBootstrap newInstance() {
@@ -217,6 +218,7 @@ public final class DubboBootstrap {
/**
* Start dubbo application
+ *
* @param wait If true, wait for startup to complete, or else no waiting.
* @return
*/
@@ -234,6 +236,7 @@ public final class DubboBootstrap {
/**
* Start dubbo application but no wait for finish.
+ *
* @return the future object
*/
public Future asyncStart() {
@@ -242,6 +245,7 @@ public final class DubboBootstrap {
/**
* Stop dubbo application
+ *
* @return
* @throws IllegalStateException
*/
@@ -369,7 +373,7 @@ public final class DubboBootstrap {
return metadataReport(null, consumerBuilder);
}
- public DubboBootstrap metadataReport(String
id,Consumer<MetadataReportBuilder> consumerBuilder) {
+ public DubboBootstrap metadataReport(String id,
Consumer<MetadataReportBuilder> consumerBuilder) {
MetadataReportBuilder metadataReportBuilder =
createMetadataReportBuilder(id);
consumerBuilder.accept(metadataReportBuilder);
return this;
diff --git
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/utils/SimpleReferenceCache.java
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/utils/SimpleReferenceCache.java
index 65389f95b5..29d3514127 100644
---
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/utils/SimpleReferenceCache.java
+++
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/utils/SimpleReferenceCache.java
@@ -21,6 +21,7 @@ import org.apache.dubbo.common.config.ReferenceCache;
import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
import org.apache.dubbo.common.logger.LoggerFactory;
import org.apache.dubbo.common.utils.CollectionUtils;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.config.ReferenceConfigBase;
import org.apache.dubbo.rpc.service.Destroyable;
@@ -70,8 +71,8 @@ public class SimpleReferenceCache implements ReferenceCache {
private final String name;
private final KeyGenerator generator;
- private final Map<String, List<ReferenceConfigBase<?>>> referenceKeyMap =
new ConcurrentHashMap<>();
- private final Map<Class<?>, List<ReferenceConfigBase<?>>> referenceTypeMap
= new ConcurrentHashMap<>();
+ private final ConcurrentMap<String, List<ReferenceConfigBase<?>>>
referenceKeyMap = new ConcurrentHashMap<>();
+ private final ConcurrentMap<Class<?>, List<ReferenceConfigBase<?>>>
referenceTypeMap = new ConcurrentHashMap<>();
private final Map<ReferenceConfigBase<?>, Object> references = new
ConcurrentHashMap<>();
protected SimpleReferenceCache(String name, KeyGenerator generator) {
@@ -104,7 +105,7 @@ public class SimpleReferenceCache implements ReferenceCache
{
* Create cache if not existed yet.
*/
public static SimpleReferenceCache getCache(String name, KeyGenerator
keyGenerator) {
- return CACHE_HOLDER.computeIfAbsent(name, k -> new
SimpleReferenceCache(k, keyGenerator));
+ return ConcurrentHashMapUtils.computeIfAbsent(CACHE_HOLDER, name, k ->
new SimpleReferenceCache(k, keyGenerator));
}
@Override
@@ -124,9 +125,9 @@ public class SimpleReferenceCache implements ReferenceCache
{
}
if (proxy == null) {
- List<ReferenceConfigBase<?>> referencesOfType =
referenceTypeMap.computeIfAbsent(type, _t -> Collections.synchronizedList(new
ArrayList<>()));
+ List<ReferenceConfigBase<?>> referencesOfType =
ConcurrentHashMapUtils.computeIfAbsent(referenceTypeMap, type, _t ->
Collections.synchronizedList(new ArrayList<>()));
referencesOfType.add(rc);
- List<ReferenceConfigBase<?>> referenceConfigList =
referenceKeyMap.computeIfAbsent(key, _k -> Collections.synchronizedList(new
ArrayList<>()));
+ List<ReferenceConfigBase<?>> referenceConfigList =
ConcurrentHashMapUtils.computeIfAbsent(referenceKeyMap, key, _k ->
Collections.synchronizedList(new ArrayList<>()));
referenceConfigList.add(rc);
proxy = rc.get();
}
@@ -262,7 +263,7 @@ public class SimpleReferenceCache implements ReferenceCache
{
private void destroyReference(ReferenceConfigBase<?> rc) {
Destroyable proxy = (Destroyable) rc.get();
- if (proxy != null){
+ if (proxy != null) {
proxy.$destroy();
}
rc.destroy();
diff --git
a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/reference/ReferenceBeanManager.java
b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/reference/ReferenceBeanManager.java
index 578accb7b9..dcef96eeea 100644
---
a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/reference/ReferenceBeanManager.java
+++
b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/reference/ReferenceBeanManager.java
@@ -19,6 +19,7 @@ package org.apache.dubbo.config.spring.reference;
import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
import org.apache.dubbo.common.logger.LoggerFactory;
import org.apache.dubbo.common.utils.Assert;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.config.ReferenceConfig;
import org.apache.dubbo.config.spring.ReferenceBean;
@@ -37,6 +38,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
import static
org.apache.dubbo.common.constants.LoggerCodeConstants.CONFIG_DUBBO_BEAN_INITIALIZER;
@@ -46,16 +48,16 @@ public class ReferenceBeanManager implements
ApplicationContextAware {
private final ErrorTypeAwareLogger logger =
LoggerFactory.getErrorTypeAwareLogger(getClass());
//reference key -> reference bean names
- private Map<String, List<String>> referenceKeyMap = new
ConcurrentHashMap<>();
+ private ConcurrentMap<String, List<String>> referenceKeyMap = new
ConcurrentHashMap<>();
// reference alias -> reference bean name
- private Map<String, String> referenceAliasMap = new ConcurrentHashMap<>();
+ private ConcurrentMap<String, String> referenceAliasMap = new
ConcurrentHashMap<>();
//reference bean name -> ReferenceBean
- private Map<String, ReferenceBean> referenceBeanMap = new
ConcurrentHashMap<>();
+ private ConcurrentMap<String, ReferenceBean> referenceBeanMap = new
ConcurrentHashMap<>();
//reference key -> ReferenceConfig instance
- private Map<String, ReferenceConfig> referenceConfigMap = new
ConcurrentHashMap<>();
+ private ConcurrentMap<String, ReferenceConfig> referenceConfigMap = new
ConcurrentHashMap<>();
private ApplicationContext applicationContext;
private volatile boolean initialized = false;
@@ -105,7 +107,7 @@ public class ReferenceBeanManager implements
ApplicationContextAware {
}
public void registerReferenceKeyAndBeanName(String referenceKey, String
referenceBeanNameOrAlias) {
- List<String> list = referenceKeyMap.computeIfAbsent(referenceKey,
(key) -> new ArrayList<>());
+ List<String> list =
ConcurrentHashMapUtils.computeIfAbsent(referenceKeyMap, referenceKey, (key) ->
new ArrayList<>());
if (!list.contains(referenceBeanNameOrAlias)) {
list.add(referenceBeanNameOrAlias);
// register bean name as alias
diff --git
a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/AbstractRegistryService.java
b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/AbstractRegistryService.java
index 9ac517c37b..4a7e85410e 100644
---
a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/AbstractRegistryService.java
+++
b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/AbstractRegistryService.java
@@ -20,6 +20,7 @@ import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
import org.apache.dubbo.common.logger.LoggerFactory;
import org.apache.dubbo.common.utils.CollectionUtils;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.registry.NotifyListener;
import org.apache.dubbo.registry.RegistryService;
@@ -102,7 +103,7 @@ public abstract class AbstractRegistryService implements
RegistryService {
if (url == null) {
throw new IllegalArgumentException("url == null");
}
- List<URL> urls = registered.computeIfAbsent(service, k -> new
CopyOnWriteArrayList<>());
+ List<URL> urls = ConcurrentHashMapUtils.computeIfAbsent(registered,
service, k -> new CopyOnWriteArrayList<>());
if (!urls.contains(url)) {
urls.add(url);
}
@@ -162,7 +163,7 @@ public abstract class AbstractRegistryService implements
RegistryService {
if (listener == null) {
return;
}
- List<NotifyListener> listeners =
notifyListeners.computeIfAbsent(service, k -> new CopyOnWriteArrayList<>());
+ List<NotifyListener> listeners =
ConcurrentHashMapUtils.computeIfAbsent(notifyListeners, service, k -> new
CopyOnWriteArrayList<>());
if (!listeners.contains(listener)) {
listeners.add(listener);
}
@@ -202,7 +203,7 @@ public abstract class AbstractRegistryService implements
RegistryService {
protected final void notify(String service, List<URL> urls) {
if (StringUtils.isEmpty(service)
- || CollectionUtils.isEmpty(urls)) {
+ || CollectionUtils.isEmpty(urls)) {
return;
}
doNotify(service, urls);
diff --git
a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/SimpleRegistryService.java
b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/SimpleRegistryService.java
index f4168654a7..a8e8d74575 100644
---
a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/SimpleRegistryService.java
+++
b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/SimpleRegistryService.java
@@ -21,6 +21,7 @@ import org.apache.dubbo.common.logger.Logger;
import org.apache.dubbo.common.logger.LoggerFactory;
import org.apache.dubbo.common.url.component.ServiceConfigURL;
import org.apache.dubbo.common.utils.CollectionUtils;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.common.utils.NetUtils;
import org.apache.dubbo.common.utils.UrlUtils;
import org.apache.dubbo.registry.NotifyListener;
@@ -46,7 +47,7 @@ public class SimpleRegistryService extends
AbstractRegistryService {
public void register(String service, URL url) {
super.register(service, url);
String client =
RpcContext.getServiceContext().getRemoteAddressString();
- Map<String, URL> urls = remoteRegistered.computeIfAbsent(client, k ->
new ConcurrentHashMap<>());
+ Map<String, URL> urls =
ConcurrentHashMapUtils.computeIfAbsent(remoteRegistered, client, k -> new
ConcurrentHashMap<>());
urls.put(service, url);
notify(service, getRegistered().get(service));
}
@@ -70,12 +71,12 @@ public class SimpleRegistryService extends
AbstractRegistryService {
}
List<URL> urls = getRegistered().get(service);
if ((RegistryService.class.getName() + ":0.0.0").equals(service)
- && CollectionUtils.isEmpty(urls)) {
+ && CollectionUtils.isEmpty(urls)) {
register(service, new ServiceConfigURL("dubbo",
- NetUtils.getLocalHost(),
- RpcContext.getServiceContext().getLocalPort(),
- RegistryService.class.getName(),
- url.getParameters()));
+ NetUtils.getLocalHost(),
+ RpcContext.getServiceContext().getLocalPort(),
+ RegistryService.class.getName(),
+ url.getParameters()));
List<String> rs = registries;
if (rs != null && rs.size() > 0) {
for (String registry : rs) {
@@ -85,7 +86,7 @@ public class SimpleRegistryService extends
AbstractRegistryService {
}
super.subscribe(service, url, listener);
- Map<String, NotifyListener> listeners =
remoteListeners.computeIfAbsent(client, k -> new ConcurrentHashMap<>());
+ Map<String, NotifyListener> listeners =
ConcurrentHashMapUtils.computeIfAbsent(remoteListeners, client, k -> new
ConcurrentHashMap<>());
listeners.put(service, listener);
urls = getRegistered().get(service);
if (urls != null && urls.size() > 0) {
@@ -125,9 +126,9 @@ public class SimpleRegistryService extends
AbstractRegistryService {
for (Map.Entry<String, NotifyListener> entry :
listeners.entrySet()) {
String service = entry.getKey();
super.unsubscribe(service, new ServiceConfigURL("subscribe",
- RpcContext.getServiceContext().getRemoteHost(),
- RpcContext.getServiceContext().getRemotePort(),
- RegistryService.class.getName(),
getSubscribed(service)), entry.getValue());
+ RpcContext.getServiceContext().getRemoteHost(),
+ RpcContext.getServiceContext().getRemotePort(),
+ RegistryService.class.getName(), getSubscribed(service)),
entry.getValue());
}
}
}
diff --git
a/dubbo-configcenter/dubbo-configcenter-nacos/src/main/java/org/apache/dubbo/configcenter/support/nacos/NacosDynamicConfiguration.java
b/dubbo-configcenter/dubbo-configcenter-nacos/src/main/java/org/apache/dubbo/configcenter/support/nacos/NacosDynamicConfiguration.java
index 5a09e03d06..55bd14b40c 100644
---
a/dubbo-configcenter/dubbo-configcenter-nacos/src/main/java/org/apache/dubbo/configcenter/support/nacos/NacosDynamicConfiguration.java
+++
b/dubbo-configcenter/dubbo-configcenter-nacos/src/main/java/org/apache/dubbo/configcenter/support/nacos/NacosDynamicConfiguration.java
@@ -21,6 +21,7 @@ import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.Executor;
@@ -33,6 +34,7 @@ import
org.apache.dubbo.common.config.configcenter.DynamicConfiguration;
import org.apache.dubbo.common.constants.LoggerCodeConstants;
import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
import org.apache.dubbo.common.logger.LoggerFactory;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.common.utils.MD5Utils;
import org.apache.dubbo.common.utils.StringUtils;
@@ -81,7 +83,7 @@ public class NacosDynamicConfiguration implements
DynamicConfiguration {
/**
* The map store the key to {@link NacosConfigListener} mapping
*/
- private final Map<String, NacosConfigListener> watchListenerMap;
+ private final ConcurrentMap<String, NacosConfigListener> watchListenerMap;
private MD5Utils md5Utils = new MD5Utils();
@@ -209,8 +211,7 @@ public class NacosDynamicConfiguration implements
DynamicConfiguration {
@Override
public void addListener(String key, String group, ConfigurationListener
listener) {
String listenerKey = buildListenerKey(key, group);
- NacosConfigListener nacosConfigListener =
- watchListenerMap.computeIfAbsent(listenerKey, k ->
createTargetListener(key, group));
+ NacosConfigListener nacosConfigListener =
ConcurrentHashMapUtils.computeIfAbsent(watchListenerMap, listenerKey, k ->
createTargetListener(key, group));
nacosConfigListener.addListener(listener);
try {
configService.addListener(key, group, nacosConfigListener);
diff --git
a/dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/java/org/apache/dubbo/configcenter/support/zookeeper/CacheListener.java
b/dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/java/org/apache/dubbo/configcenter/support/zookeeper/CacheListener.java
index 7c2bdf21fb..4f565d0ae0 100644
---
a/dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/java/org/apache/dubbo/configcenter/support/zookeeper/CacheListener.java
+++
b/dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/java/org/apache/dubbo/configcenter/support/zookeeper/CacheListener.java
@@ -18,22 +18,24 @@ package org.apache.dubbo.configcenter.support.zookeeper;
import org.apache.dubbo.common.config.configcenter.ConfigurationListener;
import org.apache.dubbo.common.utils.CollectionUtils;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
/**
* one path has one zookeeperDataListener
*/
public class CacheListener {
- private Map<String, ZookeeperDataListener> pathKeyListeners = new
ConcurrentHashMap<>();
+ private ConcurrentMap<String, ZookeeperDataListener> pathKeyListeners =
new ConcurrentHashMap<>();
public CacheListener() {
}
public ZookeeperDataListener addListener(String pathKey,
ConfigurationListener configurationListener, String key, String group) {
- ZookeeperDataListener zookeeperDataListener =
pathKeyListeners.computeIfAbsent(pathKey,
+ ZookeeperDataListener zookeeperDataListener =
ConcurrentHashMapUtils.computeIfAbsent(pathKeyListeners, pathKey,
_pathKey -> new ZookeeperDataListener(_pathKey, key, group));
zookeeperDataListener.addListener(configurationListener);
return zookeeperDataListener;
diff --git
a/dubbo-metadata/dubbo-metadata-report-zookeeper/src/main/java/org/apache/dubbo/metadata/store/zookeeper/ZookeeperMetadataReport.java
b/dubbo-metadata/dubbo-metadata-report-zookeeper/src/main/java/org/apache/dubbo/metadata/store/zookeeper/ZookeeperMetadataReport.java
index 2bfa020093..4231966aaa 100644
---
a/dubbo-metadata/dubbo-metadata-report-zookeeper/src/main/java/org/apache/dubbo/metadata/store/zookeeper/ZookeeperMetadataReport.java
+++
b/dubbo-metadata/dubbo-metadata-report-zookeeper/src/main/java/org/apache/dubbo/metadata/store/zookeeper/ZookeeperMetadataReport.java
@@ -20,6 +20,7 @@ import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.config.configcenter.ConfigItem;
import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
import org.apache.dubbo.common.logger.LoggerFactory;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.common.utils.JsonUtils;
import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.metadata.MappingChangedEvent;
@@ -45,6 +46,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
import static org.apache.dubbo.common.constants.CommonConstants.PATH_SEPARATOR;
import static
org.apache.dubbo.common.constants.LoggerCodeConstants.REGISTRY_ZOOKEEPER_EXCEPTION;
@@ -62,7 +64,7 @@ public class ZookeeperMetadataReport extends
AbstractMetadataReport {
ZookeeperClient zkClient;
- private Map<String, MappingDataListener> casListenerMap = new
ConcurrentHashMap<>();
+ private ConcurrentMap<String, MappingDataListener> casListenerMap = new
ConcurrentHashMap<>();
public ZookeeperMetadataReport(URL url, ZookeeperTransporter
zookeeperTransporter) {
@@ -162,7 +164,7 @@ public class ZookeeperMetadataReport extends
AbstractMetadataReport {
@Override
public Set<String> getServiceAppMapping(String serviceKey, MappingListener
listener, URL url) {
String path = buildPathKey(DEFAULT_MAPPING_GROUP, serviceKey);
- MappingDataListener mappingDataListener =
casListenerMap.computeIfAbsent(path, _k -> {
+ MappingDataListener mappingDataListener =
ConcurrentHashMapUtils.computeIfAbsent(casListenerMap, path, _k -> {
MappingDataListener newMappingListener = new
MappingDataListener(serviceKey, path);
zkClient.addDataListener(path, newMappingListener);
return newMappingListener;
diff --git
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/collector/AggregateMetricsCollector.java
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/collector/AggregateMetricsCollector.java
index 1dfaab9ecd..1def3cdd60 100644
---
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/collector/AggregateMetricsCollector.java
+++
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/collector/AggregateMetricsCollector.java
@@ -27,6 +27,7 @@ import org.apache.dubbo.common.metrics.model.MethodMetric;
import org.apache.dubbo.common.metrics.model.MetricsKey;
import org.apache.dubbo.common.metrics.model.sample.GaugeMetricSample;
import org.apache.dubbo.common.metrics.model.sample.MetricSample;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.config.MetricsConfig;
import org.apache.dubbo.config.context.ConfigManager;
import org.apache.dubbo.config.nested.AggregationConfig;
@@ -36,8 +37,8 @@ import org.apache.dubbo.rpc.model.ApplicationModel;
import java.util.ArrayList;
import java.util.List;
-import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
import static org.apache.dubbo.common.metrics.model.MetricsCategory.REQUESTS;
import static org.apache.dubbo.common.metrics.model.MetricsCategory.QPS;
@@ -51,15 +52,15 @@ public class AggregateMetricsCollector implements
MetricsCollector, MetricsListe
private int bucketNum;
private int timeWindowSeconds;
- private final Map<MethodMetric, TimeWindowCounter> totalRequests = new
ConcurrentHashMap<>();
- private final Map<MethodMetric, TimeWindowCounter> succeedRequests = new
ConcurrentHashMap<>();
- private final Map<MethodMetric, TimeWindowCounter> failedRequests = new
ConcurrentHashMap<>();
- private final Map<MethodMetric, TimeWindowCounter> businessFailedRequests
= new ConcurrentHashMap<>();
- private final Map<MethodMetric, TimeWindowCounter> timeoutRequests = new
ConcurrentHashMap<>();
- private final Map<MethodMetric, TimeWindowCounter> limitRequests = new
ConcurrentHashMap<>();
- private final Map<MethodMetric, TimeWindowCounter> totalFailedRequests =
new ConcurrentHashMap<>();
- private final Map<MethodMetric, TimeWindowCounter> qps = new
ConcurrentHashMap<>();
- private final Map<MethodMetric, TimeWindowQuantile> rt = new
ConcurrentHashMap<>();
+ private final ConcurrentMap<MethodMetric, TimeWindowCounter> totalRequests
= new ConcurrentHashMap<>();
+ private final ConcurrentMap<MethodMetric, TimeWindowCounter>
succeedRequests = new ConcurrentHashMap<>();
+ private final ConcurrentMap<MethodMetric, TimeWindowCounter>
failedRequests = new ConcurrentHashMap<>();
+ private final ConcurrentMap<MethodMetric, TimeWindowCounter>
businessFailedRequests = new ConcurrentHashMap<>();
+ private final ConcurrentMap<MethodMetric, TimeWindowCounter>
timeoutRequests = new ConcurrentHashMap<>();
+ private final ConcurrentMap<MethodMetric, TimeWindowCounter> limitRequests
= new ConcurrentHashMap<>();
+ private final ConcurrentMap<MethodMetric, TimeWindowCounter>
totalFailedRequests = new ConcurrentHashMap<>();
+ private final ConcurrentMap<MethodMetric, TimeWindowCounter> qps = new
ConcurrentHashMap<>();
+ private final ConcurrentMap<MethodMetric, TimeWindowQuantile> rt = new
ConcurrentHashMap<>();
private final ApplicationModel applicationModel;
@@ -97,7 +98,7 @@ public class AggregateMetricsCollector implements
MetricsCollector, MetricsListe
private void onRTEvent(RTEvent event) {
MethodMetric metric = (MethodMetric) event.getSource();
Long responseTime = event.getRt();
- TimeWindowQuantile quantile = rt.computeIfAbsent(metric, k -> new
TimeWindowQuantile(DEFAULT_COMPRESSION, bucketNum, timeWindowSeconds));
+ TimeWindowQuantile quantile =
ConcurrentHashMapUtils.computeIfAbsent(rt, metric, k -> new
TimeWindowQuantile(DEFAULT_COMPRESSION, bucketNum, timeWindowSeconds));
quantile.add(responseTime);
}
@@ -107,30 +108,30 @@ public class AggregateMetricsCollector implements
MetricsCollector, MetricsListe
TimeWindowCounter counter = null;
switch (type) {
case TOTAL:
- counter = totalRequests.computeIfAbsent(metric, k -> new
TimeWindowCounter(bucketNum, timeWindowSeconds));
- TimeWindowCounter qpsCounter = qps.computeIfAbsent(metric, k
-> new TimeWindowCounter(bucketNum, timeWindowSeconds));
+ counter =
ConcurrentHashMapUtils.computeIfAbsent(totalRequests, metric, k -> new
TimeWindowCounter(bucketNum, timeWindowSeconds));
+ TimeWindowCounter qpsCounter =
ConcurrentHashMapUtils.computeIfAbsent(qps, metric, k -> new
TimeWindowCounter(bucketNum, timeWindowSeconds));
qpsCounter.increment();
break;
case SUCCEED:
- counter = succeedRequests.computeIfAbsent(metric, k -> new
TimeWindowCounter(bucketNum, timeWindowSeconds));
+ counter =
ConcurrentHashMapUtils.computeIfAbsent(succeedRequests, metric, k -> new
TimeWindowCounter(bucketNum, timeWindowSeconds));
break;
case FAILED:
- counter = failedRequests.computeIfAbsent(metric, k -> new
TimeWindowCounter(bucketNum, timeWindowSeconds));
+ counter =
ConcurrentHashMapUtils.computeIfAbsent(failedRequests, metric, k -> new
TimeWindowCounter(bucketNum, timeWindowSeconds));
break;
case BUSINESS_FAILED:
- counter = businessFailedRequests.computeIfAbsent(metric, k ->
new TimeWindowCounter(bucketNum, timeWindowSeconds));
+ counter =
ConcurrentHashMapUtils.computeIfAbsent(businessFailedRequests, metric, k -> new
TimeWindowCounter(bucketNum, timeWindowSeconds));
break;
case REQUEST_TIMEOUT:
- counter = timeoutRequests.computeIfAbsent(metric, k -> new
TimeWindowCounter(bucketNum, timeWindowSeconds));
+ counter =
ConcurrentHashMapUtils.computeIfAbsent(timeoutRequests, metric, k -> new
TimeWindowCounter(bucketNum, timeWindowSeconds));
break;
case REQUEST_LIMIT:
- counter = limitRequests.computeIfAbsent(metric, k -> new
TimeWindowCounter(bucketNum, timeWindowSeconds));
+ counter =
ConcurrentHashMapUtils.computeIfAbsent(limitRequests, metric, k -> new
TimeWindowCounter(bucketNum, timeWindowSeconds));
break;
case TOTAL_FAILED:
- counter = totalFailedRequests.computeIfAbsent(metric, k -> new
TimeWindowCounter(bucketNum, timeWindowSeconds));
+ counter =
ConcurrentHashMapUtils.computeIfAbsent(totalFailedRequests, metric, k -> new
TimeWindowCounter(bucketNum, timeWindowSeconds));
break;
default:
diff --git
a/dubbo-monitor/dubbo-monitor-api/src/main/java/org/apache/dubbo/monitor/support/MonitorFilter.java
b/dubbo-monitor/dubbo-monitor-api/src/main/java/org/apache/dubbo/monitor/support/MonitorFilter.java
index 61b80f3c9e..7e50cc800b 100644
---
a/dubbo-monitor/dubbo-monitor-api/src/main/java/org/apache/dubbo/monitor/support/MonitorFilter.java
+++
b/dubbo-monitor/dubbo-monitor-api/src/main/java/org/apache/dubbo/monitor/support/MonitorFilter.java
@@ -21,6 +21,7 @@ import org.apache.dubbo.common.extension.Activate;
import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
import org.apache.dubbo.common.logger.LoggerFactory;
import org.apache.dubbo.common.url.component.ServiceConfigURL;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.common.utils.NetUtils;
import org.apache.dubbo.monitor.Monitor;
import org.apache.dubbo.monitor.MonitorFactory;
@@ -109,7 +110,7 @@ public class MonitorFilter implements Filter,
Filter.Listener {
*/
private AtomicInteger getConcurrent(Invoker<?> invoker, Invocation
invocation) {
String key = invoker.getInterface().getName() + "." +
invocation.getMethodName();
- return concurrents.computeIfAbsent(key, k -> new AtomicInteger());
+ return ConcurrentHashMapUtils.computeIfAbsent(concurrents, key, k ->
new AtomicInteger());
}
@Override
diff --git
a/dubbo-monitor/dubbo-monitor-default/src/main/java/org/apache/dubbo/monitor/dubbo/DubboMonitor.java
b/dubbo-monitor/dubbo-monitor-default/src/main/java/org/apache/dubbo/monitor/dubbo/DubboMonitor.java
index e0a7d9c8b2..e66fd5f485 100644
---
a/dubbo-monitor/dubbo-monitor-default/src/main/java/org/apache/dubbo/monitor/dubbo/DubboMonitor.java
+++
b/dubbo-monitor/dubbo-monitor-default/src/main/java/org/apache/dubbo/monitor/dubbo/DubboMonitor.java
@@ -20,6 +20,7 @@ import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
import org.apache.dubbo.common.logger.LoggerFactory;
import org.apache.dubbo.common.threadpool.manager.FrameworkExecutorRepository;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.common.utils.ExecutorUtil;
import org.apache.dubbo.monitor.Monitor;
import org.apache.dubbo.monitor.MonitorService;
@@ -152,7 +153,7 @@ public class DubboMonitor implements Monitor {
int concurrent = url.getParameter(CONCURRENT_KEY, 0);
// init atomic reference
Statistics statistics = new Statistics(url);
- AtomicReference<StatisticsItem> reference =
statisticsMap.computeIfAbsent(statistics, k -> new AtomicReference<>());
+ AtomicReference<StatisticsItem> reference =
ConcurrentHashMapUtils.computeIfAbsent(statisticsMap, statistics, k -> new
AtomicReference<>());
// use CompareAndSet to sum
StatisticsItem current;
StatisticsItem update = new StatisticsItem();
diff --git
a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/AbstractServiceDiscoveryFactory.java
b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/AbstractServiceDiscoveryFactory.java
index a2d74d6037..57b4213433 100644
---
a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/AbstractServiceDiscoveryFactory.java
+++
b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/AbstractServiceDiscoveryFactory.java
@@ -17,6 +17,7 @@
package org.apache.dubbo.registry.client;
import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.rpc.model.ApplicationModel;
import org.apache.dubbo.rpc.model.ScopeModelAware;
@@ -50,7 +51,7 @@ public abstract class AbstractServiceDiscoveryFactory
implements ServiceDiscover
@Override
public ServiceDiscovery getServiceDiscovery(URL registryURL) {
String key = registryURL.toServiceStringWithoutResolving();
- return discoveries.computeIfAbsent(key, k ->
createDiscovery(registryURL));
+ return ConcurrentHashMapUtils.computeIfAbsent(discoveries, key, k ->
createDiscovery(registryURL));
}
protected abstract ServiceDiscovery createDiscovery(URL registryURL);
diff --git
a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ReflectionBasedServiceDiscovery.java
b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ReflectionBasedServiceDiscovery.java
index a35cc893e0..61537f88c3 100644
---
a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ReflectionBasedServiceDiscovery.java
+++
b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ReflectionBasedServiceDiscovery.java
@@ -33,6 +33,7 @@ import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.constants.CommonConstants;
import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
import org.apache.dubbo.common.logger.LoggerFactory;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.common.utils.JsonUtils;
import org.apache.dubbo.common.utils.NamedThreadFactory;
import org.apache.dubbo.common.utils.NetUtils;
@@ -261,7 +262,7 @@ public class ReflectionBasedServiceDiscovery extends
AbstractServiceDiscovery {
}
private synchronized MetadataService
getMetadataServiceProxy(ServiceInstance instance) {
- return metadataServiceProxies.computeIfAbsent(computeKey(instance), k
-> MetadataUtils.referProxy(instance).getProxy());
+ return ConcurrentHashMapUtils.computeIfAbsent(metadataServiceProxies,
computeKey(instance), k -> MetadataUtils.referProxy(instance).getProxy());
}
private synchronized void destroyMetadataServiceProxy(ServiceInstance
instance) {
diff --git
a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java
b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java
index 0347cf369c..88c04eadb9 100644
---
a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java
+++
b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java
@@ -20,6 +20,7 @@ import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
import org.apache.dubbo.common.logger.LoggerFactory;
import org.apache.dubbo.common.utils.CollectionUtils;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.metadata.AbstractServiceNameMapping;
import org.apache.dubbo.metadata.MappingChangedEvent;
import org.apache.dubbo.metadata.MappingListener;
@@ -429,7 +430,7 @@ public class ServiceDiscoveryRegistry extends
FailbackRegistry {
}
public Lock getAppSubscription(String key) {
- return appSubscriptionLocks.computeIfAbsent(key, _k -> new
ReentrantLock());
+ return ConcurrentHashMapUtils.computeIfAbsent(appSubscriptionLocks,
key, _k -> new ReentrantLock());
}
public void removeAppSubscriptionLock(String key) {
diff --git
a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistryDirectory.java
b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistryDirectory.java
index 8cc86720cc..c39176bfc6 100644
---
a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistryDirectory.java
+++
b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistryDirectory.java
@@ -26,6 +26,7 @@ import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
import java.util.stream.Collectors;
import org.apache.dubbo.common.ProtocolServiceKey;
@@ -37,6 +38,7 @@ import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
import org.apache.dubbo.common.logger.LoggerFactory;
import org.apache.dubbo.common.utils.Assert;
import org.apache.dubbo.common.utils.CollectionUtils;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.common.utils.NetUtils;
import org.apache.dubbo.metadata.MetadataInfo;
import org.apache.dubbo.registry.AddressListener;
@@ -86,7 +88,7 @@ public class ServiceDiscoveryRegistryDirectory<T> extends
DynamicDirectory<T> {
private final Set<String> providerFirstParams;
private final ModuleModel moduleModel;
private final ProtocolServiceKey consumerProtocolServiceKey;
- private final Map<ProtocolServiceKey, URL> customizedConsumerUrlMap = new
ConcurrentHashMap<>();
+ private final ConcurrentMap<ProtocolServiceKey, URL>
customizedConsumerUrlMap = new ConcurrentHashMap<>();
public ServiceDiscoveryRegistryDirectory(Class<T> serviceType, URL url) {
super(serviceType, url);
@@ -351,7 +353,7 @@ public class ServiceDiscoveryRegistryDirectory<T> extends
DynamicDirectory<T> {
}
if (enabled) {
if (shouldWrap) {
- URL newConsumerUrl =
customizedConsumerUrlMap.computeIfAbsent(matchedProtocolServiceKey,
+ URL newConsumerUrl =
ConcurrentHashMapUtils.computeIfAbsent(customizedConsumerUrlMap,
matchedProtocolServiceKey,
k ->
consumerUrl.setProtocol(k.getProtocol())
.addParameter(CommonConstants.GROUP_KEY, k.getGroup())
.addParameter(CommonConstants.VERSION_KEY, k.getVersion()));
diff --git
a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/migration/DefaultMigrationAddressComparator.java
b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/migration/DefaultMigrationAddressComparator.java
index 8316bdc080..b02f5209ec 100644
---
a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/migration/DefaultMigrationAddressComparator.java
+++
b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/migration/DefaultMigrationAddressComparator.java
@@ -20,6 +20,7 @@ import org.apache.dubbo.common.config.ConfigurationUtils;
import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
import org.apache.dubbo.common.logger.LoggerFactory;
import org.apache.dubbo.common.utils.CollectionUtils;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.registry.client.migration.model.MigrationRule;
import org.apache.dubbo.rpc.Invoker;
@@ -28,6 +29,7 @@ import org.apache.dubbo.rpc.cluster.ClusterInvoker;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
import static
org.apache.dubbo.common.constants.LoggerCodeConstants.COMMON_PROPERTY_TYPE_MISMATCH;
@@ -40,11 +42,11 @@ public class DefaultMigrationAddressComparator implements
MigrationAddressCompar
public static final String OLD_ADDRESS_SIZE = "OLD_ADDRESS_SIZE";
public static final String NEW_ADDRESS_SIZE = "NEW_ADDRESS_SIZE";
- private Map<String, Map<String, Integer>> serviceMigrationData = new
ConcurrentHashMap<>();
+ private ConcurrentMap<String, Map<String, Integer>> serviceMigrationData =
new ConcurrentHashMap<>();
@Override
public <T> boolean shouldMigrate(ClusterInvoker<T> newInvoker,
ClusterInvoker<T> oldInvoker, MigrationRule rule) {
- Map<String, Integer> migrationData =
serviceMigrationData.computeIfAbsent(oldInvoker.getUrl().getDisplayServiceKey(),
_k -> new ConcurrentHashMap<>());
+ Map<String, Integer> migrationData =
ConcurrentHashMapUtils.computeIfAbsent(serviceMigrationData,
oldInvoker.getUrl().getDisplayServiceKey(), _k -> new ConcurrentHashMap<>());
if (!newInvoker.hasProxyInvokers()) {
migrationData.put(OLD_ADDRESS_SIZE, getAddressSize(oldInvoker));
diff --git
a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/migration/MigrationRuleListener.java
b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/migration/MigrationRuleListener.java
index 764b0c0d33..bc5c5a4876 100644
---
a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/migration/MigrationRuleListener.java
+++
b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/migration/MigrationRuleListener.java
@@ -26,6 +26,7 @@ import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
import org.apache.dubbo.common.logger.LoggerFactory;
import org.apache.dubbo.common.threadpool.manager.FrameworkExecutorRepository;
import org.apache.dubbo.common.utils.CollectionUtils;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.common.utils.NamedThreadFactory;
import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.registry.client.migration.model.MigrationRule;
@@ -40,6 +41,7 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@@ -73,7 +75,7 @@ public class MigrationRuleListener implements
RegistryProtocolListener, Configur
private static final int MIGRATION_DEFAULT_DELAY_TIME = 60000;
private String ruleKey;
- protected final Map<MigrationInvoker, MigrationRuleHandler> handlers = new
ConcurrentHashMap<>();
+ protected final ConcurrentMap<MigrationInvoker, MigrationRuleHandler>
handlers = new ConcurrentHashMap<>();
protected final LinkedBlockingQueue<String> ruleQueue = new
LinkedBlockingQueue<>();
private final AtomicBoolean executorSubmit = new AtomicBoolean(false);
@@ -239,7 +241,7 @@ public class MigrationRuleListener implements
RegistryProtocolListener, Configur
@Override
public void onRefer(RegistryProtocol registryProtocol, ClusterInvoker<?>
invoker, URL consumerUrl, URL registryURL) {
- MigrationRuleHandler<?> migrationRuleHandler =
handlers.computeIfAbsent((MigrationInvoker<?>) invoker, _key -> {
+ MigrationRuleHandler<?> migrationRuleHandler =
ConcurrentHashMapUtils.computeIfAbsent(handlers, (MigrationInvoker<?>) invoker,
_key -> {
((MigrationInvoker<?>) invoker).setMigrationRuleListener(this);
return new MigrationRuleHandler<>((MigrationInvoker<?>) invoker,
consumerUrl);
});
diff --git
a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/CacheableFailbackRegistry.java
b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/CacheableFailbackRegistry.java
index a31b2e375d..fb77e17d62 100644
---
a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/CacheableFailbackRegistry.java
+++
b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/CacheableFailbackRegistry.java
@@ -28,6 +28,7 @@ import
org.apache.dubbo.common.url.component.ServiceAddressURL;
import org.apache.dubbo.common.url.component.URLAddress;
import org.apache.dubbo.common.url.component.URLParam;
import org.apache.dubbo.common.utils.CollectionUtils;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.common.utils.UrlUtils;
import org.apache.dubbo.registry.NotifyListener;
@@ -42,6 +43,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
@@ -83,8 +85,8 @@ public abstract class CacheableFailbackRegistry extends
FailbackRegistry {
private static String[] VARIABLE_KEYS = new
String[]{ENCODED_TIMESTAMP_KEY, ENCODED_PID_KEY};
- protected Map<String, URLAddress> stringAddress = new
ConcurrentHashMap<>();
- protected Map<String, URLParam> stringParam = new ConcurrentHashMap<>();
+ protected ConcurrentMap<String, URLAddress> stringAddress = new
ConcurrentHashMap<>();
+ protected ConcurrentMap<String, URLParam> stringParam = new
ConcurrentHashMap<>();
private ScheduledExecutorService cacheRemovalScheduler;
private int cacheRemovalTaskIntervalInMillis;
@@ -249,8 +251,8 @@ public abstract class CacheableFailbackRegistry extends
FailbackRegistry {
/**
* Create DubboServiceAddress object using provider url, consumer url, and
extra parameters.
*
- * @param rawProvider provider url string
- * @param consumerURL URL object of consumer
+ * @param rawProvider provider url string
+ * @param consumerURL URL object of consumer
* @param extraParameters extra parameters
* @return created DubboServiceAddressURL object
*/
@@ -286,10 +288,10 @@ public abstract class CacheableFailbackRegistry extends
FailbackRegistry {
boolean isEncoded = encoded;
// PathURLAddress if it's using dubbo protocol.
- URLAddress address = stringAddress.computeIfAbsent(rawAddress, k ->
URLAddress.parse(k, getDefaultURLProtocol(), isEncoded));
+ URLAddress address =
ConcurrentHashMapUtils.computeIfAbsent(stringAddress, rawAddress, k ->
URLAddress.parse(k, getDefaultURLProtocol(), isEncoded));
address.setTimestamp(System.currentTimeMillis());
- URLParam param = stringParam.computeIfAbsent(rawParams, k ->
URLParam.parse(k, isEncoded, extraParameters));
+ URLParam param = ConcurrentHashMapUtils.computeIfAbsent(stringParam,
rawParams, k -> URLParam.parse(k, isEncoded, extraParameters));
param.setTimestamp(System.currentTimeMillis());
// create service URL using cached address, param, and consumer URL.
diff --git
a/dubbo-registry/dubbo-registry-multiple/src/main/java/org/apache/dubbo/registry/multiple/MultipleServiceDiscovery.java
b/dubbo-registry/dubbo-registry-multiple/src/main/java/org/apache/dubbo/registry/multiple/MultipleServiceDiscovery.java
index 6d02ad195b..fcb6a168ea 100644
---
a/dubbo-registry/dubbo-registry-multiple/src/main/java/org/apache/dubbo/registry/multiple/MultipleServiceDiscovery.java
+++
b/dubbo-registry/dubbo-registry-multiple/src/main/java/org/apache/dubbo/registry/multiple/MultipleServiceDiscovery.java
@@ -22,10 +22,12 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
import java.util.function.Function;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.constants.CommonConstants;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.metadata.MetadataInfo;
import org.apache.dubbo.registry.NotifyListener;
import org.apache.dubbo.registry.client.ServiceDiscovery;
@@ -178,7 +180,7 @@ public class MultipleServiceDiscovery implements
ServiceDiscovery {
}
protected static class MultiServiceInstancesChangedListener extends
ServiceInstancesChangedListener {
- private final Map<String, SingleServiceInstancesChangedListener>
singleListenerMap;
+ private final ConcurrentMap<String,
SingleServiceInstancesChangedListener> singleListenerMap;
public MultiServiceInstancesChangedListener(Set<String> serviceNames,
ServiceDiscovery serviceDiscovery) {
super(serviceNames, serviceDiscovery);
@@ -207,7 +209,7 @@ public class MultipleServiceDiscovery implements
ServiceDiscovery {
public SingleServiceInstancesChangedListener
getAndComputeIfAbsent(String registryKey,
Function<String, SingleServiceInstancesChangedListener> func) {
- return singleListenerMap.computeIfAbsent(registryKey, func);
+ return ConcurrentHashMapUtils.computeIfAbsent(singleListenerMap,
registryKey, func);
}
}
diff --git
a/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosNamingServiceWrapper.java
b/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosNamingServiceWrapper.java
index 32d52a6ea5..3bd6116d15 100644
---
a/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosNamingServiceWrapper.java
+++
b/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosNamingServiceWrapper.java
@@ -23,6 +23,7 @@ import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.stream.Collectors;
@@ -30,6 +31,7 @@ import java.util.stream.Collectors;
import org.apache.dubbo.common.constants.LoggerCodeConstants;
import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
import org.apache.dubbo.common.logger.LoggerFactory;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.common.utils.MethodUtils;
import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.registry.nacos.function.NacosConsumer;
@@ -56,8 +58,8 @@ public class NacosNamingServiceWrapper {
private final boolean isSupportBatchRegister;
- private final Map<InstanceId, InstancesInfo> registerStatus = new
ConcurrentHashMap<>();
- private final Map<SubscribeInfo, NamingService> subscribeStatus = new
ConcurrentHashMap<>();
+ private final ConcurrentMap<InstanceId, InstancesInfo> registerStatus =
new ConcurrentHashMap<>();
+ private final ConcurrentMap<SubscribeInfo, NamingService> subscribeStatus
= new ConcurrentHashMap<>();
private final Lock mapLock = new ReentrantLock();
public NacosNamingServiceWrapper(NacosConnectionManager
nacosConnectionManager, int retryTimes, int sleepMsBetweenRetries) {
@@ -86,7 +88,7 @@ public class NacosNamingServiceWrapper {
public void subscribe(String serviceName, String group, EventListener
eventListener) throws NacosException {
String nacosServiceName = handleInnerSymbol(serviceName);
SubscribeInfo subscribeInfo = new SubscribeInfo(nacosServiceName,
group, eventListener);
- NamingService namingService =
subscribeStatus.computeIfAbsent(subscribeInfo, info ->
nacosConnectionManager.getNamingService());
+ NamingService namingService =
ConcurrentHashMapUtils.computeIfAbsent(subscribeStatus, subscribeInfo, info ->
nacosConnectionManager.getNamingService());
accept(() -> namingService.subscribe(nacosServiceName, group,
eventListener));
}
@@ -109,7 +111,7 @@ public class NacosNamingServiceWrapper {
InstancesInfo instancesInfo;
try {
mapLock.lock();
- instancesInfo = registerStatus.computeIfAbsent(new
InstanceId(nacosServiceName, group), id -> new InstancesInfo());
+ instancesInfo =
ConcurrentHashMapUtils.computeIfAbsent(registerStatus, new
InstanceId(nacosServiceName, group), id -> new InstancesInfo());
} finally {
mapLock.unlock();
}
@@ -177,7 +179,7 @@ public class NacosNamingServiceWrapper {
InstancesInfo instancesInfo;
try {
mapLock.lock();
- instancesInfo = registerStatus.computeIfAbsent(new
InstanceId(nacosServiceName, group), id -> new InstancesInfo());
+ instancesInfo =
ConcurrentHashMapUtils.computeIfAbsent(registerStatus, new
InstanceId(nacosServiceName, group), id -> new InstancesInfo());
} finally {
mapLock.unlock();
}
@@ -223,7 +225,7 @@ public class NacosNamingServiceWrapper {
InstancesInfo instancesInfo;
try {
mapLock.lock();
- instancesInfo = registerStatus.computeIfAbsent(new
InstanceId(nacosServiceName, group), id -> new InstancesInfo());
+ instancesInfo =
ConcurrentHashMapUtils.computeIfAbsent(registerStatus, new
InstanceId(nacosServiceName, group), id -> new InstancesInfo());
} finally {
mapLock.unlock();
}
@@ -250,7 +252,7 @@ public class NacosNamingServiceWrapper {
InstancesInfo instancesInfo;
try {
mapLock.lock();
- instancesInfo = registerStatus.computeIfAbsent(new
InstanceId(nacosServiceName, group), id -> new InstancesInfo());
+ instancesInfo =
ConcurrentHashMapUtils.computeIfAbsent(registerStatus, new
InstanceId(nacosServiceName, group), id -> new InstancesInfo());
} finally {
mapLock.unlock();
}
diff --git
a/dubbo-registry/dubbo-registry-zookeeper/src/main/java/org/apache/dubbo/registry/zookeeper/ZookeeperRegistry.java
b/dubbo-registry/dubbo-registry-zookeeper/src/main/java/org/apache/dubbo/registry/zookeeper/ZookeeperRegistry.java
index 9614772433..8087914b33 100644
---
a/dubbo-registry/dubbo-registry-zookeeper/src/main/java/org/apache/dubbo/registry/zookeeper/ZookeeperRegistry.java
+++
b/dubbo-registry/dubbo-registry-zookeeper/src/main/java/org/apache/dubbo/registry/zookeeper/ZookeeperRegistry.java
@@ -21,6 +21,7 @@ import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
import org.apache.dubbo.common.logger.LoggerFactory;
import org.apache.dubbo.common.utils.CollectionUtils;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.common.utils.ConcurrentHashSet;
import org.apache.dubbo.common.utils.UrlUtils;
import org.apache.dubbo.registry.NotifyListener;
@@ -180,9 +181,9 @@ public class ZookeeperRegistry extends
CacheableFailbackRegistry {
if (ANY_VALUE.equals(url.getServiceInterface())) {
String root = toRootPath();
boolean check = url.getParameter(CHECK_KEY, false);
- ConcurrentMap<NotifyListener, ChildListener> listeners =
zkListeners.computeIfAbsent(url, k -> new ConcurrentHashMap<>());
+ ConcurrentMap<NotifyListener, ChildListener> listeners =
ConcurrentHashMapUtils.computeIfAbsent(zkListeners, url, k -> new
ConcurrentHashMap<>());
- ChildListener zkListener = listeners.computeIfAbsent(listener,
k -> (parentPath, currentChildren) -> {
+ ChildListener zkListener =
ConcurrentHashMapUtils.computeIfAbsent(listeners, listener, k -> (parentPath,
currentChildren) -> {
for (String child : currentChildren) {
child = URL.decode(child);
if (!anyServices.contains(child)) {
@@ -219,8 +220,8 @@ public class ZookeeperRegistry extends
CacheableFailbackRegistry {
/dubbo/[service name]/routers
*/
for (String path : toCategoriesPath(url)) {
- ConcurrentMap<NotifyListener, ChildListener> listeners
= zkListeners.computeIfAbsent(url, k -> new ConcurrentHashMap<>());
- ChildListener zkListener =
listeners.computeIfAbsent(listener, k -> new RegistryChildListenerImpl(url, k,
latch));
+ ConcurrentMap<NotifyListener, ChildListener> listeners
= ConcurrentHashMapUtils.computeIfAbsent(zkListeners, url, k -> new
ConcurrentHashMap<>());
+ ChildListener zkListener =
ConcurrentHashMapUtils.computeIfAbsent(listeners, listener, k -> new
RegistryChildListenerImpl(url, k, latch));
if (zkListener instanceof RegistryChildListenerImpl) {
((RegistryChildListenerImpl)
zkListener).setLatch(latch);
diff --git
a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/api/connection/MultiplexProtocolConnectionManager.java
b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/api/connection/MultiplexProtocolConnectionManager.java
index a1b60eb3be..25ef6fa009 100644
---
a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/api/connection/MultiplexProtocolConnectionManager.java
+++
b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/api/connection/MultiplexProtocolConnectionManager.java
@@ -17,6 +17,7 @@
package org.apache.dubbo.remoting.api.connection;
import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.remoting.ChannelHandler;
import org.apache.dubbo.rpc.model.FrameworkModel;
@@ -37,7 +38,7 @@ public class MultiplexProtocolConnectionManager implements
ConnectionManager {
@Override
public AbstractConnectionClient connect(URL url, ChannelHandler handler) {
- final ConnectionManager manager =
protocols.computeIfAbsent(url.getProtocol(),
this::createSingleProtocolConnectionManager);
+ final ConnectionManager manager =
ConcurrentHashMapUtils.computeIfAbsent(protocols, url.getProtocol(),
this::createSingleProtocolConnectionManager);
return manager.connect(url, handler);
}
diff --git
a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/PortUnificationExchanger.java
b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/PortUnificationExchanger.java
index 3b1f9e7a82..26252adc98 100644
---
a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/PortUnificationExchanger.java
+++
b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/PortUnificationExchanger.java
@@ -19,6 +19,7 @@ package org.apache.dubbo.remoting.exchange;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
import org.apache.dubbo.common.logger.LoggerFactory;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.remoting.ChannelHandler;
import org.apache.dubbo.remoting.RemotingException;
import org.apache.dubbo.remoting.RemotingServer;
@@ -38,7 +39,7 @@ public class PortUnificationExchanger {
private static final ConcurrentMap<String, RemotingServer> servers = new
ConcurrentHashMap<>();
public static RemotingServer bind(URL url, ChannelHandler handler) {
- servers.computeIfAbsent(url.getAddress(), addr -> {
+ ConcurrentHashMapUtils.computeIfAbsent(servers, url.getAddress(), addr
-> {
final AbstractPortUnificationServer server;
try {
server = getTransporter(url).bind(url, handler);
@@ -85,7 +86,7 @@ public class PortUnificationExchanger {
public static PortUnificationTransporter getTransporter(URL url) {
return
url.getOrDefaultFrameworkModel().getExtensionLoader(PortUnificationTransporter.class)
- .getAdaptiveExtension();
+ .getAdaptiveExtension();
}
}
diff --git
a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/transport/CodecSupport.java
b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/transport/CodecSupport.java
index 0c7861e34a..0f0d079927 100644
---
a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/transport/CodecSupport.java
+++
b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/transport/CodecSupport.java
@@ -25,6 +25,7 @@ import org.apache.dubbo.common.serialize.ObjectInput;
import org.apache.dubbo.common.serialize.ObjectOutput;
import org.apache.dubbo.common.serialize.Serialization;
import org.apache.dubbo.common.utils.CollectionUtils;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.remoting.utils.UrlUtils;
import org.apache.dubbo.rpc.model.FrameworkModel;
import org.apache.dubbo.rpc.model.FrameworkServiceRepository;
@@ -38,6 +39,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
import static org.apache.dubbo.common.BaseServiceMetadata.keyWithoutGroup;
import static
org.apache.dubbo.common.constants.LoggerCodeConstants.TRANSPORT_FAILED_SERIALIZATION;
@@ -48,7 +50,7 @@ public class CodecSupport {
private static Map<Byte, String> ID_SERIALIZATIONNAME_MAP = new
HashMap<Byte, String>();
private static Map<String, Byte> SERIALIZATIONNAME_ID_MAP = new
HashMap<String, Byte>();
// Cache null object serialize results, for heartbeat request/response
serialize use.
- private static Map<Byte, byte[]> ID_NULLBYTES_MAP = new
ConcurrentHashMap<>();
+ private static ConcurrentMap<Byte, byte[]> ID_NULLBYTES_MAP = new
ConcurrentHashMap<>();
private static final ThreadLocal<byte[]> TL_BUFFER =
ThreadLocal.withInitial(() -> new byte[1024]);
@@ -107,7 +109,7 @@ public class CodecSupport {
* @return serialize result of null object
*/
public static byte[] getNullBytesOf(Serialization s) {
- return ID_NULLBYTES_MAP.computeIfAbsent(s.getContentTypeId(), k -> {
+ return ConcurrentHashMapUtils.computeIfAbsent(ID_NULLBYTES_MAP,
s.getContentTypeId(), k -> {
//Pre-generated Null object bytes
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] nullBytes = new byte[0];
diff --git
a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/zookeeper/AbstractZookeeperClient.java
b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/zookeeper/AbstractZookeeperClient.java
index a4d4f64a4d..9f5d3c7bf5 100644
---
a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/zookeeper/AbstractZookeeperClient.java
+++
b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/zookeeper/AbstractZookeeperClient.java
@@ -20,6 +20,7 @@ import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.config.configcenter.ConfigItem;
import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
import org.apache.dubbo.common.logger.LoggerFactory;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.common.utils.ConcurrentHashSet;
import java.util.List;
@@ -106,8 +107,8 @@ public abstract class
AbstractZookeeperClient<TargetDataListener, TargetChildLis
@Override
public List<String> addChildListener(String path, final ChildListener
listener) {
- ConcurrentMap<ChildListener, TargetChildListener> listeners =
childListeners.computeIfAbsent(path, k -> new ConcurrentHashMap<>());
- TargetChildListener targetListener =
listeners.computeIfAbsent(listener, k -> createTargetChildListener(path, k));
+ ConcurrentMap<ChildListener, TargetChildListener> listeners =
ConcurrentHashMapUtils.computeIfAbsent(childListeners, path, k -> new
ConcurrentHashMap<>());
+ TargetChildListener targetListener =
ConcurrentHashMapUtils.computeIfAbsent(listeners, listener, k ->
createTargetChildListener(path, k));
return addTargetChildListener(path, targetListener);
}
@@ -118,8 +119,8 @@ public abstract class
AbstractZookeeperClient<TargetDataListener, TargetChildLis
@Override
public void addDataListener(String path, DataListener listener, Executor
executor) {
- ConcurrentMap<DataListener, TargetDataListener> dataListenerMap =
listeners.computeIfAbsent(path, k -> new ConcurrentHashMap<>());
- TargetDataListener targetListener =
dataListenerMap.computeIfAbsent(listener, k -> createTargetDataListener(path,
k));
+ ConcurrentMap<DataListener, TargetDataListener> dataListenerMap =
ConcurrentHashMapUtils.computeIfAbsent(listeners, path, k -> new
ConcurrentHashMap<>());
+ TargetDataListener targetListener =
ConcurrentHashMapUtils.computeIfAbsent(dataListenerMap, listener, k ->
createTargetDataListener(path, k));
addTargetDataListener(path, targetListener, executor);
}
diff --git
a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/AdaptiveMetrics.java
b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/AdaptiveMetrics.java
index 0c6fa4cce6..9fd3052b2c 100644
---
a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/AdaptiveMetrics.java
+++
b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/AdaptiveMetrics.java
@@ -16,6 +16,7 @@
*/
package org.apache.dubbo.rpc;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.common.utils.StringUtils;
import java.util.Map;
@@ -45,7 +46,7 @@ public class AdaptiveMetrics {
private final AtomicLong errorReq = new AtomicLong();
private double ewma = 0;
- public double getLoad(String idKey,int weight,int timeout){
+ public double getLoad(String idKey, int weight, int timeout) {
AdaptiveMetrics metrics = getStatus(idKey);
//If the time more than 2 times, mandatory selected
@@ -53,13 +54,13 @@ public class AdaptiveMetrics {
return 0;
}
- if (metrics.currentTime > 0){
+ if (metrics.currentTime > 0) {
long multiple = (System.currentTimeMillis() - metrics.currentTime)
/ timeout + 1;
if (multiple > 0) {
if (metrics.currentProviderTime == metrics.currentTime) {
//penalty value
metrics.lastLatency = timeout * 2L;
- }else {
+ } else {
metrics.lastLatency = metrics.lastLatency >> multiple;
}
metrics.ewma = metrics.beta * metrics.ewma + (1 -
metrics.beta) * metrics.lastLatency;
@@ -68,49 +69,48 @@ public class AdaptiveMetrics {
}
long inflight = metrics.consumerReq.get() -
metrics.consumerSuccess.get() - metrics.errorReq.get();
- return metrics.providerCPULoad * (Math.sqrt(metrics.ewma) + 1) *
(inflight + 1) / ((((double)metrics.consumerSuccess.get() /
(double)(metrics.consumerReq.get() + 1)) * weight) + 1);
+ return metrics.providerCPULoad * (Math.sqrt(metrics.ewma) + 1) *
(inflight + 1) / ((((double) metrics.consumerSuccess.get() / (double)
(metrics.consumerReq.get() + 1)) * weight) + 1);
}
- public AdaptiveMetrics getStatus(String idKey){
- return metricsStatistics.computeIfAbsent(idKey, k -> new
AdaptiveMetrics());
+ public AdaptiveMetrics getStatus(String idKey) {
+ return ConcurrentHashMapUtils.computeIfAbsent(metricsStatistics,
idKey, k -> new AdaptiveMetrics());
}
- public void addConsumerReq(String idKey){
+ public void addConsumerReq(String idKey) {
AdaptiveMetrics metrics = getStatus(idKey);
metrics.consumerReq.incrementAndGet();
}
- public void addConsumerSuccess(String idKey){
+ public void addConsumerSuccess(String idKey) {
AdaptiveMetrics metrics = getStatus(idKey);
metrics.consumerSuccess.incrementAndGet();
}
- public void addErrorReq(String idKey){
+ public void addErrorReq(String idKey) {
AdaptiveMetrics metrics = getStatus(idKey);
metrics.errorReq.incrementAndGet();
}
- public void setPickTime(String idKey,long time){
+ public void setPickTime(String idKey, long time) {
AdaptiveMetrics metrics = getStatus(idKey);
metrics.pickTime = time;
}
-
- public void setProviderMetrics(String idKey,Map<String,String> metricsMap){
+ public void setProviderMetrics(String idKey, Map<String, String>
metricsMap) {
AdaptiveMetrics metrics = getStatus(idKey);
- long serviceTime =
Long.parseLong(Optional.ofNullable(metricsMap.get("curTime")).filter(v ->
StringUtils.isNumeric(v,false)).orElse("0"));
+ long serviceTime =
Long.parseLong(Optional.ofNullable(metricsMap.get("curTime")).filter(v ->
StringUtils.isNumeric(v, false)).orElse("0"));
//If server time is less than the current time, discard
- if (metrics.currentProviderTime > serviceTime){
+ if (metrics.currentProviderTime > serviceTime) {
return;
}
metrics.currentProviderTime = serviceTime;
metrics.currentTime = serviceTime;
- metrics.providerCPULoad =
Double.parseDouble(Optional.ofNullable(metricsMap.get("load")).filter(v ->
StringUtils.isNumeric(v,true)).orElse("0"));
- metrics.lastLatency =
Long.parseLong((Optional.ofNullable(metricsMap.get("rt")).filter(v ->
StringUtils.isNumeric(v,false)).orElse("0")));
+ metrics.providerCPULoad =
Double.parseDouble(Optional.ofNullable(metricsMap.get("load")).filter(v ->
StringUtils.isNumeric(v, true)).orElse("0"));
+ metrics.lastLatency =
Long.parseLong((Optional.ofNullable(metricsMap.get("rt")).filter(v ->
StringUtils.isNumeric(v, false)).orElse("0")));
metrics.beta = 0.5;
//Vt = β * Vt-1 + (1 - β ) * θt
diff --git
a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/RpcStatus.java
b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/RpcStatus.java
index d451c342aa..6ea826a116 100644
--- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/RpcStatus.java
+++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/RpcStatus.java
@@ -17,6 +17,7 @@
package org.apache.dubbo.rpc;
import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
@@ -33,10 +34,10 @@ import java.util.concurrent.atomic.AtomicLong;
public class RpcStatus {
private static final ConcurrentMap<String, RpcStatus> SERVICE_STATISTICS =
new ConcurrentHashMap<String,
- RpcStatus>();
+ RpcStatus>();
private static final ConcurrentMap<String, ConcurrentMap<String,
RpcStatus>> METHOD_STATISTICS =
- new ConcurrentHashMap<String, ConcurrentMap<String, RpcStatus>>();
+ new ConcurrentHashMap<String, ConcurrentMap<String, RpcStatus>>();
private final ConcurrentMap<String, Object> values = new
ConcurrentHashMap<String, Object>();
@@ -58,7 +59,7 @@ public class RpcStatus {
*/
public static RpcStatus getStatus(URL url) {
String uri = url.toIdentityString();
- return SERVICE_STATISTICS.computeIfAbsent(uri, key -> new RpcStatus());
+ return ConcurrentHashMapUtils.computeIfAbsent(SERVICE_STATISTICS, uri,
key -> new RpcStatus());
}
/**
@@ -76,8 +77,8 @@ public class RpcStatus {
*/
public static RpcStatus getStatus(URL url, String methodName) {
String uri = url.toIdentityString();
- ConcurrentMap<String, RpcStatus> map =
METHOD_STATISTICS.computeIfAbsent(uri, k -> new ConcurrentHashMap<>());
- return map.computeIfAbsent(methodName, k -> new RpcStatus());
+ ConcurrentMap<String, RpcStatus> map =
ConcurrentHashMapUtils.computeIfAbsent(METHOD_STATISTICS, uri, k -> new
ConcurrentHashMap<>());
+ return ConcurrentHashMapUtils.computeIfAbsent(map, methodName, k ->
new RpcStatus());
}
/**
diff --git
a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/AccessLogFilter.java
b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/AccessLogFilter.java
index 3433fb4dc6..f692e6d87c 100644
---
a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/AccessLogFilter.java
+++
b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/AccessLogFilter.java
@@ -20,6 +20,7 @@ import org.apache.dubbo.common.extension.Activate;
import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
import org.apache.dubbo.common.logger.LoggerFactory;
import org.apache.dubbo.common.threadpool.manager.FrameworkExecutorRepository;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.common.utils.ConfigUtils;
import org.apache.dubbo.rpc.Constants;
import org.apache.dubbo.rpc.Filter;
@@ -40,6 +41,7 @@ import java.util.Optional;
import java.util.Queue;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -77,7 +79,7 @@ public class AccessLogFilter implements Filter {
// It's safe to declare it as singleton since it runs on single thread only
private final DateFormat fileNameFormatter = new
SimpleDateFormat(FILE_DATE_FORMAT);
- private final Map<String, Queue<AccessLogData>> logEntries = new
ConcurrentHashMap<>();
+ private final ConcurrentMap<String, Queue<AccessLogData>> logEntries = new
ConcurrentHashMap<>();
private AtomicBoolean scheduled = new AtomicBoolean();
@@ -127,12 +129,12 @@ public class AccessLogFilter implements Filter {
}
private void log(String accessLog, AccessLogData accessLogData) {
- Queue<AccessLogData> logQueue = logEntries.computeIfAbsent(accessLog,
k -> new ConcurrentLinkedQueue<>());
+ Queue<AccessLogData> logQueue =
ConcurrentHashMapUtils.computeIfAbsent(logEntries, accessLog, k -> new
ConcurrentLinkedQueue<>());
if (logQueue.size() < LOG_MAX_BUFFER) {
logQueue.add(accessLogData);
} else {
- logger.warn(CONFIG_FILTER_VALIDATION_EXCEPTION, "", "","AccessLog
buffer is full. Do a force writing to file to clear buffer.");
+ logger.warn(CONFIG_FILTER_VALIDATION_EXCEPTION, "", "", "AccessLog
buffer is full. Do a force writing to file to clear buffer.");
//just write current logSet to file.
writeLogSetToFile(accessLog, logQueue);
//after force writing, add accessLogData to current logSet
diff --git
a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/protocol/AbstractProtocol.java
b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/protocol/AbstractProtocol.java
index 50c37d9a81..3781b2f382 100644
---
a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/protocol/AbstractProtocol.java
+++
b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/protocol/AbstractProtocol.java
@@ -41,6 +41,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
import static
org.apache.dubbo.common.constants.CommonConstants.DEFAULT_SERVER_SHUTDOWN_TIMEOUT;
import static
org.apache.dubbo.common.constants.CommonConstants.SHUTDOWN_WAIT_KEY;
@@ -59,7 +60,7 @@ public abstract class AbstractProtocol implements Protocol,
ScopeModelAware {
/**
* <host:port, ProtocolServer>
*/
- protected final Map<String, ProtocolServer> serverMap = new
ConcurrentHashMap<>();
+ protected final ConcurrentMap<String, ProtocolServer> serverMap = new
ConcurrentHashMap<>();
// TODO SoftReference
protected final Set<Invoker<?>> invokers = new ConcurrentHashSet<>();
diff --git
a/dubbo-rpc/dubbo-rpc-grpc/src/main/java/org/apache/dubbo/rpc/protocol/grpc/GrpcProtocol.java
b/dubbo-rpc/dubbo-rpc-grpc/src/main/java/org/apache/dubbo/rpc/protocol/grpc/GrpcProtocol.java
index 2223311578..1f5805a298 100644
---
a/dubbo-rpc/dubbo-rpc-grpc/src/main/java/org/apache/dubbo/rpc/protocol/grpc/GrpcProtocol.java
+++
b/dubbo-rpc/dubbo-rpc-grpc/src/main/java/org/apache/dubbo/rpc/protocol/grpc/GrpcProtocol.java
@@ -19,6 +19,7 @@ package org.apache.dubbo.rpc.protocol.grpc;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.logger.Logger;
import org.apache.dubbo.common.logger.LoggerFactory;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.rpc.Invoker;
import org.apache.dubbo.rpc.ProtocolServer;
import org.apache.dubbo.rpc.RpcException;
@@ -55,13 +56,13 @@ public class GrpcProtocol extends AbstractProxyProtocol {
@Override
protected <T> Runnable doExport(T proxiedImpl, Class<T> type, URL url)
throws RpcException {
String key = url.getAddress();
- ProtocolServer protocolServer = serverMap.computeIfAbsent(key, k -> {
+ ProtocolServer protocolServer =
ConcurrentHashMapUtils.computeIfAbsent(serverMap, key, k -> {
DubboHandlerRegistry registry = new DubboHandlerRegistry();
NettyServerBuilder builder =
- NettyServerBuilder
+ NettyServerBuilder
.forPort(url.getPort())
- .fallbackHandlerRegistry(registry);
+ .fallbackHandlerRegistry(registry);
Server originalServer = GrpcOptionsUtils.buildServerBuilder(url,
builder).build();
GrpcRemotingServer remotingServer = new
GrpcRemotingServer(originalServer, registry);
@@ -74,7 +75,7 @@ public class GrpcProtocol extends AbstractProxyProtocol {
ProviderModel providerModel =
serviceRepository.lookupExportedService(url.getServiceKey());
if (providerModel == null) {
throw new IllegalStateException("Service " + url.getServiceKey() +
"should have already been stored in service repository, " +
- "but failed to find it.");
+ "but failed to find it.");
}
Object originalImpl = providerModel.getServiceInstance();
@@ -84,7 +85,7 @@ public class GrpcProtocol extends AbstractProxyProtocol {
method.invoke(originalImpl, proxiedImpl);
} catch (Exception e) {
throw new IllegalStateException("Failed to set dubbo proxied
service impl to stub, please make sure your stub " +
- "was generated by the dubbo-protoc-compiler.", e);
+ "was generated by the dubbo-protoc-compiler.", e);
}
grpcServer.getRegistry().addService((BindableService) originalImpl,
url.getServiceKey());
@@ -101,13 +102,13 @@ public class GrpcProtocol extends AbstractProxyProtocol {
if (enclosingClass == null) {
throw new IllegalArgumentException(type.getName() + " must be
declared inside protobuf generated classes, " +
- "should be something like ServiceNameGrpc.IServiceName.");
+ "should be something like ServiceNameGrpc.IServiceName.");
}
final Method dubboStubMethod;
try {
dubboStubMethod = enclosingClass.getDeclaredMethod("getDubboStub",
Channel.class, CallOptions.class,
- URL.class);
+ URL.class);
} catch (NoSuchMethodException e) {
throw new IllegalArgumentException("Does not find getDubboStub in
" + enclosingClass.getName() + ", please use the customized
protoc-gen-dubbo-java to update the generated classes.");
}
@@ -118,9 +119,9 @@ public class GrpcProtocol extends AbstractProxyProtocol {
// CallOptions
try {
@SuppressWarnings("unchecked") final T stub = (T)
dubboStubMethod.invoke(null,
- channel,
- GrpcOptionsUtils.buildCallOptions(url),
- url
+ channel,
+ GrpcOptionsUtils.buildCallOptions(url),
+ url
);
final Invoker<T> target = proxyFactory.getInvoker(stub, type, url);
GrpcInvoker<T> grpcInvoker = new GrpcInvoker<>(type, url, target,
channel);
diff --git
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/RestProtocol.java
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/RestProtocol.java
index f38b0139c0..1966e7f0ec 100644
---
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/RestProtocol.java
+++
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/RestProtocol.java
@@ -17,6 +17,7 @@
package org.apache.dubbo.rpc.protocol.rest;
import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.remoting.http.HttpBinder;
import org.apache.dubbo.remoting.http.servlet.BootstrapListener;
@@ -45,6 +46,7 @@ import javax.ws.rs.ProcessingException;
import javax.ws.rs.WebApplicationException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.TimeUnit;
import static
org.apache.dubbo.common.constants.CommonConstants.COMMA_SPLIT_PATTERN;
@@ -72,7 +74,7 @@ public class RestProtocol extends AbstractProxyProtocol {
private final RestServerFactory serverFactory = new RestServerFactory();
- private final Map<String, ReferenceCountedClient> clients = new
ConcurrentHashMap<>();
+ private final ConcurrentMap<String, ReferenceCountedClient> clients = new
ConcurrentHashMap<>();
private volatile ConnectionMonitor connectionMonitor;
@@ -93,7 +95,7 @@ public class RestProtocol extends AbstractProxyProtocol {
protected <T> Runnable doExport(T impl, Class<T> type, URL url) throws
RpcException {
String addr = getAddr(url);
Class implClass = url.getServiceModel().getProxyObject().getClass();
- RestProtocolServer server = (RestProtocolServer)
serverMap.computeIfAbsent(addr, restServer -> {
+ RestProtocolServer server = (RestProtocolServer)
ConcurrentHashMapUtils.computeIfAbsent(serverMap, addr, restServer -> {
RestProtocolServer s =
serverFactory.createServer(url.getParameter(SERVER_KEY, DEFAULT_SERVER));
s.setAddress(url.getAddress());
s.start(url);
@@ -135,7 +137,7 @@ public class RestProtocol extends AbstractProxyProtocol {
@Override
protected <T> T doRefer(Class<T> serviceType, URL url) throws RpcException
{
- ReferenceCountedClient referenceCountedClient =
clients.computeIfAbsent(url.getAddress(), _key -> {
+ ReferenceCountedClient referenceCountedClient =
ConcurrentHashMapUtils.computeIfAbsent(clients, url.getAddress(), _key -> {
// TODO more configs to add
return createReferenceCountedClient(url);
});
diff --git
a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/SingleProtobufUtils.java
b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/SingleProtobufUtils.java
index 0c9aeeb62f..5f79dad3b7 100644
---
a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/SingleProtobufUtils.java
+++
b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/SingleProtobufUtils.java
@@ -17,6 +17,8 @@
package org.apache.dubbo.rpc.protocol.tri;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
+
import com.google.protobuf.BoolValue;
import com.google.protobuf.BytesValue;
import com.google.protobuf.DoubleValue;
@@ -110,7 +112,7 @@ public class SingleProtobufUtils {
}
private static SingleMessageMarshaller<?> getMarshaller(Class<?> clz) {
- return MARSHALLER_CACHE.computeIfAbsent(clz, k -> new
SingleMessageMarshaller(k));
+ return ConcurrentHashMapUtils.computeIfAbsent(MARSHALLER_CACHE, clz, k
-> new SingleMessageMarshaller(k));
}
public static final class SingleMessageMarshaller<T extends MessageLite> {
diff --git
a/dubbo-xds/src/main/java/org/apache/dubbo/registry/xds/util/protocol/AbstractProtocol.java
b/dubbo-xds/src/main/java/org/apache/dubbo/registry/xds/util/protocol/AbstractProtocol.java
index 625de92e62..1054526594 100644
---
a/dubbo-xds/src/main/java/org/apache/dubbo/registry/xds/util/protocol/AbstractProtocol.java
+++
b/dubbo-xds/src/main/java/org/apache/dubbo/registry/xds/util/protocol/AbstractProtocol.java
@@ -43,6 +43,7 @@ import
io.envoyproxy.envoy.service.discovery.v3.DiscoveryResponse;
import static
org.apache.dubbo.common.constants.LoggerCodeConstants.INTERNAL_INTERRUPTED;
import static
org.apache.dubbo.common.constants.LoggerCodeConstants.PROTOCOL_FAILED_REQUEST;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
public abstract class AbstractProtocol<T, S extends DeltaResource<T>>
implements XdsProtocol<T>, XdsListener {
@@ -138,7 +139,7 @@ public abstract class AbstractProtocol<T, S extends
DeltaResource<T>> implements
Consumer<Map<String, T>> futureConsumer = future::complete;
try {
writeLock.lock();
-
consumerObserveMap.computeIfAbsent(consumerObserveResourceNames, key -> new
ArrayList<>())
+
ConcurrentHashMapUtils.computeIfAbsent((ConcurrentHashMap<Set<String>,
List<Consumer<Map<String,
T>>>>)consumerObserveMap,consumerObserveResourceNames, key -> new ArrayList<>())
.add(futureConsumer);
} finally {
writeLock.unlock();
diff --git
a/dubbo-xds/src/main/java/org/apache/dubbo/rpc/cluster/router/xds/EdsEndpointManager.java
b/dubbo-xds/src/main/java/org/apache/dubbo/rpc/cluster/router/xds/EdsEndpointManager.java
index f8ff539995..6291551889 100644
---
a/dubbo-xds/src/main/java/org/apache/dubbo/rpc/cluster/router/xds/EdsEndpointManager.java
+++
b/dubbo-xds/src/main/java/org/apache/dubbo/rpc/cluster/router/xds/EdsEndpointManager.java
@@ -25,6 +25,7 @@ import java.util.stream.Collectors;
import org.apache.dubbo.common.threadpool.manager.FrameworkExecutorRepository;
import org.apache.dubbo.common.utils.CollectionUtils;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.common.utils.ConcurrentHashSet;
import org.apache.dubbo.registry.xds.util.PilotExchanger;
import org.apache.dubbo.registry.xds.util.protocol.message.Endpoint;
@@ -45,7 +46,7 @@ public class EdsEndpointManager {
public synchronized void subscribeEds(String cluster, EdsEndpointListener
listener) {
- Set<EdsEndpointListener> listeners =
ENDPOINT_LISTENERS.computeIfAbsent(cluster, key ->
+ Set<EdsEndpointListener> listeners =
ConcurrentHashMapUtils.computeIfAbsent(ENDPOINT_LISTENERS, cluster, key ->
new ConcurrentHashSet<>()
);
if (CollectionUtils.isEmpty(listeners)) {
@@ -59,7 +60,7 @@ public class EdsEndpointManager {
}
private void doSubscribeEds(String cluster) {
- EDS_LISTENERS.computeIfAbsent(cluster, key -> endpoints -> {
+ ConcurrentHashMapUtils.computeIfAbsent(EDS_LISTENERS, cluster, key ->
endpoints -> {
Set<Endpoint> result = endpoints.values()
.stream()
.map(EndpointResult::getEndpoints)
diff --git
a/dubbo-xds/src/main/java/org/apache/dubbo/rpc/cluster/router/xds/RdsRouteRuleManager.java
b/dubbo-xds/src/main/java/org/apache/dubbo/rpc/cluster/router/xds/RdsRouteRuleManager.java
index 3f464f5e43..a76508a138 100644
---
a/dubbo-xds/src/main/java/org/apache/dubbo/rpc/cluster/router/xds/RdsRouteRuleManager.java
+++
b/dubbo-xds/src/main/java/org/apache/dubbo/rpc/cluster/router/xds/RdsRouteRuleManager.java
@@ -20,9 +20,11 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
import java.util.function.Consumer;
import org.apache.dubbo.common.utils.CollectionUtils;
+import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.common.utils.ConcurrentHashSet;
import org.apache.dubbo.registry.xds.util.PilotExchanger;
import org.apache.dubbo.registry.xds.util.protocol.message.ListenerResult;
@@ -38,7 +40,7 @@ public class RdsRouteRuleManager {
private static final ConcurrentHashMap<String, List<XdsRouteRule>>
ROUTE_DATA_CACHE = new ConcurrentHashMap<>();
- private static final Map<String, RdsVirtualHostListener> RDS_LISTENERS =
new ConcurrentHashMap<>();
+ private static final ConcurrentMap<String, RdsVirtualHostListener>
RDS_LISTENERS = new ConcurrentHashMap<>();
private static volatile Consumer<Map<String, ListenerResult>> LDS_LISTENER;
@@ -51,7 +53,7 @@ public class RdsRouteRuleManager {
public synchronized void subscribeRds(String domain, XdsRouteRuleListener
listener) {
- Set<XdsRouteRuleListener> listeners =
RULE_LISTENERS.computeIfAbsent(domain, key ->
+ Set<XdsRouteRuleListener> listeners =
ConcurrentHashMapUtils.computeIfAbsent(RULE_LISTENERS, domain, key ->
new ConcurrentHashSet<>()
);
if (CollectionUtils.isEmpty(listeners)) {
@@ -107,7 +109,7 @@ public class RdsRouteRuleManager {
}
}
}
- RDS_LISTENERS.computeIfAbsent(domain, key -> new
RdsVirtualHostListener(domain, this));
+ ConcurrentHashMapUtils.computeIfAbsent(RDS_LISTENERS, domain, key ->
new RdsVirtualHostListener(domain, this));
RDS_LISTENER.accept(RDS_RESULT);
}