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