在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的更多相关文章

  1. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  2. [Firefly引擎][学习笔记三][已完结]所需模块封装

    原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读:        笔记三主要就是各个模块的封装了,这里贴 ...

  3. JSP学习笔记(三):简单的Tomcat Web服务器

    注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...

  4. java之jvm学习笔记三(Class文件检验器)

    java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...

  5. VSTO学习笔记(三) 开发Office 2010 64位COM加载项

    原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...

  6. Java IO学习笔记三

    Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...

  7. NumPy学习笔记 三 股票价格

    NumPy学习笔记 三 股票价格 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.&l ...

  8. Learning ROS for Robotics Programming Second Edition学习笔记(三) 补充 hector_slam

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  9. Learning ROS for Robotics Programming Second Edition学习笔记(三) indigo rplidar rviz slam

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

随机推荐

  1. MyBatis定义复合主键

    <resultMap type="XX" id="XXMap">   <id property="id" column=& ...

  2. C# 5.0 TAP 模式下的HTTP Get和Post

    标题有点瘆人,换了工作之后很少写代码了,之前由于签了保密协议,不敢把代码拿出来分享给大家,只能摘抄网上的, 今斗胆拿出来晒晒,跪求指点,直接上代码吧 public class HTTPHelper : ...

  3. ExtJS4.2学习(七)EditorGrid可编辑表格(转)

    鸣谢地址:http://www.shuyangyang.com.cn/jishuliangongfang/qianduanjishu/2013-11-14/176.html ------------- ...

  4. ***CI异常记录到日志:CodeIgniter中设计一个全局exception hook

    在CodeIgniter中,当发生异常时,经常要通知系统管理员,因此有必要在全局的高度上 捕捉异常,因此可以写一个hook, 比如在config目录的hook.php中,加入: $hook['pre_ ...

  5. linux 使用kill命令杀死进程的几个办法

    常规篇: 首先,用ps查看进程,方法如下: $ ps -ef ……smx       1822     1  0 11:38 ?        00:00:49 gnome-terminalsmx   ...

  6. Ubuntu Server 中resolv.conf重启时被覆盖的问题

    /etc/resolv.conf中设置dns之后每次重启Ubuntu Server时该文件会被覆盖,针对这种情况找了一些个解决方法 防止/etc/resolv.conf被覆盖的方法 方法一 1.需要创 ...

  7. [Gauss]HDOJ3364 Lanterns

    题意:有n个灯笼,m个开关 每个开关可以控制k个灯笼, 然后分别列出控制的灯笼的编号(灯笼编号为1到n) 下面有Q个询问,每个询问会有一个最终状态(n个灯笼为一个状态)0代表关 1代表开 问到达这种状 ...

  8. ajax readyState的五种状态详解

    通过ajax的readyState的值,我们可以知道当前的这个http请求处于什么状态.对于web的调试是比较重要的. readyState 状态说明: (0)未初始化 此阶段确认XMLHttpReq ...

  9. php用于URL的base64

    function base64url_encode($plainText) { $base64 = base64_encode($plainText); $base64url = strtr($bas ...

  10. HDU1312——Red and Black(DFS)

    Red and Black Problem DescriptionThere is a rectangular room, covered with square tiles. Each tile i ...