Commit ae095b2c authored by Stephane Nicoll's avatar Stephane Nicoll

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
parent 33634157
/* /*
* 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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -16,15 +16,12 @@ ...@@ -16,15 +16,12 @@
package org.springframework.boot.autoconfigure.integration; package org.springframework.boot.autoconfigure.integration;
import javax.management.MBeanServer;
import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.condition.SearchStrategy; import org.springframework.boot.autoconfigure.condition.SearchStrategy;
import org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration; import org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.integration.config.EnableIntegration; import org.springframework.integration.config.EnableIntegration;
import org.springframework.integration.jmx.config.EnableIntegrationMBeanExport; import org.springframework.integration.jmx.config.EnableIntegrationMBeanExport;
...@@ -36,19 +33,15 @@ import org.springframework.integration.monitor.IntegrationMBeanExporter; ...@@ -36,19 +33,15 @@ import org.springframework.integration.monitor.IntegrationMBeanExporter;
* *
* @author Artem Bilan * @author Artem Bilan
* @author Dave Syer * @author Dave Syer
* @author Stephane Nicoll
* @since 1.1.0 * @since 1.1.0
*/ */
@Configuration @Configuration
@ConditionalOnClass(EnableIntegration.class) @ConditionalOnClass(EnableIntegration.class)
@AutoConfigureAfter(JmxAutoConfiguration.class) @AutoConfigureAfter(JmxAutoConfiguration.class)
@ConditionalOnProperty(prefix = "spring.jmx", name = "enabled", havingValue = "true", matchIfMissing = true)
public class IntegrationAutoConfiguration { public class IntegrationAutoConfiguration {
@Bean
@ConditionalOnMissingBean(MBeanServer.class)
public MBeanServer mbeanServer() {
return new JmxAutoConfiguration().mbeanServer();
}
@Configuration @Configuration
@EnableIntegration @EnableIntegration
protected static class IntegrationConfiguration { protected static class IntegrationConfiguration {
...@@ -57,7 +50,6 @@ public class IntegrationAutoConfiguration { ...@@ -57,7 +50,6 @@ public class IntegrationAutoConfiguration {
@Configuration @Configuration
@ConditionalOnClass(EnableIntegrationMBeanExport.class) @ConditionalOnClass(EnableIntegrationMBeanExport.class)
@ConditionalOnMissingBean(value = IntegrationMBeanExporter.class, search = SearchStrategy.CURRENT) @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}") @EnableIntegrationMBeanExport(defaultDomain = "${spring.jmx.default-domain:}", server = "${spring.jmx.server:mbeanServer}")
protected static class IntegrationJmxConfiguration { protected static class IntegrationJmxConfiguration {
} }
......
/* /*
* 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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -16,53 +16,96 @@ ...@@ -16,53 +16,96 @@
package org.springframework.boot.autoconfigure.integration; 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.junit.Test;
import org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration; import org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration;
import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.integration.support.channel.HeaderChannelRegistry; 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; import static org.junit.Assert.assertNotNull;
/** /**
* Tests for {@link IntegrationAutoConfiguration}. * Tests for {@link IntegrationAutoConfiguration}.
* *
* @author Artem Bilan * @author Artem Bilan
* @author Stephane Nicoll
*/ */
public class IntegrationAutoConfigurationTests { 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 @Test
public void integrationIsAvailable() { public void integrationIsAvailable() {
this.context.register(IntegrationAutoConfiguration.class); load();
this.context.refresh(); MBeanServer mBeanServer = this.context.getBean(MBeanServer.class);
assertDomains(mBeanServer, true, "org.springframework.integration",
"org.springframework.integration.monitor");
assertNotNull(this.context.getBean(HeaderChannelRegistry.class)); assertNotNull(this.context.getBean(HeaderChannelRegistry.class));
this.context.close();
} }
@Test @Test
public void addJmxAuto() { public void disableIntegration() {
this.context.register(JmxAutoConfiguration.class, load("spring.jmx.enabled=false");
IntegrationAutoConfiguration.class); assertEquals(0, this.context.getBeansOfType(MBeanServer.class).size());
this.context.refresh(); }
assertNotNull(this.context.getBean(HeaderChannelRegistry.class));
this.context.close(); @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 @Test
public void parentContext() { public void parentContext() {
this.context.register(IntegrationAutoConfiguration.class); this.context = new AnnotationConfigApplicationContext();
this.context.register(JmxAutoConfiguration.class, IntegrationAutoConfiguration.class);
this.context.refresh(); this.context.refresh();
AnnotationConfigApplicationContext parent = this.context; AnnotationConfigApplicationContext parent = this.context;
this.context = new AnnotationConfigApplicationContext(); this.context = new AnnotationConfigApplicationContext();
this.context.setParent(parent); this.context.setParent(parent);
this.context.register(IntegrationAutoConfiguration.class); this.context.register(JmxAutoConfiguration.class, IntegrationAutoConfiguration.class);
this.context.refresh(); this.context.refresh();
assertNotNull(this.context.getBean(HeaderChannelRegistry.class)); assertNotNull(this.context.getBean(HeaderChannelRegistry.class));
((ConfigurableApplicationContext) this.context.getParent()).close(); ((ConfigurableApplicationContext) this.context.getParent()).close();
this.context.close(); this.context.close();
} }
private static void assertDomains(MBeanServer mBeanServer, boolean expected, String... domains) {
List<String> 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;
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment