From ac176da5154cdd7e78f1d8d8d7e9ba369aa4f2f9 Mon Sep 17 00:00:00 2001 From: Mark Fisher Date: Fri, 3 Jun 2011 18:54:21 +0000 Subject: [PATCH] SPR-8205 added support for a 'trigger' attribute (bean ref) on scheduled-task elements git-svn-id: https://src.springframework.org/svn/spring-framework/trunk@4441 50f2f4bb-b051-0410-bef5-90022cba6387 --- .../ScheduledTasksBeanDefinitionParser.java | 46 ++++++++++++------- .../scheduling/config/spring-task-3.1.xsd | 7 +++ ...heduledTasksBeanDefinitionParserTests.java | 19 ++++++++ .../config/scheduledTasksContext.xml | 3 ++ 4 files changed, 58 insertions(+), 17 deletions(-) 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 9a75475ec1c..a4e624ec815 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 25507e79eb9..402d255594e 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 2a830e338ca..30e46c7bb8a 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 @@ + + +