当前位置: 首页 > news >正文

【JAVA基础】JMX 和 MBean

文章目录

    • 1. JMX 与 MBean 概述
      • 1.1 JMX 技术简介
      • 1.2 MBean 核心概念
    • 2. MBean 类型详解
      • 2.1 标准 MBean (Standard MBean)
      • 2.2 动态 MBean (Dynamic MBean)
      • 2.3 开放 MBean (Open MBean)
      • 2.4 模型 MBean (Model MBean)
    • 3. MBean 注册与访问
      • 3.1 注册流程
      • 3.2 访问方式
    • 4.实际应用案例
      • 4.1 Spring JMX 集成示例
      • 4.2 自定义缓存监控指标

1. JMX 与 MBean 概述

1.1 JMX 技术简介

Java Management Extensions (JMX) 是 Java 的标准管理扩展技术,提供了应用程序管理功能,包括:

  • 实时监控:运行时数据采集
  • 远程管理:通过网络接口管理应用
  • 动态扩展:无需重启便可动态增加应用功能

1.2 MBean 核心概念

Managed Bean (MBean) 是 JMX 的核心管理单元,特点包括:

  • 标准化的管理接口
  • 暴露属性和操作
  • 支持通知机制
  • 可通过 JMX 代理访问

2. MBean 类型详解

2.1 标准 MBean (Standard MBean)

// 接口定义
public interface SystemConfigMBean {int getThreadCount();void setThreadCount(int count);String doDiagnostic();
}// 实现类
public class SystemConfig implements SystemConfigMBean {private int threadCount = 100;public int getThreadCount() { return threadCount; }public void setThreadCount(int count) { this.threadCount = count; }public String doDiagnostic() { return "System OK"; }
}

2.2 动态 MBean (Dynamic MBean)

public class DynamicLogger implements DynamicMBean {private Logger logger = Logger.getLogger("dynamic");public Object getAttribute(String attribute) {if("level".equals(attribute)) {return logger.getLevel();}throw new AttributeNotFoundException(attribute);}public void setAttribute(Attribute attribute) {...}// 其他必须实现的方法...
}

2.3 开放 MBean (Open MBean)

使用通用数据类型(CompositeData)实现类型安全的动态管理:

public interface CacheOpenMBean {CompositeData getCacheStats();void resetStatistics(CompositeData options);
}

2.4 模型 MBean (Model MBean)

运行时动态创建管理接口:

ModelMBean mbean = new RequiredModelMBean();
mbean.setManagedResource(resource, "ObjectReference");

3. MBean 注册与访问

3.1 注册流程

比如我现在定义一个动态线程池的MBean,那么注册流程如下:

MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
ObjectName name = new ObjectName("org.javaboy:type=DynamicThreadPool");
mbs.registerMBean(this, name);

3.2 访问方式

  • JConsole: JDK 内置可视化工具
  • VisualVM: 功能更强大的监控工具
  • JMX Client API: 编程式访问. 这是最灵活的方式,适合集成到自己的应用程序中

4.实际应用案例

4.1 Spring JMX 集成示例

/*** 应用指标监控Bean** 使用@ManagedResource注解声明这是一个MBean,并指定其在JMX服务器中的唯一标识:* - objectName格式:域名:键=值(类似包名结构)* - 此处定义为"com.example:name=AppMetrics"*/
@ManagedResource(objectName = "com.example:name=AppMetrics")
public class AppMetrics {private int activeSessions = 0; // 实际存储会话数的字段/*** 获取当前活跃会话数(通过JMX暴露的属性)** @ManagedAttribute 注解表示这是一个可读属性* 在JConsole中会显示为"属性"字段,可以实时查看*/@ManagedAttribute(description = "当前活跃用户会话数量")public int getActiveSessions() {return activeSessions;}/*** 增加会话计数(非JMX暴露方法,仅供内部调用)*/public void incrementSession() {activeSessions++;}/*** 重置所有计数器(通过JMX暴露的操作)** @ManagedOperation 注解表示这是一个可调用方法* 在JConsole中会显示为"操作"按钮,可以手动触发*/@ManagedOperation(description = "重置所有统计计数器")public void resetCounters() {activeSessions = 0;System.out.println("计数器已重置");}
}

4.2 自定义缓存监控指标

/*** 缓存性能监控MBean* * 实现CacheMetricsMBean接口(标准MBean模式)* 接口定义示例:* public interface CacheMetricsMBean {*     long getHitCount();*     double getHitRate();* }*/
public class CacheMetrics implements CacheMetricsMBean {// 使用Micrometer的Counter指标(可选)private final Counter hitCounter;private long totalRequests = 0;private long hitCount = 0;/*** 构造函数初始化指标*/public CacheMetrics() {// 初始化计数器(需要Micrometer依赖)this.hitCounter = Metrics.counter("cache.hits");// 注册到JMX(也可以通过Spring自动注册)try {ManagementFactory.getPlatformMBeanServer().registerMBean(this, new ObjectName("com.example:type=Cache,name=DefaultCache"));} catch (Exception e) {throw new RuntimeException("注册MBean失败", e);}}/*** 获取缓存命中次数* * @ManagedAttribute 表示这是可读属性* 在JMX客户端显示为"HitCount"属性*/@ManagedAttribute(description = "缓存总命中次数")public long getHitCount() {return hitCounter != null ? hitCounter.count() : hitCount;}/*** 获取缓存命中率*/@ManagedAttribute(description = "缓存命中率(0-1)")public double getHitRate() {return totalRequests == 0 ? 0 : (double)hitCount / totalRequests;}/*** 记录缓存访问(业务方法)*/public void recordAccess(boolean hit) {totalRequests++;if(hit) {hitCount++;if(hitCounter != null) hitCounter.increment();}}
}

相关文章:

  • AI科技前沿动态:5.26 - 5.30 一周速览
  • PostgreSQL 临时表空间
  • Java八股文——Java基础「数据类型篇」
  • 【c语言输入不大于26的整数,输出全部大写字母输入3输出ABC】2022-1-30
  • 电子电路:共射极放大器工作原理及应用详解
  • 深入链表剖析:从原理到 C 语言实现,涵盖单向、双向及循环链表全解析
  • ES6解构赋值与传统数据提取方式的对比分析
  • 测试工程师学LangChain之promptTemplate 实战笔记
  • 数据库笔记
  • 一句话开发Chrome摸鱼插件
  • OpenCV中的分水岭算法 (C/C++)
  • 大语言模型的技术原理与应用前景:从Transformer到ChatGPT
  • 晨控CK-FR03与汇川H5U系列PLC配置MODBUS TCP通讯连接操作手册
  • 【解决办法】Git报错error: src refspec main does not match any.
  • 通信算法之280:无人机侦测模块知识框架思维导图
  • Spring Boot中使用@JsonAnyGetter和@JsonAnySetter处理动态JSON属性
  • 移动安全Android——解决APP抓包证书无效问题
  • Spring Boot 基础知识全面解析:快速构建企业级应用的核心指南
  • 备战2025全国青少年信息素养大赛省赛—图形化编程—每一练——打开密码锁
  • 关于ffplay在macos上运行奔溃的问题
  • 重庆建设网/巩义网站优化公司
  • 网站维护的主要内容包括/电商平台怎么注册
  • 营销型网站建设总结/推广普通话标语
  • wordpress author template/北京seo全网营销
  • 常州网站建设方案/上海优化seo
  • 微网站与普通网站的区别/建立网站的基本流程