jmx即java management extensions,即"java管理扩展",它是一个为应用程序植入管理功能的框架。
这里我们首先来介绍几个核心概念:
1.设备层(instrumentation level)
设备层定义了信息模型,也就是jmx中的各种管理对象。需要管理的时候,信息模型需要向MBean服务器进行注册。
jmx中的各种管理对象,即jmx的管理构件,即managed bean,即mbean。
在jmx中定义了四种管理构件,即四种mbean:
(1)标准管理构件。它是通过内省实现的,因此它对命名规则有比较强的要求。
(2)动态管理构件。它不需要通过内省机制来确定动态管理构件的管理接口,而且有较强的灵活性。
(3)开放管理构件。它是一种专门化的动态管理构件,我们可以通过OpenMBeanInfo对象来获取开放管理构件的管理接口。
(4)模型管理构件。它是内置的、通用的、动态的mbean,它已经包含了必要行为的默认实现,它也允许我们重新给出实现。如果我们想定义自己的模型管理构件,我们就需要实现javax.management.modelmbean.RequiredModelMBean。
jmx在网络服务器上应用比较广泛,我们所熟知的tomcat、jetty都对jmx提供了一定的支持。
本节我们先来介绍标准管理构件,即Standard MBean,我们要实现类似的功能,一般需要做三件事:首先定义MBean接口,然后定义MBean接口的类,最后把它们注册到MBeanServer中进行管理。
我们首先来来定义一个标准管理构件,它的接口名必须以MBean结尾。
public interface UserMBean { String getName(); void setName(String name); Integer getAge(); void setAge(Integer age); void info(); }
然后我们创建一个实现该接口的具体的类,代码内容如下所示:
public class User implements UserMBean{ private String name; private Integer age; @Override public String getName() { return name; } @Override public void setName(String name) { this.name = name; } @Override public Integer getAge() { return age; } @Override public void setAge(Integer age) { this.age = age; } @Override public void info() { System.out.println("名称: " + name + " 年龄:" + age); } }
然后我们创建一个代理,我们把我们的MBean注册到其中,我们代码内容如下所示:
import javax.management.MBeanServer; import javax.management.ObjectName; import java.lang.management.ManagementFactory; public class BaseAgent { public static void main(String[] args) throws Exception{ MBeanServer server = ManagementFactory.getPlatformMBeanServer(); ObjectName userObject = new ObjectName("jmxBean:name=hello"); server.registerMBean(new User(), userObject); // 用于不让程序快速退出 char c = (char)System.in.read(); System.out.println("字符是:" + c); } }
然后我们运行程序,然后在命令行执行jconsole,我们可以看到我们的MBean被注册进来了,如下所示:
然后我们可以修改属性内容(我们可以双击属性对应的值对应的单元格,然后我们就可以填充对应的值了):
我们还可以调用它对应的操作,我们对应如下所示:
对于jmx的标准管理构件,我们就介绍到这里了。