什么是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很容易,并减少了为我们的应用程序创建任何管理工具的工作量和投资。