Module java.management

Package javax.management


package javax.management

为Java管理扩展提供核心类。

Java管理扩展(JMX)API是用于管理和监控的标准API。典型用途包括:

  • 咨询和更改应用程序配置
  • 收集关于应用程序行为的统计信息并使其可用
  • 通知状态更改和错误条件。

JMX API也可以作为管理系统、网络等解决方案的一部分使用。

该API包括远程访问,因此远程管理程序可以与运行中的应用程序交互以实现这些目的。

MBeans

JMX API的基本概念是 MBean。MBean是代表资源的命名 托管对象。它具有必须是 public管理接口,其中包括:

  • 可以读取和/或写入的命名和类型化属性
  • 可以调用的命名和类型化操作
  • 可以由MBean发出的类型化通知。

例如,代表应用程序配置的MBean可以具有代表不同配置项的属性。读取 CacheSize 属性将返回该项的当前值。写入它将更新该项,可能会更改运行中应用程序的行为。例如,像 save 这样的操作可以将当前配置持久存储。每次更改配置时都可以发送诸如 ConfigurationChangedNotification 这样的通知。

在JMX API的标准用法中,MBeans被实现为Java对象。但是,如下所述,这些对象通常不直接引用。

标准MBeans

为了使MBean的实现简单,JMX API包括 标准MBeans 的概念。标准MBean是根据某些命名模式从Java接口推导出其属性和操作的MBean。例如,考虑这样的接口:

    public interface ConfigurationMBean {
         public int getCacheSize();
         public void setCacheSize(int size);
         public long getLastChangedTime();
         public void save();
    }
        

方法 getCacheSizesetCacheSize 定义了一个名为 CacheSize(与JavaBeans约定不同,首字母大写)的可读写类型为 int 的属性。

方法 getLastChangedTime 定义了一个名为 LastChangedTime 的类型为 long 的只读属性。这是一个只读属性,因为没有 setLastChangedTime 方法。

方法 save 定义了一个名为 save 的操作。它不是属性,因为其名称不以 getsetis 开头。

标准MBeans的确切命名模式在 JMX规范 中有详细说明。

有两种方法可以使Java对象成为具有此管理接口的MBean。一种方法是使对象成为具有与Java接口完全相同名称但没有 MBean 后缀的类。因此,在示例中,对象将是与 ConfigurationMBean 相同Java包中的类 Configuration。第二种方法是使用 StandardMBean 类。

MXBeans

MXBean 是标准MBean的一种变体,其中复杂类型映射到在 javax.management.openmbean 包中定义的一组标准类型。如果您否则需要在MBean接口中引用特定于应用程序的类,则MXBeans是合适的。它们在 MXBean 规范中有详细描述。

动态MBeans

动态MBean 是在运行时定义其管理接口的MBean。例如,配置MBean可以通过解析XML文件来确定其公开的属性的名称和类型。

任何实现 DynamicMBean 接口的类的Java对象都是动态MBean。

开放MBeans

开放MBean 是一种动态MBean,其中属性的类型以及操作参数和返回值是使用一小组预定义的Java类构建的。开放MBeans便于与不一定具有对应用程序特定类型的访问权限的远程管理程序一起操作,包括非Java程序。开放MBeans由包 javax.management.openmbean 定义。

模型MBeans

模型MBean 是一种作为管理接口和底层托管资源之间桥梁的动态MBean。管理接口和托管资源都指定为Java对象。相同的模型MBean实现可以多次重用,具有不同的管理接口和托管资源,并且可以提供诸如持久性和缓存等通用功能。模型MBeans由包 javax.management.modelmbean 定义。

MBean服务器

为了有用,MBean必须在 MBean服务器 中注册。MBean服务器是MBean的存储库。通常,对MBean的唯一访问是通过MBean服务器。换句话说,代码不再直接访问实现MBean的Java对象,而是通过MBean服务器按名称访问MBean。每个MBean在MBean服务器内具有唯一名称,由 ObjectName 类定义。

MBean服务器是实现接口 MBeanServer 的对象。使用最方便的MBean服务器是 平台MBean服务器。这是一个单个MBean服务器,可以由在同一Java虚拟机中运行的不同托管组件共享。可以使用方法 ManagementFactory.getPlatformMBeanServer() 访问平台MBean服务器。

应用程序代码还可以使用 MBeanServerFactory 类创建新的MBean服务器,或访问已创建的MBean服务器。

在MBean服务器中创建MBeans

创建MBean有两种方法。一种是构造将成为MBean的Java对象,然后使用 registerMBean 方法将其注册到MBean服务器中。另一种方法是使用 createMBean 方法之一创建并注册MBean。

registerMBean 方法对于本地使用更简单,但不能远程使用。createMBean 方法可以远程使用,但有时需要注意类加载问题。

如果MBean实现了 MBeanRegistration 接口,则在将其注册到MBean服务器中或从中注销时,MBean可以执行操作。

在MBean服务器中访问MBeans

给定一个 ObjectName name 和一个 MBeanServer mbs,您可以像这样访问属性和操作:

    int cacheSize = mbs.getAttribute(name, "CacheSize");
    Attribute newCacheSize =
         new Attribute("CacheSize", new Integer(2000));
    mbs.setAttribute(name, newCacheSize);
    mbs.invoke(name, "save", new Object[0], new Class[0]);
        

或者,如果您有一个与MBean的管理接口对应的Java接口,您可以像这样使用 MBean代理

    ConfigurationMBean conf =
        JMX.newMBeanProxy(mbs, name, ConfigurationMBean.class);
    int cacheSize = conf.getCacheSize();
    conf.setCacheSize(2000);
    conf.save();
        

使用MBean代理只是一种便利。第二个示例最终调用与第一个示例相同的 MBeanServer 操作。

MBean服务器可以查询其名称与某些模式匹配和/或其属性满足某些约束的MBeans。名称模式使用 ObjectName 类构建,约束使用 Query 类构建。然后,方法 queryNamesqueryMBeans 执行查询。

MBean生命周期

MBean可以实现 MBeanRegistration 接口,以便在其在MBean服务器中注册和注销时得到通知。此外,preRegister 方法允许MBean获取对 MBeanServer 对象的引用以及在MBean服务器中获取其 ObjectName

通知

通知Notification 类或其子类的实例。除了其Java类之外,它还具有一个可以将其与同一类的其他通知区分开的 类型 字符串。

NotificationBroadcasterNotificationEmitter 接口。通常,它通过子类化 NotificationBroadcasterSupport 或委托给该类的实例来实现。以下是一个示例:

    public class Configuration extends NotificationBroadcasterSupport
            implements ConfigurationMBean {
        ...
        private void updated() {
            Notification n = new Notification(...);
            sendNotification(n);
        }
    }
        

通知可以由一个监听器接收,该监听器是实现NotificationListener接口的对象。您可以使用方法MBeanServer.addNotificationListener(ObjectName, NotificationListener, NotificationFilter, Object)向MBean添加监听器。您可以选择性地向此方法提供一个过滤器,以仅选择感兴趣的通知。过滤器是实现NotificationFilter接口的对象。

MBean可以作为同一MBean服务器中其他MBean发出的通知的监听器。在这种情况下,它实现了NotificationListener,并使用方法MBeanServer.addNotificationListener(ObjectName, ObjectName, NotificationFilter, Object)来监听。

远程访问MBean

MBean服务器可以通过连接器远程访问。连接器允许远程Java应用程序以基本相同的方式访问MBean服务器,就像访问本地MBean服务器一样。包javax.management.remote定义了连接器。

JMX规范还定义了适配器的概念。适配器在协议(如SNMP或HTML)中的请求与对MBean服务器的访问之间进行转换。因此,例如,SNMP的GET操作可能会导致MBean服务器上的getAttribute操作。

JMX规范版本之间的互操作性

当客户端使用JMX远程API连接到服务器时,可能客户端和服务器没有相同版本的JMX规范。这里描述的JMX规范版本是1.4。之前的版本是1.0、1.1和1.2(没有1.3)。标准JMX远程API被定义为与1.2版本及以上版本一起使用,因此在基于标准的部署中,唯一可能出现的互操作性问题涉及1.2版本及以上版本。

每个JMX规范版本都继续实现先前版本的功能。因此,当客户端运行的版本早于服务器时,不应该有任何互操作性问题。

当客户端运行的版本晚于服务器时,某些较新的功能可能不可用,详细信息请参见下一节。客户端可以通过检查MBeanServerDelegateSpecificationVersion属性来确定服务器的版本。

如果远程MBean服务器是1.2

  • 您不能在ObjectName的键属性中使用通配符,例如domain:type=Foo,name=*。仍然允许匹配整个属性的通配符,例如*:**:type=Foo,*

  • 您不能在查询中使用Query.isInstanceOf

  • 您不能在监视器的观察属性中使用点语法,例如 HeapMemoryUsage.used,如javax.management.monitor包的文档中所述。

自1.5版本开始
1.5
参见: