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 ...
随机推荐
- LeetCode Weekly Contest 20
1. 520. Detect Capital 题目描述的很清楚,直接写,注意:字符串长度为1的时候,大写和小写都是满足要求的,剩下的情况单独判断.还有:我感觉自己写的代码很丑,判断条件比较多,需要改进 ...
- springmvc-servlet.xml(springmvc-servlet.xml 配置 增强配置)
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- SQLServer Union 和 Union All 在Insert 语句中的不同效果
如果不是发了那个帖子还不会像这样意外发现这两者的不同,好歹了也工作了一段时间,真是汗颜 上例子: 执行此条插入语句后,只会插入两条数据,因为会把完全重复的数据过滤掉 insert into tests ...
- 百度地图api的简单应用
百度地图api 获取经纬度(通过浏览器的) //获取经纬度 window.navigator.geolocation.getCurrentPosition(function(position) { a ...
- 关于百分比宽高div居中并垂直居中问题
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Android横屏时软键盘全屏问题
1.使用 SearchView xml加入 android:imeOptions="actionDone|flagNoExtractUi" 可以限制软键盘禁止全屏 <andr ...
- spring之pom.xml配置
spring之pom.xml配置 <?xml version="1.0" encoding="UTF-8"?> <project xmlns= ...
- PowerDesigner 逆向工程Non SQL Error : Could not load class com.mysql.jdbc.Driver
建立与数据库的连接. 在菜单条上,有一个Database的选择项: 选择connect…后弹出设置对话框: 在Data source里选择第三个单选按钮,即Connection profile:后,点 ...
- uva 1658 Admiral 【 最小费用最大流 】
拆点,每个点拆成 i,i' 在i 和i‘之间连一条费用为0,容量为1的边,就可以保证每个点只经过一次 特殊的点,1和n之间,,,n和2*n之间连一条费用为0,容量为2的边,可以求出两条路径 #incl ...
- (转)RabbitMQ学习之安装
http://blog.csdn.net/zhu_tianwei/article/details/40832185 RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客 ...