diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/xml/PollerParser.java b/spring-integration-core/src/main/java/org/springframework/integration/config/xml/PollerParser.java index cf5c7c4069..0367423675 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/xml/PollerParser.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/xml/PollerParser.java @@ -42,6 +42,7 @@ import org.springframework.util.xml.DomUtils; * Parser for the <poller> element. * * @author Mark Fisher + * @author Marius Bogoevici */ public class PollerParser extends AbstractBeanDefinitionParser { @@ -91,18 +92,31 @@ public class PollerParser extends AbstractBeanDefinitionParser { private void configureTrigger(Element pollerElement, BeanDefinitionBuilder targetBuilder, ParserContext parserContext) { String triggerBeanName = null; + if (pollerElement.hasAttribute("trigger")) { + triggerBeanName = pollerElement.getAttribute("trigger"); + } Element intervalElement = DomUtils.getChildElementByTagName(pollerElement, "interval-trigger"); if (intervalElement != null) { + if (triggerBeanName != null) { + parserContext.getReaderContext().error( + "A element with the 'trigger' attribute cannot have or child elements. ", pollerElement); + } triggerBeanName = parseIntervalTrigger(intervalElement, parserContext); } else { Element cronElement = DomUtils.getChildElementByTagName(pollerElement, "cron-trigger"); - if (cronElement == null) { - parserContext.getReaderContext().error( - "A element must include either an or child element.", pollerElement); - } - triggerBeanName = parseCronTrigger(cronElement, parserContext); + if (cronElement != null) { + if (triggerBeanName != null) { + parserContext.getReaderContext().error( + "A element with the 'trigger' attribute cannot have or child elements. ", pollerElement); + } + triggerBeanName = parseCronTrigger(cronElement, parserContext); + } } + if (triggerBeanName == null) { + parserContext.getReaderContext().error( + "A element must include a trigger definition, either as a 'trigger' attribute, or as an or child element.", pollerElement); + } targetBuilder.addPropertyReference("trigger", triggerBeanName); } diff --git a/spring-integration-core/src/main/resources/org/springframework/integration/config/xml/spring-integration-2.0.xsd b/spring-integration-core/src/main/resources/org/springframework/integration/config/xml/spring-integration-2.0.xsd index e30d5e945b..7e5c6a6b73 100644 --- a/spring-integration-core/src/main/resources/org/springframework/integration/config/xml/spring-integration-2.0.xsd +++ b/spring-integration-core/src/main/resources/org/springframework/integration/config/xml/spring-integration-2.0.xsd @@ -1099,6 +1099,15 @@ + + + + + + + + + diff --git a/spring-integration-core/src/test/java/org/springframework/integration/config/TestTrigger.java b/spring-integration-core/src/test/java/org/springframework/integration/config/TestTrigger.java new file mode 100644 index 0000000000..e656f78ccb --- /dev/null +++ b/spring-integration-core/src/test/java/org/springframework/integration/config/TestTrigger.java @@ -0,0 +1,17 @@ +package org.springframework.integration.config; + +import org.springframework.scheduling.Trigger; +import org.springframework.scheduling.TriggerContext; + +import java.util.Date; + +/** + * @author Marius Bogoevici + */ +public class TestTrigger implements Trigger { + + public Date nextExecutionTime(TriggerContext triggerContext) { + throw new UnsupportedOperationException(); + } + +} diff --git a/spring-integration-core/src/test/java/org/springframework/integration/config/xml/PollerParserTests.java b/spring-integration-core/src/test/java/org/springframework/integration/config/xml/PollerParserTests.java index 5bc6bf257d..46f44a4f37 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/config/xml/PollerParserTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/config/xml/PollerParserTests.java @@ -18,12 +18,14 @@ package org.springframework.integration.config.xml; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; import org.junit.Test; import org.springframework.beans.factory.parsing.BeanDefinitionParsingException; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.integration.config.TestTrigger; import org.springframework.integration.context.IntegrationContextUtils; import org.springframework.integration.scheduling.PollerMetadata; @@ -88,4 +90,14 @@ public class PollerParserTests { assertEquals(1234, metadata.getReceiveTimeout()); } + @Test + public void pollerWithTriggerReference() { + ApplicationContext context = new ClassPathXmlApplicationContext( + "pollerWithTriggerReference.xml", PollerParserTests.class); + Object poller = context.getBean("poller"); + assertNotNull(poller); + PollerMetadata metadata = (PollerMetadata) poller; + assertTrue(metadata.getTrigger() instanceof TestTrigger); + } + } diff --git a/spring-integration-core/src/test/java/org/springframework/integration/config/xml/pollerWithTriggerReference.xml b/spring-integration-core/src/test/java/org/springframework/integration/config/xml/pollerWithTriggerReference.xml new file mode 100644 index 0000000000..55dcc5008b --- /dev/null +++ b/spring-integration-core/src/test/java/org/springframework/integration/config/xml/pollerWithTriggerReference.xml @@ -0,0 +1,14 @@ + + + + + + + +