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
19
20
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 }