Add support for 'trigger' attribute.

This commit is contained in:
Marius Bogoevici
2010-06-24 13:35:35 +00:00
parent 74619a4c8b
commit 1354b808cc
5 changed files with 71 additions and 5 deletions

View File

@@ -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 <poller> element with the 'trigger' attribute cannot have <interval-trigger/> or <cron-trigger/> child elements. ", pollerElement);
}
triggerBeanName = parseIntervalTrigger(intervalElement, parserContext);
}
else {
Element cronElement = DomUtils.getChildElementByTagName(pollerElement, "cron-trigger");
if (cronElement == null) {
parserContext.getReaderContext().error(
"A <poller> element must include either an <interval-trigger/> or <cron-trigger/> child element.", pollerElement);
}
triggerBeanName = parseCronTrigger(cronElement, parserContext);
if (cronElement != null) {
if (triggerBeanName != null) {
parserContext.getReaderContext().error(
"A <poller> element with the 'trigger' attribute cannot have <interval-trigger/> or <cron-trigger/> child elements. ", pollerElement);
}
triggerBeanName = parseCronTrigger(cronElement, parserContext);
}
}
if (triggerBeanName == null) {
parserContext.getReaderContext().error(
"A <poller> element must include a trigger definition, either as a 'trigger' attribute, or as an <interval-trigger/> or <cron-trigger/> child element.", pollerElement);
}
targetBuilder.addPropertyReference("trigger", triggerBeanName);
}

View File

@@ -1099,6 +1099,15 @@
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="trigger" type="xsd:string">
<xsd:annotation>
<xsd:appinfo>
<tool:annotation kind="ref">
<tool:expected-type type="org.springframework.scheduling.Trigger" />
</tool:annotation>
</xsd:appinfo>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="receive-timeout" type="xsd:string" />
<xsd:attribute name="send-timeout" type="xsd:string" />
<xsd:attribute name="max-messages-per-poll" type="xsd:string" />

View File

@@ -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();
}
}

View File

@@ -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);
}
}

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/integration"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/integration
http://www.springframework.org/schema/integration/spring-integration.xsd">
<poller id="poller" receive-timeout="1234" default="true" trigger="trigger"/>
<beans:bean id="trigger" class="org.springframework.integration.config.TestTrigger"/>
</beans:beans>