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