From 4c3287d2c38819e3e68685673d7c4ee3f12ccf8a Mon Sep 17 00:00:00 2001 From: David Syer Date: Fri, 3 Sep 2010 12:39:00 +0000 Subject: [PATCH] INT-1416: replace control-bus with mbean-exporter --- .../integration/control/ControlBus.java | 13 +------ .../jmx/config/JmxNamespaceHandler.java | 2 +- ...usParser.java => MBeanExporterParser.java} | 39 +++++++++++-------- .../jmx/config/spring-integration-jmx-2.0.xsd | 11 +++--- .../ControlBusOperationChannelTests.java | 1 + .../integration/control/ControlBusTests.java | 1 + .../control/ControlBusXmlTests-context.xml | 3 ++ ...l => MBeanExporterParserTests-context.xml} | 2 +- ...sts.java => MBeanExporterParserTests.java} | 5 +-- 9 files changed, 39 insertions(+), 38 deletions(-) rename spring-integration-jmx/src/main/java/org/springframework/integration/jmx/config/{ControlBusParser.java => MBeanExporterParser.java} (64%) rename spring-integration-jmx/src/test/java/org/springframework/integration/jmx/config/{ControlBusParserTests-context.xml => MBeanExporterParserTests-context.xml} (88%) rename spring-integration-jmx/src/test/java/org/springframework/integration/jmx/config/{ControlBusParserTests.java => MBeanExporterParserTests.java} (93%) diff --git a/spring-integration-jmx/src/main/java/org/springframework/integration/control/ControlBus.java b/spring-integration-jmx/src/main/java/org/springframework/integration/control/ControlBus.java index a1b4d80c23..fe549c2c16 100644 --- a/spring-integration-jmx/src/main/java/org/springframework/integration/control/ControlBus.java +++ b/spring-integration-jmx/src/main/java/org/springframework/integration/control/ControlBus.java @@ -25,7 +25,6 @@ import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.ListableBeanFactory; import org.springframework.integration.Message; import org.springframework.integration.MessageHeaders; -import org.springframework.integration.channel.DirectChannel; import org.springframework.integration.core.SubscribableChannel; import org.springframework.integration.jmx.JmxHeaders; import org.springframework.integration.jmx.OperationInvokingMessageHandler; @@ -43,7 +42,7 @@ public class ControlBus implements BeanFactoryAware, InitializingBean { public static final String TARGET_BEAN_NAME = JmxHeaders.PREFIX + "_controlBus_targetBeanName"; - private volatile SubscribableChannel operationChannel; + private final SubscribableChannel operationChannel; private volatile ListableBeanFactory beanFactory; @@ -51,16 +50,12 @@ public class ControlBus implements BeanFactoryAware, InitializingBean { private final MBeanServer server; - /** * Create a {@link ControlBus}. */ - public ControlBus(ObjectNameLocator locator, MBeanServer server) { + public ControlBus(ObjectNameLocator locator, MBeanServer server, SubscribableChannel operationChannel) { this.exporter = locator; this.server = server; - } - - public void setOperationChannel(SubscribableChannel operationChannel) { this.operationChannel = operationChannel; } @@ -78,16 +73,12 @@ public class ControlBus implements BeanFactoryAware, InitializingBean { Assert.isTrue(beanFactory instanceof ListableBeanFactory, "A ListableBeanFactory is required."); this.beanFactory = (ListableBeanFactory) beanFactory; } - public void afterPropertiesSet() throws Exception { OperationInvokingMessageHandler handler = new ControlBusOperationInvokingMessageHandler(); handler.setBeanFactory(this.beanFactory); handler.setServer(this.server); handler.afterPropertiesSet(); - if (this.operationChannel == null) { - this.operationChannel = new DirectChannel(); - } this.operationChannel.subscribe(handler); } diff --git a/spring-integration-jmx/src/main/java/org/springframework/integration/jmx/config/JmxNamespaceHandler.java b/spring-integration-jmx/src/main/java/org/springframework/integration/jmx/config/JmxNamespaceHandler.java index 323dc41046..a47d725e08 100644 --- a/spring-integration-jmx/src/main/java/org/springframework/integration/jmx/config/JmxNamespaceHandler.java +++ b/spring-integration-jmx/src/main/java/org/springframework/integration/jmx/config/JmxNamespaceHandler.java @@ -33,7 +33,7 @@ public class JmxNamespaceHandler extends AbstractIntegrationNamespaceHandler { this.registerBeanDefinitionParser("attribute-polling-channel-adapter", new AttributePollingChannelAdapterParser()); this.registerBeanDefinitionParser("notification-listening-channel-adapter", new NotificationListeningChannelAdapterParser()); this.registerBeanDefinitionParser("notification-publishing-channel-adapter", new NotificationPublishingChannelAdapterParser()); - this.registerBeanDefinitionParser("control-bus", new ControlBusParser()); + this.registerBeanDefinitionParser("mbean-exporter", new MBeanExporterParser()); } } diff --git a/spring-integration-jmx/src/main/java/org/springframework/integration/jmx/config/ControlBusParser.java b/spring-integration-jmx/src/main/java/org/springframework/integration/jmx/config/MBeanExporterParser.java similarity index 64% rename from spring-integration-jmx/src/main/java/org/springframework/integration/jmx/config/ControlBusParser.java rename to spring-integration-jmx/src/main/java/org/springframework/integration/jmx/config/MBeanExporterParser.java index 9da9311ab9..e3c6797000 100644 --- a/spring-integration-jmx/src/main/java/org/springframework/integration/jmx/config/ControlBusParser.java +++ b/spring-integration-jmx/src/main/java/org/springframework/integration/jmx/config/MBeanExporterParser.java @@ -18,10 +18,10 @@ package org.springframework.integration.jmx.config; import javax.management.MBeanServerFactory; -import org.springframework.beans.BeanMetadataElement; import org.springframework.beans.factory.config.RuntimeBeanReference; +import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; -import org.springframework.beans.factory.xml.AbstractSimpleBeanDefinitionParser; +import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.integration.config.xml.IntegrationNamespaceUtils; import org.springframework.util.StringUtils; @@ -31,20 +31,23 @@ import org.w3c.dom.Element; * @author Mark Fisher * @since 2.0 */ -public class ControlBusParser extends AbstractSimpleBeanDefinitionParser { +public class MBeanExporterParser extends AbstractBeanDefinitionParser { @Override - protected String getBeanClassName(Element element) { - return "org.springframework.integration.control.ControlBus"; - } - - @Override - protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { - builder.getRawBeanDefinition().setSource(parserContext.extractSource(element)); + protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) { Object mbeanServer = getMBeanServer(element, parserContext); - builder.addConstructorArgValue(getMBeanExporter(element, parserContext, mbeanServer)); - builder.addConstructorArgValue(mbeanServer); - IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "operation-channel"); + BeanDefinitionBuilder builder = BeanDefinitionBuilder + .genericBeanDefinition("org.springframework.integration.monitor.IntegrationMBeanExporter"); + builder.getRawBeanDefinition().setSource(parserContext.extractSource(element)); + IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "domain"); + builder.addPropertyValue("server", mbeanServer); + if (StringUtils.hasText(element.getAttribute("operation-channel"))) { + AbstractBeanDefinition controlBus = getControlBus(element, parserContext, mbeanServer, builder + .getRawBeanDefinition()); + parserContext.getRegistry().registerBeanDefinition( + parserContext.getReaderContext().generateBeanName(controlBus), controlBus); + } + return builder.getBeanDefinition(); } private Object getMBeanServer(Element element, ParserContext parserContext) { @@ -57,12 +60,14 @@ public class ControlBusParser extends AbstractSimpleBeanDefinitionParser { } } - private BeanMetadataElement getMBeanExporter(Element element, ParserContext parserContext, Object mbeanServer) { + private AbstractBeanDefinition getControlBus(Element element, ParserContext parserContext, Object mbeanServer, + Object mbeanExporter) { BeanDefinitionBuilder builder = BeanDefinitionBuilder - .genericBeanDefinition("org.springframework.integration.monitor.IntegrationMBeanExporter"); + .genericBeanDefinition("org.springframework.integration.control.ControlBus"); builder.getRawBeanDefinition().setSource(parserContext.extractSource(element)); - IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "domain"); - builder.addPropertyValue("server", mbeanServer); + builder.addConstructorArgValue(mbeanExporter); + builder.addConstructorArgValue(mbeanServer); + builder.addConstructorArgReference(element.getAttribute("operation-channel")); return builder.getBeanDefinition(); } 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 c03d92f2a5..f0d0305833 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 @@ -105,11 +105,11 @@ - + - Defines a Control Bus that exports Message Channels and Endpoints as MBeans - and connects to an "operation channel". + Exports Message Channels and Endpoints as MBeans + and optionally connects to an "operation channel". @@ -126,7 +126,8 @@ - The Message Channel that can be used to send operation commands to + If provided a control bus will be created and subscribed to the Message Channel. + The channel can then be used to send operation commands to this Control Bus. It must implement SubscribableChannel. @@ -140,7 +141,7 @@ - + diff --git a/spring-integration-jmx/src/test/java/org/springframework/integration/control/ControlBusOperationChannelTests.java b/spring-integration-jmx/src/test/java/org/springframework/integration/control/ControlBusOperationChannelTests.java index 4b654d20c7..e11150b383 100644 --- a/spring-integration-jmx/src/test/java/org/springframework/integration/control/ControlBusOperationChannelTests.java +++ b/spring-integration-jmx/src/test/java/org/springframework/integration/control/ControlBusOperationChannelTests.java @@ -87,6 +87,7 @@ public class ControlBusOperationChannelTests { BeanDefinition controlBusDef = new RootBeanDefinition(ControlBus.class); controlBusDef.getConstructorArgumentValues().addGenericArgumentValue(new RuntimeBeanReference("mbeanServer")); controlBusDef.getConstructorArgumentValues().addGenericArgumentValue(new RuntimeBeanReference("exporter")); + controlBusDef.getConstructorArgumentValues().addGenericArgumentValue(new DirectChannel()); context.registerBeanDefinition("controlBus", controlBusDef); return exporterDef; } diff --git a/spring-integration-jmx/src/test/java/org/springframework/integration/control/ControlBusTests.java b/spring-integration-jmx/src/test/java/org/springframework/integration/control/ControlBusTests.java index 190de35f7f..0d911cf0d8 100644 --- a/spring-integration-jmx/src/test/java/org/springframework/integration/control/ControlBusTests.java +++ b/spring-integration-jmx/src/test/java/org/springframework/integration/control/ControlBusTests.java @@ -189,6 +189,7 @@ public class ControlBusTests { BeanDefinition controlBusDef = new RootBeanDefinition(ControlBus.class); controlBusDef.getConstructorArgumentValues().addGenericArgumentValue(new RuntimeBeanReference("mbeanServer")); controlBusDef.getConstructorArgumentValues().addGenericArgumentValue(new RuntimeBeanReference("exporter")); + controlBusDef.getConstructorArgumentValues().addGenericArgumentValue(new DirectChannel()); context.registerBeanDefinition("controlBus", controlBusDef); return exporterDef; } diff --git a/spring-integration-jmx/src/test/java/org/springframework/integration/control/ControlBusXmlTests-context.xml b/spring-integration-jmx/src/test/java/org/springframework/integration/control/ControlBusXmlTests-context.xml index 638163e89b..d67f90ed0b 100644 --- a/spring-integration-jmx/src/test/java/org/springframework/integration/control/ControlBusXmlTests-context.xml +++ b/spring-integration-jmx/src/test/java/org/springframework/integration/control/ControlBusXmlTests-context.xml @@ -5,6 +5,8 @@ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> + + @@ -22,6 +24,7 @@ + diff --git a/spring-integration-jmx/src/test/java/org/springframework/integration/jmx/config/ControlBusParserTests-context.xml b/spring-integration-jmx/src/test/java/org/springframework/integration/jmx/config/MBeanExporterParserTests-context.xml similarity index 88% rename from spring-integration-jmx/src/test/java/org/springframework/integration/jmx/config/ControlBusParserTests-context.xml rename to spring-integration-jmx/src/test/java/org/springframework/integration/jmx/config/MBeanExporterParserTests-context.xml index 7295d27881..9275d7da3d 100644 --- a/spring-integration-jmx/src/test/java/org/springframework/integration/jmx/config/ControlBusParserTests-context.xml +++ b/spring-integration-jmx/src/test/java/org/springframework/integration/jmx/config/MBeanExporterParserTests-context.xml @@ -17,6 +17,6 @@ - + diff --git a/spring-integration-jmx/src/test/java/org/springframework/integration/jmx/config/ControlBusParserTests.java b/spring-integration-jmx/src/test/java/org/springframework/integration/jmx/config/MBeanExporterParserTests.java similarity index 93% rename from spring-integration-jmx/src/test/java/org/springframework/integration/jmx/config/ControlBusParserTests.java rename to spring-integration-jmx/src/test/java/org/springframework/integration/jmx/config/MBeanExporterParserTests.java index 19bfa979d4..fab13d864f 100644 --- a/spring-integration-jmx/src/test/java/org/springframework/integration/jmx/config/ControlBusParserTests.java +++ b/spring-integration-jmx/src/test/java/org/springframework/integration/jmx/config/MBeanExporterParserTests.java @@ -36,15 +36,14 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; */ @ContextConfiguration @RunWith(SpringJUnit4ClassRunner.class) -public class ControlBusParserTests { +public class MBeanExporterParserTests { @Autowired private ApplicationContext context; - @Test public void test() throws InterruptedException { - ControlBus controlBus = this.context.getBean("controlBus", ControlBus.class); + ControlBus controlBus = this.context.getBean(ControlBus.class); assertEquals(controlBus.getOperationChannel(), this.context.getBean("testChannel")); MBeanServer server = this.context.getBean("mbs", MBeanServer.class); MBeanExporter exporter = (MBeanExporter) new DirectFieldAccessor(controlBus).getPropertyValue("exporter");