包 javax.management


javax.management

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

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

  • 咨询和更改应用程序配置
  • 积累有关应用程序行为的统计数据并使它们可用
  • 通知状态变化和错误条件。

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

API 包括远程访问,因此远程管理程序可以出于这些目的与正在运行的应用程序进行交互。

MBean

JMX API 的基本概念是 MBean 。 MBean 是代表资源的命名 managed object。它有一个 management interface 必须是 public 并且包括:

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

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

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

标准MBean

为了简化 MBean 实现,JMX API 包含了 Standard MBeans 的概念。标准 MBean 的属性和操作是使用特定命名模式从 Java 接口推导出来的,类似于 JavaBeans 使用的命名模式。例如,考虑这样的接口:

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

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

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

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

JMX规范 中详细介绍了标准 MBean 的确切命名模式。

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

MXBeans

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

动态MBean

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

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

打开MBean

Open MBean 是一种 Dynamic MBean,其中属性和操作参数的类型以及返回值是使用一小组预定义的 Java 类构建的。 Open MBean 促进了与远程管理程序的操作,这些远程管理程序不一定能够访问特定于应用程序的类型,包括非 Java 程序。 Open MBean 由包 javax.management.openmbean 定义。

模型MBean

Model MBean 是一种 Dynamic MBean,充当管理接口和底层托管资源之间的桥梁。管理接口和托管资源都指定为 Java 对象。相同的 Model MBean 实现可以在不同的管理接口和托管资源中多次重复使用,并且可以提供持久性和缓存等通用功能。模型 MBean 由包 javax.management.modelmbean 定义。

MBean 服务

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

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

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

在 MBean 服务中创建 MBean

有两种创建 MBean 的方法。一种是构造一个将成为 MBean 的 Java 对象,然后使用 registerMBean 方法将其注册到 MBean Server 中。另一种是使用 createMBean 方法之一在单个操作中创建和注册 MBean。

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

如果 MBean 实现了 MBeanRegistration 接口,那么当它在 MBean Server 中注册或注销时,它可以执行操作。

在 MBean Server 中访问 MBean

给定一个 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 proxy

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

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

可以查询 MBean Server 以查找名称匹配特定模式和/或其属性满足特定约束的 MBean。名称模式是使用 ObjectName 类构造的,约束是使用 Query 类构造的。然后方法queryNames queryMBeans 执行查询。

MBean 生命周期

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

通知

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

将发出通知的 MBean 必须实现 NotificationBroadcaster NotificationEmitter 接口。通常,它通过继承 NotificationBroadcasterSupport 或委托给该类的一个实例来实现。这是一个例子:

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

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

一个 MBean 可以是同一 MBean Server 中其他 MBean 发出的通知的监听器。在这种情况下,它实现了 NotificationListener 并且方法 MBeanServer.addNotificationListener(ObjectName, ObjectName, NotificationFilter, Object) 用于监听。

远程访问 MBean

可以通过 connector 远程访问 MBean Server。连接器允许远程 Java 应用程序以与本地应用程序基本相同的方式访问 MBean Server。包 javax.management.remote 定义了连接器。

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

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

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

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

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

如果远程 MBean Server 是 1.2

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

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

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

自从:
1.5
参见: