此版本仍在开发中,尚未被视为稳定版本。最新的稳定版本请使用 Spring Framework 6.1.13! |
此版本仍在开发中,尚未被视为稳定版本。最新的稳定版本请使用 Spring Framework 6.1.13! |
在上一节的示例中,
您对 Bean 的 Management Interface 几乎没有控制权。每个导出的 bean 的所有属性和方法都作为 JMX 属性和
操作。要对具体内容进行更精细的控制
导出的 bean 的属性和方法实际上作为 JMX 属性公开
和操作,Spring JMX 为
控制 bean 的 Management 接口。public
使用 APIMBeanInfoAssembler
在后台,委托给 API 的实现,即
负责定义每个公开的 bean 的 Management 接口。
默认实现 ,
定义公开所有公共属性和方法的管理接口
(如您在前面部分的示例中看到的那样)。Spring 提供两个
接口的其他实现,可让您
使用源级元数据控制生成的管理界面
或任何任意接口。MBeanExporter
org.springframework.jmx.export.assembler.MBeanInfoAssembler
org.springframework.jmx.export.assembler.SimpleReflectiveMBeanInfoAssembler
MBeanInfoAssembler
使用源级元数据:Java 标注
通过使用 ,您可以定义
使用 source level metadata 的 bean。元数据的读取由接口封装。Spring JMX
提供使用 Java 注解的默认实现,即 .您必须
使用 interface 的 implementation 实例配置 ,使其正常运行,因为没有 default。MetadataMBeanInfoAssembler
org.springframework.jmx.export.metadata.JmxAttributeSource
org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource
MetadataMBeanInfoAssembler
JmxAttributeSource
要标记要导出到 JMX 的 Bean,您应该使用注释对 Bean 类进行注释。您必须将您希望公开的每个方法注释为
操作,并注释你想要的每个属性
expose 与 Annotation 一起。在注释属性时,您可以省略
getter 或 setter 的注解,用于创建 write-only 或 read-only
属性。@ManagedResource
@ManagedOperation
@ManagedAttribute
带 -ancomments 的 bean 必须是 public 的,公开
操作或属性。@ManagedResource |
以下示例显示了该类的带注释版本,我们
用于创建 MBeanServer。JmxTestBean
package org.springframework.jmx;
@ManagedResource(
objectName="bean:name=testBean4",
description="My Managed Bean",
log=true,
logFile="jmx.log",
currencyTimeLimit=15,
persistPolicy="OnUpdate",
persistPeriod=200,
persistLocation="foo",
persistName="bar")
public class AnnotationTestBean {
private int age;
private String name;
public void setAge(int age) {
this.age = age;
}
@ManagedAttribute(description="The Age Attribute", currencyTimeLimit=15)
public int getAge() {
return this.age;
}
@ManagedAttribute(description="The Name Attribute",
currencyTimeLimit=20,
defaultValue="bar",
persistPolicy="OnUpdate")
public void setName(String name) {
this.name = name;
}
@ManagedAttribute(defaultValue="foo", persistPeriod=300)
public String getName() {
return this.name;
}
@ManagedOperation(description="Add two numbers")
@ManagedOperationParameter(name = "x", description = "The first number")
@ManagedOperationParameter(name = "y", description = "The second number")
public int add(int x, int y) {
return x + y;
}
public void dontExposeMe() {
throw new RuntimeException();
}
}
在前面的示例中,您可以看到该类已批注
with 并配置了此注释
具有一组属性。这些属性可用于配置各个方面
由 生成的 MBean 和 在 greater 中解释
detail 在 Spring JMX 注释中。AnnotationTestBean
@ManagedResource
@ManagedResource
MBeanExporter
和 属性都用 ,
但是,对于 property,只有 getter 方法被注解。
这会导致这两个属性都包含在管理界面中
作为托管属性,但该属性是只读的。age
name
@ManagedAttribute
age
age
最后,该方法用 ,
而 method 则不是。这会导致管理界面
仅包含一个操作 () 时。add(int, int)
@ManagedOperation
dontExposeMe()
add(int, int)
MetadataMBeanInfoAssembler
该类不需要实现任何 Java 接口,
因为 JMX 管理接口仅从 Comments 派生。AnnotationTestBean |
以下配置显示了如何配置 以使用 :MBeanExporter
MetadataMBeanInfoAssembler
<beans>
<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">
<property name="assembler" ref="assembler"/>
<property name="namingStrategy" ref="namingStrategy"/>
<property name="autodetect" value="true"/>
</bean>
<!-- will create management interface using annotation metadata -->
<bean id="assembler"
class="org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler">
<property name="attributeSource" ref="jmxAttributeSource"/>
</bean>
<!-- will pick up the ObjectName from the annotation -->
<bean id="namingStrategy"
class="org.springframework.jmx.export.naming.MetadataNamingStrategy">
<property name="attributeSource" ref="jmxAttributeSource"/>
</bean>
<bean id="jmxAttributeSource"
class="org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource"/>
<bean id="testBean" class="org.springframework.jmx.AnnotationTestBean">
<property name="name" value="TEST"/>
<property name="age" value="100"/>
</bean>
</beans>
在前面的示例中,Bean 配置了
实例,并通过 assembler 属性传递给 。这就是利用所需的全部内容
用于 Spring 公开的 MBean 的 Comments 驱动的管理界面。MetadataMBeanInfoAssembler
AnnotationJmxAttributeSource
MBeanExporter
带 -ancomments 的 bean 必须是 public 的,公开
操作或属性。@ManagedResource |
该类不需要实现任何 Java 接口,
因为 JMX 管理接口仅从 Comments 派生。AnnotationTestBean |
Spring JMX 注释
下表描述了可在 Spring JMX 中使用的 Comments:
注解 | 适用于 | 描述 |
---|---|---|
|
类 |
将 的所有实例标记为 JMX 托管资源。 |
|
类 |
指示托管资源发出的 JMX 通知。 |
|
方法(仅限 getter 和 setter) |
将 getter 或 setter 标记为 JMX 属性的一半。 |
|
方法(仅限 getter) |
将 getter 标记为 JMX 属性,并添加 descriptor 属性以指示它是一个量度。 |
|
方法 |
将方法标记为 JMX 操作。 |
|
方法 |
定义操作参数的描述。 |
下表描述了一些可用于 这些注释。有关更多详细信息,请参阅每个注释的 Javadoc。
属性 | 适用于 | 描述 |
---|---|---|
|
|
用于确定托管资源的 。 |
|
|
设置资源、通知、属性、指标或操作的描述。 |
|
|
设置 descriptor 字段的值。 |
|
|
设置 descriptor 字段的值。 |
|
|
设置 descriptor 字段的值。 |
|
|
设置 descriptor 字段的值。 |
|
|
设置 descriptor 字段的值。 |
|
|
设置 descriptor 字段的值。 |
|
|
设置 descriptor 字段的值。 |
|
|
设置 descriptor 字段的值。 |
|
|
设置操作参数的显示名称。 |
|
|
设置操作参数的索引。 |
注解 | 适用于 | 描述 |
---|---|---|
|
类 |
将 的所有实例标记为 JMX 托管资源。 |
|
类 |
指示托管资源发出的 JMX 通知。 |
|
方法(仅限 getter 和 setter) |
将 getter 或 setter 标记为 JMX 属性的一半。 |
|
方法(仅限 getter) |
将 getter 标记为 JMX 属性,并添加 descriptor 属性以指示它是一个量度。 |
|
方法 |
将方法标记为 JMX 操作。 |
|
方法 |
定义操作参数的描述。 |
属性 | 适用于 | 描述 |
---|---|---|
|
|
用于确定托管资源的 。 |
|
|
设置资源、通知、属性、指标或操作的描述。 |
|
|
设置 descriptor 字段的值。 |
|
|
设置 descriptor 字段的值。 |
|
|
设置 descriptor 字段的值。 |
|
|
设置 descriptor 字段的值。 |
|
|
设置 descriptor 字段的值。 |
|
|
设置 descriptor 字段的值。 |
|
|
设置 descriptor 字段的值。 |
|
|
设置 descriptor 字段的值。 |
|
|
设置操作参数的显示名称。 |
|
|
设置操作参数的索引。 |
使用界面AutodetectCapableMBeanInfoAssembler
为了进一步简化配置, Spring 包括了接口,该接口扩展了接口以添加对 MBean 资源的自动检测的支持。如果使用 的实例配置 ,则为
允许 “投票” 包含用于 JMX 的 bean。AutodetectCapableMBeanInfoAssembler
MBeanInfoAssembler
MBeanExporter
AutodetectCapableMBeanInfoAssembler
接口的唯一实现是
,它投票以包括任何标记为
替换为属性。在这种情况下,默认方法是使用
bean name 设置为 ,这将产生类似于以下内容的配置:AutodetectCapableMBeanInfo
MetadataMBeanInfoAssembler
ManagedResource
ObjectName
<beans>
<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">
<!-- notice how no 'beans' are explicitly configured here -->
<property name="autodetect" value="true"/>
<property name="assembler" ref="assembler"/>
</bean>
<bean id="assembler" class="org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler">
<property name="attributeSource">
<bean class="org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource"/>
</property>
</bean>
<bean id="testBean" class="org.springframework.jmx.AnnotationTestBean">
<property name="name" value="TEST"/>
<property name="age" value="100"/>
</bean>
</beans>
请注意,在前面的配置中,没有 bean 传递给 .
但是,它仍然被注册,因为它被注释了 并且 检测到这一点并投票包含
它。这种方法的唯一缺点是 now 的名称
具有商业意义。您可以通过配置 来解决此问题,如控制 ObjectName
实例中所述
你的豆子。您还可以查看一个示例,该示例使用 Using Source-level Metadata: Java Annotations.MBeanExporter
AnnotationTestBean
@ManagedResource
MetadataMBeanInfoAssembler
AnnotationTestBean
ObjectNamingStrategy
MetadataNamingStrategy
使用 Java 接口定义管理接口
除了 之外,Spring 还包括 ,它允许您约束 methods 和
属性,这些属性根据
接口。MetadataMBeanInfoAssembler
InterfaceBasedMBeanInfoAssembler
尽管公开 MBean 的标准机制是使用接口和简单的
命名方案,通过以下方式扩展此功能
无需命名约定,让您使用多个接口
以及消除 bean 实现 MBean 接口的需要。InterfaceBasedMBeanInfoAssembler
请考虑以下接口,该接口用于定义我们前面展示的类的管理接口:JmxTestBean
public interface IJmxTestBean {
public int add(int x, int y);
public long myOperation();
public int getAge();
public void setAge(int age);
public void setName(String name);
public String getName();
}
此接口定义作为操作公开的方法和属性,并且 属性。以下代码显示了如何配置 Spring JMX 以使用 此接口作为 Management Interface 的定义:
<beans>
<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">
<property name="beans">
<map>
<entry key="bean:name=testBean5" value-ref="testBean"/>
</map>
</property>
<property name="assembler">
<bean class="org.springframework.jmx.export.assembler.InterfaceBasedMBeanInfoAssembler">
<property name="managedInterfaces">
<value>org.springframework.jmx.IJmxTestBean</value>
</property>
</bean>
</property>
</bean>
<bean id="testBean" class="org.springframework.jmx.JmxTestBean">
<property name="name" value="TEST"/>
<property name="age" value="100"/>
</bean>
</beans>
在前面的示例中,配置为在为任何 bean 构造 Management 接口时使用该接口。是的
重要的是要了解由 处理的 bean 不需要实现用于生成 JMX 管理的接口
接口。InterfaceBasedMBeanInfoAssembler
IJmxTestBean
InterfaceBasedMBeanInfoAssembler
在上述情况下,该接口用于构造所有管理
所有 bean 的接口。在许多情况下,这不是所需的行为,您可能会
希望对不同的 bean 使用不同的接口。在这种情况下,您可以通过属性传递实例,其中每个条目的键是 Bean 名称,每个条目的值是
用于该 bean 的接口名称的逗号分隔列表。IJmxTestBean
InterfaceBasedMBeanInfoAssembler
Properties
interfaceMappings
如果未通过 或 属性指定管理接口,则
在 Bean 上,并使用该 Bean 实现的所有接口来创建
管理界面。managedInterfaces
interfaceMappings
InterfaceBasedMBeanInfoAssembler
用MethodNameBasedMBeanInfoAssembler
MethodNameBasedMBeanInfoAssembler
用于指定方法名称列表
作为属性和操作向 JMX 公开。下面的代码显示了一个示例
配置:
<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">
<property name="beans">
<map>
<entry key="bean:name=testBean5" value-ref="testBean"/>
</map>
</property>
<property name="assembler">
<bean class="org.springframework.jmx.export.assembler.MethodNameBasedMBeanInfoAssembler">
<property name="managedMethods">
<value>add,myOperation,getName,setName,getAge</value>
</property>
</bean>
</property>
</bean>
在前面的示例中,您可以看到 and 方法作为 JMX 公开
操作、 、 和 以及 作为
适当的 JMX 属性的一半。在上面的代码中,方法映射适用于
向 JMX 公开的 bean。要逐个 bean 控制方法公开,可以使用
将 bean 名称映射到 的属性
方法名称列表。add
myOperation
getName()
setName(String)
getAge()
methodMappings
MethodNameMBeanInfoAssembler