View Javadoc
1   package com.atlassian.cache.memory;
2   
3   import com.atlassian.cache.CacheSettingsDefaultsProvider;
4   import com.atlassian.cache.ManagedCache;
5   import com.atlassian.cache.impl.jmx.MBeanRegistrar;
6   import com.atlassian.cache.memory.jmx.MemoryCacheMXBeanRegistrar;
7   import io.atlassian.util.concurrent.ManagedLock;
8   import io.atlassian.util.concurrent.ManagedLocks;
9   
10  import java.util.function.Supplier;
11  
12  import javax.annotation.Nonnull;
13  import javax.annotation.Nullable;
14  import javax.management.MBeanServer;
15  import java.util.concurrent.locks.ReentrantReadWriteLock;
16  
17  /**
18   * Extension of @{@link MemoryCacheManager} wrapping it with registering JMX metrics for caches.
19   *
20   * @since v3.1
21   */
22  public class JMXMemoryCacheManager extends MemoryCacheManager implements MBeanRegistrar
23  {
24      private final MemoryCacheMXBeanRegistrar mbeansRegistrar = new MemoryCacheMXBeanRegistrar();
25  
26      private ManagedLock.ReadWrite metricsLock = ManagedLocks.manageReadWrite(new ReentrantReadWriteLock());
27  
28      public JMXMemoryCacheManager()
29      {
30          super();
31      }
32  
33      public JMXMemoryCacheManager(CacheSettingsDefaultsProvider cacheSettingsDefaultsProvider)
34      {
35          super(cacheSettingsDefaultsProvider);
36      }
37  
38      @Override
39      protected void putCacheInMap(@Nonnull String name, @Nonnull Supplier<ManagedCache> supplier)
40      {
41          metricsLock.read().withLock(() ->
42          {
43              JMXMemoryCacheManager.super.putCacheInMap(name, supplier);
44              mbeansRegistrar.registerMBean(name);
45          });
46      }
47  
48      @Override
49      public void registerMBeans(@Nullable MBeanServer mBeanServer)
50      {
51          metricsLock.write().withLock(() ->
52          {
53              mbeansRegistrar.enableCollectingJMXMetrics(mBeanServer, JMXMemoryCacheManager.this);
54          });
55      }
56  
57      @Override
58      public void unregisterMBeans(@Nullable MBeanServer mBeanServer)
59      {
60          metricsLock.write().withLock(() ->
61          {
62              mbeansRegistrar.unregisterMBeans();
63          });
64      }
65  }