此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Framework 6.1.10Spring中文文档

此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Framework 6.1.10Spring中文文档

Spring 的 JMX 框架中的核心类是 .这个类是 负责获取您的 Spring 豆并在 JMX 中注册它们。 例如,请考虑以下类:MBeanExporterMBeanServerSpring中文文档

public class JmxTestBean implements IJmxTestBean {

	private String name;
	private int age;

	@Override
	public int getAge() {
		return age;
	}

	@Override
	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String getName() {
		return name;
	}

	@Override
	public int add(int x, int y) {
		return x + y;
	}

	@Override
	public void dontExposeMe() {
		throw new RuntimeException();
	}
}
class JmxTestBean : IJmxTestBean {

	private lateinit var name: String
	private var age = 0

	override fun getAge(): Int {
		return age
	}

	override fun setAge(age: Int) {
		this.age = age
	}

	override fun setName(name: String) {
		this.name = name
	}

	override fun getName(): String {
		return name
	}

	override fun add(x: Int, y: Int): Int {
		return x + y
	}

	override fun dontExposeMe() {
		throw RuntimeException()
	}
}

将此 Bean 的属性和方法公开为 MBean,您可以在 配置文件并传入 bean,如以下示例所示:MBeanExporterSpring中文文档

@Configuration
public class JmxConfiguration {

	@Bean
	MBeanExporter exporter(JmxTestBean testBean) {
		MBeanExporter exporter = new MBeanExporter();
		exporter.setBeans(Map.of("bean:name=testBean1", testBean));
		return exporter;
	}

	@Bean
	JmxTestBean testBean() {
		JmxTestBean testBean = new JmxTestBean();
		testBean.setName("TEST");
		testBean.setAge(100);
		return testBean;
	}
}
@Configuration
class JmxConfiguration {

	@Bean
	fun exporter(testBean: JmxTestBean) = MBeanExporter().apply {
		setBeans(mapOf("bean:name=testBean1" to testBean))
	}

	@Bean
	fun testBean() = JmxTestBean().apply {
		name = "TEST"
		age = 100
	}
}
<beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	   xsi:schemaLocation="http://www.springframework.org/schema/beans
	   https://www.springframework.org/schema/beans/spring-beans.xsd">

	<!-- this bean must not be lazily initialized if the exporting is to happen -->
	<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">
		<property name="beans">
			<map>
				<entry key="bean:name=testBean1" value-ref="testBean"/>
			</map>
		</property>
	</bean>

	<bean id="testBean" class="org.example.JmxTestBean">
		<property name="name" value="TEST"/>
		<property name="age" value="100"/>
	</bean>
</beans>

前面配置代码段中的相关 Bean 定义是 Bean。该属性确切地告诉您的豆子必须是哪个 导出到 JMX .在默认配置中,每个条目的键 in 用作 for the bean 引用的 相应的条目值。您可以更改此行为,如控制 Bean 的 ObjectName 实例中所述。exporterbeansMBeanExporterMBeanServerbeansMapObjectNameSpring中文文档

使用此配置时,Bean 将作为 MBean 公开在 .缺省情况下,Bean 的所有属性 公开为属性,所有方法(从类继承的方法除外)都公开为操作。testBeanObjectNamebean:name=testBean1publicpublicObjectSpring中文文档

MBeanExporter是一个 bean(请参阅 Startup and Shutdown Callbacks )。默认情况下,MBean 在 应用程序生命周期。您可以配置在哪个 通过设置标志进行导出或禁用自动注册。LifecyclephaseautoStartup
MBeanExporter是一个 bean(请参阅 Startup and Shutdown Callbacks )。默认情况下,MBean 在 应用程序生命周期。您可以配置在哪个 通过设置标志进行导出或禁用自动注册。LifecyclephaseautoStartup

创建 MBeanServer

上一节中显示的配置假定 应用程序正在运行一个(且只有一个)已运行的环境中。在这种情况下,Spring 尝试定位正在运行的 将您的 Bean 注册到该服务器(如果有)。此行为在以下情况下很有用 应用程序运行在容器(例如 Tomcat 或 IBM WebSphere)中,该容器具有 有。MBeanServerMBeanServerMBeanServerSpring中文文档

但是,此方法在独立环境中或在内部运行时没有用处 不提供 .若要解决此问题,可以通过将类的实例添加到配置中以声明方式创建实例。 还可以通过将实例属性的值设置为 返回的值来确保使用特定值,如以下示例所示:MBeanServerMBeanServerorg.springframework.jmx.support.MBeanServerFactoryBeanMBeanServerMBeanExporterserverMBeanServerMBeanServerFactoryBeanSpring中文文档

<beans>

	<bean id="mbeanServer" class="org.springframework.jmx.support.MBeanServerFactoryBean"/>

	<!--
	this bean needs to be eagerly pre-instantiated in order for the exporting to occur;
	this means that it must not be marked as lazily initialized
	-->
	<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">
		<property name="beans">
			<map>
				<entry key="bean:name=testBean1" value-ref="testBean"/>
			</map>
		</property>
		<property name="server" ref="mbeanServer"/>
	</bean>

	<bean id="testBean" class="org.springframework.jmx.JmxTestBean">
		<property name="name" value="TEST"/>
		<property name="age" value="100"/>
	</bean>

</beans>

在前面的示例中,的实例由 和 通过物业供应。当您提供自己的实例时,不会尝试查找正在运行的实例,而是使用提供的实例。为此要起作用 正确地,您的类路径上必须有一个 JMX 实现。MBeanServerMBeanServerFactoryBeanMBeanExporterserverMBeanServerMBeanExporterMBeanServerMBeanServerSpring中文文档

重用现有的MBeanServer

如果未指定服务器,则尝试自动检测正在运行的 .这适用于大多数环境,其中只有一个实例 使用。但是,当存在多个实例时,导出器可能会选择错误的服务器。 在这种情况下,您应该使用 to 指示要执行的实例 ,如以下示例所示:MBeanExporterMBeanServerMBeanServerMBeanServeragentIdSpring中文文档

<beans>
	<bean id="mbeanServer" class="org.springframework.jmx.support.MBeanServerFactoryBean">
		<!-- indicate to first look for a server -->
		<property name="locateExistingServerIfPossible" value="true"/>
		<!-- search for the MBeanServer instance with the given agentId -->
		<property name="agentId" value="MBeanServer_instance_agentId>"/>
	</bean>
	<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">
		<property name="server" ref="mbeanServer"/>
		...
	</bean>
</beans>

对于现有平台或现有具有通过查找方法检索的动态(或未知)的情况,您应该使用 factory-method, 如以下示例所示:MBeanServeragentIdSpring中文文档

<beans>
	<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">
		<property name="server">
			<!-- Custom MBeanServerLocator -->
			<bean class="platform.package.MBeanServerLocator" factory-method="locateMBeanServer"/>
		</property>
	</bean>

	<!-- other beans here -->

</beans>

延迟初始化的 MBean

如果将 Bean 配置为 a 也配置为惰性 初始化,不会破坏此契约并避免 实例化 Bean。相反,它会向 和 推迟 从容器中获取 Bean,直到对代理进行第一次调用。MBeanExporterMBeanExporterMBeanServerSpring中文文档

这也会影响解决方案,其中将定期 内省产生的对象,有效触发. 为了避免这种情况,请将相应的 Bean 定义标记为 lazy-init。FactoryBeanMBeanExporterFactoryBean.getObject()Spring中文文档

MBean 的自动注册

通过 导出且已经是有效 MBean 的任何 Bean 按原样注册,无需 Spring 的进一步干预。 您可以通过设置使 MBean 自动检测 的属性,如以下示例所示:MBeanExporterMBeanServerMBeanExporterautodetecttrueSpring中文文档

<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">
	<property name="autodetect" value="true"/>
</bean>

<bean name="spring:mbean=true" class="org.springframework.jmx.export.TestDynamicMBean"/>

在前面的示例中,调用的 Bean 已经是有效的 JMX MBean 并由 Spring 自动注册。缺省情况下,为 JMX 自动检测的 Bean 注册的 Bean 名称用作 .您可以覆盖此行为, 如控制 Bean 的 ObjectName 实例中所述。spring:mbean=trueObjectNameSpring中文文档

控制注册行为

考虑 Spring 尝试使用 .如果一个实例已经在同一下注册,则默认行为 是失败(并抛出一个 )。MBeanExporterMBeanMBeanServerObjectNamebean:name=testBean1MBeanObjectNameInstanceAlreadyExistsExceptionSpring中文文档

您可以准确控制当 在 .Spring 的 JMX 支持允许三种不同的 注册行为,用于控制注册时的注册行为 进程发现 an 已在同一个 . 下表总结了这些注册行为:MBeanMBeanServerMBeanObjectNameSpring中文文档

表 1.注册行为
注册行为 解释

FAIL_ON_EXISTINGSpring中文文档

这是默认注册行为。如果实例已经 注册下,正在注册的不是 注册,然后抛出一个。现有不受影响。MBeanObjectNameMBeanInstanceAlreadyExistsExceptionMBeanSpring中文文档

IGNORE_EXISTINGSpring中文文档

如果一个实例已经在同一下注册,则正在注册的实例不会注册。现有的是 不受影响,并且不会抛出任何内容。这在以下设置中很有用 多个应用程序希望在共享中共享一个公共资源。MBeanObjectNameMBeanMBeanExceptionMBeanMBeanServerSpring中文文档

REPLACE_EXISTINGSpring中文文档

如果一个实例已经注册在同一个 下, 先前注册的现有设备未注册,新设备在其位置注册(新设备有效地取代了 上一个实例)。MBeanObjectNameMBeanMBeanMBeanSpring中文文档

上表中的值定义为类上的枚举。 如果要更改默认注册行为,则需要将定义上的属性值设置为其中之一 值。RegistrationPolicyregistrationPolicyMBeanExporterSpring中文文档

以下示例演示如何从默认注册进行更改 行为到行为:REPLACE_EXISTINGSpring中文文档

<beans>

	<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">
		<property name="beans">
			<map>
				<entry key="bean:name=testBean1" value-ref="testBean"/>
			</map>
		</property>
		<property name="registrationPolicy" value="REPLACE_EXISTING"/>
	</bean>

	<bean id="testBean" class="org.springframework.jmx.JmxTestBean">
		<property name="name" value="TEST"/>
		<property name="age" value="100"/>
	</bean>

</beans>
表 1.注册行为
注册行为 解释

FAIL_ON_EXISTINGSpring中文文档

这是默认注册行为。如果实例已经 注册下,正在注册的不是 注册,然后抛出一个。现有不受影响。MBeanObjectNameMBeanInstanceAlreadyExistsExceptionMBeanSpring中文文档

IGNORE_EXISTINGSpring中文文档

如果一个实例已经在同一下注册,则正在注册的实例不会注册。现有的是 不受影响,并且不会抛出任何内容。这在以下设置中很有用 多个应用程序希望在共享中共享一个公共资源。MBeanObjectNameMBeanMBeanExceptionMBeanMBeanServerSpring中文文档

REPLACE_EXISTINGSpring中文文档

如果一个实例已经注册在同一个 下, 先前注册的现有设备未注册,新设备在其位置注册(新设备有效地取代了 上一个实例)。MBeanObjectNameMBeanMBeanMBeanSpring中文文档