You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by or...@apache.org on 2018/05/11 16:31:58 UTC

[3/6] qpid-broker-j git commit: QPID-7830: [Broker-J] [AMQP 0-8..0-91] Move caching responsubility to virtualhost

QPID-7830: [Broker-J] [AMQP 0-8..0-91] Move caching responsubility to virtualhost

(cherry picked from commit ddc519a551061c682877784068e755677e2c6313)


Project: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/commit/d79537d2
Tree: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/tree/d79537d2
Diff: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/diff/d79537d2

Branch: refs/heads/7.0.x
Commit: d79537d2951dc6eabc7fabe6fa0760cb0f07c11d
Parents: 995d535
Author: Keith Wall <kw...@apache.org>
Authored: Fri Apr 27 12:54:01 2018 +0100
Committer: Alex Rudyy <or...@apache.org>
Committed: Fri May 11 16:10:04 2018 +0100

----------------------------------------------------------------------
 .../server/protocol/v0_8/AMQShortString.java    |  51 +++++++--
 .../qpid/server/security/QpidPrincipal.java     |  38 +++++++
 .../security/auth/AuthenticatedPrincipal.java   |  24 +----
 .../server/virtualhost/AbstractVirtualHost.java |  19 ++++
 .../qpid/server/virtualhost/CacheProvider.java  |  28 +++++
 .../qpid/server/virtualhost/NullCache.java      | 107 +++++++++++++++++++
 .../virtualhost/QueueManagingVirtualHost.java   |  15 ++-
 .../virtualhost/VirtualHostPrincipal.java       |   5 +
 .../protocol/v0_8/AMQShortStringTest.java       |  33 ++++--
 9 files changed, 274 insertions(+), 46 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/d79537d2/broker-core/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQShortString.java
----------------------------------------------------------------------
diff --git a/broker-core/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQShortString.java b/broker-core/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQShortString.java
index 0ee98c3..6d17f8e 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQShortString.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQShortString.java
@@ -23,15 +23,20 @@ package org.apache.qpid.server.protocol.v0_8;
 
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
+import java.security.AccessController;
 import java.util.Arrays;
-import java.util.concurrent.TimeUnit;
+
+import javax.security.auth.Subject;
 
 import com.google.common.cache.Cache;
-import com.google.common.cache.CacheBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.qpid.server.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.server.security.QpidPrincipal;
+import org.apache.qpid.server.virtualhost.CacheProvider;
+import org.apache.qpid.server.virtualhost.NullCache;
+import org.apache.qpid.server.virtualhost.VirtualHostPrincipal;
 
 /**
  * A short string is a representation of an AMQ Short String
@@ -47,14 +52,11 @@ public final class AMQShortString implements Comparable<AMQShortString>
     public static final int MAX_LENGTH = 255;
 
     private static final Logger LOGGER = LoggerFactory.getLogger(AMQShortString.class);
+    private static final NullCache<ByteBuffer, AMQShortString> NULL_CACHE = new NullCache<>();
 
     // Unfortunately CacheBuilder does not yet support keyEquivalence, so we have to wrap the keys in ByteBuffers
     // rather than using the byte arrays as keys.
-    private static ThreadLocal<Cache<ByteBuffer, AMQShortString>> CACHE =
-            ThreadLocal.withInitial(() -> CacheBuilder.newBuilder()
-                                                      .maximumSize(100)
-                                                      .expireAfterAccess(300, TimeUnit.SECONDS)
-                                                      .build());
+    private static ThreadLocal<Cache<ByteBuffer, AMQShortString>> CACHE = new ThreadLocal<>();
 
     private final byte[] _data;
     private int _hashCode;
@@ -100,7 +102,7 @@ public final class AMQShortString implements Comparable<AMQShortString>
             byte[] data = new byte[length];
             buffer.get(data);
 
-            final AMQShortString cached = CACHE.get().getIfPresent(ByteBuffer.wrap(data));
+            final AMQShortString cached = getShortStringCache().getIfPresent(ByteBuffer.wrap(data));
             return cached != null ? cached : new AMQShortString(data);
         }
     }
@@ -112,7 +114,7 @@ public final class AMQShortString implements Comparable<AMQShortString>
             throw new NullPointerException("Cannot create AMQShortString with null data[]");
         }
 
-        final AMQShortString cached = CACHE.get().getIfPresent(ByteBuffer.wrap(data));
+        final AMQShortString cached = getShortStringCache().getIfPresent(ByteBuffer.wrap(data));
         return cached != null ? cached : new AMQShortString(data);
     }
 
@@ -120,7 +122,7 @@ public final class AMQShortString implements Comparable<AMQShortString>
     {
         final byte[] data = EncodingUtils.asUTF8Bytes(string);
 
-        final AMQShortString cached = CACHE.get().getIfPresent(ByteBuffer.wrap(data));
+        final AMQShortString cached = getShortStringCache().getIfPresent(ByteBuffer.wrap(data));
         if (cached != null)
         {
             return cached;
@@ -301,7 +303,7 @@ public final class AMQShortString implements Comparable<AMQShortString>
 
     public void intern()
     {
-        CACHE.get().put(ByteBuffer.wrap(_data), this);
+        getShortStringCache().put(ByteBuffer.wrap(_data), this);
     }
 
     public static AMQShortString validValueOf(Object obj)
@@ -361,4 +363,31 @@ public final class AMQShortString implements Comparable<AMQShortString>
         return amqShortString == null ? null : amqShortString.toString();
     }
 
+    private static Cache<ByteBuffer, AMQShortString> getShortStringCache()
+    {
+        Cache<ByteBuffer, AMQShortString> cache = CACHE.get();
+        if (cache == null)
+        {
+            cache = NULL_CACHE;
+            Subject subject = Subject.getSubject(AccessController.getContext());
+            if (subject != null)
+            {
+                VirtualHostPrincipal principal = QpidPrincipal.getSingletonPrincipal(subject, true, VirtualHostPrincipal.class);
+
+                if (principal != null && principal.getVirtualHost() instanceof CacheProvider)
+                {
+                    CacheProvider cacheProvider = (CacheProvider) principal.getVirtualHost();
+                    cache = cacheProvider.getNamedCache("amqShortStringCache");
+                }
+            }
+            CACHE.set(cache);
+        }
+        return cache;
+    }
+
+    /** Unit testing only */
+    static void setCache(final Cache<ByteBuffer, AMQShortString> cache)
+    {
+        CACHE.set(cache);
+    }
 }

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/d79537d2/broker-core/src/main/java/org/apache/qpid/server/security/QpidPrincipal.java
----------------------------------------------------------------------
diff --git a/broker-core/src/main/java/org/apache/qpid/server/security/QpidPrincipal.java b/broker-core/src/main/java/org/apache/qpid/server/security/QpidPrincipal.java
index 46c717f..382fea8 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/security/QpidPrincipal.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/security/QpidPrincipal.java
@@ -21,11 +21,49 @@ package org.apache.qpid.server.security;
 
 import java.io.Serializable;
 import java.security.Principal;
+import java.util.Set;
+
+import javax.security.auth.Subject;
 
 import org.apache.qpid.server.model.ConfiguredObject;
 
 
 public interface QpidPrincipal extends Principal, Serializable
 {
+    static <P extends Principal> P getSingletonPrincipal(final Subject authSubject,
+                                                         final boolean isPrincipalOptional,
+                                                         final Class<P> principalClazz)
+    {
+        if (authSubject == null)
+        {
+            throw new IllegalArgumentException("No authenticated subject.");
+        }
+
+        final Set<P> principals = authSubject.getPrincipals(principalClazz);
+        int numberOfAuthenticatedPrincipals = principals.size();
+
+        if(numberOfAuthenticatedPrincipals == 0 && isPrincipalOptional)
+        {
+            return null;
+        }
+        else
+        {
+            if (numberOfAuthenticatedPrincipals != 1)
+            {
+                throw new IllegalArgumentException(
+                        String.format(
+                                "Can't find single %s in the authenticated subject. There were %d "
+                                + "%s principals out of a total number of principals of: %s",
+                                principalClazz.getSimpleName(),
+                                principalClazz.getSimpleName(),
+                                numberOfAuthenticatedPrincipals,
+                                authSubject.getPrincipals()));
+            }
+            return principals.iterator().next();
+        }
+    }
+
     ConfiguredObject<?> getOrigin();
+
+
 }

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/d79537d2/broker-core/src/main/java/org/apache/qpid/server/security/auth/AuthenticatedPrincipal.java
----------------------------------------------------------------------
diff --git a/broker-core/src/main/java/org/apache/qpid/server/security/auth/AuthenticatedPrincipal.java b/broker-core/src/main/java/org/apache/qpid/server/security/auth/AuthenticatedPrincipal.java
index 3e4d688..3ead31c 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/security/auth/AuthenticatedPrincipal.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/security/auth/AuthenticatedPrincipal.java
@@ -126,29 +126,7 @@ public final class AuthenticatedPrincipal implements QpidPrincipal
 
     private static AuthenticatedPrincipal getAuthenticatedPrincipalFromSubject(final Subject authSubject, boolean isPrincipalOptional)
     {
-        if (authSubject == null)
-        {
-            throw new IllegalArgumentException("No authenticated subject.");
-        }
-
-        final Set<AuthenticatedPrincipal> principals = authSubject.getPrincipals(AuthenticatedPrincipal.class);
-        int numberOfAuthenticatedPrincipals = principals.size();
-
-        if(numberOfAuthenticatedPrincipals == 0 && isPrincipalOptional)
-        {
-            return null;
-        }
-        else
-        {
-            if (numberOfAuthenticatedPrincipals != 1)
-            {
-                throw new IllegalArgumentException(
-                        "Can't find single AuthenticatedPrincipal in authenticated subject. There were "
-                                + numberOfAuthenticatedPrincipals
-                                + " authenticated principals out of a total number of principals of: " + authSubject.getPrincipals());
-            }
-            return principals.iterator().next();
-        }
+        return QpidPrincipal.getSingletonPrincipal(authSubject, isPrincipalOptional, AuthenticatedPrincipal.class);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/d79537d2/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java
----------------------------------------------------------------------
diff --git a/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java b/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java
index 7fab645..f097644 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java
@@ -53,6 +53,7 @@ import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.Future;
 import java.util.concurrent.RejectedExecutionException;
 import java.util.concurrent.ScheduledFuture;
@@ -65,6 +66,8 @@ import java.util.regex.PatternSyntaxException;
 
 import javax.security.auth.Subject;
 
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
 import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.JdkFutureAdapters;
@@ -156,6 +159,7 @@ public abstract class AbstractVirtualHost<X extends AbstractVirtualHost<X>> exte
     private final AtomicBoolean _acceptsConnections = new AtomicBoolean(false);
     private volatile TaskExecutor _preferenceTaskExecutor;
     private volatile boolean _deleteRequested;
+    private final ConcurrentMap<String, Cache> _caches = new ConcurrentHashMap<>();
 
     private enum BlockingType { STORE, FILESYSTEM };
 
@@ -3010,6 +3014,21 @@ public abstract class AbstractVirtualHost<X extends AbstractVirtualHost<X>> exte
         }));
     }
 
+    @Override
+    public <K, V> Cache<K, V> getNamedCache(final String cacheName)
+    {
+        final String maxSizeContextVarName = String.format(NAMED_CACHE_MAXIMUM_SIZE_FORMAT, cacheName);
+        final String expirationContextVarName = String.format(NAMED_CACHE_EXPIRATION_FORMAT, cacheName);
+        Set<String> contextKeys = getContextKeys(false);
+        int maxSize = contextKeys.contains(maxSizeContextVarName) ? getContextValue(Integer.class, maxSizeContextVarName) : getContextValue(Integer.class, NAMED_CACHE_MAXIMUM_SIZE);
+        long expiration = contextKeys.contains(expirationContextVarName) ? getContextValue(Long.class, expirationContextVarName) : getContextValue(Long.class, NAMED_CACHE_EXPIRATION);
+
+        return _caches.computeIfAbsent(cacheName, (k) -> CacheBuilder.<K, V>newBuilder()
+                .maximumSize(maxSize)
+                .expireAfterAccess(expiration, TimeUnit.MILLISECONDS)
+                .build());
+    }
+
     private boolean hasDifferentBindings(final Exchange<?> exchange,
                                          final Queue queue,
                                          final Map<String, Map<String,Object>> bindings)

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/d79537d2/broker-core/src/main/java/org/apache/qpid/server/virtualhost/CacheProvider.java
----------------------------------------------------------------------
diff --git a/broker-core/src/main/java/org/apache/qpid/server/virtualhost/CacheProvider.java b/broker-core/src/main/java/org/apache/qpid/server/virtualhost/CacheProvider.java
new file mode 100644
index 0000000..64a6233
--- /dev/null
+++ b/broker-core/src/main/java/org/apache/qpid/server/virtualhost/CacheProvider.java
@@ -0,0 +1,28 @@
+/*
+ * 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.qpid.server.virtualhost;
+
+import com.google.common.cache.Cache;
+
+public interface CacheProvider
+{
+    <K, V> Cache<K, V> getNamedCache(String cacheName);
+}

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/d79537d2/broker-core/src/main/java/org/apache/qpid/server/virtualhost/NullCache.java
----------------------------------------------------------------------
diff --git a/broker-core/src/main/java/org/apache/qpid/server/virtualhost/NullCache.java b/broker-core/src/main/java/org/apache/qpid/server/virtualhost/NullCache.java
new file mode 100644
index 0000000..3d2ef6f
--- /dev/null
+++ b/broker-core/src/main/java/org/apache/qpid/server/virtualhost/NullCache.java
@@ -0,0 +1,107 @@
+/*
+ * 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.qpid.server.virtualhost;
+
+import java.util.Map;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.ExecutionException;
+
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheStats;
+import com.google.common.collect.ImmutableMap;
+
+public class NullCache<K, V> implements Cache<K, V>
+{
+    @Override
+    public V getIfPresent(final Object key)
+    {
+        return null;
+    }
+
+    @Override
+    public V get(final K key, final Callable<? extends V> loader) throws ExecutionException
+    {
+        try
+        {
+            return loader.call();
+        }
+        catch (Exception e)
+        {
+            throw new ExecutionException(e);
+        }
+    }
+
+    @Override
+    public ImmutableMap<K, V> getAllPresent(final Iterable<?> keys)
+    {
+        return ImmutableMap.of();
+    }
+
+    @Override
+    public void put(final K key, final V value)
+    {
+    }
+
+    @Override
+    public void putAll(final Map<? extends K, ? extends V> m)
+    {
+    }
+
+    @Override
+    public void invalidate(final Object key)
+    {
+    }
+
+    @Override
+    public void invalidateAll(final Iterable<?> keys)
+    {
+    }
+
+    @Override
+    public void invalidateAll()
+    {
+    }
+
+    @Override
+    public long size()
+    {
+        return 0;
+    }
+
+    @Override
+    public CacheStats stats()
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public ConcurrentMap<K, V> asMap()
+    {
+        return new ConcurrentHashMap<>();
+    }
+
+    @Override
+    public void cleanUp()
+    {
+    }
+}

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/d79537d2/broker-core/src/main/java/org/apache/qpid/server/virtualhost/QueueManagingVirtualHost.java
----------------------------------------------------------------------
diff --git a/broker-core/src/main/java/org/apache/qpid/server/virtualhost/QueueManagingVirtualHost.java b/broker-core/src/main/java/org/apache/qpid/server/virtualhost/QueueManagingVirtualHost.java
index b30373a..9388304 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/virtualhost/QueueManagingVirtualHost.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/virtualhost/QueueManagingVirtualHost.java
@@ -57,7 +57,8 @@ public interface QueueManagingVirtualHost<X extends QueueManagingVirtualHost<X>>
                                                                                          EventListener,
                                                                                          StatisticsGatherer,
                                                                                          UserPreferencesCreator,
-                                                                                         EventLoggerProvider
+                                                                                         EventLoggerProvider,
+                                                                                         CacheProvider
 {
     String HOUSEKEEPING_CHECK_PERIOD            = "housekeepingCheckPeriod";
     String STORE_TRANSACTION_IDLE_TIMEOUT_CLOSE = "storeTransactionIdleTimeoutClose";
@@ -163,6 +164,18 @@ public interface QueueManagingVirtualHost<X extends QueueManagingVirtualHost<X>>
     @ManagedContextDefault( name = VIRTUALHOST_CONNECTION_THREAD_POOL_NUMBER_OF_SELECTORS)
     long DEFAULT_VIRTUALHOST_CONNECTION_THREAD_POOL_NUMBER_OF_SELECTORS = Math.max(DEFAULT_VIRTUALHOST_CONNECTION_THREAD_POOL_SIZE/8, 1);
 
+    String NAMED_CACHE_MAXIMUM_SIZE = "virtualhost.namedCache.maximumSize";
+    @SuppressWarnings("unused")
+    @ManagedContextDefault(name = NAMED_CACHE_MAXIMUM_SIZE, description = "Maximum number of entries within the named cached")
+    int DEFAULT_NAMED_CACHE_SIZE = 100;
+    String NAMED_CACHE_MAXIMUM_SIZE_FORMAT = "virtualhost.namedCache.%s.maximumSize";
+
+    String NAMED_CACHE_EXPIRATION = "virtualhost.namedCache.expiration";
+    @SuppressWarnings("unused")
+    @ManagedContextDefault(name = NAMED_CACHE_EXPIRATION, description = "Expiration time (in millis) applied to cached values within the named cache")
+    long DEFAULT_NAMED_CACHE_EXPIRATION = 300 * 1000;
+    String NAMED_CACHE_EXPIRATION_FORMAT = "virtualhost.namedCache.%s.expiration";
+
     @ManagedAttribute( defaultValue = "${" + QueueManagingVirtualHost.VIRTUALHOST_CONNECTION_THREAD_POOL_NUMBER_OF_SELECTORS + "}")
     int getNumberOfSelectors();
 

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/d79537d2/broker-core/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostPrincipal.java
----------------------------------------------------------------------
diff --git a/broker-core/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostPrincipal.java b/broker-core/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostPrincipal.java
index b3d7374..14fd8cc 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostPrincipal.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostPrincipal.java
@@ -44,6 +44,11 @@ public class VirtualHostPrincipal implements Principal, Serializable
         return _name;
     }
 
+    public VirtualHost<?> getVirtualHost()
+    {
+        return _virtualHost;
+    }
+
     @Override
     public boolean equals(Object o)
     {

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/d79537d2/broker-core/src/test/java/org/apache/qpid/server/protocol/v0_8/AMQShortStringTest.java
----------------------------------------------------------------------
diff --git a/broker-core/src/test/java/org/apache/qpid/server/protocol/v0_8/AMQShortStringTest.java b/broker-core/src/test/java/org/apache/qpid/server/protocol/v0_8/AMQShortStringTest.java
index 8ff7c96..7d29b5b 100644
--- a/broker-core/src/test/java/org/apache/qpid/server/protocol/v0_8/AMQShortStringTest.java
+++ b/broker-core/src/test/java/org/apache/qpid/server/protocol/v0_8/AMQShortStringTest.java
@@ -20,10 +20,12 @@
 
 package org.apache.qpid.server.protocol.v0_8;
 
-import org.apache.qpid.test.utils.QpidTestCase;
-
 import java.nio.charset.StandardCharsets;
 
+import com.google.common.cache.CacheBuilder;
+
+import org.apache.qpid.test.utils.QpidTestCase;
+
 public class AMQShortStringTest extends QpidTestCase
 {
 
@@ -132,15 +134,24 @@ public class AMQShortStringTest extends QpidTestCase
 
     public void testInterning()
     {
-        AMQShortString str1 = AMQShortString.createAMQShortString("hello");
-        str1.intern();
-        AMQShortString str2 = AMQShortString.createAMQShortString("hello");
-        AMQShortString str3 = AMQShortString.createAMQShortString("hello".getBytes(StandardCharsets.UTF_8));
-
-        assertEquals(str1, str2);
-        assertEquals(str1, str3);
-        assertSame(str1, str2);
-        assertSame(str1, str3);
+        AMQShortString.setCache(CacheBuilder.newBuilder().maximumSize(1).build());
+
+        try
+        {
+            AMQShortString str1 = AMQShortString.createAMQShortString("hello");
+            str1.intern();
+            AMQShortString str2 = AMQShortString.createAMQShortString("hello");
+            AMQShortString str3 = AMQShortString.createAMQShortString("hello".getBytes(StandardCharsets.UTF_8));
+
+            assertEquals(str1, str2);
+            assertEquals(str1, str3);
+            assertSame(str1, str2);
+            assertSame(str1, str3);
+        }
+        finally
+        {
+            AMQShortString.setCache(null);
+        }
     }
 
     /**


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org