包 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(); }
getCacheSize
和 setCacheSize
方法定义了一个名为 CacheSize
的 int
类型的读写属性(首字母大写,与 JavaBeans 约定不同)。
getLastChangedTime
方法定义了一个名为 LastChangedTime
的 long
类型的属性。这是一个只读属性,因为没有方法 setLastChangedTime
。
save
方法定义了一个名为 save
的操作。它不是属性,因为它的名称不是以 get
、set
或 is
开头。
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
。
通知
notification 是 Notification
类或子类的实例。除了它的 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 规范的每个版本都继续实现以前版本的功能。因此,当客户端运行的版本早于服务时,不应该有任何互操作性问题。
当客户端运行的版本高于服务时,某些较新的功能可能不可用,详见下一节。客户端可以通过检查 MBeanServerDelegate
的 SpecificationVersion
属性来确定服务的版本。
如果远程 MBean Server 是 1.2
您不能在
ObjectName
的键属性中使用通配符,例如domain:type=Foo,name=*
。仍然允许匹配整个属性的通配符,例如*:*
或*:type=Foo,*
。您不能在查询中使用
Query.isInstanceOf
。您不能在监视器的 观察属性 中使用点语法,例如
HeapMemoryUsage.used
,如javax.management.monitor
包的文档中所述。
- 自从:
- 1.5
- 参见:
-
类描述通过将其名称与其值相关联来表示 MBean 特性。提供由 MBean 发送的属性更改通知的定义。此类为
attribute change notification
实现了NotificationFilter
接口。表示 MBean 属性的值列表。指定的属性不存在或无法检索。表示用作关系约束参数的属性。当将无效的 MBean 属性传递给查询构造方法时抛出。当将无效表达式传递给构造查询的方法时抛出。当将无效的字符串操作传递给构造查询的方法时抛出。构造方法上的注释,显示该构造方法的参数如何对应于构造对象的 getter 方法。已弃用。JMX 元素的附加元数据。此接口用于访问与 JMX 组件关联的 Descriptor 类的描述符,即描述注解元素如何与Descriptor
中的字段相关的元注释。用于读取管理接口元素(例如 MBeanInfo)的描述符的接口。定义应由 Dynamic MBean(公开动态管理接口的 MBean)实现的方法。一个不可变的描述符。MBean 已在存储库中注册。存储库中不存在指定的 MBean。MBean 的内省期间发生异常。尝试应用以下任一操作时抛出:对 MBean 的子查询表达式或对错误类的 MBean 的限定属性表达式。指定的值对该属性无效。JMX 实现抛出的异常。JMX 实现发出的运行时异常。来自 JMX API 的静态方法。存储库中不存在指定的 MBean 监听。字符串的格式与有效的 ObjectName 不对应。描述为管理而公开的 MBean 属性。描述由 MBean 公开的构造方法。表示代理中 MBean 方法抛出的“用户定义”异常。提供 MBean 描述符对象的一般信息。描述由 MBean 公开的管理接口;也就是说,可用于管理操作的一组属性和操作。对于给定的 Java 通知类,MBeanNotificationInfo
类用于描述 MBean 发出的不同通知实例的特征。描述由 MBean 公开的管理操作。描述由 MBean 公开的操作的参数。权限控制对 MBeanServer 操作的访问。可以由 MBean 实现,以便在从 MBean Server 注册或注销之前和之后执行操作。包装MBeanRegistration
接口的 preRegister()、preDeregister() 方法抛出的异常。这是在代理端进行 MBean 操作的接口。此类表示创建默认MBeanServer
实现的构建器。这个接口代表了一种与 MBean 服务对话的方式,无论是本地的还是远程的。从管理的角度代表 MBean 服务。定义类 MBeanServerDelegate 的对象的管理接口。提供 MBean 服务引用。InvocationHandler
通过 MBean 服务将 MBean 管理接口中的方法转发到 MBean。表示 MBean Server 通过 MBeanServerDelegate MBean 发出的通知。执行与 MBeanServers 相关的操作的权限。此权限表示对签名者或代码库的“信任”。用于将接口显式标记为 MXBean 接口或不是 MXBean 接口的注解。尝试在不符合 JMX 的 MBean 的 MBean 服务中注册对象时发生的异常。Notification 类表示由 MBean 发出的通知。由发出通知的 MBean 实现的接口。提供NotificationEmitter
接口的实现。由发出通知的 MBean 实现的接口。由充当通知过滤器的任何类实现。提供NotificationFilter
接口的实现。应该由想要接收通知的对象实现。用于表示 MBean 的对象名及其类名。表示一个 MBean 的对象名称,或者可以匹配多个 MBean 名称的模式。表示在对 MBean 执行操作时在 MBean 服务中抛出的异常。此类是要由旨在持久化的 MBean 实现的接口。构造查询对象约束。允许在特定 MBean 服务的上下文中执行查询。表示类似于数据库查询“where 子句”的关系约束。表示使用 java.lang.reflect 类调用 MBean 上的方法时在 MBean 服务中抛出的异常。当java.lang.Error
出现在代理中时,它应该被捕获并作为RuntimeErrorException
重新抛出。表示代理中的 MBean 方法抛出的运行时异常。表示在对 MBean 执行操作时在代理中抛出的运行时异常。表示不支持请求的服务时引发的异常。一个 MBean,其管理接口由 Java 接口上的反射决定,并发出通知。其管理接口由 Java 接口上的反射确定的 MBean。表示作为关系约束参数的字符串。表示可以作为参数传递给关系表达式的值。
MBeanServer.getClassLoaderRepository()
。