diff --git a/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/SchedulerFactoryObject.cs b/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/SchedulerFactoryObject.cs
index 789f51ec..998e84ae 100644
--- a/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/SchedulerFactoryObject.cs
+++ b/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/SchedulerFactoryObject.cs
@@ -26,6 +26,7 @@ using Quartz.Spi;
using Quartz.Util;
using Spring.Context;
+using Spring.Context.Events;
using Spring.Core.IO;
using Spring.Data.Common;
using Spring.Objects.Factory;
@@ -73,7 +74,8 @@ namespace Spring.Scheduling.Quartz
///
///
///
- public class SchedulerFactoryObject : SchedulerAccessor, IFactoryObject, IObjectNameAware, IApplicationContextAware, IInitializingObject, IDisposable
+ public class SchedulerFactoryObject : SchedulerAccessor, IFactoryObject, IObjectNameAware,
+ IApplicationContextAware, IApplicationEventListener, IInitializingObject, IDisposable
{
///
/// Default thread count to be set to thread pool.
@@ -616,12 +618,6 @@ namespace Spring.Scheduling.Quartz
RegisterListeners();
RegisterJobsAndTriggers();
-
- // Start Scheduler immediately, if demanded.
- if (autoStartup)
- {
- StartScheduler(scheduler, startupDelay);
- }
}
#endregion
@@ -841,5 +837,23 @@ namespace Spring.Scheduling.Quartz
}
}
+ ///
+ /// Handles the application context's refresh event and starts the scheduler.
+ ///
+ public void HandleApplicationEvent(object sender, ApplicationEventArgs e)
+ {
+ // auto-start Scheduler if demanded
+ if (e is ContextRefreshedEventArgs && autoStartup)
+ {
+ try
+ {
+ StartScheduler(scheduler, startupDelay);
+ }
+ catch (SchedulerException ex)
+ {
+ throw new ObjectInitializationException("failed to auto-start scheduler", ex);
+ }
+ }
+ }
}
}
diff --git a/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/QuartzSupportTests.cs b/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/QuartzSupportTests.cs
index 80a77ad9..f2323b9c 100644
--- a/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/QuartzSupportTests.cs
+++ b/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/QuartzSupportTests.cs
@@ -158,6 +158,7 @@ namespace Spring.Scheduling.Quartz
try
{
schedulerFactoryObject.AfterPropertiesSet();
+ schedulerFactoryObject.Start();
}
finally
{
@@ -254,6 +255,7 @@ namespace Spring.Scheduling.Quartz
try
{
schedulerFactoryObject.AfterPropertiesSet();
+ schedulerFactoryObject.Start();
}
finally
{
@@ -359,6 +361,7 @@ namespace Spring.Scheduling.Quartz
try
{
schedulerFactoryObject.AfterPropertiesSet();
+ schedulerFactoryObject.Start();
}
finally
{
@@ -405,6 +408,7 @@ namespace Spring.Scheduling.Quartz
try
{
schedulerFactoryObject.AfterPropertiesSet();
+ schedulerFactoryObject.Start();
}
finally
{
@@ -570,6 +574,7 @@ namespace Spring.Scheduling.Quartz
try
{
schedulerFactoryObject.AfterPropertiesSet();
+ schedulerFactoryObject.Start();
}
finally
{
@@ -605,6 +610,7 @@ namespace Spring.Scheduling.Quartz
try
{
schedulerFactoryObject.AfterPropertiesSet();
+ schedulerFactoryObject.Start();
IScheduler returnedScheduler = (IScheduler) schedulerFactoryObject.GetObject();
Assert.AreEqual(tb, returnedScheduler.Context["testObject"]);
Assert.AreEqual(ac, returnedScheduler.Context["appCtx"]);
@@ -715,17 +721,18 @@ namespace Spring.Scheduling.Quartz
trigger.RepeatCount = (1);
trigger.AfterPropertiesSet();
- SchedulerFactoryObject bean = new SchedulerFactoryObject();
- bean.TaskExecutor = (taskExecutor);
- bean.Triggers = (new Trigger[] {trigger});
- bean.JobDetails = (new JobDetail[] {jobDetail});
- bean.AfterPropertiesSet();
+ SchedulerFactoryObject factoryObject = new SchedulerFactoryObject();
+ factoryObject.TaskExecutor = (taskExecutor);
+ factoryObject.Triggers = (new Trigger[] {trigger});
+ factoryObject.JobDetails = (new JobDetail[] {jobDetail});
+ factoryObject.AfterPropertiesSet();
+ factoryObject.Start();
Thread.Sleep(500);
Assert.IsTrue(DummyJob.count > 0);
Assert.AreEqual(DummyJob.count, taskExecutor.count);
- bean.Dispose();
+ factoryObject.Dispose();
}
///
@@ -747,15 +754,16 @@ namespace Spring.Scheduling.Quartz
trigger.RepeatCount = (1);
trigger.AfterPropertiesSet();
- SchedulerFactoryObject bean = new SchedulerFactoryObject();
- bean.Triggers = (new Trigger[] {trigger});
- bean.JobDetails = (new JobDetail[] {jobDetail});
- bean.AfterPropertiesSet();
+ SchedulerFactoryObject factoryObject = new SchedulerFactoryObject();
+ factoryObject.Triggers = (new Trigger[] {trigger});
+ factoryObject.JobDetails = (new JobDetail[] {jobDetail});
+ factoryObject.AfterPropertiesSet();
+ factoryObject.Start();
Thread.Sleep(500);
Assert.IsTrue(DummyRunnable.count > 0);
- bean.Dispose();
+ factoryObject.Dispose();
}
///
@@ -779,16 +787,17 @@ namespace Spring.Scheduling.Quartz
trigger.RepeatCount = (1);
trigger.AfterPropertiesSet();
- SchedulerFactoryObject sfo = new SchedulerFactoryObject();
- sfo.Triggers = (new Trigger[] {trigger});
- sfo.JobDetails = (new JobDetail[] {jobDetail});
- sfo.AfterPropertiesSet();
+ SchedulerFactoryObject factoryObject = new SchedulerFactoryObject();
+ factoryObject.Triggers = (new Trigger[] {trigger});
+ factoryObject.JobDetails = (new JobDetail[] {jobDetail});
+ factoryObject.AfterPropertiesSet();
+ factoryObject.Start();
Thread.Sleep(500);
Assert.AreEqual(10, DummyJobObject.param);
Assert.IsTrue(DummyJobObject.count > 0);
- sfo.Dispose();
+ factoryObject.Dispose();
}
///
@@ -813,17 +822,18 @@ namespace Spring.Scheduling.Quartz
trigger.RepeatCount = (1);
trigger.AfterPropertiesSet();
- SchedulerFactoryObject bean = new SchedulerFactoryObject();
- bean.JobFactory = (new SpringObjectJobFactory());
- bean.Triggers = (new Trigger[] {trigger});
- bean.JobDetails = (new JobDetail[] {jobDetail});
- bean.AfterPropertiesSet();
+ SchedulerFactoryObject factoryObject = new SchedulerFactoryObject();
+ factoryObject.JobFactory = (new SpringObjectJobFactory());
+ factoryObject.Triggers = (new Trigger[] {trigger});
+ factoryObject.JobDetails = (new JobDetail[] {jobDetail});
+ factoryObject.AfterPropertiesSet();
+ factoryObject.Start();
Thread.Sleep(500);
Assert.AreEqual(10, DummyJob.param);
Assert.IsTrue(DummyJob.count > 0);
- bean.Dispose();
+ factoryObject.Dispose();
}
///
@@ -884,17 +894,18 @@ namespace Spring.Scheduling.Quartz
trigger.RepeatCount = (1);
trigger.AfterPropertiesSet();
- SchedulerFactoryObject bean = new SchedulerFactoryObject();
- bean.JobFactory = (new SpringObjectJobFactory());
- bean.Triggers = (new Trigger[] {trigger});
- bean.JobDetails = (new JobDetail[] {jobDetail});
- bean.AfterPropertiesSet();
+ SchedulerFactoryObject factoryObject = new SchedulerFactoryObject();
+ factoryObject.JobFactory = (new SpringObjectJobFactory());
+ factoryObject.Triggers = (new Trigger[] {trigger});
+ factoryObject.JobDetails = (new JobDetail[] {jobDetail});
+ factoryObject.AfterPropertiesSet();
+ factoryObject.Start();
Thread.Sleep(500);
Assert.AreEqual(10, DummyRunnable.param);
Assert.IsTrue(DummyRunnable.count > 0);
- bean.Dispose();
+ factoryObject.Dispose();
}
///
@@ -918,17 +929,18 @@ namespace Spring.Scheduling.Quartz
trigger.RepeatCount = (1);
trigger.AfterPropertiesSet();
- SchedulerFactoryObject bean = new SchedulerFactoryObject();
- bean.JobFactory = (new SpringObjectJobFactory());
- bean.Triggers = (new Trigger[] {trigger});
- bean.JobDetails = (new JobDetail[] {jobDetail});
- bean.AfterPropertiesSet();
+ SchedulerFactoryObject factoryObject = new SchedulerFactoryObject();
+ factoryObject.JobFactory = (new SpringObjectJobFactory());
+ factoryObject.Triggers = (new Trigger[] {trigger});
+ factoryObject.JobDetails = (new JobDetail[] {jobDetail});
+ factoryObject.AfterPropertiesSet();
+ factoryObject.Start();
Thread.Sleep(500);
Assert.AreEqual(10, DummyJobObject.param);
Assert.IsTrue(DummyJobObject.count > 0);
- bean.Dispose();
+ factoryObject.Dispose();
}
///
@@ -940,17 +952,18 @@ namespace Spring.Scheduling.Quartz
DummyJob.param = 0;
DummyJob.count = 0;
- SchedulerFactoryObject bean = new SchedulerFactoryObject();
- bean.JobFactory = (new SpringObjectJobFactory());
- bean.JobSchedulingDataLocation = ("job-scheduling-data.xml");
+ SchedulerFactoryObject factoryObject = new SchedulerFactoryObject();
+ factoryObject.JobFactory = (new SpringObjectJobFactory());
+ factoryObject.JobSchedulingDataLocation = ("job-scheduling-data.xml");
// TODO bean.ResourceLoader = (new FileSystemResourceLoader());
- bean.AfterPropertiesSet();
+ factoryObject.AfterPropertiesSet();
+ factoryObject.Start();
Thread.Sleep(500);
Assert.AreEqual(10, DummyJob.param);
Assert.IsTrue(DummyJob.count > 0);
- bean.Dispose();
+ factoryObject.Dispose();
}
@@ -1039,6 +1052,33 @@ namespace Spring.Scheduling.Quartz
}
}
+ [Test]
+ public void TestSchedulerAutoStartsOnContextRefreshedEventByDefault()
+ {
+ StaticApplicationContext context = new StaticApplicationContext();
+ context.RegisterObjectDefinition("scheduler", new RootObjectDefinition(typeof (SchedulerFactoryObject)));
+ IScheduler scheduler = (IScheduler) context.GetObject("scheduler", typeof (IScheduler));
+ Assert.IsFalse(scheduler.IsStarted);
+ context.Refresh();
+ Assert.IsTrue(scheduler.IsStarted);
+ }
+
+ [Test]
+ public void TestSchedulerAutoStartupFalse()
+ {
+ StaticApplicationContext context = new StaticApplicationContext();
+ ObjectDefinitionBuilder beanDefinition = ObjectDefinitionBuilder
+ .GenericObjectDefinition(typeof(SchedulerFactoryObject))
+ .AddPropertyValue("autoStartup", false);
+
+ context.RegisterObjectDefinition("scheduler", beanDefinition.ObjectDefinition);
+ IScheduler scheduler = (IScheduler) context.GetObject("scheduler", typeof(IScheduler));
+
+ Assert.IsFalse(scheduler.IsStarted);
+ context.Refresh();
+ Assert.IsFalse(scheduler.IsStarted);
+ }
+
///
/// Tests how scheduler is exposed to application context.
///