diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/PointToPointChannelParser.java b/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/PointToPointChannelParser.java index 34d2532663..6fc85f9c6f 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/PointToPointChannelParser.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/PointToPointChannelParser.java @@ -41,6 +41,8 @@ public class PointToPointChannelParser extends AbstractChannelParser { protected BeanDefinitionBuilder buildBeanDefinition(Element element, ParserContext parserContext) { BeanDefinitionBuilder builder = null; Element queueElement = null; + + // configure a queue-based channel if any queue sub-element is defined if ((queueElement = DomUtils.getChildElementByTagName(element, "queue")) != null) { builder = BeanDefinitionBuilder.genericBeanDefinition(CHANNEL_PACKAGE + ".QueueChannel"); boolean hasCapacity = this.parseQueueCapacity(builder, queueElement); @@ -61,8 +63,24 @@ public class PointToPointChannelParser extends AbstractChannelParser { else if ((queueElement = DomUtils.getChildElementByTagName(element, "rendezvous-queue")) != null) { builder = BeanDefinitionBuilder.genericBeanDefinition(CHANNEL_PACKAGE + ".RendezvousChannel"); } - else { - builder = BeanDefinitionBuilder.genericBeanDefinition(CHANNEL_PACKAGE + ".DirectChannel"); + + // verify that the 'task-executor' is not provided if a queue sub-element exists + String taskExecutor = element.getAttribute("task-executor"); + if (queueElement != null && StringUtils.hasText(taskExecutor)) { + parserContext.getReaderContext().error("The 'task-executor' attribute " + + "and any queue sub-element are mutually exclusive.", element); + return null; + } + + if (builder == null) { + // configure either an ExecutorChannel or DirectChannel based on existence of 'task-executor' + if (StringUtils.hasText(taskExecutor)) { + builder = BeanDefinitionBuilder.genericBeanDefinition(CHANNEL_PACKAGE + ".ExecutorChannel"); + builder.addConstructorArgReference(taskExecutor); + } + else { + builder = BeanDefinitionBuilder.genericBeanDefinition(CHANNEL_PACKAGE + ".DirectChannel"); + } parseDispatcher(element.getAttribute("dispatcher"), builder, parserContext); } return builder; diff --git a/org.springframework.integration/src/main/resources/org/springframework/integration/config/xml/spring-integration-1.0.xsd b/org.springframework.integration/src/main/resources/org/springframework/integration/config/xml/spring-integration-1.0.xsd index e9d7b87e33..9adfd196f5 100644 --- a/org.springframework.integration/src/main/resources/org/springframework/integration/config/xml/spring-integration-1.0.xsd +++ b/org.springframework.integration/src/main/resources/org/springframework/integration/config/xml/spring-integration-1.0.xsd @@ -46,7 +46,7 @@ - Defines a Point-to-Point MessageChannel. + Defines a Point-to-Point MessageChannel. @@ -66,6 +66,21 @@ + + + + + + + + + +