MXBean接口

一个MBean由一个MBean接口(该MBean接口列出了所有被暴露的属性和操作对应的方法)和一个class(这 个class实现了这个MBean接口并提供被监测资源的功能)组成。

下面的章节展示了一个MBean例子,以及管理该MBean的一个简单的 JMX agent。

public interface MXBeanBase {/*** 加载元素*/void load();
}

ServerMonitor 接口实现有两种方式:

1. @MXBean注解

2. 接口命名

根据JMX规范,接口名字加上后缀 MXBean ,实现类必须是接口名去掉MBean

下面是基于注解的接口类

@MXBean
public interface ServerMonitor extends MXBeanBase {/*** 加载*/@Overridevoid load();/*** 加载-按照类型** @param type* @see MonitorType*/void load(MonitorType type);/*** 获取接口名称** @return*/String getApiName();/*** 获取QPS*/Double getQps();/*** 获取请求返回总数*/Long getResTotalNum();/*** 获取请求数-成功*/Long getResSucNum();/*** 获取请求数-失败*/Long getResFailNum();/*** 获取请求数-空*/Long getResNullNum();/*** 获取请求数-非空*/Long getResNotNullNum();}

MXBean实现类

public class ServerMonitorForUserProfile implements ServerMonitor {private static final Logger LOG = LoggerFactory.getLogger(ServerMonitorForUserProfile.class);private List<ServerMonitorBean> serverMonitorBeans = new ArrayList<>();@Overridepublic void load() {List<ServerMonitorInfo> monitor_profiles = UserProfileAspect.getMonitor_profiles();serverMonitorBeans.clear();monitor_profiles.parallelStream().forEach(e -> {ServerMonitorBean serverMonitorBean = new ServerMonitorBean();serverMonitorBean.setApiName(e.getApiName());serverMonitorBean.setQps(e.getQps());serverMonitorBean.setResTotalNum(e.getResTotalNum());serverMonitorBean.setResSucNum(e.getResSucNum());serverMonitorBean.setResFailNum(e.getResFailNum());serverMonitorBean.setResNullNum(e.getResNullNum());serverMonitorBean.setResNotNullNum(e.getResNotNullNum());serverMonitorBeans.add(serverMonitorBean);});LOG.info(getMonitorInfoJson());}@Overridepublic List<ServerMonitorBean> getMonitorInfos() {return serverMonitorBeans;}public String getMonitorInfoJson() {return JSON.toJSONString(serverMonitorBeans);}
}

自定义复杂类型

@Setter
@Getter
@NoArgsConstructor
public class ServerMonitorBean {private String apiName;private Double qps;private Long qpsNum;private Long resTotalNum;private Long resSucNum;private Long resFailNum;private Long resNullNum;private Long resNotNullNum;@ConstructorProperties({"apiName", "qps", "qpsNum", "resTotalNum","resSucNum", "resFailNum", "resNullNum", "resNotNullNum"})public ServerMonitorBean(String apiName, Double qps, Long qpsNum, Long resTotalNum,Long resSucNum, Long resFailNum, Long resNullNum, Long resNotNullNum) {this.apiName = apiName;this.qps = qps;this.qpsNum = qpsNum;this.resTotalNum = resTotalNum;this.resSucNum = resSucNum;this.resFailNum = resFailNum;this.resNullNum = resNullNum;this.resNotNullNum = resNotNullNum;}

MBeanServer注册

使用MBeanServer注册开放jmx接口实现类

这个JMX agent,Main,首先通过调用java.lang.management.ManagementFactory类的getPlatformMBeanServer()方法,来获取一个MXBeanSerer,该MBeanSerer已经由Java SE平台创建并初始化。如果平台还没创建MBeanSerer,那么 getPlatformMBeanServer()就通过调用JMX方法MBeanServerFactory.createMBeanServer(),自动地创建一个MBeanServer。由Main获取的MBeanServer instance被叫做mbs。

接着,Main 为 将要被创建的MBean instance 定义了一个对象名。每个JMX MBean都必须有一个对象名。对象名是JMX类ObjectName 的一个实例,必须遵守定义在JMX规范中的语法。也就是说,对象名必须包含一个domain以及一个"键-值"属性列表。由Main定义的这个对象名中,domain是com.example (包含这个MBean例子的包名)。此外,"键-值"属性 声明了该对象的类型是为MXBeanBase。

接着创建了MXBeanBase对象的一个实例,命名为monitorForUserProfile。然后,通过将这个叫做monitorForUserProfile 的MXBeanBase对象 及其 对象名传入JMX方法MBeanServer.registerMBean(),该Hello对象,就被注册为MBean Server mbs中的一个MBean,其对象名为nameForUserProfile。

当该 MXBeanBase注册到了该 MBeanServer中之后,Main简单地等待对MXBeanBase进行管理操作。在这个例子中,这些管理操作是 调用load()以及读写属性的值。

@Component("ServerMonitorManager")
public class ServerMonitorManager {private static final Logger LOG = LoggerFactory.getLogger(ServerMonitorManager.class);static Map<String, MXBeanBase> monitorMap;public static void main(String[] args) {initMbServerForMonitor();return;}@PostConstructpublic void init() {//1. 初始化map容器monitorMap = new HashMap<>();//2. 初始化MBeanServerLOG.info("ServerMonitorManager#initMbServerForMonitor() init...");initMbServerForMonitor();LOG.info("ServerMonitorManager#initMbServerForMonitor() init: success, size: {}", monitorMap.size());//3. 记录数刷新recordLoad();}public static void initMbServerForMonitor() {try {MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();MXBeanBase monitorForUserProfile = new ServerMonitorForUserProfile();String nameForUserProfile = "com.apus.hella:type=UserProfile";MBeanRegister4ServerMonitor(mbs, monitorForUserProfile, nameForUserProfile);} catch (Exception e) {LOG.error(e.getMessage(), e);}}private static void MBeanRegister4ServerMonitor(MBeanServer mbs, MXBeanBase monitor, String name)throws MalformedObjectNameException, InstanceAlreadyExistsException, MBeanRegistrationException, NotCompliantMBeanException {ObjectName objectName = new ObjectName(name);mbs.registerMBean(monitor, objectName);monitorMap.put(name, monitor);}/*** 定时刷新记录值*/public void recordLoad() {final long delay = 0;final long period = 10 * 1000;new java.util.Timer().schedule(new TimerTask() {@Overridepublic void run() {monitorMap.forEach((k, v) -> v.load());}}, delay, period);}
}

JMX自定义MXBean相关推荐

  1. jmx使用应该注意的基本规范

    1.标准MBean 名称必需是在要监控的类名后面加上"MBean ". 2.监控的类和MBean 接口必需在同一包下,也可以理解为注册的接口名字必须以MBean结尾,接口实现类比接 ...

  2. JMX : Standard MBean

    Standard MBean由一个接口和一个实现类组成. 命名规范 : 接口 : XXXMBean 实现类 : XXX 按照约定,MBean的name为XXX.自定. 接口中的每个方法定义了一个att ...

  3. gcore java_获取一直FullGC下的java进程HeapDump的小技巧

    小技巧 我们应用的java进程出问题的时候,我们往往会用jmap或者gcore拿到一份HeapDump,拿到MAT上做一次Heap分析,但是 如果你排查的是一直在FullGC的gc问题,你Dump下来 ...

  4. sugarnms网管软件实用吗?

    2019独角兽企业重金招聘Python工程师标准>>> sugarnms网管软件实用吗? 接触了很多IT运维工程师,问他们什么样的网管软件是他们真正需要的.统计了一下回答结果,发现8 ...

  5. 实用的网络管理软件-智和网管平台

    接触了很多 IT 运维工程师,问他们什么样的网管软件是他们真正需要的.统计了一下回答结果,发现 80% 以上的 IT 运维工程师说要实用的网管软件,要能真正减轻他们繁琐重复手工劳动的网管软件. 那什么 ...

  6. JMX : MXBean

    MXBean是一种MBean. 只会引用有限的几种数据类型,predefined set of data types. 如此,任何client都可以访问MXBean,包括远程client.client ...

  7. 【jmx】JMX最佳实践与详解

    1.概述 转载:https://www.iteye.com/blog/shift-alt-ctrl-2404103 2.JMX最佳实践 1.Object Names(对象命名) 每个JMX MBean ...

  8. Java管理扩展JMX入门学习

    系列文章目录 Java管理扩展JMX入门学习 Spring JMX编程学习(一)- 手动注册bean到MBeanServer Spring JMX编程学习(二)- 以Bean的方式注册MbeanSer ...

  9. jconsole是否可以在生产环境使用_使用rmi jmx JCONSOLE远程监控JVM

    [root@localhost SPECjbb2005]# ls /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/management/j ...

最新文章

  1. CSS 定位之绝对与相对
  2. 锁屏界面提示某些设置已隐藏_iOS 13隐藏手电筒和相机快捷图标
  3. 交换基本数据类型的方法swap,并影响到主方法
  4. 鸟哥的Linux私房菜(基础篇)- 第十九章、认识与分析登录文件
  5. Linux之CentOS防火墙及端口操作
  6. OpenCV2:幼儿园篇 第四章 访问图像
  7. 将 .NET Framework 项目转换为 .NET Standard 项目
  8. 如何使用cURL一次测量请求和响应时间?
  9. 程序员梗_那些程序员才懂的梗,看到第10张笑喷了,网友:太真实了
  10. c语言编译器环境,C语言教程:C环境设置
  11. mysql索引超出了数组接线_索引超出数组范围是什么意思
  12. 程序员如何写工作日志
  13. 利用sublime text进行文本对比,替换收费的sublimemerge插件
  14. 淘宝/天猫如何获取sku API接口,item_sku - 获取sku详细信息
  15. 等式约束与不等式约束问题
  16. 远程桌面协议报错0xd06解决方案
  17. 基于顺承关系的事理图谱的构建
  18. ipfs搭建mysql_【IPFS + 区块链 系列】 入门篇 - IPFS环境配置
  19. 离线下载安装Microsoft Store中的应用
  20. Flash游戏制作--打飞碟

热门文章

  1. 解决windows系统wifi图标不见了的问题
  2. 为啥打开桌面计算机很慢,为什么电脑开机很慢
  3. python智能模块_Python模块常用的几种安装方式
  4. php程序+打印机,php程序怎么调用打印机
  5. linux 如何查看端口被哪个进程占用,如何查看linux端口被哪个进程占用
  6. 一加手机html,【一加手机X评测】玩儿设计不谈性价比 一加手机X上手简评_一加 手机X _手机评测-中关村在线...
  7. Raspberry Pi 3使用IoT Dashboard和NOOBS 安装 windows IoT以及Raspbian 系统
  8. 深度学习超级采样(DLSS)到底是什么?
  9. 【通知】博客搬家通知
  10. Python之函数(综合练习)