You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@servicecomb.apache.org by GitBox <gi...@apache.org> on 2018/01/11 07:03:09 UTC

[GitHub] WillemJiang closed pull request #503: [SCB-217] Fix usage of concurrent hash map

WillemJiang closed pull request #503: [SCB-217] Fix usage of concurrent hash map
URL: https://github.com/apache/incubator-servicecomb-java-chassis/pull/503
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/core/src/main/java/io/servicecomb/core/executor/FixedThreadExecutor.java b/core/src/main/java/io/servicecomb/core/executor/FixedThreadExecutor.java
index 0969d49b2..165756931 100644
--- a/core/src/main/java/io/servicecomb/core/executor/FixedThreadExecutor.java
+++ b/core/src/main/java/io/servicecomb/core/executor/FixedThreadExecutor.java
@@ -20,7 +20,6 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.Executor;
 import java.util.concurrent.Executors;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -30,6 +29,8 @@
 
 import com.netflix.config.DynamicPropertyFactory;
 
+import io.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx;
+
 public class FixedThreadExecutor implements Executor {
   private static final Logger LOGGER = LoggerFactory.getLogger(FixedThreadExecutor.class);
 
@@ -44,7 +45,7 @@
   // it's impossible that has too many network thread, so index will not too big that less than 0
   private AtomicInteger index = new AtomicInteger();
 
-  private Map<Long, Executor> threadExecutorMap = new ConcurrentHashMap<>();
+  private Map<Long, Executor> threadExecutorMap = new ConcurrentHashMapEx<>();
 
   public FixedThreadExecutor() {
     int groupCount = DynamicPropertyFactory.getInstance().getIntProperty(KEY_GROUP, 2).get();
diff --git a/core/src/main/java/io/servicecomb/core/handler/impl/SimpleLoadBalanceHandler.java b/core/src/main/java/io/servicecomb/core/handler/impl/SimpleLoadBalanceHandler.java
index b62a57731..aa8f1d214 100644
--- a/core/src/main/java/io/servicecomb/core/handler/impl/SimpleLoadBalanceHandler.java
+++ b/core/src/main/java/io/servicecomb/core/handler/impl/SimpleLoadBalanceHandler.java
@@ -19,7 +19,6 @@
 
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import org.slf4j.Logger;
@@ -31,6 +30,7 @@
 import io.servicecomb.core.exception.ExceptionUtils;
 import io.servicecomb.core.filter.EndpointDiscoveryFilter;
 import io.servicecomb.foundation.common.cache.VersionedCache;
+import io.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx;
 import io.servicecomb.serviceregistry.discovery.DiscoveryContext;
 import io.servicecomb.serviceregistry.discovery.DiscoveryFilter;
 import io.servicecomb.serviceregistry.discovery.DiscoveryTree;
@@ -45,7 +45,7 @@
   private DiscoveryTree discoveryTree = new DiscoveryTree();
 
   // key?grouping filter qualified name
-  private volatile Map<String, AtomicInteger> indexMap = new ConcurrentHashMap<>();
+  private volatile Map<String, AtomicInteger> indexMap = new ConcurrentHashMapEx<>();
 
   public SimpleLoadBalanceHandler() {
     discoveryTree.loadFromSPI(DiscoveryFilter.class);
diff --git a/core/src/test/java/io/servicecomb/core/definition/loader/TestDynamicSchemaLoader.java b/core/src/test/java/io/servicecomb/core/definition/loader/TestDynamicSchemaLoader.java
index c23fd5963..9825a20af 100644
--- a/core/src/test/java/io/servicecomb/core/definition/loader/TestDynamicSchemaLoader.java
+++ b/core/src/test/java/io/servicecomb/core/definition/loader/TestDynamicSchemaLoader.java
@@ -67,6 +67,7 @@ public static void teardown() {
     RegistryUtils.setServiceRegistry(null);
   }
 
+  @SuppressWarnings("deprecation")
   @Test
   public void testRegisterSchemas() {
     DynamicSchemaLoader.INSTANCE.registerSchemas("classpath*:test/test/schema.yaml");
@@ -74,6 +75,7 @@ public void testRegisterSchemas() {
     Assert.assertEquals("cse.gen.pojotest.perfClient.schema", schemaMeta.getPackageName());
   }
 
+  @SuppressWarnings("deprecation")
   @Test
   public void testRegisterShemasAcrossApp() {
     DynamicSchemaLoader.INSTANCE.registerSchemas("CSE:as", "classpath*:test/test/schema.yaml");
diff --git a/demo/demo-crossapp/crossapp-client/src/main/java/io/servicecomb/demo/crossapp/CrossappBootListener.java b/demo/demo-crossapp/crossapp-client/src/main/java/io/servicecomb/demo/crossapp/CrossappBootListener.java
index e00e317eb..7148cefea 100644
--- a/demo/demo-crossapp/crossapp-client/src/main/java/io/servicecomb/demo/crossapp/CrossappBootListener.java
+++ b/demo/demo-crossapp/crossapp-client/src/main/java/io/servicecomb/demo/crossapp/CrossappBootListener.java
@@ -22,6 +22,7 @@
 import io.servicecomb.core.BootListener;
 import io.servicecomb.core.definition.loader.DynamicSchemaLoader;
 
+@SuppressWarnings("deprecation")
 @Component
 public class CrossappBootListener implements BootListener {
   @Override
diff --git a/demo/demo-crossapp/crossapp-server/src/main/java/io/servicecomb/demo/crossapp/CrossappBootListener.java b/demo/demo-crossapp/crossapp-server/src/main/java/io/servicecomb/demo/crossapp/CrossappBootListener.java
index 614b5f889..b99e619fb 100644
--- a/demo/demo-crossapp/crossapp-server/src/main/java/io/servicecomb/demo/crossapp/CrossappBootListener.java
+++ b/demo/demo-crossapp/crossapp-server/src/main/java/io/servicecomb/demo/crossapp/CrossappBootListener.java
@@ -22,6 +22,7 @@
 import io.servicecomb.core.BootListener;
 import io.servicecomb.core.definition.loader.DynamicSchemaLoader;
 
+@SuppressWarnings("deprecation")
 @Component
 public class CrossappBootListener implements BootListener {
   @Override
diff --git a/demo/demo-springmvc/springmvc-client/src/main/java/io/servicecomb/demo/springmvc/client/SpringmvcClient.java b/demo/demo-springmvc/springmvc-client/src/main/java/io/servicecomb/demo/springmvc/client/SpringmvcClient.java
index f03b9b45c..03b91ff93 100644
--- a/demo/demo-springmvc/springmvc-client/src/main/java/io/servicecomb/demo/springmvc/client/SpringmvcClient.java
+++ b/demo/demo-springmvc/springmvc-client/src/main/java/io/servicecomb/demo/springmvc/client/SpringmvcClient.java
@@ -93,13 +93,15 @@ public static void run() throws Exception {
     try {
       // this test class is intended for retry hanging issue JAV-127
       String content = restTemplate.getForObject("cse://springmvc/codeFirstSpringmvc/metricsForTest", String.class);
+      @SuppressWarnings("unchecked")
       Map<String, String> resultMap = JsonUtils.OBJ_MAPPER.readValue(content, HashMap.class);
 
       TestMgr.check(true, resultMap.get("CPU and Memory").contains("heapUsed="));
 
       String[] requestProviders = resultMap.get("totalRequestProvider OPERATIONAL_LEVEL")
           .replace("{", "")
-          .replace("}", "").split(",");
+          .replace("}", "")
+          .split(",");
       Map<String, Integer> requests = new HashMap<>();
       for (String requestProvider : requestProviders) {
         String[] requestKeyAndValues = requestProvider.split("=");
@@ -133,13 +135,13 @@ public static void run() throws Exception {
     try {
       String content = restTemplate.getForObject("cse://springmvc/codeFirstSpringmvc/prometheusForTest", String.class);
 
-      TestMgr.check(true,content.contains("servicecomb_springmvc_codeFirst_addDate"));
-      TestMgr.check(true,content.contains("servicecomb_springmvc_codeFirst_sayHello"));
-      TestMgr.check(true,content.contains("servicecomb_springmvc_codeFirst_fallbackFromCache"));
-      TestMgr.check(true,content.contains("servicecomb_springmvc_codeFirst_isTrue_producer"));
-      TestMgr.check(true,content.contains("servicecomb_springmvc_codeFirst_add"));
-      TestMgr.check(true,content.contains("servicecomb_springmvc_codeFirst_sayHi2"));
-      TestMgr.check(true,content.contains("servicecomb_springmvc_codeFirst_saySomething"));
+      TestMgr.check(true, content.contains("servicecomb_springmvc_codeFirst_addDate"));
+      TestMgr.check(true, content.contains("servicecomb_springmvc_codeFirst_sayHello"));
+      TestMgr.check(true, content.contains("servicecomb_springmvc_codeFirst_fallbackFromCache"));
+      TestMgr.check(true, content.contains("servicecomb_springmvc_codeFirst_isTrue_producer"));
+      TestMgr.check(true, content.contains("servicecomb_springmvc_codeFirst_add"));
+      TestMgr.check(true, content.contains("servicecomb_springmvc_codeFirst_sayHi2"));
+      TestMgr.check(true, content.contains("servicecomb_springmvc_codeFirst_saySomething"));
 
       String[] metricLines = content.split("\n");
       if (metricLines.length > 0) {
diff --git a/dynamic-config/config-apollo/src/main/java/io/servicecomb/config/client/ApolloClient.java b/dynamic-config/config-apollo/src/main/java/io/servicecomb/config/client/ApolloClient.java
index fcf70df59..d88f9631b 100644
--- a/dynamic-config/config-apollo/src/main/java/io/servicecomb/config/client/ApolloClient.java
+++ b/dynamic-config/config-apollo/src/main/java/io/servicecomb/config/client/ApolloClient.java
@@ -99,6 +99,7 @@ public void run() {
       }
     }
 
+    @SuppressWarnings("unchecked")
     void refreshConfig() {
       HttpHeaders headers = new HttpHeaders();
       headers.add("Content-Type", "application/json;charset=UTF-8");
diff --git a/dynamic-config/config-apollo/src/test/java/io/servicecomb/config/client/ApolloClientTest.java b/dynamic-config/config-apollo/src/test/java/io/servicecomb/config/client/ApolloClientTest.java
index 74a250d18..445ff9bbb 100644
--- a/dynamic-config/config-apollo/src/test/java/io/servicecomb/config/client/ApolloClientTest.java
+++ b/dynamic-config/config-apollo/src/test/java/io/servicecomb/config/client/ApolloClientTest.java
@@ -55,9 +55,7 @@ public void refreshApolloConfig() {
         Matchers.anyString(),
         Matchers.any(HttpMethod.class),
         Matchers.<HttpEntity<String>>any(),
-        Matchers.<Class<String>>any()
-        )
-    ).thenReturn(responseEntity);
+        Matchers.<Class<String>>any())).thenReturn(responseEntity);
     ApolloConfigurationSourceImpl impl = new ApolloConfigurationSourceImpl();
     UpdateHandler updateHandler = impl.new UpdateHandler();
     ApolloClient apolloClient = new ApolloClient(updateHandler);
@@ -81,7 +79,6 @@ public void testCompareChangedConfig() {
 
     ConfigRefresh cr = apolloClient.new ConfigRefresh("");
 
-    ApolloConfig instance = ApolloConfig.INSTANCE;
     try {
       Deencapsulation.invoke(cr, "compareChangedConfig", before, after);
     } catch (Exception e) {
diff --git a/edge/edge-core/src/main/java/io/servicecomb/edge/core/CompatiblePathVersionMapper.java b/edge/edge-core/src/main/java/io/servicecomb/edge/core/CompatiblePathVersionMapper.java
index c5297cf48..7e33b8020 100644
--- a/edge/edge-core/src/main/java/io/servicecomb/edge/core/CompatiblePathVersionMapper.java
+++ b/edge/edge-core/src/main/java/io/servicecomb/edge/core/CompatiblePathVersionMapper.java
@@ -18,10 +18,10 @@
 package io.servicecomb.edge.core;
 
 import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
 
 import org.springframework.util.StringUtils;
 
+import io.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx;
 import io.servicecomb.foundation.common.exceptions.ServiceCombException;
 import io.servicecomb.serviceregistry.version.VersionRule;
 import io.servicecomb.serviceregistry.version.VersionRuleUtils;
@@ -29,7 +29,7 @@
 public class CompatiblePathVersionMapper {
   // v1 -> 1.0.0-2.0.0
   // v2 -> 2.0.0-3.0.0
-  private Map<String, VersionRule> mapper = new ConcurrentHashMap<>();
+  private Map<String, VersionRule> mapper = new ConcurrentHashMapEx<>();
 
   public VersionRule getOrCreate(String pathVersion) {
     return mapper.computeIfAbsent(pathVersion, pv -> {
diff --git a/edge/edge-core/src/main/java/io/servicecomb/edge/core/OperationInstancesDiscoveryFilter.java b/edge/edge-core/src/main/java/io/servicecomb/edge/core/OperationInstancesDiscoveryFilter.java
index 3cdbd2d02..2067f5f0a 100644
--- a/edge/edge-core/src/main/java/io/servicecomb/edge/core/OperationInstancesDiscoveryFilter.java
+++ b/edge/edge-core/src/main/java/io/servicecomb/edge/core/OperationInstancesDiscoveryFilter.java
@@ -22,12 +22,12 @@
 import java.util.IdentityHashMap;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.concurrent.ConcurrentHashMap;
 
 import io.servicecomb.core.Invocation;
 import io.servicecomb.core.definition.MicroserviceMeta;
 import io.servicecomb.core.definition.MicroserviceVersionMeta;
 import io.servicecomb.core.definition.OperationMeta;
+import io.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx;
 import io.servicecomb.serviceregistry.RegistryUtils;
 import io.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
 import io.servicecomb.serviceregistry.consumer.AppManager;
@@ -83,7 +83,7 @@ protected void fillInstances(Map<String, DiscoveryTreeNode> operationNodes,
 
   protected Map<String, DiscoveryTreeNode> initOperationNodes(DiscoveryTreeNode parent,
       Map<MicroserviceVersionMeta, Map<String, MicroserviceInstance>> versionMap) {
-    Map<String, DiscoveryTreeNode> tmpChildren = new ConcurrentHashMap<>();
+    Map<String, DiscoveryTreeNode> tmpChildren = new ConcurrentHashMapEx<>();
     versionMap
         .keySet()
         .stream()
diff --git a/foundations/foundation-common/src/main/java/io/servicecomb/foundation/common/concurrent/ConcurrentHashMapEx.java b/foundations/foundation-common/src/main/java/io/servicecomb/foundation/common/concurrent/ConcurrentHashMapEx.java
new file mode 100644
index 000000000..30670dd49
--- /dev/null
+++ b/foundations/foundation-common/src/main/java/io/servicecomb/foundation/common/concurrent/ConcurrentHashMapEx.java
@@ -0,0 +1,58 @@
+/*
+ * 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 io.servicecomb.foundation.common.concurrent;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Function;
+
+public class ConcurrentHashMapEx<K, V> extends ConcurrentHashMap<K, V> {
+  private static final long serialVersionUID = -7753722464102569902L;
+
+  public ConcurrentHashMapEx() {
+    super();
+  }
+
+  public ConcurrentHashMapEx(int initialCapacity) {
+    super(initialCapacity);
+  }
+
+  public ConcurrentHashMapEx(Map<? extends K, ? extends V> m) {
+    super(m);
+  }
+
+  public ConcurrentHashMapEx(int initialCapacity, float loadFactor) {
+    super(initialCapacity, loadFactor);
+  }
+
+  public ConcurrentHashMapEx(int initialCapacity,
+      float loadFactor, int concurrencyLevel) {
+    super(initialCapacity, loadFactor, concurrencyLevel);
+  }
+
+  // ConcurrentHashMap.computeIfAbsent always do "synchronized" operation
+  // so we wrap it to improve performance
+  @Override
+  public V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) {
+    V value = get(key);
+    if (value != null) {
+      return value;
+    }
+
+    return super.computeIfAbsent(key, mappingFunction);
+  }
+}
diff --git a/foundations/foundation-metrics/src/main/java/io/servicecomb/foundation/metrics/output/servo/RollingMetricsFileOutput.java b/foundations/foundation-metrics/src/main/java/io/servicecomb/foundation/metrics/output/servo/RollingMetricsFileOutput.java
index affec8705..84c3a41e3 100644
--- a/foundations/foundation-metrics/src/main/java/io/servicecomb/foundation/metrics/output/servo/RollingMetricsFileOutput.java
+++ b/foundations/foundation-metrics/src/main/java/io/servicecomb/foundation/metrics/output/servo/RollingMetricsFileOutput.java
@@ -18,18 +18,18 @@
 package io.servicecomb.foundation.metrics.output.servo;
 
 import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
 
+import io.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx;
 import io.servicecomb.foundation.metrics.output.MetricsFileOutput;
 
 @Component
 public class RollingMetricsFileOutput extends MetricsFileOutput {
 
-  private final Map<String, Logger> allLoggers = new ConcurrentHashMap<>();
+  private final Map<String, Logger> allLoggers = new ConcurrentHashMapEx<>();
 
   public RollingMetricsFileOutput() {
   }
diff --git a/foundations/foundation-metrics/src/main/java/io/servicecomb/foundation/metrics/performance/MetricsDataMonitor.java b/foundations/foundation-metrics/src/main/java/io/servicecomb/foundation/metrics/performance/MetricsDataMonitor.java
index b8f0db974..1c7d60452 100644
--- a/foundations/foundation-metrics/src/main/java/io/servicecomb/foundation/metrics/performance/MetricsDataMonitor.java
+++ b/foundations/foundation-metrics/src/main/java/io/servicecomb/foundation/metrics/performance/MetricsDataMonitor.java
@@ -18,7 +18,8 @@
 package io.servicecomb.foundation.metrics.performance;
 
 import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
+
+import io.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx;
 
 /**
  * Implements the collection of metrics such as total request, total fail
@@ -46,15 +47,15 @@
   // key is operQualifiedName
   // inc
   // after invocation finished
-  public Map<String, Long> operMetricsTotalReq = new ConcurrentHashMap<>();
+  public Map<String, Long> operMetricsTotalReq = new ConcurrentHashMapEx<>();
 
   // key is operQualifiedName
   // inc
   // after invocation finished
-  public Map<String, Long> operMetricsTotalFailReq = new ConcurrentHashMap<>();
+  public Map<String, Long> operMetricsTotalFailReq = new ConcurrentHashMapEx<>();
 
   // key is operQualifiedName
-  public Map<String, QueueMetricsData> queueMetrics = new ConcurrentHashMap<>();
+  public Map<String, QueueMetricsData> queueMetrics = new ConcurrentHashMapEx<>();
 
   /**
    * default constructor.
@@ -70,8 +71,7 @@ public MetricsDataMonitor() {
    * @return QueueMetrics object based on key
    */
   public QueueMetricsData getOrCreateQueueMetrics(String pathId) {
-    return queueMetrics.computeIfAbsent(pathId, p -> new QueueMetricsData()
-    );
+    return queueMetrics.computeIfAbsent(pathId, p -> new QueueMetricsData());
   }
 
   /**
diff --git a/foundations/foundation-vertx/src/main/java/io/servicecomb/foundation/vertx/client/ClientPoolManager.java b/foundations/foundation-vertx/src/main/java/io/servicecomb/foundation/vertx/client/ClientPoolManager.java
index 004b13ab8..5084ede80 100644
--- a/foundations/foundation-vertx/src/main/java/io/servicecomb/foundation/vertx/client/ClientPoolManager.java
+++ b/foundations/foundation-vertx/src/main/java/io/servicecomb/foundation/vertx/client/ClientPoolManager.java
@@ -20,10 +20,10 @@
 import java.util.List;
 import java.util.Map;
 import java.util.UUID;
-import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import io.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx;
 import io.vertx.core.Context;
 import io.vertx.core.Vertx;
 
@@ -54,7 +54,7 @@
   // send??????CLIENT_POOL??????????hash????????
   // key???????id
   // TODO:???????????????????
-  private Map<Long, CLIENT_POOL> threadBindMap = new ConcurrentHashMap<>();
+  private Map<Long, CLIENT_POOL> threadBindMap = new ConcurrentHashMapEx<>();
 
   public ClientPoolManager(Vertx vertx, ClientPoolFactory<CLIENT_POOL> factory) {
     this.vertx = vertx;
diff --git a/foundations/foundation-vertx/src/main/java/io/servicecomb/foundation/vertx/client/tcp/AbstractTcpClientConnectionPool.java b/foundations/foundation-vertx/src/main/java/io/servicecomb/foundation/vertx/client/tcp/AbstractTcpClientConnectionPool.java
index dd888c0a0..a08b1f467 100644
--- a/foundations/foundation-vertx/src/main/java/io/servicecomb/foundation/vertx/client/tcp/AbstractTcpClientConnectionPool.java
+++ b/foundations/foundation-vertx/src/main/java/io/servicecomb/foundation/vertx/client/tcp/AbstractTcpClientConnectionPool.java
@@ -18,9 +18,9 @@
 package io.servicecomb.foundation.vertx.client.tcp;
 
 import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.TimeUnit;
 
+import io.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx;
 import io.vertx.core.Context;
 
 public abstract class AbstractTcpClientConnectionPool<T extends TcpClientConnection> {
@@ -30,7 +30,7 @@
   protected NetClientWrapper netClientWrapper;
 
   // key?address
-  protected Map<String, T> tcpClientMap = new ConcurrentHashMap<>();
+  protected Map<String, T> tcpClientMap = new ConcurrentHashMapEx<>();
 
   public AbstractTcpClientConnectionPool(Context context,
       NetClientWrapper netClientWrapper) {
diff --git a/handlers/handler-loadbalance/src/main/java/io/servicecomb/loadbalance/LoadbalanceHandler.java b/handlers/handler-loadbalance/src/main/java/io/servicecomb/loadbalance/LoadbalanceHandler.java
index 61fd9ae68..df727c2c0 100644
--- a/handlers/handler-loadbalance/src/main/java/io/servicecomb/loadbalance/LoadbalanceHandler.java
+++ b/handlers/handler-loadbalance/src/main/java/io/servicecomb/loadbalance/LoadbalanceHandler.java
@@ -20,7 +20,6 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.Executor;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -44,6 +43,7 @@
 import io.servicecomb.core.exception.ExceptionUtils;
 import io.servicecomb.core.provider.consumer.SyncResponseExecutor;
 import io.servicecomb.foundation.common.cache.VersionedCache;
+import io.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx;
 import io.servicecomb.loadbalance.filter.CseServerDiscoveryFilter;
 import io.servicecomb.loadbalance.filter.IsolationServerListFilter;
 import io.servicecomb.loadbalance.filter.TransactionControlFilter;
@@ -73,7 +73,7 @@ public Thread newThread(Runnable r) {
   private DiscoveryTree discoveryTree = new DiscoveryTree();
 
   // key?grouping filter qualified name
-  private volatile Map<String, LoadBalancer> loadBalancerMap = new ConcurrentHashMap<>();
+  private volatile Map<String, LoadBalancer> loadBalancerMap = new ConcurrentHashMapEx<>();
 
   private final Object lock = new Object();
 
diff --git a/integration-tests/test-common/src/test/java/io/servicecomb/tests/tracing/TraceContextConfig.java b/integration-tests/test-common/src/test/java/io/servicecomb/tests/tracing/TraceContextConfig.java
index 81133c862..03004cfa8 100644
--- a/integration-tests/test-common/src/test/java/io/servicecomb/tests/tracing/TraceContextConfig.java
+++ b/integration-tests/test-common/src/test/java/io/servicecomb/tests/tracing/TraceContextConfig.java
@@ -36,6 +36,7 @@ CurrentTraceContext traceContext() {
   }
 
   private static class ParentAwareMDCCurrentTraceContext extends CurrentTraceContext {
+    @SuppressWarnings("deprecation")
     static ParentAwareMDCCurrentTraceContext create() {
       return new ParentAwareMDCCurrentTraceContext(new Default());
     }
diff --git a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/monitor/RegistryMonitor.java b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/monitor/RegistryMonitor.java
index 387c0506c..7c810b24b 100644
--- a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/monitor/RegistryMonitor.java
+++ b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/monitor/RegistryMonitor.java
@@ -19,11 +19,11 @@
 
 import java.util.HashMap;
 import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import io.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx;
 import io.servicecomb.metrics.common.ConsumerInvocationMetric;
 import io.servicecomb.metrics.common.ProducerInvocationMetric;
 import io.servicecomb.metrics.common.RegistryMetric;
@@ -40,8 +40,8 @@
   @Autowired
   public RegistryMonitor(SystemMonitor systemMonitor) {
     this.systemMonitor = systemMonitor;
-    this.consumerInvocationMonitors = new ConcurrentHashMap<>();
-    this.producerInvocationMonitors = new ConcurrentHashMap<>();
+    this.consumerInvocationMonitors = new ConcurrentHashMapEx<>();
+    this.producerInvocationMonitors = new ConcurrentHashMapEx<>();
   }
 
   public ConsumerInvocationMonitor getConsumerInvocationMonitor(String operationName) {
diff --git a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/publish/DefaultHealthCheckerManager.java b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/publish/DefaultHealthCheckerManager.java
index f83d209e0..331bd0d07 100644
--- a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/publish/DefaultHealthCheckerManager.java
+++ b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/publish/DefaultHealthCheckerManager.java
@@ -25,21 +25,15 @@
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.stream.Collectors;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import io.servicecomb.metrics.common.HealthCheckResult;
 import io.servicecomb.metrics.common.HealthChecker;
-import io.servicecomb.metrics.core.health.DefaultMicroserviceHealthChecker;
 import io.servicecomb.swagger.invocation.exception.InvocationException;
 
 @Component
 public class DefaultHealthCheckerManager implements HealthCheckerManager {
-
-  private static Logger logger = LoggerFactory.getLogger(DefaultHealthCheckerManager.class);
-
   private final Map<String, HealthChecker> healthCheckers;
 
   @Autowired(required = false)
diff --git a/metrics/metrics-integration/metrics-prometheus/src/main/java/io/servicecomb/metrics/prometheus/MetricsPublisher.java b/metrics/metrics-integration/metrics-prometheus/src/main/java/io/servicecomb/metrics/prometheus/MetricsPublisher.java
index dc83a56f1..30ef25492 100644
--- a/metrics/metrics-integration/metrics-prometheus/src/main/java/io/servicecomb/metrics/prometheus/MetricsPublisher.java
+++ b/metrics/metrics-integration/metrics-prometheus/src/main/java/io/servicecomb/metrics/prometheus/MetricsPublisher.java
@@ -20,7 +20,12 @@
 import java.io.IOException;
 import java.net.InetSocketAddress;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationEvent;
+import org.springframework.context.ApplicationListener;
+import org.springframework.context.event.ContextClosedEvent;
 import org.springframework.stereotype.Component;
 
 import com.netflix.config.DynamicPropertyFactory;
@@ -30,12 +35,14 @@
 import io.servicecomb.foundation.common.exceptions.ServiceCombException;
 
 @Component
-public class MetricsPublisher {
+public class MetricsPublisher implements ApplicationListener<ApplicationEvent> {
+  private static final Logger LOGGER = LoggerFactory.getLogger(MetricsPublisher.class);
+
   private static final String METRICS_PROMETHEUS_PORT = "servicecomb.metrics.prometheus.port";
 
   private final MetricsCollector metricsCollector;
 
-  private final HTTPServer httpServer;
+  private HTTPServer httpServer;
 
   @Autowired
   public MetricsPublisher(MetricsCollector metricsCollector) {
@@ -45,8 +52,20 @@ public MetricsPublisher(MetricsCollector metricsCollector) {
     this.metricsCollector.register();
     try {
       this.httpServer = new HTTPServer(new InetSocketAddress(publishPort), CollectorRegistry.defaultRegistry, true);
+      LOGGER.info("Prometheus httpServer listened {}.", publishPort);
     } catch (IOException e) {
       throw new ServiceCombException("create http publish server failed", e);
     }
   }
+
+  @Override
+  public void onApplicationEvent(ApplicationEvent event) {
+    if (!ContextClosedEvent.class.isInstance(event) || httpServer == null) {
+      return;
+    }
+
+    httpServer.stop();
+    httpServer = null;
+    LOGGER.info("Prometheus httpServer stopped.");
+  }
 }
diff --git a/samples/metrics-write-file-sample/metrics-write-file-log4j-springboot/src/main/java/io/servicecomb/samples/mwf/Log4JMetricsFileWriter.java b/samples/metrics-write-file-sample/metrics-write-file-log4j-springboot/src/main/java/io/servicecomb/samples/mwf/Log4JMetricsFileWriter.java
index 716fba190..ba166cc37 100644
--- a/samples/metrics-write-file-sample/metrics-write-file-log4j-springboot/src/main/java/io/servicecomb/samples/mwf/Log4JMetricsFileWriter.java
+++ b/samples/metrics-write-file-sample/metrics-write-file-log4j-springboot/src/main/java/io/servicecomb/samples/mwf/Log4JMetricsFileWriter.java
@@ -19,7 +19,6 @@
 
 import java.nio.file.Paths;
 import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.log4j.Level;
 import org.apache.log4j.Logger;
@@ -30,6 +29,8 @@
 
 import com.netflix.config.DynamicPropertyFactory;
 
+import io.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx;
+
 @Component
 public class Log4JMetricsFileWriter implements MetricsFileWriter {
   private static final String METRICS_FILE_ROLLING_MAX_FILE_COUNT = "servicecomb.metrics.file.rolling.max_file_count";
@@ -39,7 +40,7 @@
   private static final String METRICS_FILE_ROOT_PATH = "servicecomb.metrics.file.root_path";
 
 
-  private final Map<String, RollingFileAppender> fileAppenders = new ConcurrentHashMap<>();
+  private final Map<String, RollingFileAppender> fileAppenders = new ConcurrentHashMapEx<>();
 
   private final int maxFileCount;
 
@@ -49,7 +50,8 @@
 
   public Log4JMetricsFileWriter() {
     maxFileCount = DynamicPropertyFactory.getInstance().getIntProperty(METRICS_FILE_ROLLING_MAX_FILE_COUNT, 10).get();
-    maxFileSize = DynamicPropertyFactory.getInstance().getStringProperty(METRICS_FILE_ROLLING_MAX_FILE_SIZE, "10MB")
+    maxFileSize = DynamicPropertyFactory.getInstance()
+        .getStringProperty(METRICS_FILE_ROLLING_MAX_FILE_SIZE, "10MB")
         .get();
     rootPath = DynamicPropertyFactory.getInstance().getStringProperty(METRICS_FILE_ROOT_PATH, "target").get();
   }
diff --git a/samples/metrics-write-file-sample/metrics-write-file-log4j2-springboot/src/main/java/io/servicecomb/samples/mwf/Log4J2MetricsFileWriter.java b/samples/metrics-write-file-sample/metrics-write-file-log4j2-springboot/src/main/java/io/servicecomb/samples/mwf/Log4J2MetricsFileWriter.java
index 13a5046a6..283747693 100644
--- a/samples/metrics-write-file-sample/metrics-write-file-log4j2-springboot/src/main/java/io/servicecomb/samples/mwf/Log4J2MetricsFileWriter.java
+++ b/samples/metrics-write-file-sample/metrics-write-file-log4j2-springboot/src/main/java/io/servicecomb/samples/mwf/Log4J2MetricsFileWriter.java
@@ -19,7 +19,6 @@
 
 import java.nio.file.Paths;
 import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.core.LoggerContext;
@@ -34,6 +33,8 @@
 
 import com.netflix.config.DynamicPropertyFactory;
 
+import io.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx;
+
 @Component
 public class Log4J2MetricsFileWriter implements MetricsFileWriter {
   private static final String METRICS_FILE_ROLLING_MAX_FILE_COUNT = "servicecomb.metrics.file.rolling.max_file_count";
@@ -46,7 +47,7 @@
 
   private final Configuration config = ctx.getConfiguration();
 
-  private final Map<String, RollingFileAppender> fileAppenders = new ConcurrentHashMap<>();
+  private final Map<String, RollingFileAppender> fileAppenders = new ConcurrentHashMapEx<>();
 
   private final int maxFileCount;
 
@@ -56,7 +57,8 @@
 
   public Log4J2MetricsFileWriter() {
     maxFileCount = DynamicPropertyFactory.getInstance().getIntProperty(METRICS_FILE_ROLLING_MAX_FILE_COUNT, 10).get();
-    maxFileSize = DynamicPropertyFactory.getInstance().getStringProperty(METRICS_FILE_ROLLING_MAX_FILE_SIZE, "10MB")
+    maxFileSize = DynamicPropertyFactory.getInstance()
+        .getStringProperty(METRICS_FILE_ROLLING_MAX_FILE_SIZE, "10MB")
         .get();
     rootPath = DynamicPropertyFactory.getInstance().getStringProperty(METRICS_FILE_ROOT_PATH, "target").get();
   }
@@ -67,18 +69,37 @@ public void write(String loggerName, String filePrefix, String content) {
     logger.append(Log4jLogEvent.newBuilder().setMessage(new SimpleMessage(content)).build());
   }
 
+  @SuppressWarnings("deprecation")
   private RollingFileAppender initLogger(String loggerName, String filePrefix) {
     String fileName = Paths.get(rootPath, filePrefix + "." + loggerName + ".dat").toString();
     String filePattern = Paths.get(rootPath, filePrefix + "." + loggerName + "-%i.dat").toString();
 
     PatternLayout layout = PatternLayout.newBuilder().withPattern(PatternLayout.DEFAULT_CONVERSION_PATTERN).build();
     SizeBasedTriggeringPolicy policy = SizeBasedTriggeringPolicy.createPolicy(maxFileSize);
-    DefaultRolloverStrategy strategy = DefaultRolloverStrategy.createStrategy(String.valueOf(maxFileCount), null, null,
-        null, null, false, config);
+    DefaultRolloverStrategy strategy = DefaultRolloverStrategy.createStrategy(String.valueOf(maxFileCount),
+        null,
+        null,
+        null,
+        null,
+        false,
+        config);
 
     //TODO:use RollingFileAppender.newBuilder throw No such static method exception,will improve later!
     return RollingFileAppender
-        .createAppender(fileName, filePattern, "true", loggerName, "true", null,
-            "true", policy, strategy, layout, null, null, null, null, config);
+        .createAppender(fileName,
+            filePattern,
+            "true",
+            loggerName,
+            "true",
+            null,
+            "true",
+            policy,
+            strategy,
+            layout,
+            null,
+            null,
+            null,
+            null,
+            config);
   }
 }
diff --git a/samples/springmvc-sample/springmvc-provider/src/main/java/io/servicecomb/samples/springmvc/provider/SpringmvcHelloImpl.java b/samples/springmvc-sample/springmvc-provider/src/main/java/io/servicecomb/samples/springmvc/provider/SpringmvcHelloImpl.java
index 328fd94f5..20317999e 100644
--- a/samples/springmvc-sample/springmvc-provider/src/main/java/io/servicecomb/samples/springmvc/provider/SpringmvcHelloImpl.java
+++ b/samples/springmvc-sample/springmvc-provider/src/main/java/io/servicecomb/samples/springmvc/provider/SpringmvcHelloImpl.java
@@ -20,13 +20,11 @@
 
 import javax.ws.rs.core.MediaType;
 
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
 
-import io.servicecomb.foundation.metrics.MetricsServoRegistry;
 import io.servicecomb.provider.rest.common.RestSchema;
 import io.servicecomb.samples.common.schema.Hello;
 import io.servicecomb.samples.common.schema.models.Person;
@@ -34,14 +32,6 @@
 @RestSchema(schemaId = "springmvcHello")
 @RequestMapping(path = "/springmvchello", produces = MediaType.APPLICATION_JSON)
 public class SpringmvcHelloImpl implements Hello {
-
-  private MetricsServoRegistry registry;
-
-  @Autowired
-  public SpringmvcHelloImpl(MetricsServoRegistry registry) {
-    this.registry = registry;
-  }
-
   @Override
   @RequestMapping(path = "/sayhi", method = RequestMethod.POST)
   public String sayHi(@RequestParam(name = "name") String name) {
diff --git a/service-registry/src/main/java/io/servicecomb/serviceregistry/consumer/AppManager.java b/service-registry/src/main/java/io/servicecomb/serviceregistry/consumer/AppManager.java
index 3b34b591c..0128feeae 100644
--- a/service-registry/src/main/java/io/servicecomb/serviceregistry/consumer/AppManager.java
+++ b/service-registry/src/main/java/io/servicecomb/serviceregistry/consumer/AppManager.java
@@ -18,17 +18,18 @@
 package io.servicecomb.serviceregistry.consumer;
 
 import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
 
 import com.google.common.eventbus.EventBus;
 
+import io.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx;
+
 public class AppManager {
   private EventBus eventBus;
 
   private MicroserviceVersionFactory microserviceVersionFactory = new DefaultMicroserviceVersionFactory();
 
   // key: appId
-  private Map<String, MicroserviceManager> apps = new ConcurrentHashMap<>();
+  private Map<String, MicroserviceManager> apps = new ConcurrentHashMapEx<>();
 
   public AppManager(EventBus eventBus) {
     this.eventBus = eventBus;
diff --git a/service-registry/src/main/java/io/servicecomb/serviceregistry/consumer/MicroserviceManager.java b/service-registry/src/main/java/io/servicecomb/serviceregistry/consumer/MicroserviceManager.java
index aca5ef21e..763e0fc76 100644
--- a/service-registry/src/main/java/io/servicecomb/serviceregistry/consumer/MicroserviceManager.java
+++ b/service-registry/src/main/java/io/servicecomb/serviceregistry/consumer/MicroserviceManager.java
@@ -18,10 +18,10 @@
 package io.servicecomb.serviceregistry.consumer;
 
 import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
 
 import com.google.common.eventbus.Subscribe;
 
+import io.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx;
 import io.servicecomb.serviceregistry.task.event.PeriodicPullEvent;
 import io.servicecomb.serviceregistry.task.event.RecoveryEvent;
 
@@ -31,7 +31,7 @@
   private String appId;
 
   // key: microserviceName
-  private Map<String, MicroserviceVersions> versionsByName = new ConcurrentHashMap<>();
+  private Map<String, MicroserviceVersions> versionsByName = new ConcurrentHashMapEx<>();
 
   public MicroserviceManager(AppManager appManager, String appId) {
     this.appManager = appManager;
diff --git a/service-registry/src/main/java/io/servicecomb/serviceregistry/consumer/MicroserviceVersions.java b/service-registry/src/main/java/io/servicecomb/serviceregistry/consumer/MicroserviceVersions.java
index 796d1c58b..6e398c055 100644
--- a/service-registry/src/main/java/io/servicecomb/serviceregistry/consumer/MicroserviceVersions.java
+++ b/service-registry/src/main/java/io/servicecomb/serviceregistry/consumer/MicroserviceVersions.java
@@ -19,7 +19,6 @@
 
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
@@ -29,6 +28,7 @@
 
 import com.google.common.eventbus.Subscribe;
 
+import io.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx;
 import io.servicecomb.serviceregistry.RegistryUtils;
 import io.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
 import io.servicecomb.serviceregistry.api.registry.MicroserviceInstanceStatus;
@@ -51,10 +51,10 @@
   private List<MicroserviceInstance> instances;
 
   // key is service id
-  private Map<String, MicroserviceVersion> versions = new ConcurrentHashMap<>();
+  private Map<String, MicroserviceVersion> versions = new ConcurrentHashMapEx<>();
 
   // key is version rule
-  private Map<String, MicroserviceVersionRule> versionRules = new ConcurrentHashMap<>();
+  private Map<String, MicroserviceVersionRule> versionRules = new ConcurrentHashMapEx<>();
 
   // process pulled instances and create versionRule must be protected by lock
   // otherwise maybe lost instance or version in versionRule
diff --git a/service-registry/src/main/java/io/servicecomb/serviceregistry/discovery/DiscoveryTreeNode.java b/service-registry/src/main/java/io/servicecomb/serviceregistry/discovery/DiscoveryTreeNode.java
index cf72522f3..e9d251e8e 100644
--- a/service-registry/src/main/java/io/servicecomb/serviceregistry/discovery/DiscoveryTreeNode.java
+++ b/service-registry/src/main/java/io/servicecomb/serviceregistry/discovery/DiscoveryTreeNode.java
@@ -18,18 +18,18 @@
 package io.servicecomb.serviceregistry.discovery;
 
 import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
 
 import io.servicecomb.foundation.common.cache.VersionedCache;
+import io.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx;
 
 public class DiscoveryTreeNode extends VersionedCache {
   private boolean childrenInited;
 
   private int level;
 
-  protected Map<String, Object> attributes = new ConcurrentHashMap<>();
+  protected Map<String, Object> attributes = new ConcurrentHashMapEx<>();
 
-  protected Map<String, DiscoveryTreeNode> children = new ConcurrentHashMap<>();
+  protected Map<String, DiscoveryTreeNode> children = new ConcurrentHashMapEx<>();
 
   public boolean childrenInited() {
     return childrenInited;
diff --git a/service-registry/src/main/java/io/servicecomb/serviceregistry/version/VersionRuleUtils.java b/service-registry/src/main/java/io/servicecomb/serviceregistry/version/VersionRuleUtils.java
index 8da6f7174..c959c8c9e 100644
--- a/service-registry/src/main/java/io/servicecomb/serviceregistry/version/VersionRuleUtils.java
+++ b/service-registry/src/main/java/io/servicecomb/serviceregistry/version/VersionRuleUtils.java
@@ -21,12 +21,13 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
-import java.util.concurrent.ConcurrentHashMap;
+
+import io.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx;
 
 public final class VersionRuleUtils {
   private static List<VersionRuleParser> parsers = new ArrayList<>();
 
-  private static Map<String, VersionRule> versionRuleCache = new ConcurrentHashMap<>();
+  private static Map<String, VersionRule> versionRuleCache = new ConcurrentHashMapEx<>();
 
   static {
     parsers.add(new VersionRuleLatestParser());
diff --git a/service-registry/src/main/java/io/servicecomb/serviceregistry/version/VersionUtils.java b/service-registry/src/main/java/io/servicecomb/serviceregistry/version/VersionUtils.java
index 04a22720a..ed6620cd6 100644
--- a/service-registry/src/main/java/io/servicecomb/serviceregistry/version/VersionUtils.java
+++ b/service-registry/src/main/java/io/servicecomb/serviceregistry/version/VersionUtils.java
@@ -19,10 +19,11 @@
 
 import java.util.Map;
 import java.util.Objects;
-import java.util.concurrent.ConcurrentHashMap;
+
+import io.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx;
 
 public final class VersionUtils {
-  private static Map<String, Version> versionCache = new ConcurrentHashMap<>();
+  private static Map<String, Version> versionCache = new ConcurrentHashMapEx<>();
 
   public static Version getOrCreate(String strVersion) {
     Objects.requireNonNull(strVersion);
diff --git a/spring-boot-starter/spring-boot-starter-discovery/src/main/java/io/servicecomb/springboot/starter/discovery/CseDiscoveryClient.java b/spring-boot-starter/spring-boot-starter-discovery/src/main/java/io/servicecomb/springboot/starter/discovery/CseDiscoveryClient.java
index 28b68f353..c07289be1 100644
--- a/spring-boot-starter/spring-boot-starter-discovery/src/main/java/io/servicecomb/springboot/starter/discovery/CseDiscoveryClient.java
+++ b/spring-boot-starter/spring-boot-starter-discovery/src/main/java/io/servicecomb/springboot/starter/discovery/CseDiscoveryClient.java
@@ -19,13 +19,13 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
 
 import org.springframework.cloud.client.DefaultServiceInstance;
 import org.springframework.cloud.client.ServiceInstance;
 import org.springframework.cloud.client.discovery.DiscoveryClient;
 
 import io.servicecomb.foundation.common.cache.VersionedCache;
+import io.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx;
 import io.servicecomb.foundation.common.net.URIEndpointObject;
 import io.servicecomb.serviceregistry.RegistryUtils;
 import io.servicecomb.serviceregistry.api.registry.Microservice;
@@ -36,7 +36,7 @@
 import io.servicecomb.serviceregistry.discovery.DiscoveryTree;
 
 public class CseDiscoveryClient implements DiscoveryClient {
-  private Map<String, DiscoveryTree> discoveryTrees = new ConcurrentHashMap<>();
+  private Map<String, DiscoveryTree> discoveryTrees = new ConcurrentHashMapEx<>();
 
   @Override
   public String description() {
diff --git a/spring-boot-starter/spring-boot-starter-discovery/src/main/java/io/servicecomb/springboot/starter/discovery/CseRibbonClientConfiguration.java b/spring-boot-starter/spring-boot-starter-discovery/src/main/java/io/servicecomb/springboot/starter/discovery/CseRibbonClientConfiguration.java
index fabb086c7..1572ca4aa 100644
--- a/spring-boot-starter/spring-boot-starter-discovery/src/main/java/io/servicecomb/springboot/starter/discovery/CseRibbonClientConfiguration.java
+++ b/spring-boot-starter/spring-boot-starter-discovery/src/main/java/io/servicecomb/springboot/starter/discovery/CseRibbonClientConfiguration.java
@@ -16,12 +16,7 @@
  */
 package io.servicecomb.springboot.starter.discovery;
 
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
-import org.springframework.cloud.netflix.ribbon.RibbonClientConfiguration;
-import org.springframework.cloud.netflix.zuul.filters.ZuulProperties;
 import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
 
 import com.netflix.client.config.IClientConfig;
 import com.netflix.loadbalancer.Server;
diff --git a/swagger/swagger-generator/generator-core/src/test/java/io/servicecomb/swagger/generator/core/TestOperationGenerator.java b/swagger/swagger-generator/generator-core/src/test/java/io/servicecomb/swagger/generator/core/TestOperationGenerator.java
index fd1c36419..8e9aa1ff2 100644
--- a/swagger/swagger-generator/generator-core/src/test/java/io/servicecomb/swagger/generator/core/TestOperationGenerator.java
+++ b/swagger/swagger-generator/generator-core/src/test/java/io/servicecomb/swagger/generator/core/TestOperationGenerator.java
@@ -97,6 +97,7 @@ public void function() {
     public void functionWithNoTag() {
     }
 
+    @SuppressWarnings("unused")
     public void functionWithNoAnnotation() {
     }
   }


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services