diff --git a/core/src/main/java/org/dromara/dynamictp/core/monitor/collector/jmx/JMXCollector.java b/core/src/main/java/org/dromara/dynamictp/core/monitor/collector/jmx/JMXCollector.java index 366aab46561fb12d6d87bdbe941388a24dcb3e4e..a3e59afc6c5412269998680167e3c16e5900fbad 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/monitor/collector/jmx/JMXCollector.java +++ b/core/src/main/java/org/dromara/dynamictp/core/monitor/collector/jmx/JMXCollector.java @@ -21,11 +21,14 @@ import lombok.extern.slf4j.Slf4j; import org.dromara.dynamictp.common.em.CollectorTypeEnum; import org.dromara.dynamictp.common.entity.ThreadPoolStats; import org.dromara.dynamictp.core.monitor.collector.AbstractCollector; +import org.springframework.beans.BeanUtils; import javax.management.JMException; import javax.management.MBeanServer; import javax.management.ObjectName; import java.lang.management.ManagementFactory; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; /** * ThreadPoolStatsInfo related @@ -37,15 +40,27 @@ public class JMXCollector extends AbstractCollector { public static final String DTP_METRIC_NAME_PREFIX = "dtp.thread.pool"; + /** + * thread pool stats map + * 缓存的作用是将注册到JMX的数据,每次都是同一个对象 + */ + private static final Map GAUGE_CACHE = new ConcurrentHashMap<>(); + @Override public void collect(ThreadPoolStats threadPoolStats) { - try { - MBeanServer server = ManagementFactory.getPlatformMBeanServer(); - ObjectName name = new ObjectName(DTP_METRIC_NAME_PREFIX + ":name=" + threadPoolStats.getPoolName()); - ThreadPoolStatsJMX stats = new ThreadPoolStatsJMX(threadPoolStats); - server.registerMBean(stats, name); - } catch (JMException e) { - log.error("collect thread pool stats error", e); + if (GAUGE_CACHE.containsKey(threadPoolStats.getPoolName())) { + ThreadPoolStats poolStats = GAUGE_CACHE.get(threadPoolStats.getPoolName()); + BeanUtils.copyProperties(threadPoolStats, poolStats); + } else { + try { + MBeanServer server = ManagementFactory.getPlatformMBeanServer(); + ObjectName name = new ObjectName(DTP_METRIC_NAME_PREFIX + ":name=" + threadPoolStats.getPoolName()); + ThreadPoolStatsJMX stats = new ThreadPoolStatsJMX(threadPoolStats); + server.registerMBean(stats, name); + } catch (JMException e) { + log.error("collect thread pool stats error", e); + } + GAUGE_CACHE.put(threadPoolStats.getPoolName(), threadPoolStats); } }