diff --git a/spring-integration-jmx/src/main/java/org/springframework/integration/jmx/config/MBeanExporterParser.java b/spring-integration-jmx/src/main/java/org/springframework/integration/jmx/config/MBeanExporterParser.java index e662955fe5..36ee82b3d2 100644 --- a/spring-integration-jmx/src/main/java/org/springframework/integration/jmx/config/MBeanExporterParser.java +++ b/spring-integration-jmx/src/main/java/org/springframework/integration/jmx/config/MBeanExporterParser.java @@ -53,6 +53,7 @@ public class MBeanExporterParser extends AbstractSingleBeanDefinitionParser { builder.getRawBeanDefinition().setSource(parserContext.extractSource(element)); IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "default-domain"); IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "object-name-static-properties"); + IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "managed-components", "componentNamePatterns"); builder.addPropertyValue("server", mbeanServer); } diff --git a/spring-integration-jmx/src/main/java/org/springframework/integration/monitor/IntegrationMBeanExporter.java b/spring-integration-jmx/src/main/java/org/springframework/integration/monitor/IntegrationMBeanExporter.java index 0fa94560c7..dd203fb621 100644 --- a/spring-integration-jmx/src/main/java/org/springframework/integration/monitor/IntegrationMBeanExporter.java +++ b/spring-integration-jmx/src/main/java/org/springframework/integration/monitor/IntegrationMBeanExporter.java @@ -63,6 +63,7 @@ import org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler; import org.springframework.jmx.export.naming.MetadataNamingStrategy; import org.springframework.jmx.support.MetricType; import org.springframework.util.Assert; +import org.springframework.util.PatternMatchUtils; import org.springframework.util.ReflectionUtils; /** @@ -142,6 +143,8 @@ public class IntegrationMBeanExporter extends MBeanExporter implements BeanPostP private final MetadataNamingStrategy namingStrategy = new MetadataNamingStrategy(attributeSource); + private String[] componentNamePatterns = { "*" }; + public IntegrationMBeanExporter() { super(); // Shouldn't be necessary, but to be on the safe side... @@ -176,6 +179,11 @@ public class IntegrationMBeanExporter extends MBeanExporter implements BeanPostP this.namingStrategy.setDefaultDomain(domain); } + public void setComponentNamePatterns(String[] componentNamePatterns) { + Assert.notEmpty(componentNamePatterns, "componentNamePatterns must not be empty"); + this.componentNamePatterns = componentNamePatterns; + } + public void setBeanFactory(BeanFactory beanFactory) throws BeansException { super.setBeanFactory(beanFactory); Assert.isTrue(beanFactory instanceof ListableBeanFactory, "A ListableBeanFactory is required."); @@ -494,6 +502,9 @@ public class IntegrationMBeanExporter extends MBeanExporter implements BeanPostP private void registerChannels() { for (DirectChannelMetrics monitor : channels) { String name = monitor.getName(); + if (!PatternMatchUtils.simpleMatch(this.componentNamePatterns, name)) { + continue; + } // Only register once... if (!channelsByName.containsKey(name)) { String beanKey = getChannelBeanKey(name); @@ -515,6 +526,9 @@ public class IntegrationMBeanExporter extends MBeanExporter implements BeanPostP for (SimpleMessageHandlerMetrics source : handlers) { MessageHandlerMetrics monitor = enhanceHandlerMonitor(source); String name = monitor.getName(); + if (!PatternMatchUtils.simpleMatch(this.componentNamePatterns, name)) { + continue; + } // Only register once... if (!handlersByName.containsKey(name)) { String beanKey = getHandlerBeanKey(monitor); @@ -535,6 +549,9 @@ public class IntegrationMBeanExporter extends MBeanExporter implements BeanPostP for (SimpleMessageSourceMetrics source : sources) { MessageSourceMetrics monitor = enhanceSourceMonitor(source); String name = monitor.getName(); + if (!PatternMatchUtils.simpleMatch(this.componentNamePatterns, name)) { + continue; + } // Only register once... if (!sourcesByName.containsKey(name)) { String beanKey = getSourceBeanKey(monitor); @@ -558,12 +575,19 @@ public class IntegrationMBeanExporter extends MBeanExporter implements BeanPostP AbstractEndpoint endpoint = beanFactory.getBean(name, AbstractEndpoint.class); String beanKey; name = endpoint.getComponentName(); + String source; if (name.startsWith("_org.springframework.integration")) { - beanKey = getEndpointBeanKey(endpoint, getInternalComponentName(name), "internal"); + name = getInternalComponentName(name); + source = "internal"; } else { - beanKey = getEndpointBeanKey(endpoint, endpoint.getComponentName(), "endpoint"); + name = endpoint.getComponentName(); + source = "endpoint"; } + if (!PatternMatchUtils.simpleMatch(this.componentNamePatterns, name)) { + continue; + } + beanKey = getEndpointBeanKey(endpoint, name, source); ObjectName objectName = registerBeanInstance(new ManagedEndpoint(endpoint), beanKey); logger.info("Registered endpoint without MessageSource: " + objectName); } diff --git a/spring-integration-jmx/src/main/resources/org/springframework/integration/jmx/config/spring-integration-jmx-2.0.xsd b/spring-integration-jmx/src/main/resources/org/springframework/integration/jmx/config/spring-integration-jmx-2.0.xsd index 5b2dd5a05c..aa31451072 100644 --- a/spring-integration-jmx/src/main/resources/org/springframework/integration/jmx/config/spring-integration-jmx-2.0.xsd +++ b/spring-integration-jmx/src/main/resources/org/springframework/integration/jmx/config/spring-integration-jmx-2.0.xsd @@ -124,6 +124,13 @@ + + + + Comma separated list of simple patterns for component names to register (defaults to '*'). + + + diff --git a/spring-integration-jmx/src/test/java/org/springframework/integration/monitor/MBeanExporterIntegrationTests.java b/spring-integration-jmx/src/test/java/org/springframework/integration/monitor/MBeanExporterIntegrationTests.java index c9f33caf22..7942713b46 100644 --- a/spring-integration-jmx/src/test/java/org/springframework/integration/monitor/MBeanExporterIntegrationTests.java +++ b/spring-integration-jmx/src/test/java/org/springframework/integration/monitor/MBeanExporterIntegrationTests.java @@ -129,6 +129,17 @@ public class MBeanExporterIntegrationTests { assertEquals("start", startName); } + @Test + public void testComponentNames() throws Exception { + context = new GenericXmlApplicationContext(getClass(), "excluded-components.xml"); + messageChannelsMonitor = context.getBean(IntegrationMBeanExporter.class); + assertNotNull(messageChannelsMonitor); + MBeanServer server = context.getBean(MBeanServer.class); + Set names = server.queryNames(ObjectName.getInstance("org.springframework.integration:type=*,*"), null); + // Only one registered (out of >2 available) + assertEquals(1, names.size()); + } + public static class DateFactoryBean implements FactoryBean { private Date date; diff --git a/spring-integration-jmx/src/test/java/org/springframework/integration/monitor/excluded-components.xml b/spring-integration-jmx/src/test/java/org/springframework/integration/monitor/excluded-components.xml new file mode 100644 index 0000000000..8de96bea77 --- /dev/null +++ b/spring-integration-jmx/src/test/java/org/springframework/integration/monitor/excluded-components.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + +