什么是JMX? 10分钟快速入门JMX教程(MBean,JConsole)

时间:2020-02-23 14:34:43  来源:igfitidea点击:

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