diff --git a/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/CronTriggerObject.cs b/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/CronTriggerObject.cs index 4bf86237..3bd455e0 100644 --- a/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/CronTriggerObject.cs +++ b/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/CronTriggerObject.cs @@ -20,6 +20,7 @@ using System.Reflection; using Quartz; using Spring.Objects.Factory; +using Spring.Util; namespace Spring.Scheduling.Quartz { @@ -52,9 +53,10 @@ namespace Spring.Scheduling.Quartz /// public class CronTriggerObject : CronTrigger, IJobDetailAwareTrigger, IObjectNameAware, IInitializingObject { - private JobDetail jobDetail; - private string objectName; private readonly Constants constants = new Constants(typeof(MisfireInstruction.CronTrigger), typeof(MisfireInstruction)); + private JobDetail jobDetail; + private string objectName; + private TimeSpan startDelay; /// /// Register objects in the JobDataMap via a given Map. @@ -115,8 +117,32 @@ namespace Spring.Scheduling.Quartz set { jobDetail = value; } } - /// + /// Set the start delay as . + /// + /// + /// + /// The start delay is added to the current system UTC time + /// (when the object starts) to control the + /// of the trigger. + /// + /// + /// If the start delay is non-zero it will always + /// take precedence over start time. + /// + /// + /// the start delay, as object. + public TimeSpan StartDelay + { + set + { + AssertUtils.State(value > TimeSpan.Zero, "Start delay cannot be negative."); + startDelay = value; + } + get { return startDelay; } + } + + /// /// Invoked by an /// after it has injected all of an object's dependencies. /// @@ -144,6 +170,10 @@ namespace Spring.Scheduling.Quartz /// public virtual void AfterPropertiesSet() { + if (StartDelay > TimeSpan.Zero) + { + StartTimeUtc = DateTime.UtcNow.Add(startDelay); + } if (Name == null) { Name = objectName; diff --git a/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/CronTriggerObjectTest.cs b/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/CronTriggerObjectTest.cs index c1bed77c..7532140b 100644 --- a/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/CronTriggerObjectTest.cs +++ b/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/CronTriggerObjectTest.cs @@ -14,6 +14,7 @@ * limitations under the License. */ +using System; using System.Collections; using NUnit.Framework; @@ -85,6 +86,25 @@ namespace Spring.Scheduling.Quartz CollectionAssert.AreEqual(data, cronTrigger.JobDataMap, "Data differed"); } + /// + /// Tests that StartDelay is respected. + /// + [Test] + public void TestStartDelay() + { + TimeSpan expectedDelay = TimeSpan.FromMinutes(10); + cronTrigger.StartDelay = expectedDelay; + Assert.AreEqual(expectedDelay, cronTrigger.StartDelay); + + cronTrigger.AfterPropertiesSet(); + DateTime now = DateTime.UtcNow; + TimeSpan delay = cronTrigger.StartTimeUtc - now; + + // check roughly + Assert.IsTrue(delay > TimeSpan.FromMinutes(9).Add(TimeSpan.FromSeconds(55))); + Assert.IsTrue(delay < TimeSpan.FromMinutes(10).Add(TimeSpan.FromSeconds(5))); + } + } }