JMX学习笔记(三)-MXBean
在MBean中有只要遵循以下两个规则,我们就可以在jconsole中动态的改变MBean中的属性值
1. JMX中要定义接口必须以xxxMBean的规范定义
2. 得有类实现xxxMBean接口
例如:
package com.dxz.mbean.demo3;
public interface ServerConfigureMBean {
public int getPort();
public void setPort(int port);
public String getHost();
public void setHost(String host);
public int getMaxThread();
public void setMaxThread(int maxThread);
public int getMinThread();
public void setMinThread(int minThread);
}
接着实现这个MBean:
package com.dxz.mbean.demo3;
public class ServerConfigure implements ServerConfigureMBean {
private int port;
private String host;
private int maxThread;
private int minThread;
public ServerConfigure(int port, String host, int maxThread, int minThread) {
this.port = port;
this.host = host;
this.maxThread = maxThread;
this.minThread = minThread;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public int getMaxThread() {
return maxThread;
}
public void setMaxThread(int maxThread) {
this.maxThread = maxThread;
}
public int getMinThread() {
return minThread;
}
public void setMinThread(int minThread) {
this.minThread = minThread;
}
}
测试:
package com.dxz.mbean.demo3; import java.lang.management.ManagementFactory; import javax.management.MBeanServer;
import javax.management.ObjectName; public class ServerTest { public static void main(String[] args) throws Exception {
testServerConfigureMBean();
} public static void testServerConfigureMBean() throws Exception {
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); ServerConfigure serverConfigure = new ServerConfigure(8080, "china.com", 20, 100); ObjectName serverName = new ObjectName("com.dxz.mbean.demo3:type=ServerConfigure");
mbs.registerMBean(serverConfigure, serverName);
System.out.println("Waiting...");
Thread.sleep(Long.MAX_VALUE);
} }
打开jconsole:

但是以上这些ServerConfigure的属性都是基本类型,包含在Java.lang.*里,设想,如果说jconsole在类外一个远端的jvm上,如果这里的属性是一个自定义对象,远端的jvm可能不知道该类型的对象:
修改上边的ServerConfigre,使他成为一个聚合对象,去掉ServerConfigureMBean接口实现:
测试结果,打开jconsole查看:

为了让与远端JVM认识该对象,我们需要将ServerMbean改为ServerMXBean,并使用java.beans.ConstructorProperties注解告诉JVM怎样组装该对象:
package com.dxz.mbean.demo5;
public interface ServerMXBean {
public ServerConfigure getServerConfigure();
public void setServerConfigure(ServerConfigure serverConfigure);
public void defaultServerConfigure();
}
1. 使用java.beans.ConstructorProperties注解:
package com.dxz.mbean.demo5;
import java.beans.ConstructorProperties;
public class ServerConfigure {
private int port;
private String host;
private int maxThread;
private int minThread;
/**
* 加入@ConstructorProperties注解
*/
@ConstructorProperties({ "port", "host", "maxThread", "minThread" }) //如果没有会报错,Caused by: java.io.InvalidObjectException: Do not know how to make a com.dxz.mbean.demo5.ServerConfigure from a CompositeData: no method from(CompositeData); no constructor has @ConstructorProperties annotation; does not have a public no-arg constructor; not an interface
public ServerConfigure(int port, String host, int maxThread, int minThread) {
this.port = port;
this.host = host;
this.maxThread = maxThread;
this.minThread = minThread;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public int getMaxThread() {
return maxThread;
}
public void setMaxThread(int maxThread) {
this.maxThread = maxThread;
}
public int getMinThread() {
return minThread;
}
public void setMinThread(int minThread) {
this.minThread = minThread;
}
}
package com.dxz.mbean.demo5;
public class Server implements ServerMXBean {
/**
* 封装
*/
private ServerConfigure serverConfigure;
public Server(ServerConfigure serverConfigure) {
this.serverConfigure = serverConfigure;
}
@Override
public ServerConfigure getServerConfigure() {
synchronized (serverConfigure) {
return this.serverConfigure;
}
}
@Override
public void setServerConfigure(ServerConfigure serverConfigure) {
synchronized (serverConfigure) {
this.serverConfigure = serverConfigure;
}
}
@Override
public void defaultServerConfigure() {
synchronized (serverConfigure) {
serverConfigure.setPort(80);
serverConfigure.setHost("www.haitao.com");
serverConfigure.setMinThread(10);
serverConfigure.setMaxThread(500);
}
}
}
package com.dxz.mbean.demo5; import java.lang.management.ManagementFactory; import javax.management.MBeanServer;
import javax.management.ObjectName; public class ServerTest {
public static void main(String[] args) throws Exception {
testServerMBean();
} public static void testServerMBean() throws Exception {
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); ServerConfigure serverConfigure = new ServerConfigure(8080,
"www.china5.com", 20, 100); Server server = new Server(serverConfigure); ObjectName serverName = new ObjectName(
"com.dxz.mbean.demo5:type=Server");
mbs.registerMBean(server, serverName);
System.out.println("Waiting...");
Thread.sleep(Long.MAX_VALUE);
}
}
测试代码一样,就不再重复,最后运行测试,查看jconsole:

双击值,我们将会看到:

实际上MXBean的概念很简单,就是定义xxxMXBean接口,然后实现这个接口,与MBean类似,为了阐述这个MXBean与MBean的不同才列出这么多代码,希望大家能理解:)
JMX学习笔记(三)-MXBean的更多相关文章
- Oracle学习笔记三 SQL命令
SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)
- [Firefly引擎][学习笔记三][已完结]所需模块封装
原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读: 笔记三主要就是各个模块的封装了,这里贴 ...
- JSP学习笔记(三):简单的Tomcat Web服务器
注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...
- java之jvm学习笔记三(Class文件检验器)
java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...
- VSTO学习笔记(三) 开发Office 2010 64位COM加载项
原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...
- Java IO学习笔记三
Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...
- NumPy学习笔记 三 股票价格
NumPy学习笔记 三 股票价格 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.&l ...
- Learning ROS for Robotics Programming Second Edition学习笔记(三) 补充 hector_slam
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- Learning ROS for Robotics Programming Second Edition学习笔记(三) indigo rplidar rviz slam
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
随机推荐
- kruskal算法-Pascal
马上就快要考试了,然而突然发现自己图论已经废了,于是再都打一遍练练手...... const maxn=; maxe=maxn*maxn; type edge=record //edge记录每一条边, ...
- 【BZOJ 1022】 [SHOI2008]小约翰的游戏John
Description 小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有n堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子,在这堆石子中取走任意多的石子,但不能一粒石子也不取 ...
- IE9下Coolite.Ext出现createContextualFragment错误
解决Ext在IE9上报错“createContextualFragment”,只需要在使用Coolite.Ext页面加入如下代码即可: if ((typeof Range !== "unde ...
- Runtime 实现 动态添加属性
利用动态加载为对象添加一个 block 点击属性; .h 文件 #import <UIKit/UIKit.h> @interface UIView (Tap) /** * 动态添加手势 * ...
- 如何使用 XSD
如何使用 XSD 一个简单的 XML 文档: 请看这个名为 "note.xml" 的 XML 文档: <?xml version="1.0"?> & ...
- CrackMe_001
本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注册机的东西. 其中,文章中按照如下逻辑编排(解决如 ...
- JNI和NDK的区别
http://blog.csdn.net/ithomer/article/details/6828830 NDK(Native Development Kit)“原生”也就是二进制 android常用 ...
- 如何快速查看linux的发行版信息
思路一: 在CentOS中想查看发行版信息,输入了lsb_release -a 命令却报错了,通过输入以下命令进行安装 yum install redhat-lsb -y 然后继续查看发行版信息 [r ...
- Android TabHost中实现标签的滚动以及一些TabHost开发的奇怪问题
最近在使用TabHost的时候遇到了一些奇怪的问题,在这里总结分享备忘一下. 首先说一点TabActivity将会被FragmentActivity所替代,但是本文中却是使用的TabActivity. ...
- HTML DOM与XML DOM之间,既有区别
http://kb.cnblogs.com/page/74971/ HTML文档可以使用Core API和HTML API两者: 而XML文档只能使用Core API. 换句话说,HTML与XML重叠 ...