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. ///