对于最新的稳定版本,请使用 Spring Framework 6.2.10! |
控制 Bean 的管理界面
在上一节的示例中,
您对 Bean 的管理界面几乎没有控制权。所有public
每个导出的 bean 的属性和方法都公开为 JMX 属性,并且
作。对确切的控制进行更细粒度的控制
导出的 bean 的属性和方法实际上作为 JMX 属性公开
和作,Spring JMX 提供了一个全面且可扩展的机制
控制 Bean 的管理接口。
使用MBeanInfoAssembler
接口
在幕后,MBeanExporter
委托到org.springframework.jmx.export.assembler.MBeanInfoAssembler
接口,即
负责定义每个公开的 Bean 的管理接口。
默认实现org.springframework.jmx.export.assembler.SimpleReflectiveMBeanInfoAssembler
,
定义一个公开所有公共属性和方法的管理接口
(如您在前面各节的示例中看到的那样)。Spring 提供了两个
的其他实现MBeanInfoAssembler
界面,让您
使用源级元数据控制生成的管理接口
或任何任意接口。
使用源级元数据:Java 注释
通过使用MetadataMBeanInfoAssembler
,您可以定义管理接口
使用源级元数据。元数据的读取被封装
通过org.springframework.jmx.export.metadata.JmxAttributeSource
接口。
Spring JMX 提供了一个使用 Java 注释的默认实现,即org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource
.
您必须配置MetadataMBeanInfoAssembler
实现实例为
这JmxAttributeSource
接口使其正常运行(没有默认值)。
要标记要导出到 JMX 的 bean,您应该使用ManagedResource
注解。必须将要公开的每个方法标记为作
使用ManagedOperation
注释并标记您希望公开的每个属性
使用ManagedAttribute
注解。标记属性时,可以省略
getter 或 setter 的注释,用于创建只写或只读
属性。
一个ManagedResource -带注释的 bean 必须是公共的,公开的方法也必须是公共的
作或属性。 |
以下示例显示了JmxTestBean
我们
用于创建 MBeanServer:
package org.springframework.jmx;
import org.springframework.jmx.export.annotation.ManagedResource;
import org.springframework.jmx.export.annotation.ManagedOperation;
import org.springframework.jmx.export.annotation.ManagedAttribute;
@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 implements IJmxTestBean {
private String name;
private int age;
@ManagedAttribute(description="The Age Attribute", currencyTimeLimit=15)
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = 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 name;
}
@ManagedOperation(description="Add two numbers")
@ManagedOperationParameters({
@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();
}
}
在前面的示例中,您可以看到JmxTestBean
class 的ManagedResource
注释和这个ManagedResource
配置注释
具有一组属性。这些属性可用于配置各个方面
由MBeanExporter
并在 greater 中解释
稍后在源级元数据类型中详述。
两个age
和name
属性的注释是ManagedAttribute
注释,但是,在age
属性,则仅标记 getter。
这会导致这两个属性都包含在管理界面中
作为属性,但age
属性是只读的。
最后,add(int, int)
方法标有ManagedOperation
属性
而dontExposeMe()
方法不是。这会导致管理界面
仅包含一个作 (add(int, int)
) 当您使用MetadataMBeanInfoAssembler
.
以下配置显示了如何配置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>
<bean id="jmxAttributeSource"
class="org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource"/>
<!-- 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="testBean" class="org.springframework.jmx.AnnotationTestBean">
<property name="name" value="TEST"/>
<property name="age" value="100"/>
</bean>
</beans>
在前面的示例中,MetadataMBeanInfoAssembler
bean 已配置了
实例AnnotationJmxAttributeSource
类并传递给MBeanExporter
通过汇编器属性。这就是利用所需的全部内容
用于 Spring 公开的 MBean 的元数据驱动管理接口。
源级元数据类型
下表描述了可用于 Spring JMX 的源级元数据类型:
目的 | 注解 | 注释类型 |
---|---|---|
标记 |
|
类 |
将方法标记为 JMX作。 |
|
方法 |
将 getter 或 setter 标记为 JMX 属性的一半。 |
|
方法(仅限 getter 和 setter) |
定义作参数的描述。 |
|
方法 |
下表描述了可用于这些源级别的配置参数 元数据类型:
参数 | 描述 | 适用于 |
---|---|---|
|
使用者 |
|
|
设置资源、属性或作的友好描述。 |
|
|
设置 |
|
|
设置 |
|
|
设置 |
|
|
设置 |
|
|
设置 |
|
|
设置 |
|
|
设置 |
|
|
设置 |
|
|
设置作参数的显示名称。 |
|
|
设置作参数的索引。 |
|
使用AutodetectCapableMBeanInfoAssembler
接口
为了进一步简化配置,Spring 包含了AutodetectCapableMBeanInfoAssembler
接口,它扩展了MBeanInfoAssembler
接口,以添加对 MBean 资源自动检测的支持。如果将MBeanExporter
实例为AutodetectCapableMBeanInfoAssembler
是的
允许“投票”是否包含用于 JMX 的 bean。
唯一的实现AutodetectCapableMBeanInfo
接口是
这MetadataMBeanInfoAssembler
,它投票以包含任何标记的 Bean
使用ManagedResource
属性。在这种情况下,默认方法是使用
bean name 作为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="testBean" class="org.springframework.jmx.JmxTestBean">
<property name="name" value="TEST"/>
<property name="age" value="100"/>
</bean>
<bean id="assembler" class="org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler">
<property name="attributeSource">
<bean class="org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource"/>
</property>
</bean>
</beans>
请注意,在前面的配置中,没有 bean 传递给MBeanExporter
.
但是,JmxTestBean
仍已注册,因为它标有ManagedResource
属性和MetadataMBeanInfoAssembler
检测到这一点并投票将其包含在内。
这种方法的唯一问题是JmxTestBean
现在有生意了
意义。可以通过更改ObjectName
创建,如控制ObjectName
Bean 的实例.
使用 Java 接口定义管理接口
除了MetadataMBeanInfoAssembler
,Spring 还包括InterfaceBasedMBeanInfoAssembler
,这允许您约束方法
基于集合中定义的方法集公开的属性
接口。
虽然公开 MBean 的标准机制是使用接口和简单的
命名方案,InterfaceBasedMBeanInfoAssembler
通过以下方式扩展此功能
无需命名约定,允许您使用多个接口
并消除 Bean 实现 MBean 接口的需要。
考虑以下接口,该接口用于为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();
}
此接口定义作为作公开的方法和属性,并且 JMX MBean 上的属性。以下代码显示了如何配置 Spring JMX 以使用 此接口作为管理接口的定义:
<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>
在前面的示例中,InterfaceBasedMBeanInfoAssembler
配置为使用IJmxTestBean
接口。是的
重要的是要了解由InterfaceBasedMBeanInfoAssembler
不需要实现用于生成 JMX 管理的接口
接口。
在前面的案例中,IJmxTestBean
接口用于构建所有管理
所有 bean 的接口。在许多情况下,这不是理想的行为,您可能
想要为不同的 bean 使用不同的接口。在这种情况下,您可以通过InterfaceBasedMBeanInfoAssembler
一个Properties
实例通过interfaceMappings
属性,其中每个条目的键是 bean 名称,每个条目的值是
要用于该 bean 的接口名称的逗号分隔列表。
如果未通过managedInterfaces
或interfaceMappings
属性,则InterfaceBasedMBeanInfoAssembler
反映
并使用该 bean 实现的所有接口来创建
管理界面。
用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>
在前面的示例中,您可以看到add
和myOperation
方法公开为 JMX
作,以及getName()
,setName(String)
和getAge()
公开为
JMX 属性的适当一半。在前面的代码中,方法映射适用于
向 JMX 公开的 bean。要逐个 Bean 控制方法暴露,您可以使用
这methodMappings
属性MethodNameMBeanInfoAssembler
将 Bean 名称映射到
方法名称列表。