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 ...
随机推荐
- WPF中StringToImage和BoolToImage简单用法
在WPF的绑定控件操作中,经常会通过bool值或者某些特定的string值做出相应动作.但UI层控件的很多属性对应的都不是Bool值或者对应的只是固定的String值. 这个时候有两方法解决该问题. ...
- linux 标准输出和后台运行
一.后台运行程序 至需要在命令后面加上一个 & 即可 # command & 例如: python test.py & 二.标准输出.标准错误输出 # command > ...
- Arduino-IIC-Wire.h
前言:Wire.h是Arduino的IIC库. 一.Wire库函数 Wire.begin() Wire.requestFrom() Wire.beginTransmission() Wire.endT ...
- ios网络模拟
ios网络模拟 在ios开发和测试中,需要针对不同网络状况做一下测试优化,如果在真机上用真实网络的话,需要不同网络(2G.3G.4G)的手机卡,比较麻烦. 其实可以模拟不同网络状况,以下分别针对真机和 ...
- Hadoop MapReduce编程 API入门系列之多个Job迭代式MapReduce运行(十二)
推荐 MapReduce分析明星微博数据 http://git.oschina.net/ljc520313/codeexample/tree/master/bigdata/hadoop/mapredu ...
- Unity3d gameObject
using UnityEngine; using System.Collections; public class test : MonoBehaviour { //print只能在MonoBehav ...
- pc端和移动端的轮播图实现(只是结构,内容以后慢慢补充)
轮播图 PC端 移动端 原生js的写法 图片顺序 8123456781 设置计时器 当过度完成之后判断index是否到达两边界限,是的话设置位移 手指touchstart时,获取位置,暂停计时器 手指 ...
- 爱,死亡和机器人 第十四集 齐马蓝 中文字幕(Python处理utf8文件获取想要的内容)
处理代码 file = "a.srt" fi = open(file, mode='r') a = fi.readline() i = 1 while len(str(a)) != ...
- hdu3938 Portal 离线的并查集
离线算法是将全部输入都读入,计算出所有的答案以后再输出的方法.主要是为避免重复计算.类似于计算斐波那契数列的时候用打表的方法. 题目:给一个无向图,求有多少个点对,使得两点间的路径上的花费小于L,这里 ...
- spring中log4j的使用---转载
原文链接:http://www.codeceo.com/article/log4j-usage.html 日志是应用软件中不可缺少的部分,Apache的开源项目log4j是一个功能强大的日志组件,提供 ...