JMX入门开发
什么是JMX?或者是JMX是做什么的?我的理解是:可以远程管理/编辑JAVA对象。如图:
上面的SchemaName属性就是可以动态修改的,那么是如何做到的哪?下面咱们逐步分析。
一、首先假设咱们有个对象SystemConfig,包含两个属性threadCount和schemaName
package study; public class SystemConfig implements SystemConfigMBean { private int threadCount; private String schemaName; public SystemConfig(int numThreads, String schema) { this.threadCount = numThreads; this.schemaName = schema; } @Override public void setThreadCount(int noOfThreads) { this.threadCount = noOfThreads; } @Override public int getThreadCount() { return this.threadCount; } @Override public void setSchemaName(String schemaName) { this.schemaName = schemaName; } @Override public String getSchemaName() { return this.schemaName; } @Override public String doConfig() { return "No of Threads=" + this.threadCount + " and DB Schema Name=" + this.schemaName; } }
package study; public interface SystemConfigMBean { public void setThreadCount(int noOfThreads); public int getThreadCount(); public void setSchemaName(String schemaName); public String getSchemaName(); // any method starting with get and set are considered // as attributes getter and setter methods, so I am // using do* for operation. public String doConfig(); }
二、需要实现远程动态修改这个对象,那么就需要将这个类注册到JMX里面,代码如下:
package study; import java.lang.management.ManagementFactory; import javax.management.MBeanServer; import javax.management.ObjectName; public class SystemConfigManagement { private static final int DEFAULT_NO_THREADS = 10; private static final String DEFAULT_SCHEMA = "default"; public static void main(String[] args) throws Exception { // Get the MBean server MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); // register the MBean SystemConfig mBean = new SystemConfig(DEFAULT_NO_THREADS, DEFAULT_SCHEMA); ObjectName name = new ObjectName("xman:type=SystemConfig"); mbs.registerMBean(mBean, name); do { Thread.sleep(3000); System.out.println("Thread Count=" + mBean.getThreadCount() + ":::Schema Name=" + mBean.getSchemaName()); } while (mBean.getThreadCount() != 0); } }
三、想要支持远程管理,就需要配置JMX参数,如图:
四、在本地运行jconsole链接上来,然后修改Count的值:
五、最后再看结果:
实现了上面的内容,那么自然就会想能否程序自动调用修改,而不用jconsole,下面就可以了:
package study; import javax.management.JMX; import javax.management.MBeanServerConnection; import javax.management.ObjectName; import javax.management.remote.JMXConnector; import javax.management.remote.JMXConnectorFactory; import javax.management.remote.JMXServiceURL; public class Client { /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://127.0.0.1:8888/jmxrmi"); JMXConnector jmxc = JMXConnectorFactory.connect(url, null); MBeanServerConnection mbsc = jmxc.getMBeanServerConnection(); ObjectName mbeanName = new ObjectName("xman:type=SystemConfig"); SystemConfigMBean mbeanProxy = JMX.newMBeanProxy(mbsc, mbeanName, SystemConfigMBean.class, true); int threadCount = mbeanProxy.getThreadCount(); System.out.println("Current ThreadCount: " + threadCount); mbeanProxy.setThreadCount(100); threadCount = mbeanProxy.getThreadCount(); System.out.println("Changed ThreadCount: " + threadCount); Thread.sleep(3); jmxc.close(); } }
上面的程序不需要我怎么解释了吧,远程连接,修改内容。