SPRNET-1342: Quartz scheduler should not start until context is refreshed

This commit is contained in:
lahma
2010-07-13 10:27:07 +00:00
parent 46ec969e09
commit 4a501f3e71
2 changed files with 100 additions and 46 deletions

View File

@@ -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
/// <seealso cref="IScheduler" />
/// <seealso cref="ISchedulerFactory" />
/// <seealso cref="StdSchedulerFactory" />
public class SchedulerFactoryObject : SchedulerAccessor, IFactoryObject, IObjectNameAware, IApplicationContextAware, IInitializingObject, IDisposable
public class SchedulerFactoryObject : SchedulerAccessor, IFactoryObject, IObjectNameAware,
IApplicationContextAware, IApplicationEventListener, IInitializingObject, IDisposable
{
/// <summary>
/// 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
}
}
/// <summary>
/// Handles the application context's refresh event and starts the scheduler.
/// </summary>
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);
}
}
}
}
}

View File

@@ -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();
}
/// <summary>
@@ -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();
}
/// <summary>
@@ -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();
}
/// <summary>
@@ -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();
}
/// <summary>
@@ -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();
}
///<summary>
@@ -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();
}
/// <summary>
@@ -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);
}
/// <summary>
/// Tests how scheduler is exposed to application context.
/// </summary>