JMX学习笔记(一)-MBean

JMX 即 Java Management Extensions Java管理扩展
MBean 即 managed beans 被管理的Beans
一个MBean是一个被管理的Java对象,有点类似于JavaBean,一个设备、一个应用或者任何资源都可以被表示为MBean,MBean会暴露一个接口对外,这个接口可以读取或者写入一些对象中的属性,通常一个MBean需要定义一个接口,以MBean结尾, 例如: EchoMBean, 格式为XXXMBean,这个是规范,必须得遵守。例如:
- package com.haitao.jmx;
- /**
- * JMX MBean Interface
- *
- * @author haitao.tu
- *
- */
- public interface EchoMBean {
- public void print(String yourName);
- }
- package com.haitao.jmx;
- /**
- * JMX MBean Interface
- *
- * @author haitao.tu
- *
- */
- public interface EchoMBean {
- public void print(String yourName);
- }
很简单的,在EchoMBean接口中,定义了一个print方法,带一个yourName的String类型参数,只有接口貌似没什么用,下边我们实现这个接口
- package com.haitao.jmx;
- /**
- * Implements of JMX EchoMBean
- *
- * @author haitao.tu
- *
- */
- public class Echo implements EchoMBean {
- @Override
- public void print(String yourName) {
- System.out.println("Hi " + yourName + "!");
- }
- }
- package com.haitao.jmx;
- /**
- * Implements of JMX EchoMBean
- *
- * @author haitao.tu
- *
- */
- public class Echo implements EchoMBean {
- @Override
- public void print(String yourName) {
- System.out.println("Hi " + yourName + "!");
- }
- }
Echo实现了EchoMBean接口,很简单我们只是print了hi yourName!
按照JMX的定义,是被管理的对象,现在我们只是定义了该对象,并没有被管理,接着我们让这个Echo类的实例对象被管理起来:
- package com.haitao.jmx;
- import java.lang.management.ManagementFactory;
- import javax.management.MBeanServer;
- import javax.management.ObjectName;
- /**
- * JMX App Demo
- *
- * @author haitao.tu
- */
- public class App {
- public static void main(String[] args) throws Exception {
- // 创建MBeanServer
- MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
- // 新建MBean ObjectName, 在MBeanServer里标识注册的MBean
- ObjectName name = new ObjectName("com.haitao.jmx:type=Echo");
- // 创建MBean
- Echo mbean = new Echo();
- // 在MBeanServer里注册MBean, 标识为ObjectName(com.tenpay.jmx:type=Echo)
- mbs.registerMBean(mbean, name);
- // 在MBeanServer里调用已注册的EchoMBean的print方法
- mbs.invoke(name, "print", new Object[] { "haitao.tu"}, new String[] {"java.lang.String"});
- Thread.sleep(Long.MAX_VALUE);
- }
- }
- package com.haitao.jmx;
- import java.lang.management.ManagementFactory;
- import javax.management.MBeanServer;
- import javax.management.ObjectName;
- /**
- * JMX App Demo
- *
- * @author haitao.tu
- */
- public class App {
- public static void main(String[] args) throws Exception {
- // 创建MBeanServer
- MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
- // 新建MBean ObjectName, 在MBeanServer里标识注册的MBean
- ObjectName name = new ObjectName("com.haitao.jmx:type=Echo");
- // 创建MBean
- Echo mbean = new Echo();
- // 在MBeanServer里注册MBean, 标识为ObjectName(com.tenpay.jmx:type=Echo)
- mbs.registerMBean(mbean, name);
- // 在MBeanServer里调用已注册的EchoMBean的print方法
- mbs.invoke(name, "print", new Object[] { "haitao.tu"}, new String[] {"java.lang.String"});
- Thread.sleep(Long.MAX_VALUE);
- }
- }
1. 首先我们在App类中向ManagementFactory申请了一个MBeanServer对象
2. 接着我们即然要使Echo的实例对象被管理起来,我们就需要给这个对象一个标识,这个标识是ObjectName.注意这个ObjectName构造函数,这里使用了(包名:type=类名)的形式.
3. 然后我们通过mbs.registerMBean方法注册了echo,并传入了ObjectName在MBeanServer中标识该MBean.
4. 随后我们通过mbs.invoke方法调用了已经注册的Echo的print方法,通过ObjectName找到该MBean, 并通过最后两个参数,传入print方法执行的参数,与参数的类型。
5. 最后我们sleep主线程,等待其他线程的调用.
通过这个例子我们可以看出,MBean的好处,在Echo的实例对象未被管理之前,我们只能通过Echo对象的句柄,来调用Echo里的public方法,在被管理之后,我们可以通过MBeanServer的句柄mbs来调用Echo对象的print方法。
更详细的内容,我们可以通过JDK自带工具jconsole或者 VisualVM 来查看MBean:
1.jconsole
jconsole的位置在%JAVA_HOME%/bin/jconsole.exe
开后会看到:

选择com.haitao.jmx.App,然后点击连接, 选择MBean后会看到

这里可以直接调用Echo的print方法, 当然大家看到这里边还有好多其他的table,包括概述、内存、线程、类、VM摘要、MBean。
2.VisualVM
VisualVM的位置在%JAVA_HOME%/bin/jvisualvm.exe
打开后经过连接我们会看到类似的效果:
JMX学习笔记(一)-MBean的更多相关文章
- JMX学习笔记(二)-Notification
Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...
- JMX学习笔记(三)-MXBean
在MBean中有只要遵循以下两个规则,我们就可以在jconsole中动态的改变MBean中的属性值 1. JMX中要定义接口必须以xxxMBean的规范定义 2. 得有类实现xxxMBean接口 例如 ...
- springmvc学习笔记---idea创建springmvc项目
前言: 真的是很久没搞java的web服务开发了, 最近一次搞还是读研的时候, 想来感慨万千. 英雄没落, Eclipse的盟主地位隐隐然有被IntelliJ IDEA超越的趋势. Spring从2. ...
- GC学习笔记
GC学习笔记 这是我公司同事的GC学习笔记,写得蛮详细的,由浅入深,循序渐进,让人一看就懂,特转到这里. 一.GC特性以及各种GC的选择 1.垃圾回收器的特性 2.对垃圾回收器的选择 2.1 连续 V ...
- 非常详细GC学习笔记
转载:http://blog.csdn.net/fenglibing/article/details/6321453 这是我公司同事的GC学习笔记,写得蛮详细的,由浅入深,循序渐进,让人一看就懂,特转 ...
- 很具体GC学习笔记
GC学习笔记 这是我公司同事的GC学习笔记,写得蛮具体的,由浅入深,循序渐进,让人一看就懂,特转到这里. 一.GC特性以及各种GC的选择 1.垃圾回收器的特性 2.对垃圾回收器的选择 2.1 连续 V ...
- spring学习笔记(一) Spring概述
博主Spring学习笔记整理大部分内容来自Spring实战(第四版)这本书. 强烈建议新手购入或者需要电子书的留言. 在学习Spring之前,我们要了解这么几个问题:什么是Spring?Spring ...
- JVM调优- 学习笔记(转)
http://blog.csdn.net/fenglibing/article/details/6321453 GC学习笔记 这是我公司同事的GC学习笔记,写得蛮详细的,由浅入深,循序渐进,让人一看就 ...
- ZooKeeper学习笔记一:集群搭建
作者:Grey 原文地址:ZooKeeper学习笔记一:集群搭建 说明 单机版的zk安装和运行参考:https://zookeeper.apache.org/doc/r3.6.3/zookeeperS ...
随机推荐
- day63-webservice 07.07.如何修改cxf配置文件路径
为什么第一次访问http://localhost:8080/cxf-web-server/service有点慢?证明第一次访问的时候CXFServlet被初始化了被加载了.一般是让CXFServlet ...
- 写个js 分页玩玩(原创)
<ul id="page"> <li class="pagetest">1</li> <li class=" ...
- java基本数据类型(二)和分支结构
基本数据类型(四类八种):不能为null一.整数型 byte----2的8次方 short----2的16次方 int----2的32次方 long----2的64次方二.浮点型 float----4 ...
- 由于管理员设置的策略,该磁盘处于脱机状态"解决办法
.运行:cmd .输入:DISKPART.exe .DISKPART> san .DISKPART> san policy=onlineall .DISKPART>list disk ...
- PyQt5信号-槽机制
signal -> emit -> slot signal.connect(slot) signal.disconnect(slot) 信号 (singal) 可以连接无数多个槽 (slo ...
- How to solve a login problem of SQL Server?
Sometimes when we attempting to login the SQL Server 20xx Management Studio, when we type in the cor ...
- 关于React-native的介绍以及环境搭建
React-Native介绍(后面内容的RN就是指react-native) 由facebook公司推出的,基于react,能开发原生app 原理: 1. 利用react框架写好js代码 2. 利用p ...
- oracle 表锁定解锁
Oracle数据库操作中,我们有时会用到锁表查询以及解锁和kill进程等操作,那么这些操作是怎么实现的呢?本文我们主要就介绍一下这部分内容.(1)锁表查询的代码有以下的形式:select count( ...
- (转)基于MVC4+EasyUI的Web开发框架经验总结(3)- 使用Json实体类构建菜单数据
http://www.cnblogs.com/wuhuacong/p/3669708.html 最近花了不少时间在重构和进一步提炼我的Web开发框架上,力求在用户体验和界面设计方面,和Winform开 ...
- RabbitMQ学习之队列监控
对于RabbitMQ的监控,除了服务器基本信息(硬盘.CPU.内存.IO等)以及MQ的进程和端口,我们也可以通过请求url访问管理API监控其集群和队列的情况.在Javaapi 3.6.0以后,cha ...