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 dd203fb621..e9d9e079f4 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 @@ -570,6 +570,7 @@ public class IntegrationMBeanExporter extends MBeanExporter implements BeanPostP private void registerEndpoints() { String[] names = beanFactory.getBeanNamesForType(AbstractEndpoint.class); + Set endpointNames = new HashSet(); for (String name : names) { if (!beansByEndpointName.values().contains(name)) { AbstractEndpoint endpoint = beanFactory.getBean(name, AbstractEndpoint.class); @@ -587,6 +588,15 @@ public class IntegrationMBeanExporter extends MBeanExporter implements BeanPostP if (!PatternMatchUtils.simpleMatch(this.componentNamePatterns, name)) { continue; } + if (endpointNames.contains(name)) { + int count = 0; + String unique = name+"#"+count; + while (endpointNames.contains(unique)) { + unique = name + "#" + (++count); + } + name = unique; + } + endpointNames.add(name); 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/test/java/org/springframework/integration/monitor/MBeanExporterIntegrationTests.java b/spring-integration-jmx/src/test/java/org/springframework/integration/monitor/MBeanExporterIntegrationTests.java index bddaf3032e..e484acc51a 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 @@ -30,6 +30,8 @@ import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.InitializingBean; import org.springframework.context.support.GenericXmlApplicationContext; import org.springframework.integration.MessageChannel; +import org.springframework.integration.context.IntegrationObjectSupport; +import org.springframework.integration.endpoint.AbstractEndpoint; import org.springframework.jmx.export.annotation.ManagedResource; import org.springframework.util.Assert; @@ -142,6 +144,36 @@ public class MBeanExporterIntegrationTests { assertEquals(0, names.size()); } + @Test + public void testDuplicateComponentNames() throws Exception { + context = new GenericXmlApplicationContext(getClass(), "duplicate-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=ManagedEndpoint,*"), null); + assertEquals(2, names.size()); + } + + public static class BogusEndpoint extends AbstractEndpoint { + + @SuppressWarnings("unused") + private IntegrationObjectSupport parent; + + public void setParent(IntegrationObjectSupport parent) { + this.parent = parent; + setComponentName(parent.getComponentName()); + } + + @Override + protected void doStart() { + } + + @Override + protected void doStop() { + } + + } + public static class DateFactoryBean implements FactoryBean { private Date date; diff --git a/spring-integration-jmx/src/test/java/org/springframework/integration/monitor/duplicate-components.xml b/spring-integration-jmx/src/test/java/org/springframework/integration/monitor/duplicate-components.xml new file mode 100644 index 0000000000..84f42c7d9c --- /dev/null +++ b/spring-integration-jmx/src/test/java/org/springframework/integration/monitor/duplicate-components.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + +