在MBean中有只要遵循以下两个规则,我们就可以在jconsole中动态的改变MBean中的属性值
1. JMX中要定义接口必须以xxxMBean的规范定义
2. 得有类实现xxxMBean接口
例如:
- package com.haitao.jmx.mxbean;
-
-
-
-
-
-
-
- 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);
-
- }
package com.haitao.jmx.mxbean;
/**
* Server Configure MBean
*
* @author haitao.tu
*
*/
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.haitao.jmx.mxbean;
-
-
-
-
-
-
-
-
- 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.haitao.jmx.mxbean;
/**
* Server Configure
*
* @author haitao.tu
*
*/
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.haitao.jmx.mxbean;
-
- 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,
- "test.haitao.com", 20, 100);
-
- ObjectName serverName = new ObjectName(
- "com.haitao.jmx.mxbean:type=ServerConfigure");
- mbs.registerMBean(serverConfigure, serverName);
- System.out.println("Waiting...");
- Thread.sleep(Long.MAX_VALUE);
- }
-
- }
package com.haitao.jmx.mxbean;
import java.lang.management.ManagementFactory;
import javax.management.MBeanServer;
import javax.management.ObjectName;
/**
* Server Test
*
* @author haitao.tu
*
*/
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,
"test.haitao.com", 20, 100);
ObjectName serverName = new ObjectName(
"com.haitao.jmx.mxbean:type=ServerConfigure");
mbs.registerMBean(serverConfigure, serverName);
System.out.println("Waiting...");
Thread.sleep(Long.MAX_VALUE);
}
}
打开jconsole:
但是以上这些ServerConfigure的属性都是基本类型,包含在java.lang.*里,设想,如果说jconsole在类外一个远端的jvm上,如果这里的属性是一个自定义对象,远端的jvm可能不知道该类型的对象:
修改上边的ServerConfigre,使他成为一个聚合对象,去掉ServerConfigureMBean接口实现:
- package com.haitao.jmx.mxbean;
-
-
-
-
-
-
-
-
- public class ServerConfigure {
-
- 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.haitao.jmx.mxbean;
/**
* Server Configure
*
* @author haitao.tu
*
*/
public class ServerConfigure {
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;
}
}
新建一个ServerMBean接口:
- package com.haitao.jmx.mxbean;
-
-
-
-
-
-
-
- public interface ServerMBean {
-
- public ServerConfigure getServerConfigure();
-
- public void setServerConfigure(ServerConfigure serverConfigure);
-
- public void defaultServerConfigure();
-
- }
package com.haitao.jmx.mxbean;
/**
* Server MBean
*
* @author haitao.tu
*
*/
public interface ServerMBean {
public ServerConfigure getServerConfigure();
public void setServerConfigure(ServerConfigure serverConfigure);
public void defaultServerConfigure();
}
实现ServerMBean并封装ServerConfigure类:
- package com.haitao.jmx.mxbean;
-
-
-
-
-
-
-
- public class Server implements ServerMBean {
-
-
-
-
- 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.haitao.jmx.mxbean;
/**
* Server
*
* @author haitao.tu
*
*/
public class Server implements ServerMBean {
/**
* 封装
*/
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.haitao.jmx.mxbean;
-
- 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,
- "test.haitao.com", 20, 100);
-
- Server server = new Server(serverConfigure);
-
- ObjectName serverName = new ObjectName(
- "com.haitao.jmx.mxbean:type=Server");
- mbs.registerMBean(server, serverName);
- System.out.println("Waiting...");
- Thread.sleep(Long.MAX_VALUE);
- }
-
- }
package com.haitao.jmx.mxbean;
import java.lang.management.ManagementFactory;
import javax.management.MBeanServer;
import javax.management.ObjectName;
/**
* Server Test
*
* @author haitao.tu
*
*/
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,
"test.haitao.com", 20, 100);
Server server = new Server(serverConfigure);
ObjectName serverName = new ObjectName(
"com.haitao.jmx.mxbean:type=Server");
mbs.registerMBean(server, serverName);
System.out.println("Waiting...");
Thread.sleep(Long.MAX_VALUE);
}
}
打开jconsole查看:
为了让与远端JVM认识该对象,我们需要将ServerMbean改为ServerMXBean,并使用java.beans.ConstructorProperties注解告诉JVM怎样组装该对象:
1. 使用java.beans.ConstructorProperties注解:
- package com.haitao.jmx.mxbean;
-
- import java.beans.ConstructorProperties;
-
-
-
-
-
-
-
- public class ServerConfigure {
-
- private int port;
-
- private String host;
-
- private int maxThread;
-
- private int minThread;
-
-
-
-
- @ConstructorProperties({"port", "host", "maxThread", "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.haitao.jmx.mxbean;
import java.beans.ConstructorProperties;
/**
* Server Configure
*
* @author haitao.tu
*
*/
public class ServerConfigure {
private int port;
private String host;
private int maxThread;
private int minThread;
/**
* 加入@ConstructorPropertiesz注解
*/
@ConstructorProperties({"port", "host", "maxThread", "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;
}
}
2. 修改ServerMbean为ServerMXBean:
- package com.haitao.jmx.mxbean;
-
-
-
-
-
-
-
- public interface ServerMXBean {
-
- public ServerConfigure getServerConfigure();
-
- public void setServerConfigure(ServerConfigure serverConfigure);
-
- public void defaultServerConfigure();
-
- }
package com.haitao.jmx.mxbean;
/**
* Server MXBean
*
* @author haitao.tu
*
*/
public interface ServerMXBean {
public ServerConfigure getServerConfigure();
public void setServerConfigure(ServerConfigure serverConfigure);
public void defaultServerConfigure();
}
测试代码一样,就不再重复,最后运行测试,查看jconsole:
双击值,我们将会看到:
实际上MXBean的概念很简单,就是定义xxxMXBean接口,然后实现这个接口,与MBean类似,
为了阐述这个MXBean与MBean的不同才列出这么多代码,希望大家能理解:)
本文原帖:http://tuhaitao.javaeye.com/blog/807398