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