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. 查看计算机用户创建时间,敬业签在电脑端怎样查看团签内容的创建时间?
  2. BZOJ 4810 [Ynoi2017]由乃的玉米田 ——Bitset 莫队算法
  3. ecshop 广告设置
  4. linux 测试网络_Linux后台开发:Linux命令系列18-ping测试网络
  5. day_05 显示字符A
  6. string 操作 java_Java中String类的一些常见问题
  7. 三大有限元分析软件(ABAQUS、ANSYS、MSC)的优缺点是什么?应如何选择?
  8. 利用vlmcs客户端区分KMS服务器是KMS模拟器还是正版微软KMS服务器
  9. 信息收集及漏洞利用--安全(四)
  10. wingide python_WingIDE下载|Wingware Python WingIDE汉化中文版6.0 下载_当游网
  11. cba篮球暂停次数和时间_NBA和CBA篮球规则的主要不同
  12. oracle 隐式转换
  13. Fisher's exact test( 费希尔精确检验)
  14. PHP课程设计概要(也许毕业设计也可以用,往正式方向走)想起来在做补充 中规中矩,没有特色
  15. amCharts 报表(转)
  16. 用计算机处理机读卡上,改卷子和登分程序及其注意事项以及一些操作
  17. UE使用技巧之---去空格
  18. 在计算机桌面上的回收站作用是,计算机桌面回收站的设置(回收站的概念及设置、使用说明)...
  19. html 软键盘 页面高度,深入理解高度,获取屏幕、webview、软键盘高度
  20. 相册排版软件:Pixellu SmartAlbums 2 mac版

热门文章

  1. C# MessageBox最全的详解
  2. 指纹识别 之 电容式、超声波和光学式 三面鼎立
  3. Linux centos关闭防火墙
  4. 艾司博讯:拼多多退款率过高会影响权重吗
  5. android自定义View之(六)------高仿华为荣耀3C的圆形刻度比例图(ShowPercentView)
  6. 转载:自行车长途骑行装备
  7. ajax 与 xhr
  8. vue项目分割字符串
  9. 下载神器v1.0.9磁力搜索下载支持在线播放自定义搜索源投屏解析速度不错
  10. CAS(乐观锁)详细讲解