From f2950f2d0920d05424b16006e357709bc3dfafa6 Mon Sep 17 00:00:00 2001 From: Marten Deinum Date: Fri, 30 Sep 2022 08:51:59 +0200 Subject: [PATCH] Allow JMX Registration Policy to be set See gh-32573 --- .../autoconfigure/jmx/JmxAutoConfiguration.java | 3 +-- .../boot/autoconfigure/jmx/JmxProperties.java | 14 ++++++++++++++ .../jmx/JmxAutoConfigurationTests.java | 13 +++++++++++-- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jmx/JmxAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jmx/JmxAutoConfiguration.java index a074123800f..7133292ff06 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jmx/JmxAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jmx/JmxAutoConfiguration.java @@ -34,7 +34,6 @@ import org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource; import org.springframework.jmx.export.annotation.AnnotationMBeanExporter; import org.springframework.jmx.export.naming.ObjectNamingStrategy; import org.springframework.jmx.support.MBeanServerFactoryBean; -import org.springframework.jmx.support.RegistrationPolicy; import org.springframework.util.StringUtils; /** @@ -67,7 +66,7 @@ public class JmxAutoConfiguration { @ConditionalOnMissingBean(value = MBeanExporter.class, search = SearchStrategy.CURRENT) public AnnotationMBeanExporter mbeanExporter(ObjectNamingStrategy namingStrategy, BeanFactory beanFactory) { AnnotationMBeanExporter exporter = new AnnotationMBeanExporter(); - exporter.setRegistrationPolicy(RegistrationPolicy.FAIL_ON_EXISTING); + exporter.setRegistrationPolicy(this.properties.getRegistrationPolicy()); exporter.setNamingStrategy(namingStrategy); String serverBean = this.properties.getServer(); if (StringUtils.hasLength(serverBean)) { diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jmx/JmxProperties.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jmx/JmxProperties.java index 70466ee8dd2..9ed19b957cf 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jmx/JmxProperties.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jmx/JmxProperties.java @@ -17,6 +17,7 @@ package org.springframework.boot.autoconfigure.jmx; import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.jmx.support.RegistrationPolicy; /** * Configuration properties for JMX. @@ -47,6 +48,11 @@ public class JmxProperties { */ private String defaultDomain; + /** + * JMX Registration policy. + */ + private RegistrationPolicy registrationPolicy = RegistrationPolicy.FAIL_ON_EXISTING; + public boolean getEnabled() { return this.enabled; } @@ -79,4 +85,12 @@ public class JmxProperties { this.defaultDomain = defaultDomain; } + public RegistrationPolicy getRegistrationPolicy() { + return this.registrationPolicy; + } + + public void setRegistrationPolicy(RegistrationPolicy registrationPolicy) { + this.registrationPolicy = registrationPolicy; + } + } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jmx/JmxAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jmx/JmxAutoConfigurationTests.java index ce11238e443..d8bfc3dcc31 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jmx/JmxAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jmx/JmxAutoConfigurationTests.java @@ -33,6 +33,7 @@ import org.springframework.jmx.export.annotation.ManagedOperation; import org.springframework.jmx.export.annotation.ManagedResource; import org.springframework.jmx.export.naming.MetadataNamingStrategy; import org.springframework.jmx.export.naming.ObjectNamingStrategy; +import org.springframework.jmx.support.RegistrationPolicy; import org.springframework.test.util.ReflectionTestUtils; import static org.assertj.core.api.Assertions.assertThat; @@ -72,6 +73,8 @@ class JmxAutoConfigurationTests { assertThat(context).hasSingleBean(ParentAwareNamingStrategy.class); MBeanExporter exporter = context.getBean(MBeanExporter.class); assertThat(exporter).hasFieldOrPropertyWithValue("ensureUniqueRuntimeObjectNames", false); + assertThat(exporter).hasFieldOrPropertyWithValue("registrationPolicy", RegistrationPolicy.FAIL_ON_EXISTING); + MetadataNamingStrategy naming = (MetadataNamingStrategy) ReflectionTestUtils.getField(exporter, "namingStrategy"); assertThat(naming).hasFieldOrPropertyWithValue("ensureUniqueRuntimeObjectNames", false); @@ -80,15 +83,21 @@ class JmxAutoConfigurationTests { @Test void testDefaultDomainConfiguredOnMBeanExport() { - this.contextRunner.withPropertyValues("spring.jmx.enabled=true", "spring.jmx.default-domain=my-test-domain", - "spring.jmx.unique-names=true").run((context) -> { + this.contextRunner + .withPropertyValues("spring.jmx.enabled=true", "spring.jmx.default-domain=my-test-domain", + "spring.jmx.unique-names=true", "spring.jmx.registration-policy=IGNORE_EXISTING") + .run((context) -> { assertThat(context).hasSingleBean(MBeanExporter.class); MBeanExporter exporter = context.getBean(MBeanExporter.class); assertThat(exporter).hasFieldOrPropertyWithValue("ensureUniqueRuntimeObjectNames", true); + assertThat(exporter).hasFieldOrPropertyWithValue("registrationPolicy", + RegistrationPolicy.IGNORE_EXISTING); + MetadataNamingStrategy naming = (MetadataNamingStrategy) ReflectionTestUtils.getField(exporter, "namingStrategy"); assertThat(naming).hasFieldOrPropertyWithValue("defaultDomain", "my-test-domain"); assertThat(naming).hasFieldOrPropertyWithValue("ensureUniqueRuntimeObjectNames", true); + }); }