在MBean中有隻要遵循以下兩個規則,我們就可以在jconsole中動態的改變MBean中的屬性值
1. JMX中要定義接口必須以xxxMBean的規範定義
2. 得有類實現xxxMBean接口
例如:
- 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);
- }
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;
- /**
- * 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;
/**
* 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;
- /**
- * 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);
- }
- }
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;
- /**
- * 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;
- }
- }
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;
- /**
- * Server MBean
- *
- * @author haitao.tu
- *
- */
- 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;
- /**
- * 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;
/**
* 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;
- /**
- * 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);
- }
- }
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;
- /**
- * 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;
- }
- }
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;
- /**
- * Server MXBean
- *
- * @author haitao.tu
- *
- */
- 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的不同才列出這麼多代碼,希望大家能理解:)