JMX简介
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,并刷新:
之后运行的程序结束。
参考资料:
What is JMX? 10 mins Quick Start JMX Tutorial (MBean, JConsole)