You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by li...@apache.org on 2019/02/19 15:14:23 UTC

[incubator-dubbo] branch master updated: fix issue#1293: A question for ReferenceConfigCache. (#3505)

This is an automated email from the ASF dual-hosted git repository.

lixiaojie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-dubbo.git


The following commit(s) were added to refs/heads/master by this push:
     new 7c236ca  fix issue#1293: A question for ReferenceConfigCache. (#3505)
7c236ca is described below

commit 7c236ca8f74e6797dac4d432a37294ee8a4529d5
Author: Ian Luo <ia...@gmail.com>
AuthorDate: Tue Feb 19 23:09:54 2019 +0800

    fix issue#1293: A question for ReferenceConfigCache. (#3505)
---
 .../dubbo/config/utils/ReferenceConfigCache.java   | 55 +++++++++++++---------
 .../config/utils/ReferenceConfigCacheTest.java     |  8 ++++
 2 files changed, 42 insertions(+), 21 deletions(-)

diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/utils/ReferenceConfigCache.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/utils/ReferenceConfigCache.java
index 5ca9698..09f12da 100644
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/utils/ReferenceConfigCache.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/utils/ReferenceConfigCache.java
@@ -39,28 +39,25 @@ public class ReferenceConfigCache {
      * <p>
      * key example: <code>group1/org.apache.dubbo.foo.FooService:1.0.0</code>.
      */
-    public static final KeyGenerator DEFAULT_KEY_GENERATOR = new KeyGenerator() {
-        @Override
-        public String generateKey(ReferenceConfig<?> referenceConfig) {
-            String iName = referenceConfig.getInterface();
-            if (StringUtils.isBlank(iName)) {
-                Class<?> clazz = referenceConfig.getInterfaceClass();
-                iName = clazz.getName();
-            }
-            if (StringUtils.isBlank(iName)) {
-                throw new IllegalArgumentException("No interface info in ReferenceConfig" + referenceConfig);
-            }
-
-            StringBuilder ret = new StringBuilder();
-            if (!StringUtils.isBlank(referenceConfig.getGroup())) {
-                ret.append(referenceConfig.getGroup()).append("/");
-            }
-            ret.append(iName);
-            if (!StringUtils.isBlank(referenceConfig.getVersion())) {
-                ret.append(":").append(referenceConfig.getVersion());
-            }
-            return ret.toString();
+    public static final KeyGenerator DEFAULT_KEY_GENERATOR = referenceConfig -> {
+        String iName = referenceConfig.getInterface();
+        if (StringUtils.isBlank(iName)) {
+            Class<?> clazz = referenceConfig.getInterfaceClass();
+            iName = clazz.getName();
         }
+        if (StringUtils.isBlank(iName)) {
+            throw new IllegalArgumentException("No interface info in ReferenceConfig" + referenceConfig);
+        }
+
+        StringBuilder ret = new StringBuilder();
+        if (!StringUtils.isBlank(referenceConfig.getGroup())) {
+            ret.append(referenceConfig.getGroup()).append("/");
+        }
+        ret.append(iName);
+        if (!StringUtils.isBlank(referenceConfig.getVersion())) {
+            ret.append(":").append(referenceConfig.getVersion());
+        }
+        return ret.toString();
     };
     static final ConcurrentMap<String, ReferenceConfigCache> cacheHolder = new ConcurrentHashMap<String, ReferenceConfigCache>();
     private final String name;
@@ -115,6 +112,22 @@ public class ReferenceConfigCache {
         return (T) config.get();
     }
 
+    /**
+     * Fetch cache with the specified key. The key is decided by KeyGenerator passed-in. If the default KeyGenerator is
+     * used, then the key is in the format of <code>group/interfaceClass:version</code>
+     *
+     * @param key  cache key
+     * @param type object class
+     * @param <T>  object type
+     * @return object from the cached ReferenceConfig
+     * @see KeyGenerator#generateKey(ReferenceConfig)
+     */
+    @SuppressWarnings("unchecked")
+    public <T> T get(String key, Class<T> type) {
+        ReferenceConfig<?> config = cache.get(key);
+        return (config != null) ? (T) config.get() : null;
+    }
+
     void destroyKey(String key) {
         ReferenceConfig<?> config = cache.remove(key);
         if (config == null) {
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/utils/ReferenceConfigCacheTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/utils/ReferenceConfigCacheTest.java
index af5659e..2af6da7 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/utils/ReferenceConfigCacheTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/utils/ReferenceConfigCacheTest.java
@@ -59,6 +59,14 @@ public class ReferenceConfigCacheTest {
     }
 
     @Test
+    public void testGetCacheWithKey() throws Exception {
+        ReferenceConfigCache cache = ReferenceConfigCache.getCache();
+        MockReferenceConfig config = buildMockReferenceConfig("FooService", "group1", "1.0.0");
+        String value = cache.get(config);
+        assertEquals(value, cache.get("group1/FooService:1.0.0", String.class));
+    }
+
+    @Test
     public void testGetCacheDiffName() throws Exception {
         ReferenceConfigCache cache = ReferenceConfigCache.getCache();
         MockReferenceConfig config = buildMockReferenceConfig("FooService", "group1", "1.0.0");