什么是JMX? 10分钟快速入门JMX教程(MBean,JConsole)
J2SE 5.0版本中引入了Java管理扩展(JMX)。
它提供了一种架构,可在运行时动态管理资源。
JMX通常用于企业应用程序中,以使系统可配置或者在任何时间获取应用程序的状态。
要通过JMX管理任何资源,我们需要创建托管Bean(MBean),然后将其注册到MBean服务器。
MBean服务器充当所有注册的MBean的管理代理。
我们使用JMX连接器连接到MBean服务器并管理注册的资源。
例如,JDK随附JDK,您可以通过它连接到任何本地或者远程MBean服务器。
如果您使用过JBoss服务器或者任何企业服务器,那么它们都随附JMX Console来监视和管理MBean。
其中我们将学习JMX的基础知识以及如何使用JConsole连接和管理MBean。
让我们现在开始…
首先,我们需要创建MBean,为此,我们首先需要创建定义我们要公开的属性和操作的接口。
接口名称必须以MBean结尾。
如果只想允许只读,则可以保留setter方法。
SystemConfigMBean.java
package com.theitroad.jmx;
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();
}
下一步是提供MBean接口的实际实现。
JMX命名约定是将实现类名称保留为接口名称– MBean。
所以我的实现类将是SystemConfig。
SystemConfig.java
package com.theitroad.jmx;
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;
}
}
现在,我们需要将MBean实现注册到MBean服务器。
我们可以保留类的任何名称。
注册MBean之后,我将保持线程运行,直到通过jconsole将线程计数修改为0,这将是结束应用程序的逻辑。
SystemConfigManagement.java
package com.theitroad.jmx;
import java.lang.management.ManagementFactory;
import javax.management.InstanceAlreadyExistsException;
import javax.management.MBeanRegistrationException;
import javax.management.MBeanServer;
import javax.management.MalformedObjectNameException;
import javax.management.NotCompliantMBeanException;
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 MalformedObjectNameException, InterruptedException, InstanceAlreadyExistsException, MBeanRegistrationException, NotCompliantMBeanException {
//Get the MBean server
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
//register the MBean
SystemConfig mBean = new SystemConfig(DEFAULT_NO_THREADS, DEFAULT_SCHEMA);
ObjectName name = new ObjectName("com.theitroad.jmx: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);
}
}
当我运行上述程序时,它会将我们的MBean实现注册到平台MBean服务器,并继续在控制台上打印以下行。
Thread Count=10:::Schema Name=default Thread Count=10:::Schema Name=default Thread Count=10:::Schema Name=default
现在开始启动JConsole并检查我们的MBean提供的所有选项。
要启动JConsole,您需要做的就是打开一个终端窗口并运行jconsole命令。
JConsole允许创建本地连接以及与远程进程的连接,您将能够在本地进程列表中看到我们的程序名称。
只需选择应用程序并单击"连接"按钮,连接后转到MBean选项卡,您将看到我们可以动态更改threadCount和schemaName的值,并且其中的任何更改都将反映在运行我们应用程序的控制台中。
我们还介绍了我们可以调用的方法。
一旦将threadCount更改为0,应用程序将退出do-while循环并终止。
使用JMX的一些好处是:
JMX允许我们在运行时管理我们的应用程序,而无需花费大量资金,并提供了即用的解决方案。
使用JMX很容易,并减少了为我们的应用程序创建任何管理工具的工作量和投资。

