The <poller/> element no longer defines trigger properties (interval, initial-delay, cron, etc). Instead it expects a sub-element - either <interval-trigger/> or <cron-trigger/> (INT-423).

This commit is contained in:
Mark Fisher
2008-10-14 12:25:56 +00:00
parent 47ec57c5cd
commit 7ccc8f28d5
16 changed files with 101 additions and 36 deletions

View File

@@ -30,6 +30,7 @@ import org.springframework.integration.scheduling.Trigger;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
import org.springframework.util.xml.DomUtils;
/**
* Shared utility methods for integration namespace parsers.
@@ -141,26 +142,38 @@ public abstract class IntegrationNamespaceUtils {
*/
public static void configureTrigger(Element pollerElement, BeanDefinitionBuilder targetBuilder) {
Trigger trigger = null;
String interval = pollerElement.getAttribute("interval");
String cron = pollerElement.getAttribute("cron");
Assert.isTrue(StringUtils.hasText(interval) ^ StringUtils.hasText(cron),
"A <poller> element must include either an 'interval' or a 'cron' expression (but not both).");
if (StringUtils.hasText(interval)) {
Long period = Long.valueOf(interval);
IntervalTrigger intervalTrigger = new IntervalTrigger(period);
String initialDelay = pollerElement.getAttribute("initial-delay");
if (StringUtils.hasText(initialDelay)) {
intervalTrigger.setInitialDelay(Long.valueOf(initialDelay));
}
intervalTrigger.setFixedRate("true".equals(pollerElement.getAttribute("fixed-rate").toLowerCase()));
trigger = intervalTrigger;
Element intervalElement = DomUtils.getChildElementByTagName(pollerElement, "interval-trigger");
if (intervalElement != null) {
trigger = createIntervalTrigger(intervalElement);
}
if (StringUtils.hasText(pollerElement.getAttribute("cron"))) {
trigger = new CronTrigger(pollerElement.getAttribute("cron"));
else {
Element cronElement = DomUtils.getChildElementByTagName(pollerElement, "cron-trigger");
Assert.notNull(cronElement,
"A <poller> element must include either an <interval-trigger/> or <cron-trigger/> child element.");
trigger = createCronTrigger(cronElement);
}
targetBuilder.addPropertyValue("trigger", trigger);
}
private static Trigger createIntervalTrigger(Element element) {
String interval = element.getAttribute("interval");
Assert.hasText(interval, "the 'interval' attribute is required for an <interval-trigger/>");
Long period = Long.valueOf(interval);
IntervalTrigger trigger = new IntervalTrigger(period);
String initialDelay = element.getAttribute("initial-delay");
if (StringUtils.hasText(initialDelay)) {
trigger.setInitialDelay(Long.valueOf(initialDelay));
}
trigger.setFixedRate("true".equals(element.getAttribute("fixed-rate").toLowerCase()));
return trigger;
}
private static Trigger createCronTrigger(Element element) {
String cronExpression = element.getAttribute("expression");
Assert.hasText(cronExpression, "the 'expression' attribute is required for a <cron-trigger/>");
return new CronTrigger(cronExpression);
}
/**
* Parse a "transactional" element and configure the "transactionManager" and "transactionDefinition"
* properties for the target builder.

View File

@@ -231,12 +231,12 @@
</xsd:documentation>
</xsd:annotation>
<xsd:sequence>
<xsd:choice minOccurs="1" maxOccurs="1">
<xsd:element ref="interval-trigger"/>
<xsd:element ref="cron-trigger"/>
</xsd:choice>
<xsd:element name="transactional" type="transactionalType" minOccurs="0" maxOccurs="1"/>
</xsd:sequence>
<xsd:attribute name="interval" type="xsd:long"/>
<xsd:attribute name="cron" type="xsd:string"/>
<xsd:attribute name="initial-delay" type="xsd:long"/>
<xsd:attribute name="fixed-rate" type="xsd:boolean"/>
<xsd:attribute name="receive-timeout" type="xsd:long"/>
<xsd:attribute name="send-timeout" type="xsd:long"/>
<xsd:attribute name="max-messages-per-poll" type="xsd:long"/>
@@ -244,6 +244,31 @@
</xsd:complexType>
</xsd:element>
<xsd:element name="interval-trigger">
<xsd:complexType>
<xsd:annotation>
<xsd:documentation>
Defines an interval-based trigger.
</xsd:documentation>
</xsd:annotation>
<xsd:attribute name="interval" type="xsd:string"/>
<xsd:attribute name="initial-delay" type="xsd:string"/>
<xsd:attribute name="fixed-rate" type="xsd:boolean"/>
<!-- TODO: add time-unit -->
</xsd:complexType>
</xsd:element>
<xsd:element name="cron-trigger">
<xsd:complexType>
<xsd:annotation>
<xsd:documentation>
Defines an cron-based trigger.
</xsd:documentation>
</xsd:annotation>
<xsd:attribute name="expression" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="selector-chain">
<xsd:complexType>
<xsd:annotation>

View File

@@ -177,7 +177,8 @@ public class CronSequenceGenerator {
private void parse(String expression) throws IllegalArgumentException {
String[] fields = StringUtils.tokenizeToStringArray(expression, " ");
if (fields.length != 6) {
throw new IllegalArgumentException(String.format("Expression must consist of 6 fields (found %d in %s)",
throw new IllegalArgumentException(String.format("" +
"cron expression must consist of 6 fields (found %d in %s)",
fields.length, expression));
}
setNumberHits(seconds, fields[0], 60);

View File

@@ -5,22 +5,29 @@
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/integration
http://www.springframework.org/schema/integration/spring-integration-1.0.xsd">
<message-bus enable-annotations="true"/>
<channel id="input">
<queue capacity="5"/>
</channel>
<aggregator ref="summer" method="sum" input-channel="input"
output-channel="output">
<poller task-executor="executor" interval="20" max-messages-per-poll="5"/>
<aggregator ref="summer" method="sum" input-channel="input" output-channel="output">
<poller task-executor="executor" max-messages-per-poll="5">
<interval-trigger interval="20"/>
</poller>
</aggregator>
<beans:bean id="executor"
class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<beans:property name="corePoolSize" value="5" />
</beans:bean>
<channel id="output">
<queue capacity="5" />
</channel>
<beans:bean id="summer"
class="org.springframework.integration.aggregator.integration.ConcurrentAggregatorIntegrationTests$SummingAggregator" />
</beans:beans>

View File

@@ -18,7 +18,9 @@
<outbound-channel-adapter id="methodInvokingConsumer" ref="testBean" method="store"/>
<inbound-channel-adapter id="methodInvokingSource" ref="testBean" method="getMessage" channel="queueChannel">
<poller interval="10000" max-messages-per-poll="1"/>
<poller max-messages-per-poll="1">
<interval-trigger interval="10000"/>
</poller>
</inbound-channel-adapter>
<beans:bean id="consumer" class="org.springframework.integration.config.TestConsumer"/>

View File

@@ -14,7 +14,9 @@
</channel>
<service-activator input-channel="testChannel" ref="testHandler">
<poller interval="100"/>
<poller>
<interval-trigger interval="100"/>
</poller>
</service-activator>
<beans:bean id="testHandler" class="org.springframework.integration.config.TestHandler">

View File

@@ -26,7 +26,8 @@
ref="testBean"
method="good"
output-channel="output">
<poller interval="10000" max-messages-per-poll="1">
<poller max-messages-per-poll="1">
<interval-trigger interval="10000"/>
<transactional transaction-manager="txManager" propagation="MANDATORY"/>
</poller>
</service-activator>

View File

@@ -22,7 +22,8 @@
ref="testBean"
method="good"
output-channel="output">
<poller interval="10000" max-messages-per-poll="1">
<poller max-messages-per-poll="1">
<interval-trigger interval="10000"/>
<transactional transaction-manager="txManager" propagation="NOT_SUPPORTED"/>
</poller>
</service-activator>

View File

@@ -22,7 +22,8 @@
ref="testBean"
method="good"
output-channel="output">
<poller interval="10000" max-messages-per-poll="1">
<poller max-messages-per-poll="1">
<interval-trigger interval="10000"/>
<transactional transaction-manager="txManager" propagation="REQUIRED"/>
</poller>
</service-activator>

View File

@@ -22,7 +22,8 @@
ref="testBean"
method="good"
output-channel="output">
<poller interval="10000" max-messages-per-poll="1">
<poller max-messages-per-poll="1">
<interval-trigger interval="10000"/>
<transactional transaction-manager="txManager" propagation="REQUIRES_NEW"/>
</poller>
</service-activator>

View File

@@ -22,7 +22,8 @@
ref="testBean"
method="good"
output-channel="output">
<poller interval="10000" max-messages-per-poll="1">
<poller max-messages-per-poll="1">
<interval-trigger interval="10000"/>
<transactional transaction-manager="txManager" propagation="SUPPORTS"/>
</poller>
</service-activator>

View File

@@ -25,7 +25,8 @@
ref="testBean"
method="bad"
output-channel="output">
<poller interval="10000" max-messages-per-poll="1">
<poller max-messages-per-poll="1">
<interval-trigger interval="10000"/>
<transactional transaction-manager="txManager"/>
</poller>
</service-activator>
@@ -34,7 +35,8 @@
ref="testBean"
method="good"
output-channel="output">
<poller interval="10000" max-messages-per-poll="1">
<poller max-messages-per-poll="1">
<interval-trigger interval="10000"/>
<transactional transaction-manager="txManager"/>
</poller>
</service-activator>