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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+