From ae095b2c1bdb24f6f67ce357653184f0ef1300d1 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Tue, 29 Mar 2016 11:27:24 +0200 Subject: [PATCH] Disable JMX Integration support if necessary This commit fixes `IntegrationAutoConfiguration` to actually rely on the auto-configured `MBeanServer` rather than attempting to create it again. If JMX support is disabled, no attempt to register integration-related MBeans is made. Closes gh-5309 --- .../IntegrationAutoConfiguration.java | 14 +--- .../IntegrationAutoConfigurationTests.java | 69 +++++++++++++++---- 2 files changed, 59 insertions(+), 24 deletions(-) diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/integration/IntegrationAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/integration/IntegrationAutoConfiguration.java index 95004e8403..00fc69b0a3 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/integration/IntegrationAutoConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/integration/IntegrationAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2015 the original author or authors. + * Copyright 2012-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,15 +16,12 @@ package org.springframework.boot.autoconfigure.integration; -import javax.management.MBeanServer; - import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.SearchStrategy; import org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration; -import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.integration.config.EnableIntegration; import org.springframework.integration.jmx.config.EnableIntegrationMBeanExport; @@ -36,19 +33,15 @@ import org.springframework.integration.monitor.IntegrationMBeanExporter; * * @author Artem Bilan * @author Dave Syer + * @author Stephane Nicoll * @since 1.1.0 */ @Configuration @ConditionalOnClass(EnableIntegration.class) @AutoConfigureAfter(JmxAutoConfiguration.class) +@ConditionalOnProperty(prefix = "spring.jmx", name = "enabled", havingValue = "true", matchIfMissing = true) public class IntegrationAutoConfiguration { - @Bean - @ConditionalOnMissingBean(MBeanServer.class) - public MBeanServer mbeanServer() { - return new JmxAutoConfiguration().mbeanServer(); - } - @Configuration @EnableIntegration protected static class IntegrationConfiguration { @@ -57,7 +50,6 @@ public class IntegrationAutoConfiguration { @Configuration @ConditionalOnClass(EnableIntegrationMBeanExport.class) @ConditionalOnMissingBean(value = IntegrationMBeanExporter.class, search = SearchStrategy.CURRENT) - @ConditionalOnProperty(prefix = "spring.jmx", name = "enabled", havingValue = "true", matchIfMissing = true) @EnableIntegrationMBeanExport(defaultDomain = "${spring.jmx.default-domain:}", server = "${spring.jmx.server:mbeanServer}") protected static class IntegrationJmxConfiguration { } diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/integration/IntegrationAutoConfigurationTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/integration/IntegrationAutoConfigurationTests.java index 61ec8c668c..69706e4a44 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/integration/IntegrationAutoConfigurationTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/integration/IntegrationAutoConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2015 the original author or authors. + * Copyright 2012-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,53 +16,96 @@ package org.springframework.boot.autoconfigure.integration; +import java.util.Arrays; +import java.util.List; + +import javax.management.MBeanServer; + +import org.junit.After; import org.junit.Test; import org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.integration.support.channel.HeaderChannelRegistry; +import org.springframework.test.context.support.TestPropertySourceUtils; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; /** * Tests for {@link IntegrationAutoConfiguration}. * * @author Artem Bilan + * @author Stephane Nicoll */ public class IntegrationAutoConfigurationTests { - private AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); + private AnnotationConfigApplicationContext context; + + @After + public void close() { + if (this.context != null) { + this.context.close(); + if (this.context.getParent() != null) { + ((ConfigurableApplicationContext) this.context.getParent()).close(); + } + } + } @Test public void integrationIsAvailable() { - this.context.register(IntegrationAutoConfiguration.class); - this.context.refresh(); + load(); + MBeanServer mBeanServer = this.context.getBean(MBeanServer.class); + assertDomains(mBeanServer, true, "org.springframework.integration", + "org.springframework.integration.monitor"); assertNotNull(this.context.getBean(HeaderChannelRegistry.class)); - this.context.close(); } @Test - public void addJmxAuto() { - this.context.register(JmxAutoConfiguration.class, - IntegrationAutoConfiguration.class); - this.context.refresh(); - assertNotNull(this.context.getBean(HeaderChannelRegistry.class)); - this.context.close(); + public void disableIntegration() { + load("spring.jmx.enabled=false"); + assertEquals(0, this.context.getBeansOfType(MBeanServer.class).size()); } + @Test + public void customizeDomain() { + load("spring.jmx.default-domain=org.foo"); + MBeanServer mBeanServer = this.context.getBean(MBeanServer.class); + assertDomains(mBeanServer, true, "org.foo"); + assertDomains(mBeanServer, false, "org.springframework.integration", + "org.springframework.integration.monitor"); + } + + @Test public void parentContext() { - this.context.register(IntegrationAutoConfiguration.class); + this.context = new AnnotationConfigApplicationContext(); + this.context.register(JmxAutoConfiguration.class, IntegrationAutoConfiguration.class); this.context.refresh(); AnnotationConfigApplicationContext parent = this.context; this.context = new AnnotationConfigApplicationContext(); this.context.setParent(parent); - this.context.register(IntegrationAutoConfiguration.class); + this.context.register(JmxAutoConfiguration.class, IntegrationAutoConfiguration.class); this.context.refresh(); assertNotNull(this.context.getBean(HeaderChannelRegistry.class)); ((ConfigurableApplicationContext) this.context.getParent()).close(); this.context.close(); } + private static void assertDomains(MBeanServer mBeanServer, boolean expected, String... domains) { + List actual = Arrays.asList(mBeanServer.getDomains()); + for (String domain : domains) { + assertEquals(expected, actual.contains(domain)); + } + } + + private void load(String... environment) { + AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); + TestPropertySourceUtils.addInlinedPropertiesToEnvironment(ctx, environment); + ctx.register(JmxAutoConfiguration.class, IntegrationAutoConfiguration.class); + ctx.refresh(); + this.context = ctx; + } + }