diff --git a/org.springframework.context/src/main/java/org/springframework/scheduling/config/ScheduledTasksBeanDefinitionParser.java b/org.springframework.context/src/main/java/org/springframework/scheduling/config/ScheduledTasksBeanDefinitionParser.java index 9a75475ec1c2c61e2366231702fbfd5e5ff70b2d..a4e624ec815812ea9d1a691e8ef99c029adebc7b 100644 --- a/org.springframework.context/src/main/java/org/springframework/scheduling/config/ScheduledTasksBeanDefinitionParser.java +++ b/org.springframework.context/src/main/java/org/springframework/scheduling/config/ScheduledTasksBeanDefinitionParser.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2009 the original author or authors. + * Copyright 2002-2011 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -53,6 +53,7 @@ public class ScheduledTasksBeanDefinitionParser extends AbstractSingleBeanDefini ManagedMap cronTaskMap = new ManagedMap(); ManagedMap fixedDelayTaskMap = new ManagedMap(); ManagedMap fixedRateTaskMap = new ManagedMap(); + ManagedMap triggerTaskMap = new ManagedMap(); NodeList childNodes = element.getChildNodes(); for (int i = 0; i < childNodes.getLength(); i++) { Node child = childNodes.item(i); @@ -72,25 +73,35 @@ public class ScheduledTasksBeanDefinitionParser extends AbstractSingleBeanDefini RuntimeBeanReference runnableBeanRef = new RuntimeBeanReference( createRunnableBean(ref, method, taskElement, parserContext)); + String cronAttribute = taskElement.getAttribute("cron"); - if (StringUtils.hasText(cronAttribute)) { + String fixedDelayAttribute = taskElement.getAttribute("fixed-delay"); + String fixedRateAttribute = taskElement.getAttribute("fixed-rate"); + String triggerAttribute = taskElement.getAttribute("trigger"); + + boolean hasCronAttribute = StringUtils.hasText(cronAttribute); + boolean hasFixedDelayAttribute = StringUtils.hasText(fixedDelayAttribute); + boolean hasFixedRateAttribute = StringUtils.hasText(fixedRateAttribute); + boolean hasTriggerAttribute = StringUtils.hasText(triggerAttribute); + + if (!(hasCronAttribute | hasFixedDelayAttribute | hasFixedRateAttribute | hasTriggerAttribute)) { + parserContext.getReaderContext().error( + "exactly one of the 'cron', 'fixed-delay', 'fixed-rate', or 'trigger' attributes is required", taskElement); + // Continue with the possible next task element + continue; + } + + if (hasCronAttribute) { cronTaskMap.put(runnableBeanRef, cronAttribute); } - else { - String fixedDelayAttribute = taskElement.getAttribute("fixed-delay"); - if (StringUtils.hasText(fixedDelayAttribute)) { - fixedDelayTaskMap.put(runnableBeanRef, fixedDelayAttribute); - } - else { - String fixedRateAttribute = taskElement.getAttribute("fixed-rate"); - if (!StringUtils.hasText(fixedRateAttribute)) { - parserContext.getReaderContext().error( - "One of 'cron', 'fixed-delay', or 'fixed-rate' is required", taskElement); - // Continue with the possible next task element - continue; - } - fixedRateTaskMap.put(runnableBeanRef, fixedRateAttribute); - } + if (hasFixedDelayAttribute) { + fixedDelayTaskMap.put(runnableBeanRef, fixedDelayAttribute); + } + if (hasFixedRateAttribute) { + fixedRateTaskMap.put(runnableBeanRef, fixedRateAttribute); + } + if (hasTriggerAttribute) { + triggerTaskMap.put(runnableBeanRef, new RuntimeBeanReference(triggerAttribute)); } } String schedulerRef = element.getAttribute("scheduler"); @@ -100,6 +111,7 @@ public class ScheduledTasksBeanDefinitionParser extends AbstractSingleBeanDefini builder.addPropertyValue("cronTasks", cronTaskMap); builder.addPropertyValue("fixedDelayTasks", fixedDelayTaskMap); builder.addPropertyValue("fixedRateTasks", fixedRateTaskMap); + builder.addPropertyValue("triggerTasks", triggerTaskMap); } private boolean isScheduledElement(Node node, ParserContext parserContext) { diff --git a/org.springframework.context/src/main/resources/org/springframework/scheduling/config/spring-task-3.1.xsd b/org.springframework.context/src/main/resources/org/springframework/scheduling/config/spring-task-3.1.xsd index 25507e79eb92a88a7c20768d91d1e9d5343d3b82..402d255594efd59b488d88ea8d6cd1c2a70b7cd9 100644 --- a/org.springframework.context/src/main/resources/org/springframework/scheduling/config/spring-task-3.1.xsd +++ b/org.springframework.context/src/main/resources/org/springframework/scheduling/config/spring-task-3.1.xsd @@ -216,6 +216,13 @@ ]]> + + + + + tasks = (Map) new DirectFieldAccessor( + this.registrar).getPropertyValue("triggerTasks"); + assertEquals(1, tasks.size()); + Trigger trigger = tasks.values().iterator().next(); + assertEquals(TestTrigger.class, trigger.getClass()); + } + static class TestBean { public void test() { } + } + + static class TestTrigger implements Trigger { + + public Date nextExecutionTime(TriggerContext triggerContext) { + return null; + } } } diff --git a/org.springframework.context/src/test/resources/org/springframework/scheduling/config/scheduledTasksContext.xml b/org.springframework.context/src/test/resources/org/springframework/scheduling/config/scheduledTasksContext.xml index 2a830e338ca19c5037f8110c8229155951d3e990..30e46c7bb8ace5404f972a1c1e48976ccd1d5b3b 100644 --- a/org.springframework.context/src/test/resources/org/springframework/scheduling/config/scheduledTasksContext.xml +++ b/org.springframework.context/src/test/resources/org/springframework/scheduling/config/scheduledTasksContext.xml @@ -12,10 +12,13 @@ + + +