JMX 简介
JMX: Java Management Extension 。java 管理扩展
要想让一个 Java 对象称为 JMX 管理资源,必须创建一个 Managed Bean或者 MBean 的对象。
当然,你也可以编写MBean 管理多个 Java 对象。
一共有四种 MBean:标准 standard,动态 dynamic, 打开 open, 和模型 model。
从结构上来看, JMX 规范分为 3 层,设备层( instrumentation level),代理层( agent level),和分布服务层( distributed services level)。 MBean服务器处于代理层,而 MBeans 处于设备层。分布服务层将会在 JMX 规范的未来版本涉及到。
设备层定义了编写 JMX 管理资源的标准,也就是怎么写 MBeans。代理层提供了如何创建一个代理。一个代理封装了一个 MBean 服务器以及用于处理 MBeans 的服务。代理和 MBeans 处于同一个 Java 虚拟机中,由于 JMX 规范带有一些参考实现,你不需要自己编写 MBean 服务器。参考实现提供了一种创建默认 MBean 服务器的方式。
MBeanServer
javax.management.MBeanServer 是一个表示 MBean 服务器的接口。要创建一个MBean 服务器,可以使用javax.management.MBeanServerFactory 中的方法即可,例如 createMBean 方法
public ObjectInstance createMBean(String className, ObjectName name,
Object params[], String signature[])
throws ReflectionException, InstanceAlreadyExistsException,
MBeanRegistrationException, MBeanException,
NotCompliantMBeanException;
要在 MBean 服务器注册 MBean,调用 MBean 服务器对象的 registerMBean 方法即可。
public ObjectInstance registerMBean(Object object, ObjectName name)
throws InstanceAlreadyExistsException, MBeanRegistrationException,
NotCompliantMBeanException;
public void unregisterMBean(ObjectName name)
throws InstanceNotFoundException, MBeanRegistrationException;
标准 MBeans
标准 MBean 是最简单的 MBean。要是用标准 MBean 管理一个 Java 对象,需要以下工作
- 创建一个接口,名为你的类名加上后缀 MBean。例如,如果要管理的 Java 类是 Car,接口名就是 CarMBean。
- 修改 Java 类,让它实现你创建的接口。
- 创建一个代理,该代理必须包括一个 MBean 服务器。
- 为你的 MBean 创建一个 ObjectName。
- 初始化 MBean 服务器。
- 向 MBean 服务器注册 MBean。
标准 MBean 更易于变现,但是使用它们的话需要修改你自己的类,这在某些情况下可以,但是有时候是不行的。其它类型的 MBean 允许在不修改类的情况下管理对象。
模型 MBeans
模型 MBeans 提供了更多的灵活性。它编写起来更难,但是你不需要在修改自己的 Java 类。在不适合修改类的时候使用模型 MBean 是一种更好的选择。
在使用标准 MBean 的时候需要要管理的资源必须实现一个自己编写的接口。跟标准 MBean 不同,使用模型 MBean 的时候,不需要编写任何接口。而是使用javax.management.modelmbean.ModelMBean 接口来表示模型 MBean。你只需要实现这个接口即可,而 javax.management.modelmbean.RequiredModelMBean 类提供了该接口的默认实现。你可以初始RequiredModelMBean 类或者他的子类。
MBeanInfo 和 ModelMBeanInfo
javax.management.mbean.ModelMBeanInfo 接口描述了要暴露给 ModelMBean 的构造函数、属性、操作和监听器。构造函数使用
javax.management.modelmbean.ModelMBeanConstructorInfo 表示。属性使用
javax.management.modelmbean.ModelMBeanAttributeInfo 表示。操作用
javax.management.modelmbean.ModelMBeanOperationInfo 表示。监听器用
javax.management.modelmbean.ModelMBeanNotificationInfo 表示。在本章中,我们只关注操作和属性。
常用模型
常用模型库是 Apache 软件基金会 Jakarta 项目下的子项目。它提供了更简便的方法来编写模型 MBean。它最大的帮助在于使用它你不需要创建自己的ModelMBeanInfo 对象。
回想前面的创建 RequiredModelMBean 例子的方法,需要创建 ModelMBeanInfo对象以传递个 RequiredModelMBean 的构造函数。
MBean Descriptor
一个 MBean 描述符是用于描述 MBean 服务器管理的模型 MBean 的 XML 文档。一个描述符的开头内容如下:
<?xml version="1.0"?>
<!DOCTYPE mbeans-descriptors PUBLIC
"-//Apache Software Foundation//DTD Model MBeans Configuration File"
"http://jakarta.apache.org/commons/dtds/mbeans-descriptors.dtd">
它的根元素是 mbeans-descriptors
<mbeans-descriptors>
...
</mbeans-descriptors>
编写自己的模型 MBean 类
当使用常用模型的时候,在 mbean 元素的 className 属性中定义模型 MBean 的类型。默认的常用模型使用 org.apache.commons.modeler.BaseModelMBean 类,但是有些情况你可能想要继承 BaseModelMBean:
- 想要覆盖管理资源的属性和方法
- 想要给管理资源添加为定义的属性和方法
Catalina 在 org.apache.catalina.mbeans 包中提供了 BaseModelMBean 类的一些子类.
Catalina 创建 MBean
现在熟悉了 Catalina 中的模型 MBean,接下来看一下是怎么样创建这些 MBean来管理应用程序的。Tomcat 的配置文件 server.xml 在 Server 元素中定义了 Listener 元素
总结
在本章中学习了如何使用 JMX 来管理 Tomcat。本章介绍了两种类型的 MBeans 并展示了一个简单使用 MBeans 来管理 Catalina 的应用程序。