模块  java.management

Package javax.management

提供Java Management Extensions的核心类。

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

  • 咨询和更改应用程序配置
  • 累积有关应用程序行为的统计信息并使其可用
  • 通知国家变化和错误的条件。

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

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

的MBean

JMX API的基本概念是MBean 。 MBean是表示资源的命名托管对象 。 它有一个必须公开的管理界面 ,包括:

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

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

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

标准MBean

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

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

方法getCacheSize和setCacheSize定义了类型为int的读写属性,称为CacheSize (具有初始资本,与JavaBeans约定不同)。

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

方法save定义了称为save的操作。 它不是一个属性,因为它的名字开头不是get , set ,或is 。

标准MBean的确切命名模式在JMX Specification中有详细说明 。

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

MXBean的

MXBean是Standard MBean的变体,其中复杂类型映射到javax.management.openmbean包中定义的标准类型集。 如果您需要在MBean接口中引用特定于应用程序的类,则MXBeans是合适的。 它们在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 Server

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

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

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

在MBean Server中创建MBean

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

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

如果MBean实现了MBeanRegistration接口,则MBean可以在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代理 :

  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 Server中获取其ObjectName 。

通知

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

将发出通知的MBean必须实现NotificationBroadcaster或NotificationEmitter接口。 通常,它通过子类化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 Server中其他MBean发出的通知的侦听器。 在这种情况下,它实现NotificationListener ,方法MBeanServer.addNotificationListener(ObjectName, ObjectName, NotificationFilter, Object)用于监听。

远程访问MBean

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

JMX规范还定义了适配器的概念。 适配器在诸如SNMP或HTML之类的协议中的请求之间进行转换,并访问MBean Server。 因此,例如,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规范都继续实现以前版本的功能。 因此,当客户端运行的是早于服务器的版本时,不应存在任何互操作性问题。

当客户端运行的版本高于服务器时,某些较新的功能可能不可用,如下一节中所述。 客户端可以通过检查确定服务器的版本SpecificationVersion的属性MBeanServerDelegate 。

如果远程MBean Server是1.2

从以下版本开始:
1.5
另请参见:
JMX Specification, version 1.4