1、简介

JMX提供了一种在运行时动态管理资源的体系结构,它主要用于企业应用程序中,以使系统可配置或在任何时候获取应用程序的状态。

JMX规范用Java语言定义了体系结构、设计模式、API和服务,用于管理和监视应用程序和网络。

在JMX技术中,给定的资源由一个或多个称为Managed Beans或MBeans的对象来监测。这些MBeans注册在一个核心管理的对象服务器上(称为MBean服务器)。MBean服务器充当管理代理,可以在启用Java编程语言的大多数设备上运行。

JMX技术还定义了标准连接器(称为JMX连接器),能够从远程管理应用程序(remote management applications)访问JMX代理。

JMX允许我们在运行时管理应用程序,使用JMX不需要任何大量投资,并提供了开箱即用的解决方案(好处)。

2、体系结构

JMX可以分为以下三个层次:插桩(Instrumentation)、JMX代理、远程管理。

  • 插桩

要使用JMX技术管理资源,首先必须使用Java编程语言来检测资源。需要使用一个被称为MBeans的对象来实现对资源工具的访问。Mbean必须遵循JMX规范中定义的设计模式和接口,它被设计成灵活的、简单的和易于实现。

当一个资源被Mbean插桩后,就可以通过JMX代理对其进行管理。

  • JMX代理

JMX代理的核心组件是MBean服务器,它是一个注册MBeans的托管对象服务器。JMX代理还包括一组用于管理MBeans的服务,以及至少一个允许管理应用程序访问的通信适配器或连接器。

  • 远程管理

JMX技术工具可以通过许多不同的方式访问:通过现有的管理协议(例如简单网络管理协议SNMP)或专有协议。MBean服务器依靠协议适配器和连接器来使JMX代理可以从代理Java虚拟机外部的管理应用程序访问。

3、JConsole连接和管理MBeans

要通过JMX管理任何资源,需要创建托管bean(MBean),然后将其注册到MBean Server,MBean Server作为所有注册MBean的管理代理。

可以使用JMX连接器连接到MBean服务器并管理注册的资源,例如:通过使用JDK自带的JConsole可以连接到任何本地或远程MBean服务器来监视和管理MBeans。

  • 创建MBean接口

首先需要创建定义了要公开的属性和操作的接口,接口必须以MBean结尾。

public interface SystemConfigMBean {

	public int getThreadCount();
	public void setThreadCount(int threadCount);
    
	//如果没有setter方法,将无法动态修改
	public String getSchemaName();
    
    public String doConfig();
}
  • 创建MBean接口实现类

JMX对实现类命名的要求是接口名称中去除MBean:

public class SystemConfig implements SystemConfigMBean{

	private int threadCount;
    private String schemaName;
    
	public SystemConfig(int threadCount, String schemaName) {
		super();
		this.threadCount = threadCount;
		this.schemaName = schemaName;
	}

	@Override
	public int getThreadCount() {
		return threadCount;
	}

	@Override
	public void setThreadCount(int threadCount) {
		this.threadCount = threadCount;
	}

	@Override
	public String getSchemaName() {
		return schemaName;
	}

	public void setSchemaName(String schemaName) {
		this.schemaName = schemaName;
	}

	@Override
	public String doConfig() {
		return String.format("ThreadCount: %s, DB Schema: %s", this.threadCount, this.schemaName);
	}

}
  • 注册到MBean服务器
public class SystemConfigManagement{

	private static final int DEFAULT_NO_THREADS = 5;
    private static final String DEFAULT_SCHEMA = "default";
    
    public static void main(String[] args) throws Exception{
    	//MBean Server
		MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
		SystemConfig mBean = new SystemConfig(DEFAULT_NO_THREADS, DEFAULT_SCHEMA);
		ObjectName name = new ObjectName("com.strikeback.jmx:type=SystemConfig");
		//Register the MBean
		mbs.registerMBean(mBean, name);
		do{
			Thread.sleep(5000);
			System.out.println(String.format("ThreadCount: %s. SchemaName: %s.", mBean.getThreadCount(), mBean.getSchemaName()));
		}while(mBean.getThreadCount() != 0);
	}
}

运行上面的程序会将MBean实现注册到MBean服务器,同时保持线程运行,直到通过JConsole将threadCount修改为0,程序结束。

运行程序后,会定时输出:

ThreadCount: 5. SchemaName: default.
  • JConsole修改变量值

在命令行中输入jconsole命令启动JConsole,启动后连接到本地进程:

在MBean页签中,找到对应的MBean,可以调用其方法:

修改ThreadCount的值为0,并刷新:

之后运行的程序结束。

参考资料:

Overview of the JMX

What is JMX? 10 mins Quick Start JMX Tutorial (MBean, JConsole)