From fa894204d3f36f249cb9d92606421ec005ef5361 Mon Sep 17 00:00:00 2001 From: Marko Lahma Date: Sat, 11 Feb 2012 17:55:35 +0200 Subject: [PATCH] Initial version of Quartz 2.0 integration --- .gitignore | 20 + Spring.build | 26 +- .../solutions/Spring.Net.Quartz.2008.sln | 39 + lib/{Mono => Quartz10/mono}/2.0/Quartz.dll | Bin .../net}/2.0/Common.Logging.pdb | Bin lib/{Net => Quartz10/net}/2.0/Quartz.dll | Bin lib/{Net => Quartz10/net}/2.0/Quartz.xml | 34210 ++++++++-------- lib/Quartz10/net/3.5/Common.Logging.pdb | Bin 0 -> 52736 bytes lib/{Net => Quartz10/net}/3.5/Quartz.dll | Bin lib/{Net => Quartz10/net}/3.5/Quartz.xml | 34210 ++++++++-------- lib/Quartz10/net/4.0/Common.Logging.pdb | Bin 0 -> 52736 bytes lib/{Net => Quartz10/net}/4.0/Quartz.dll | Bin lib/{Net => Quartz10/net}/4.0/Quartz.xml | 34210 ++++++++-------- lib/Quartz20/mono/3.5/C5.dll | Bin 0 -> 272384 bytes lib/Quartz20/mono/3.5/Quartz.dll | Bin 0 -> 491520 bytes lib/Quartz20/mono/3.5/Quartz.xml | 19889 +++++++++ lib/Quartz20/mono/4.0/C5.dll | Bin 0 -> 272384 bytes lib/Quartz20/mono/4.0/Quartz.dll | Bin 0 -> 479744 bytes lib/Quartz20/mono/4.0/Quartz.xml | 19889 +++++++++ lib/Quartz20/net/3.5/C5.dll | Bin 0 -> 272384 bytes lib/Quartz20/net/3.5/Quartz.dll | Bin 0 -> 491520 bytes lib/Quartz20/net/3.5/Quartz.xml | 19889 +++++++++ lib/Quartz20/net/4.0/C5.dll | Bin 0 -> 272384 bytes lib/Quartz20/net/4.0/Quartz.dll | Bin 0 -> 479744 bytes lib/Quartz20/net/4.0/Quartz.xml | 19889 +++++++++ .../Scheduling/Quartz/AdaptableJobFactory.cs | 63 +- .../Scheduling/Quartz/DelegatingJob.cs | 7 +- .../Quartz/IJobDetailAwareTrigger.cs | 9 +- .../Quartz/ISchedulingTaskExecutor.cs | 32 +- .../Quartz/LocalTaskExecutorThreadPool.cs | 37 +- .../Scheduling/Quartz/MethodInvokingJob.cs | 6 + .../Quartz/MethodInvokingRunnable.cs | 9 +- .../Scheduling/Quartz/QuartzJobObject.cs | 7 + .../Quartz/SchedulerFactoryObject.cs | 18 +- .../Spring.Scheduling.Quartz.2008.csproj | 8 +- .../Spring.Scheduling.Quartz.2010.csproj | 9 +- .../Spring.Scheduling.Quartz.build | 8 + .../Scheduling/Quartz/CronTriggerObject.cs | 235 + .../Scheduling/Quartz/JobDetailObject.cs | 220 + .../MethodInvokingJobDetailFactoryObject.cs | 292 + .../Scheduling/Quartz/SchedulerAccessor.cs | 451 + .../Scheduling/Quartz/SimpleTriggerObject.cs | 215 + .../Quartz/StatefulMethodInvokingJob.cs | 33 + .../Spring.Scheduling.Quartz20.2008.csproj | 136 + .../Spring.Scheduling.Quartz20.2010.csproj | 134 + .../Spring.Scheduling.Quartz20.build | 56 + .../Spring.Scheduling.Quartz20.nuspec | 30 + ...uling.Quartz.Integration.Tests.2008.csproj | 6 +- ...uling.Quartz.Integration.Tests.2010.csproj | 91 + ...duling.Quartz.Integration.Tests.dll.config | 4 +- .../Quartz/AdaptableJobFactoryTest.cs | 21 +- .../Quartz/CronTriggerObjectTest.cs | 8 +- ...ethodInvokingJobDetailFactoryObjectTest.cs | 8 + .../Quartz/MethodInvokingJobTest.cs | 6 + .../Scheduling/Quartz/QuartzSupportTests.cs | 298 +- .../Quartz/SchedulerFactoryObjectTest.cs | 143 +- .../Quartz/SimpleTriggerObjectTest.cs | 9 +- .../Quartz/SpringObjectJobFactoryTest.cs | 32 +- .../Scheduling/Quartz/TestUtil.cs | 5 + .../Scheduling/Quartz/TriggerObjectTest.cs | 68 +- ...Spring.Scheduling.Quartz.Tests.2008.csproj | 8 +- ...Spring.Scheduling.Quartz.Tests.2010.csproj | 5 +- .../Quartz/LocalDataSourceJobStoreTest.cs | 51 + .../Quartz/LocalDataSourceJobStoreTest.xml | 63 + .../Scheduling/Quartz/TestJob.cs | 20 + ...ing.Quartz20.Integration.Tests.2008.csproj | 81 + ...ing.Quartz20.Integration.Tests.2010.csproj | 127 + ...cheduling.Quartz20.Integration.Tests.build | 73 + ...ling.Quartz20.Integration.Tests.dll.config | 41 + ...ring.Scheduling.Quartz20.Tests.2008.csproj | 142 + ...ring.Scheduling.Quartz20.Tests.2010.csproj | 148 + .../Spring.Scheduling.Quartz20.Tests.build | 79 + ...pring.Scheduling.Quartz20.Tests.dll.config | 4 + .../job-scheduling-data.xml | 39 + ...ipleAnonymousMethodInvokingJobDetailFB.xml | 45 + .../multipleSchedulers.xml | 16 + .../schedulerAccessorObject.xml | 48 + .../schedulerRepositoryExposure.xml | 52 + 78 files changed, 134392 insertions(+), 51635 deletions(-) rename lib/{Mono => Quartz10/mono}/2.0/Quartz.dll (100%) rename lib/{Mono => Quartz10/net}/2.0/Common.Logging.pdb (100%) rename lib/{Net => Quartz10/net}/2.0/Quartz.dll (100%) rename lib/{Net => Quartz10/net}/2.0/Quartz.xml (98%) create mode 100644 lib/Quartz10/net/3.5/Common.Logging.pdb rename lib/{Net => Quartz10/net}/3.5/Quartz.dll (100%) rename lib/{Net => Quartz10/net}/3.5/Quartz.xml (98%) create mode 100644 lib/Quartz10/net/4.0/Common.Logging.pdb rename lib/{Net => Quartz10/net}/4.0/Quartz.dll (100%) rename lib/{Net => Quartz10/net}/4.0/Quartz.xml (98%) create mode 100644 lib/Quartz20/mono/3.5/C5.dll create mode 100644 lib/Quartz20/mono/3.5/Quartz.dll create mode 100644 lib/Quartz20/mono/3.5/Quartz.xml create mode 100644 lib/Quartz20/mono/4.0/C5.dll create mode 100644 lib/Quartz20/mono/4.0/Quartz.dll create mode 100644 lib/Quartz20/mono/4.0/Quartz.xml create mode 100644 lib/Quartz20/net/3.5/C5.dll create mode 100644 lib/Quartz20/net/3.5/Quartz.dll create mode 100644 lib/Quartz20/net/3.5/Quartz.xml create mode 100644 lib/Quartz20/net/4.0/C5.dll create mode 100644 lib/Quartz20/net/4.0/Quartz.dll create mode 100644 lib/Quartz20/net/4.0/Quartz.xml create mode 100644 src/Spring/Spring.Scheduling.Quartz20/Scheduling/Quartz/CronTriggerObject.cs create mode 100644 src/Spring/Spring.Scheduling.Quartz20/Scheduling/Quartz/JobDetailObject.cs create mode 100644 src/Spring/Spring.Scheduling.Quartz20/Scheduling/Quartz/MethodInvokingJobDetailFactoryObject.cs create mode 100644 src/Spring/Spring.Scheduling.Quartz20/Scheduling/Quartz/SchedulerAccessor.cs create mode 100644 src/Spring/Spring.Scheduling.Quartz20/Scheduling/Quartz/SimpleTriggerObject.cs create mode 100644 src/Spring/Spring.Scheduling.Quartz20/Scheduling/Quartz/StatefulMethodInvokingJob.cs create mode 100644 src/Spring/Spring.Scheduling.Quartz20/Spring.Scheduling.Quartz20.2008.csproj create mode 100644 src/Spring/Spring.Scheduling.Quartz20/Spring.Scheduling.Quartz20.2010.csproj create mode 100644 src/Spring/Spring.Scheduling.Quartz20/Spring.Scheduling.Quartz20.build create mode 100644 src/Spring/Spring.Scheduling.Quartz20/Spring.Scheduling.Quartz20.nuspec create mode 100644 test/Spring/Spring.Scheduling.Quartz.Integration.Tests/Spring.Scheduling.Quartz.Integration.Tests.2010.csproj create mode 100644 test/Spring/Spring.Scheduling.Quartz20.Integration.Tests/Scheduling/Quartz/LocalDataSourceJobStoreTest.cs create mode 100644 test/Spring/Spring.Scheduling.Quartz20.Integration.Tests/Scheduling/Quartz/LocalDataSourceJobStoreTest.xml create mode 100644 test/Spring/Spring.Scheduling.Quartz20.Integration.Tests/Scheduling/Quartz/TestJob.cs create mode 100644 test/Spring/Spring.Scheduling.Quartz20.Integration.Tests/Spring.Scheduling.Quartz20.Integration.Tests.2008.csproj create mode 100644 test/Spring/Spring.Scheduling.Quartz20.Integration.Tests/Spring.Scheduling.Quartz20.Integration.Tests.2010.csproj create mode 100644 test/Spring/Spring.Scheduling.Quartz20.Integration.Tests/Spring.Scheduling.Quartz20.Integration.Tests.build create mode 100644 test/Spring/Spring.Scheduling.Quartz20.Integration.Tests/Spring.Scheduling.Quartz20.Integration.Tests.dll.config create mode 100644 test/Spring/Spring.Scheduling.Quartz20.Tests/Spring.Scheduling.Quartz20.Tests.2008.csproj create mode 100644 test/Spring/Spring.Scheduling.Quartz20.Tests/Spring.Scheduling.Quartz20.Tests.2010.csproj create mode 100644 test/Spring/Spring.Scheduling.Quartz20.Tests/Spring.Scheduling.Quartz20.Tests.build create mode 100644 test/Spring/Spring.Scheduling.Quartz20.Tests/Spring.Scheduling.Quartz20.Tests.dll.config create mode 100644 test/Spring/Spring.Scheduling.Quartz20.Tests/job-scheduling-data.xml create mode 100644 test/Spring/Spring.Scheduling.Quartz20.Tests/multipleAnonymousMethodInvokingJobDetailFB.xml create mode 100644 test/Spring/Spring.Scheduling.Quartz20.Tests/multipleSchedulers.xml create mode 100644 test/Spring/Spring.Scheduling.Quartz20.Tests/schedulerAccessorObject.xml create mode 100644 test/Spring/Spring.Scheduling.Quartz20.Tests/schedulerRepositoryExposure.xml diff --git a/.gitignore b/.gitignore index 9eb13c05..db50b6cc 100644 --- a/.gitignore +++ b/.gitignore @@ -43,3 +43,23 @@ buildlog.txt # XMLmind temporary files *.xml~ + +*.dotCover +/src/Spring/Spring.Aop/Spring.Aop.xml +/src/Spring/Spring.Core/Spring.Core.xml +/src/Spring/Spring.Data.NHibernate12/Spring.Data.NHibernate12.xml +/src/Spring/Spring.Data.NHibernate20/Spring.Data.NHibernate20.xml +/src/Spring/Spring.Data.NHibernate21/Spring.Data.NHibernate21.xml +/src/Spring/Spring.Data.NHibernate30/Spring.Data.NHibernate30.xml +/src/Spring/Spring.Data.NHibernate31/Spring.Data.NHibernate31.xml +/src/Spring/Spring.Data.NHibernate32/Spring.Data.NHibernate32.xml +/src/Spring/Spring.Messaging.Nms/Spring.Messaging.Nms.xml +/src/Spring/Spring.Messaging/Spring.Messaging.xml +/src/Spring/Spring.Data/Spring.Data.xml +/src/Spring/Spring.Web/Spring.Web.xml +/src/Spring/Spring.Web.Mvc/Spring.Web.Mvc.xml +/src/Spring/Spring.Web.Mvc3/Spring.Web.Mvc3.xml +/src/Spring/Spring.Testing.NUnit/Spring.Testing.NUnit.xml +/src/Spring/Spring.Services/Spring.Services.xml +/src/Spring/Spring.Web.Extensions/Spring.Web.Extensions.xml +/src/Spring/GenCommonAssemblyInfo.cs \ No newline at end of file diff --git a/Spring.build b/Spring.build index 30dd8597..86d5b91a 100644 --- a/Spring.build +++ b/Spring.build @@ -430,6 +430,8 @@ Commandline Examples: + + @@ -568,6 +570,8 @@ Commandline Examples: + + @@ -845,6 +849,8 @@ Commandline Examples: + + @@ -900,6 +906,8 @@ Commandline Examples: + + @@ -1545,9 +1553,14 @@ Commandline Examples: + + + + @@ -1579,9 +1592,14 @@ Commandline Examples: - - - + + + + @@ -1802,6 +1820,7 @@ Commandline Examples: + @@ -1832,6 +1851,7 @@ Commandline Examples: + diff --git a/build-support/solutions/Spring.Net.Quartz.2008.sln b/build-support/solutions/Spring.Net.Quartz.2008.sln index 832a462d..709b7e5e 100644 --- a/build-support/solutions/Spring.Net.Quartz.2008.sln +++ b/build-support/solutions/Spring.Net.Quartz.2008.sln @@ -23,6 +23,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spring.Scheduling.Quartz.In EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spring.Core.Tests.2008", "..\..\test\Spring\Spring.Core.Tests\Spring.Core.Tests.2008.csproj", "{44B16BAA-6DF8-447C-9D7F-3AD3D854D904}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spring.Scheduling.Quartz20.Integration.Tests.2008", "..\..\test\Spring\Spring.Scheduling.Quartz20.Integration.Tests\Spring.Scheduling.Quartz20.Integration.Tests.2008.csproj", "{8CF0F34A-CC93-4D87-AE14-A2DEEF072F26}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spring.Scheduling.Quartz20.Tests.2008", "..\..\test\Spring\Spring.Scheduling.Quartz20.Tests\Spring.Scheduling.Quartz20.Tests.2008.csproj", "{47E7DF97-2515-4F2F-BBFD-0A4C205800DE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spring.Scheduling.Quartz20.2008", "..\..\src\Spring\Spring.Scheduling.Quartz20\Spring.Scheduling.Quartz20.2008.csproj", "{764C3A6A-8690-49DD-B9AF-99E7C09AE4F0}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|.NET = Debug|.NET @@ -109,6 +115,36 @@ Global {44B16BAA-6DF8-447C-9D7F-3AD3D854D904}.Release|Any CPU.Build.0 = Release|Any CPU {44B16BAA-6DF8-447C-9D7F-3AD3D854D904}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {44B16BAA-6DF8-447C-9D7F-3AD3D854D904}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {8CF0F34A-CC93-4D87-AE14-A2DEEF072F26}.Debug|.NET.ActiveCfg = Debug|Any CPU + {8CF0F34A-CC93-4D87-AE14-A2DEEF072F26}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8CF0F34A-CC93-4D87-AE14-A2DEEF072F26}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8CF0F34A-CC93-4D87-AE14-A2DEEF072F26}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {8CF0F34A-CC93-4D87-AE14-A2DEEF072F26}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {8CF0F34A-CC93-4D87-AE14-A2DEEF072F26}.Release|.NET.ActiveCfg = Release|Any CPU + {8CF0F34A-CC93-4D87-AE14-A2DEEF072F26}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8CF0F34A-CC93-4D87-AE14-A2DEEF072F26}.Release|Any CPU.Build.0 = Release|Any CPU + {8CF0F34A-CC93-4D87-AE14-A2DEEF072F26}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {8CF0F34A-CC93-4D87-AE14-A2DEEF072F26}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {47E7DF97-2515-4F2F-BBFD-0A4C205800DE}.Debug|.NET.ActiveCfg = Debug|Any CPU + {47E7DF97-2515-4F2F-BBFD-0A4C205800DE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {47E7DF97-2515-4F2F-BBFD-0A4C205800DE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {47E7DF97-2515-4F2F-BBFD-0A4C205800DE}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {47E7DF97-2515-4F2F-BBFD-0A4C205800DE}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {47E7DF97-2515-4F2F-BBFD-0A4C205800DE}.Release|.NET.ActiveCfg = Release|Any CPU + {47E7DF97-2515-4F2F-BBFD-0A4C205800DE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {47E7DF97-2515-4F2F-BBFD-0A4C205800DE}.Release|Any CPU.Build.0 = Release|Any CPU + {47E7DF97-2515-4F2F-BBFD-0A4C205800DE}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {47E7DF97-2515-4F2F-BBFD-0A4C205800DE}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {764C3A6A-8690-49DD-B9AF-99E7C09AE4F0}.Debug|.NET.ActiveCfg = Debug|Any CPU + {764C3A6A-8690-49DD-B9AF-99E7C09AE4F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {764C3A6A-8690-49DD-B9AF-99E7C09AE4F0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {764C3A6A-8690-49DD-B9AF-99E7C09AE4F0}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {764C3A6A-8690-49DD-B9AF-99E7C09AE4F0}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {764C3A6A-8690-49DD-B9AF-99E7C09AE4F0}.Release|.NET.ActiveCfg = Release|Any CPU + {764C3A6A-8690-49DD-B9AF-99E7C09AE4F0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {764C3A6A-8690-49DD-B9AF-99E7C09AE4F0}.Release|Any CPU.Build.0 = Release|Any CPU + {764C3A6A-8690-49DD-B9AF-99E7C09AE4F0}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {764C3A6A-8690-49DD-B9AF-99E7C09AE4F0}.Release|Mixed Platforms.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -118,9 +154,12 @@ Global {3A3A4E65-45A6-4B20-B460-0BEDC302C02C} = {438FE108-6F55-4C8A-8BF4-C85D0906D134} {AE00E5AB-C39A-436F-86D2-33BFE33E2E40} = {438FE108-6F55-4C8A-8BF4-C85D0906D134} {E823D54C-CE82-4868-929F-5F95A999F61E} = {438FE108-6F55-4C8A-8BF4-C85D0906D134} + {764C3A6A-8690-49DD-B9AF-99E7C09AE4F0} = {438FE108-6F55-4C8A-8BF4-C85D0906D134} {9FE720ED-2BD9-4FB9-89C8-FFFA4A491CB5} = {5ECE7B2B-6975-4800-982E-618794909499} {E4328F68-C3FC-43E2-9D63-30CEC55215B0} = {5ECE7B2B-6975-4800-982E-618794909499} {44B16BAA-6DF8-447C-9D7F-3AD3D854D904} = {5ECE7B2B-6975-4800-982E-618794909499} + {8CF0F34A-CC93-4D87-AE14-A2DEEF072F26} = {5ECE7B2B-6975-4800-982E-618794909499} + {47E7DF97-2515-4F2F-BBFD-0A4C205800DE} = {5ECE7B2B-6975-4800-982E-618794909499} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution NAntAddinLastFileName = Spring.build diff --git a/lib/Mono/2.0/Quartz.dll b/lib/Quartz10/mono/2.0/Quartz.dll similarity index 100% rename from lib/Mono/2.0/Quartz.dll rename to lib/Quartz10/mono/2.0/Quartz.dll diff --git a/lib/Mono/2.0/Common.Logging.pdb b/lib/Quartz10/net/2.0/Common.Logging.pdb similarity index 100% rename from lib/Mono/2.0/Common.Logging.pdb rename to lib/Quartz10/net/2.0/Common.Logging.pdb diff --git a/lib/Net/2.0/Quartz.dll b/lib/Quartz10/net/2.0/Quartz.dll similarity index 100% rename from lib/Net/2.0/Quartz.dll rename to lib/Quartz10/net/2.0/Quartz.dll diff --git a/lib/Net/2.0/Quartz.xml b/lib/Quartz10/net/2.0/Quartz.xml similarity index 98% rename from lib/Net/2.0/Quartz.xml rename to lib/Quartz10/net/2.0/Quartz.xml index 46ab8f66..e9a7dfc1 100644 --- a/lib/Net/2.0/Quartz.xml +++ b/lib/Quartz10/net/2.0/Quartz.xml @@ -1,17105 +1,17105 @@ - - - - Quartz - - - - - Collection manipulation related utility methods. - - - - - Removes the specified item from list of items and returns - whether removal was success. - - The items to remove from. - The item to remove. - - - - - A hash based set. - - - - - Represents a collection ob objects that contains no duplicate elements. - - - - - Adds a new element to the Collection if it is not already present. - - The object to add to the collection. - Returns true if the object was added to the collection, otherwise false. - - - - Adds all the elements of the specified collection to the Set. - - Collection of objects to add. - true - - - - Returns the first item in the set. - - First object. - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The whose elements are copied to the new list. - - is . - - - - Initializes a new instance of the class. - - The capacity. - - - - Unmodifiables the hash set. - - The collection. - - - - - Adds a new element to the ArrayList if it is not already present. - - Element to insert to the ArrayList. - Returns true if the new element was inserted, false otherwise. - - - - Adds all the elements of the specified collection that are not present to the list. - - Collection where the new elements will be added - Returns true if at least one element was added, false otherwise. - - - - Returns the first item in the set. - - First object. - - - - Returns a copy of the HashSet instance. - - Returns a shallow copy of the current HashSet. - - - - A sorted set. - - - - - Returns a portion of the list whose elements are greater than the limit object parameter. - - The start element of the portion to extract. - The portion of the collection whose elements are greater than the limit object parameter. - - - - SupportClass for the TreeSet class. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The whose elements are copied to the new list. - - is . - - - - Initializes a new instance of the class. - - The c. - - - - Unmodifiables the tree set. - - The collection. - - - - - Adds a new element to the ArrayList if it is not already present and sorts the ArrayList. - - Element to insert to the ArrayList. - TRUE if the new element was inserted, FALSE otherwise. - - - - Adds all the elements of the specified collection that are not present to the list. - - Collection where the new elements will be added - Returns true if at least one element was added to the collection. - - - - Returns the first item in the set. - - First object. - - - - Determines whether an element is in the the current TreeSetSupport collection. The IComparer defined for - the current set will be used to make comparisons between the elements already inserted in the collection and - the item specified. - - The object to be locatet in the current collection. - true if item is found in the collection; otherwise, false. - - - - Returns a portion of the list whose elements are greater than the limit object parameter. - - The start element of the portion to extract. - The portion of the collection whose elements are greater than the limit object parameter. - - - - Gets the IComparator object used to sort this set. - - - - - Responsible for creating the instances of - to be used within the instance. - - - Although this interface looks a lot like an 'object pool', implementations - do not have to support the re-use of instances. If an implementation does - not wish to pool instances, then the - method would simply create a new instance, and the - method would do nothing. - - James House - Marko Lahma (.NET) - - - - Initialize the factory, providing a handle to the - that should be made available within the and - the s within it, and a handle to the - that the shell will use in its own - operations with the . - - - - - Called by the - to obtain instances of . - - - - - Called by the - to return instances of . - - - - - JobRunShell instances are responsible for providing the 'safe' environment - for s to run in, and for performing all of the work of - executing the , catching ANY thrown exceptions, updating - the with the 's completion code, - etc. -

- A instance is created by a - on behalf of the which then runs the - shell in a thread from the configured when the - scheduler determines that a has been triggered. -

-
- - - - - James House - Marko Lahma (.NET) -
- - - This interface should be implemented by any class whose instances are intended - to be executed by a thread. - - - - - This method has to be implemented in order that starting of the thread causes the object's - run method to be called in that separately executing thread. - - - - - Create a JobRunShell instance with the given settings. - - A handle to the that produced - this . - The instance that should be made - available within the . - the that should be used by the - when making updates to the . - - - - Initializes the job execution context with given scheduler and bundle. - - The scheduler. - The bundle offired triggers. - - - - Requests the Shutdown. - - - - - This method has to be implemented in order that starting of the thread causes the object's - run method to be called in that separately executing thread. - - - - - Runs begin procedures on this instance. - - - - - Completes the execution. - - if set to true [successful execution]. - - - - Passivates this instance. - - - - - Completes the trigger retry loop. - - The trigger. - The job detail. - The inst code. - - - - - Vetoeds the job retry loop. - - The trigger. - The job detail. - The inst code. - - - - - This is the heart of Quartz, an indirect implementation of the - interface, containing methods to schedule s, - register instances, etc. - - - - - - James House - Marko Lahma (.NET) - - - - Starts this instance. - - - - - Standbies this instance. - - - - - Shutdowns this instance. - - - - - returns true if the given JobGroup - is paused - - The scheduling context. - - - - - - returns true if the given TriggerGroup - is paused - - - - - - - - Initializes the class. - - - - - Get the global - that has the given name. - - - - - - - Create a with the given configuration - properties. - - - - - - Bind the scheduler to remoting infrastructure. - - - - - Un-bind the scheduler from remoting infrastructure. - - - - - Adds an object that should be kept as reference to prevent - it from being garbage collected. - - The obj. - - - - Removes the object from garbae collection protected list. - - The obj. - - - - - Starts the 's threads that fire s. -

- All s that have misfired will - be passed to the appropriate TriggerListener(s). -

-
-
- - - Temporarily halts the 's firing of s. -

- The scheduler is not destroyed, and can be re-started at any time. -

-
-
- - - Halts the 's firing of s, - and cleans up all resources associated with the QuartzScheduler. - Equivalent to . -

- The scheduler cannot be re-started. -

-
-
- - - Halts the 's firing of s, - and cleans up all resources associated with the QuartzScheduler. -

- The scheduler cannot be re-started. -

-
- - if the scheduler will not allow this method - to return until all currently executing jobs have completed. - -
- - - Validates the state. - - - - - Add the identified by the given - to the Scheduler, and - associate the given with it. -

- If the given Trigger does not reference any , then it - will be set to reference the Job passed with it into this method. -

-
-
- - - Schedule the given with the - identified by the 's settings. - - - - - Add the given to the Scheduler - with no associated - . The will be 'dormant' until - it is scheduled with a , or - is called for it. -

- The must by definition be 'durable', if it is not, - SchedulerException will be thrown. -

-
-
- - - Delete the identified from the Scheduler - and any - associated s. - - true if the Job was found and deleted. - - - - Remove the indicated from the - scheduler. - - - - - Remove (delete) the with the - given name, and store the new given one - which must be associated - with the same job. - - The scheduling context. - The name of the to be removed. - The group name of the to be removed. - The new to be stored. - - if a with the given - name and group was not found and removed from the store, otherwise - the first fire time of the newly scheduled trigger. - - - - - Creates a new positive random number - - The last random obtained - Returns a new positive random number - - - - Trigger the identified (Execute it now) - with a non-volatile trigger. - - - - - Trigger the identified (Execute it - now) - with a volatile trigger. - - - - - Pause the with the given name. - - - - - Pause all of the s in the given group. - - - - - Pause the with the given - name - by pausing all of its current s. - - - - - Pause all of the s in the - given group - by pausing all of their s. - - - - - Resume (un-pause) the with the given - name. -

- If the missed one or more fire-times, then the - 's misfire instruction will be applied. -

-
-
- - - Resume (un-pause) all of the s in the - given group. -

- If any missed one or more fire-times, then the - 's misfire instruction will be applied. -

-
-
- - - Gets the paused trigger groups. - - The the job scheduling context. - - - - - Resume (un-pause) the with - the given name. -

- If any of the 's s missed one - or more fire-times, then the 's misfire - instruction will be applied. -

-
-
- - - Resume (un-pause) all of the s - in the given group. -

- If any of the s had s that - missed one or more fire-times, then the 's - misfire instruction will be applied. -

-
-
- - - Pause all triggers - equivalent of calling - on every group. -

- When is called (to un-pause), trigger misfire - instructions WILL be applied. -

-
- - -
- - - Resume (un-pause) all triggers - equivalent of calling - on every group. -

- If any missed one or more fire-times, then the - 's misfire instruction will be applied. -

-
- -
- - - Get the names of all known groups. - - - - - Get the names of all the s in the - given group. - - - - - Get all s that are associated with the - identified . - - - - - Get the names of all known - groups. - - - - - Get the names of all the s in - the given group. - - - - - Get the for the - instance with the given name and group. - - - - - Get the instance with the given name and - group. - - - - - Get the current state of the identified . - - - - - - - - - Add (register) the given to the Scheduler. - - - - - Delete the identified from the Scheduler. - - true if the Calendar was found and deleted. - - - - Get the instance with the given name. - - - - - Get the names of all registered s. - - - - - Add the given to the - 'sglobal list. -

- Listeners in the 'global' list receive notification of execution events - for ALL s. -

-
-
- - - Add the given to the - 's list, of registered s. - - - - - Remove the given from the - 's list of global listeners. - - - true if the identifed listener was found in the list, and removed. - - - - - Remove the identifed from the 's - list of global listeners. - - - true if the identifed listener was found in the list, and removed. - - - - Remove the identifed from - the 's list of registered listeners. - - - true if the identifed listener was found in the list, and removed. - - - - - Get the non-global that has the given name. - - - - - Add the given to the - 'sglobal list. -

- Listeners in the 'global' list receive notification of execution events - for ALL s. -

-
-
- - - Add the given to the - 's list, of registered s. - - - - - Remove the given from - the 's list of global listeners. - - - true if the identifed listener was found in the list, and removed. - - - - - Remove the identifed from the 's - list of global listeners. - - - true if the identifed listener was found in the list, and removed - - - - Remove the identifed - from the 's list of registered listeners. - - - true if the identifed listener was found in the list, and removed. - - - - - Get the non-global - that has the given name. - - - - - Get the global that - has the given name. - - - - - - - Register the given with the - . - - - - - Remove the given from the - . - - - true if the identifed listener was found in the list, and removed. - - - - - Notifies the job store job complete. - - The job scheduling context. - The trigger. - The detail. - The instruction code. - - - - Notifies the scheduler thread. - - - - - Notifies the trigger listeners about fired trigger. - - The job execution context. - - - - - Notifies the trigger listeners about misfired trigger. - - The trigger. - - - - Notifies the trigger listeners of completion. - - The job executution context. - The instruction code to report to triggers. - - - - Notifies the job listeners about job to be executed. - - The jec. - - - - Notifies the job listeners that job exucution was vetoed. - - The job execution context. - - - - Notifies the job listeners that job was executed. - - The jec. - The je. - - - - Notifies the scheduler listeners about scheduler error. - - The MSG. - The se. - - - - Notifies the scheduler listeners about job that was scheduled. - - The trigger. - - - - Notifies the scheduler listeners about job that was unscheduled. - - Name of the trigger. - The trigger group. - - - - Notifies the scheduler listeners about finalized trigger. - - The trigger. - - - - Notifies the scheduler listeners about paused trigger. - - The name. - The group. - - - - Notifies the scheduler listeners resumed trigger. - - The name. - The group. - - - - Notifies the scheduler listeners about paused job. - - The name. - The group. - - - - Notifies the scheduler listeners about resumed job. - - The name. - The group. - - - - Notifies the scheduler listeners about scheduler shutdown. - - - - - Interrupt all instances of the identified InterruptableJob. - - - - - Obtains a lifetime service object to control the lifetime policy for this instance. - - - - - Gets the version of the Quartz Scheduler. - - The version. - - - - Gets the version major. - - The version major. - - - - Gets the version minor. - - The version minor. - - - - Gets the version iteration. - - The version iteration. - - - - Gets the scheduler signaler. - - The scheduler signaler. - - - - Returns the name of the . - - - - - Returns the instance Id of the . - - - - - Returns the of the . - - - - - Gets or sets a value indicating whether to signal on scheduling change. - - - true if schduler should signal on scheduling change; otherwise, false. - - - - - Reports whether the is paused. - - - - - Gets the job store class. - - The job store class. - - - - Gets the thread pool class. - - The thread pool class. - - - - Gets the size of the thread pool. - - The size of the thread pool. - - - - Reports whether the has been Shutdown. - - - - - Return a list of objects that - represent all currently executing Jobs in this Scheduler instance. -

- This method is not cluster aware. That is, it will only return Jobs - currently executing in this Scheduler instance, not across the entire - cluster. -

-

- Note that the list returned is an 'instantaneous' snap-shot, and that as - soon as it's returned, the true list of executing jobs may be different. -

-
-
- - - Get a List containing all of the - s in the 'sglobal list. - - - - - Get a Set containing the names of all the non-global - s registered with the . - - - - - Get a list containing all of the - s in the 'sglobal list. - - - - - Get a Set containing the names of all the non-global - s registered with the . - - - - - Get a List containing all of the - s registered with the . - - - - - Gets or sets the job factory. - - The job factory. - - - - Gets the running since. - - The running since. - - - - Gets the number of jobs executed. - - The number of jobs executed. - - - - Gets a value indicating whether this scheduler supports persistence. - - true if supports persistence; otherwise, false. - - - - Helper class to start scheduler in a delayed fashion. - - - - - ErrorLogger - Scheduler Listener Class - - - - - A helpful abstract base class for implementors of - . - - - The methods in this class are empty so you only need to override the - subset for the events you care about. - - - - - - The interface to be implemented by classes that want to be informed of major - events. - - - - - James House - - - - Called by the when a - is scheduled. - - - - - Called by the when a - is unscheduled. - - - - - Called by the when a - has reached the condition in which it will never fire again. - - - - - Called by the when a - or group of s has been paused. -

- If a group was paused, then the parameter - will be null. -

-
- Name of the trigger. - The trigger group. -
- - - Called by the when a - or group of s has been un-paused. -

- If a group was resumed, then the parameter - will be null. -

-
- Name of the trigger. - The trigger group. -
- - - Called by the when a - or group of s has been paused. -

- If a group was paused, then the parameter will be - null. If all jobs were paused, then both parameters will be null. -

-
- Name of the job. - The job group. -
- - - Called by the when a - or group of s has been un-paused. -

- If a group was resumed, then the parameter will - be null. If all jobs were paused, then both parameters will be null. -

-
- The job group. -
- - - Called by the when a serious error has - occured within the scheduler - such as repeated failures in the , - or the inability to instantiate a instance when its - has fired. -

- The property of the given SchedulerException - can be used to determine more specific information about the type of - error that was encountered. -

-
-
- - - Called by the to inform the listener - that it has Shutdown. - - - - - Get the for this - type's category. This should be used by subclasses for logging. - - - - - The interface to be implemented by classes that want to be informed when a - executes. In general, applications that use a - will not have use for this mechanism. - - - - - - - James House - - - - Called by the when a - is about to be executed (an associated - has occured). -

- This method will not be invoked if the execution of the Job was vetoed - by a . -

-
- -
- - - Called by the when a - was about to be executed (an associated - has occured), but a vetoed it's - execution. - - - - - - Called by the after a - has been executed, and be for the associated 's - method has been called. - - - - - Get the name of the . - - - - - Contains all of the resources (,, - etc.) necessary to create a instance. - - - James House - Marko Lahma (.NET) - - - - Gets the unique identifier. - - Name of the scheduler. - The scheduler instance id. - - - - - Gets the unique identifier. - - - - - - Add the given for the - to use. This method expects the plugin's - "initialize" method to be invoked externally (either before or after - this method is called). - - - - - - Get or set the name for the . - - - if name is null or empty. - - - - - Get or set the instance Id for the . - - - if name is null or empty. - - - - - Get or set the name for the . - - - if name is null or empty. - - - - - Get or set the for the - to use. - - - if threadPool is null. - - - - - Get or set the for the - to use. - - - if jobStore is null. - - - - - Get or set the for the - to use. - - - if jobRunShellFactory is null. - - - - - Get the of all - s for the - to use. - - - - - - Gets or sets a value indicating whether to make scheduler thread daemon. - - - true if scheduler should be thread daemon; otherwise, false. - - - - - Gets or sets the scheduler exporter. - - The scheduler exporter. - - - - The thread responsible for performing the work of firing - s that are registered with the . - - - - - James House - Marko Lahma (.NET) - - - - Support class used to handle threads - - - - - The instance of System.Threading.Thread - - - - - Initializes a new instance of the QuartzThread class - - - - - Initializes a new instance of the Thread class. - - The name of the thread - - - - Initializes a new instance of the Thread class. - - A ThreadStart delegate that references the methods to be invoked when this thread begins executing - - - - Initializes a new instance of the Thread class. - - A ThreadStart delegate that references the methods to be invoked when this thread begins executing - The name of the thread - - - - This method has no functionality unless the method is overridden - - - - - Causes the operating system to change the state of the current thread instance to ThreadState.Running - - - - - Interrupts a thread that is in the WaitSleepJoin thread state - - - - - Blocks the calling thread until a thread terminates - - - - - Blocks the calling thread until a thread terminates or the specified time elapses - - Time of wait in milliseconds - - - - Blocks the calling thread until a thread terminates or the specified time elapses - - Time of wait in milliseconds - Time of wait in nanoseconds - - - - Resumes a thread that has been suspended - - - - - Raises a ThreadAbortException in the thread on which it is invoked, - to begin the process of terminating the thread. Calling this method - usually terminates the thread - - - - - Raises a ThreadAbortException in the thread on which it is invoked, - to begin the process of terminating the thread while also providing - exception information about the thread termination. - Calling this method usually terminates the thread. - - An object that contains application-specific information, such as state, which can be used by the thread being aborted - - - - Suspends the thread, if the thread is already suspended it has no effect - - - - - Obtain a string that represents the current object - - A string that represents the current object - - - - Gets the currently running thread - - The currently running thread - - - - Gets the current thread instance - - - - - Gets or sets the name of the thread - - - - - Gets or sets a value indicating the scheduling priority of a thread - - - - - Gets a value indicating the execution status of the current thread - - - - - Gets or sets a value indicating whether or not a thread is a background thread. - - - - - Gets the randomized idle wait time. - - The randomized idle wait time. - - - - Construct a new for the given - as a non-daemon - with normal priority. - - - - - Construct a new for the given - as a with the given - attributes. - - - - - Signals the main processing loop to pause at the next possible point. - - - - - Signals the main processing loop to pause at the next possible point. - - - - - Signals the main processing loop that a change in scheduling has been - made - in order to interrupt any sleeping that may be occuring while - waiting for the fire time to arrive. - - - the time when the newly scheduled trigger - will fire. If this method is being called do to some other even (rather - than scheduling a trigger), the caller should pass null. - - - - - The main processing loop of the . - - - - - Trigger retry loop that is executed on error condition. - - The bndle. - - - - Releases the trigger retry loop. - - The trigger. - - - - Gets the log. - - The log. - - - - Sets the idle wait time. - - The idle wait time. - - - - Gets a value indicating whether this is paused. - - true if paused; otherwise, false. - - - - Gets or sets the db failure retry interval. - - The db failure retry interval. - - - - An interface to be used by instances in order to - communicate signals back to the . - - James House - Marko Lahma (.NET) - - - - An interface to be used by instances in order to - communicate signals back to the . - - James House - - - - Notifies the scheduler about misfired trigger. - - The trigger that misfired. - - - - Notifies the scheduler about finalized trigger. - - The trigger that has finalized. - - - - Signals the scheduling change. - - - - - Notifies the scheduler about misfired trigger. - - The trigger that misfired. - - - - Notifies the scheduler about finalized trigger. - - The trigger that has finalized. - - - - Signals the scheduling change. - - - - - An object used to pass information about the 'client' to the . - - - James House - Marko Lahma (.NET) - - - - get the instanceId in the cluster. - -

- Set the instanceId. -

-
-
- - - Metadata information about specific ADO.NET driver library. Metadata is used to - create correct types of object instances to interact with the underlying - database. - - - - - Initializes this instance. Parses information and initializes startup - values. - - - - - Gets the name of the parameter which includes the parameter prefix for this - database. - - Name of the parameter. - - - Gets or sets the name of the assembly that holds the connection library. - The name of the assembly. - - - - Gets or sets the name of the product. - - The name of the product. - - - - Gets or sets the type of the connection. - - The type of the connection. - - - - Gets or sets the type of the command. - - The type of the command. - - - - Gets or sets the type of the parameter. - - The type of the parameter. - - - - Gets the type of the command builder. - - The type of the command builder. - - - Gets the command builder's derive parameters method. - The command builder derive parameters method. - - - - Gets or sets the parameter name prefix. - - The parameter name prefix. - - - - Gets or sets the type of the exception that is thrown when using driver - library. - - The type of the exception. - - - - Gets or sets a value indicating whether parameters are bind by name when using - ADO.NET parameters. - - true if parameters are bind by name; otherwise, false. - - - Gets or sets the type of the database parameters. - The type of the parameter db. - - - - Gets the parameter db type property. - - The parameter db type property. - - - - Gets the parameter is nullable property. - - The parameter is nullable property. - - - - Gets or sets the type of the db binary column. This is a string representation of - Enum element because this information is database driver specific. - - The type of the db binary. - - - Gets the type of the db binary. - The type of the db binary. - - - - Sets the name of the parameter db type property. - - The name of the parameter db type property. - - - - Gets or sets a value indicating whether [use parameter name prefix in parameter collection]. - - - true if [use parameter name prefix in parameter collection]; otherwise, false. - - - - - - - - - - - - - - - Returns a new command object for executing SQL statments/Stored Procedures - against the database. - - An new - - - - Returns a new instance of the providers CommandBuilder class. - - In .NET 1.1 there was no common base class or interface - for command builders, hence the return signature is object to - be portable (but more loosely typed) across .NET 1.1/2.0 - A new Command Builder - - - - Returns a new connection object to communicate with the database. - - A new - - - - Returns a new parameter object for binding values to parameter - placeholders in SQL statements or Stored Procedure variables. - - A new - - - - Shutdowns this instance. - - - - - Connection string used to create connections. - - - - - Registers DB metadata information for given provider name. - - - - - - - Initializes a new instance of the class. - - Name of the db provider. - The connection string. - - - - Returns a new command object for executing SQL statments/Stored Procedures - against the database. - - An new - - - - Returns a new instance of the providers CommandBuilder class. - - A new Command Builder - In .NET 1.1 there was no common base class or interface - for command builders, hence the return signature is object to - be portable (but more loosely typed) across .NET 1.1/2.0 - - - - Returns a new connection object to communicate with the database. - - A new - - - - Returns a new parameter object for binding values to parameter - placeholders in SQL statements or Stored Procedure variables. - - A new - - - - Shutdowns this instance. - - - - - Connection string used to create connections. - - - - - - Gets the metadata. - - The metadata. - - - - Summary description for DbProviderFactory. - - - - - This interface can be implemented by any - class that needs to use the constants contained herein. - - Jeffrey Wescott - James House - - - @deprecated Whether a trigger has misfired is no longer a state, but - rather now identified dynamically by whether the trigger's next fire - time is more than the misfire threshold time in the past. - - - - This class contains utility functions for use in all delegate classes. - - Jeffrey Wescott - - - - Replace the table prefix in a query by replacing any occurrences of - "{0}" with the table prefix. - - The unsubstitued query - The table prefix - The query, with proper table prefix substituted - - - - Obtain a unique key for a given job. - - The job name - The group containing the job - - A unique key - - - - Obtain a unique key for a given trigger. - - The trigger name - The group containing the trigger - A unique key - - - - Base class for database based lock handlers for providing thread/resource locking - in order to protect resources from being altered by multiple threads at the - same time. - - - - - This class extends - to include the query string constants in use by the - class. - - Jeffrey Wescott - - - - An interface for providing thread/resource locking in order to protect - resources from being altered by multiple threads at the same time. - - James House - - - - Grants a lock on the identified resource to the calling thread (blocking - until it is available). - - true if the lock was obtained. - - - - Release the lock on the identified resource if it is held by the calling - thread. - - - - - Determine whether the calling thread owns a lock on the identified - resource. - - - - - Whether this Semaphore implementation requires a database connection for - its lock management operations. - - - - - - - - Interface for Quartz objects that need to know what the table prefix of - the tables used by a ADO.NET JobStore is. - - - - - Initializes a new instance of the class. - - The table prefix. - The SQL. - The default SQL. - The db provider. - - - - Execute the SQL that will lock the proper database row. - - - - - - - - Grants a lock on the identified resource to the calling thread (blocking - until it is available). - - - - - true if the lock was obtained. - - - - Release the lock on the identified resource if it is held by the calling - thread. - - - - - - - Determine whether the calling thread owns a lock on the identified - resource. - - - - - - - - Gets or sets the lock owners. - - The lock owners. - - - - Gets the log. - - The log. - - - - This Semaphore implementation does use the database. - - - - - Gets or sets the table prefix. - - The table prefix. - - - - A FirebirdDelegate specific driver delegate. - - Marko Lahma - - - - This is meant to be an abstract base class for most, if not all, - implementations. Subclasses should override only those methods that need - special handling for the DBMS driver in question. - - Jeffrey Wescott - James House - Marko Lahma (.NET) - - - - This is the base interface for all driver delegate classes. - - -

- This interface is very similar to the - interface except each method has an additional - parameter. -

-

- Unless a database driver has some extremely-DB-specific - requirements, any IDriverDelegate implementation classes should extend the - class. -

-
- Jeffrey Wescott - James House - Marko Lahma (.NET) -
- - - Update all triggers having one of the two given states, to the given new - state. - - The DB Connection - The new state for the triggers - The first old state to update - The second old state to update - Number of rows updated - - - - Get the names of all of the triggers that have misfired - according to - the given timestamp. - - The DB Connection - The timestamp. - An array of objects - - - - Get the names of all of the triggers in the given state that have - misfired - according to the given timestamp. - - The DB Connection - The state. - The time stamp. - An array of objects - - - - Get the names of all of the triggers in the given group and state that - have misfired - according to the given timestamp. - - The DB Connection - Name of the group. - The state. - The timestamp. - An array of objects - - - - Select all of the triggers for jobs that are requesting recovery. The - returned trigger objects will have unique "recoverXXX" trigger names and - will be in the trigger group. - - - In order to preserve the ordering of the triggers, the fire time will be - set from the ColumnFiredTime column in the TableFiredTriggers - table. The caller is responsible for calling - on each returned trigger. It is also up to the caller to insert the - returned triggers to ensure that they are fired. - - The DB Connection - An array of objects - - - - Delete all fired triggers. - - The DB Connection - The number of rows deleted - - - - Delete all fired triggers of the given instance. - - The DB Connection - The instance id. - The number of rows deleted - - - - Delete all volatile fired triggers. - - The DB Connection - The number of rows deleted - - - - Get the names of all of the triggers that are volatile. - - The DB Connection - An array of see cref="Key" /> objects. - - - - Get the names of all of the jobs that are volatile. - - The DB Connection - An array of objects. - - - - Insert the job detail record. - - The DB Connection - The job to insert. - Number of rows inserted. - - - - Update the job detail record. - - The DB Connection. - The job to update. - Number of rows updated. - - -

- Get the names of all of the triggers associated with the given job. -

- -
- The DB Connection - The job name - The job group -
- - - Delete all job listeners for the given job. - - The DB Connection - The name of the job - The group containing the job - The number of rows deleted - - - - Delete the job detail record for the given job. - - The DB Connection - the name of the job - Name of the group. - the number of rows deleted - - - - Check whether or not the given job is stateful. - - The DB Connection - The name of the job - The group containing the job - true if the job exists and is stateful, false otherwise - - - - Check whether or not the given job exists. - - The DB Connection - Name of the job. - Name of the group. - true if the job exists, false otherwise - - - - Update the job data map for the given job. - - The DB Connection - The job. - the number of rows updated - - - - Associate a listener with a job. - - The DB Connection - The job to associate with the listener. - The listener to insert. - The number of rows inserted. - - -

- Get all of the listeners for a given job. -

- -
- The DB Connection - The job name whose listeners are wanted - The group containing the job - array of listener names -
- - - Select the JobDetail object for a given job name / group name. - - The DB Connection - The job name whose listeners are wanted - The group containing the job - The class load helper. - The populated JobDetail object - - - - Select the total number of jobs stored. - - The DB Connection - the total number of jobs stored - - - - Select all of the job group names that are stored. - - The DB Connection. - an array of group names - - - - Select all of the jobs contained in a given group. - - The DB Connection - The group containing the jobs - an array of job names - - - - Insert the base trigger data. - - The DB Connection - The trigger to insert. - The state that the trigger should be stored in. - The job detail. - The number of rows inserted - - - - Insert the simple trigger data. - - The DB Connection - The trigger to insert - The number of rows inserted - - - - Insert the blob trigger data. - - The DB Connection - The trigger to insert - The number of rows inserted - - - - Insert the cron trigger data. - - the DB Connection - The trigger. - the number of rows inserted - - - - Update the base trigger data. - - the DB Connection - The trigger. - The state. - The job detail. - the number of rows updated - - - - Update the simple trigger data. - - the DB Connection - The trigger. - the number of rows updated - - - - Update the cron trigger data. - - the DB Connection - The trigger. - the number of rows updated - - - - Update the blob trigger data. - - the DB Connection - The trigger. - the number of rows updated - - - - Check whether or not a trigger exists. - - the DB Connection - Name of the trigger. - Name of the group. - the number of rows updated - - - - Update the state for a given trigger. - - The DB Connection - The name of the trigger. - The group containing the trigger. - The new state for the trigger. - the number of rows updated - - - - Update the given trigger to the given new state, if it is in the given - old state. - - The DB connection - The name of the trigger. - The group containing the trigger - The new state for the trigger - The old state the trigger must be in - int the number of rows updated - - - - Update the given trigger to the given new state, if it is one of the - given old states. - - The DB connection - The name of the trigger - The group containing the trigger - The new state for the trigger - One of the old state the trigger must be in - One of the old state the trigger must be in - One of the old state the trigger must be in - - int the number of rows updated - - SQLException - - - - Update the all triggers to the given new state, if they are in one of - the given old states AND its next fire time is before the given time. - - The DB connection - The new state for the trigger - One of the old state the trigger must be in - One of the old state the trigger must be in - The time before which the trigger's next fire time must be - int the number of rows updated - - - - Update all triggers in the given group to the given new state, if they - are in one of the given old states. - - The DB connection - The group containing the trigger - The new state for the trigger - One of the old state the trigger must be in - One of the old state the trigger must be in - One of the old state the trigger must be in - The number of rows updated - - - - Update all of the triggers of the given group to the given new state, if - they are in the given old state. - - The DB connection - The group containing the triggers - The new state for the trigger group - The old state the triggers must be in. - int the number of rows updated - - - - Update the states of all triggers associated with the given job. - - The DB Connection - The name of the job. - The group containing the job. - The new state for the triggers. - The number of rows updated - - - - Update the states of any triggers associated with the given job, that - are the given current state. - - The DB Connection - The name of the job - The group containing the job - The new state for the triggers - The old state of the triggers - the number of rows updated - - - - Delete all of the listeners associated with a given trigger. - - The DB Connection - The name of the trigger whose listeners will be deleted - The name of the group containing the trigger - the number of rows deleted - - - - Associate a listener with the given trigger. - - The DB Connectio - The trigger - The name of the listener to associate with the trigger - the number of rows inserted - - - - Select the listeners associated with a given trigger. - - The DB Connection - The name of the trigger - The group containing the trigger - array of trigger listener names - - - - Delete the simple trigger data for a trigger. - - The DB Connection - The name of the trigger - The group containing the trigger - The number of rows deleted - - - - Delete the BLOB trigger data for a trigger. - - The DB Connection - The name of the trigger - The group containing the trigger - The number of rows deleted - - - - Delete the cron trigger data for a trigger. - - The DB Connection - The name of the trigger - The group containing the trigger - the number of rows deleted - - - - Delete the base trigger data for a trigger. - - The DB Connection - The name of the trigger - The group containing the trigger - the number of rows deleted - - - - Select the number of triggers associated with a given job. - - The DB Connection - The name of the job - The group containing the job - the number of triggers for the given job - - - - Select the job to which the trigger is associated. - - The DB Connection - The name of the trigger - The group containing the trigger - The load helper. - - The object associated with the given trigger - - - - - Select the stateful jobs which are referenced by triggers in the given - trigger group. - - The DB Connection - The trigger group. - a List of Keys to jobs. - - - - Select the triggers for a job> - - The DB Connection - The name of the trigger - The group containing the trigger - an array of objects associated with a given job. - - - - Select the triggers for a calendar - - The DB Connection. - Name of the calendar. - - An array of objects associated with a given job. - - - - - Select a trigger. - - The DB Connection. - The name of the trigger. - The group containing the trigger. - The object. - - - - - Select a trigger's JobDataMap. - - The DB Connection. - The name of the trigger. - The group containing the trigger. - The of the Trigger, never null, but possibly empty. - - - - Select a trigger's state value. - - The DB Connection. - The name of the trigger. - The group containing the trigger. - The object. - - - - Select a triggers status (state and next fire time). - - The DB Connection. - The name of the trigger. - The group containing the trigger. - A object, or null - - - - Select the total number of triggers stored. - - The DB Connection. - The total number of triggers stored. - - - - Select all of the trigger group names that are stored. - - The DB Connection. - An array of group names. - - - - Select all of the triggers contained in a given group. - - The DB Connection. - The group containing the triggers. - An array of trigger names. - - - - Select all of the triggers in a given state. - - The DB Connection. - The state the triggers must be in. - An array of trigger s. - - - - Inserts the paused trigger group. - - The conn. - Name of the group. - - - - - Deletes the paused trigger group. - - The conn. - Name of the group. - - - - - Deletes all paused trigger groups. - - The conn. - - - - - Determines whether the specified trigger group is paused. - - The conn. - Name of the group. - - true if trigger group is paused; otherwise, false. - - - - - Selects the paused trigger groups. - - The DB Connection. - - - - - Determines whether given trigger group already exists. - - The conn. - Name of the group. - - true if trigger group exists; otherwise, false. - - - - - Insert a new calendar. - - The DB Connection. - The name for the new calendar. - The calendar. - The number of rows inserted. - - - - Update a calendar. - - The DB Connection. - The name for the new calendar. - The calendar. - The number of rows updated. - - - - Check whether or not a calendar exists. - - The DB Connection. - The name of the calendar. - true if the trigger exists, false otherwise. - - - - Select a calendar. - - The DB Connection. - The name of the calendar. - The Calendar. - - - - Check whether or not a calendar is referenced by any triggers. - - The DB Connection. - The name of the calendar. - true if any triggers reference the calendar, false otherwise - - - - Delete a calendar. - - The DB Connection - The name of the trigger. - The number of rows deleted. - - - - Select the total number of calendars stored. - - The DB Connection - The total number of calendars stored. - - - - Select all of the stored calendars. - - The DB Connection - An array of calendar names. - - - - Select the trigger that will be fired at the given fire time. - - The DB Connection - The time that the trigger will be fired. - - A representing the - trigger that will be fired at the given fire time, or null if no - trigger will be fired at that time - - - - - Insert a fired trigger. - - The DB Connection - The trigger. - The state that the trigger should be stored in. - The job detail. - The number of rows inserted. - - - - Select the states of all fired-trigger records for a given trigger, or - trigger group if trigger name is . - - The DB Connection - Name of the trigger. - Name of the group. - A list of FiredTriggerRecord objects. - - - - Select the states of all fired-trigger records for a given job, or job - group if job name is . - - The DB Connection - Name of the job. - Name of the group. - A List of FiredTriggerRecord objects. - - - - Select the states of all fired-trigger records for a given scheduler - instance. - - The DB Connection - Name of the instance. - A list of FiredTriggerRecord objects. - - - - Delete a fired trigger. - - The DB Connection - The fired trigger entry to delete. - The number of rows deleted. - - - - Get the number instances of the identified job currently executing. - - The DB Connection - Name of the job. - The job group. - - The number instances of the identified job currently executing. - - - - - Insert a scheduler-instance state record. - - The DB Connection - The instance id. - The check in time. - The interval. - The number of inserted rows. - - - - Delete a scheduler-instance state record. - - The DB Connection - The instance id. - The number of deleted rows. - - - - Update a scheduler-instance state record. - - The DB Connection - The instance id. - The check in time. - The number of updated rows. - - - - A List of all current s. -

- If instanceId is not null, then only the record for the identified - instance will be returned. -

-
- The DB Connection - The instance id. - -
- - - Select the next trigger which will fire to fire between the two given timestamps - in ascending order of fire time, and then descending by priority. - - The conn. - highest value of of the triggers (exclusive) - highest value of of the triggers (inclusive) - A (never null, possibly empty) list of the identifiers (Key objects) of the next triggers to be fired. - - - - Select the distinct instance names of all fired-trigger records. - - - This is useful when trying to identify orphaned fired triggers (a - fired trigger without a scheduler state record.) - - The conn. - - - - - Counts the misfired triggers in states. - - The conn. - The state1. - The state2. - The ts. - - - - - Selects the misfired triggers in states. - - The conn. - The state1. - The state2. - The ts. - The count. - The result list. - - - - - Create new StdAdoDelegate instance. - - the logger to use during execution - the prefix of all table names - The instance id. - The db provider. - - - - Create new StdAdoDelegate instance. - - the logger to use during execution - the prefix of all table names - The instance id. - The db provider. - if set to true [use properties]. - - - - Insert the job detail record. - - the DB Connection - the new state for the triggers - the first old state to update - the second old state to update - number of rows updated - - - - Get the names of all of the triggers that have misfired. - - the DB Connection - The ts. - an array of objects - - - - Select all of the triggers in a given state. - - The DB Connection - The state the triggers must be in - an array of trigger s - - - - Get the names of all of the triggers in the given state that have - misfired - according to the given timestamp. - - The DB Connection - The state. - The time stamp. - An array of objects - - - - Get the names of all of the triggers in the given states that have - misfired - according to the given timestamp. No more than count will - be returned. - - The conn. - The state1. - The state2. - The ts. - The most misfired triggers to return, negative for all - - Output parameter. A List of objects. Must not be null - - Whether there are more misfired triggers left to find beyond the given count. - - - - Get the number of triggers in the given states that have - misfired - according to the given timestamp. - - - - - - - - - - Get the names of all of the triggers in the given group and state that - have misfired. - - The DB Connection - Name of the group. - The state. - The timestamp. - an array of objects - - - - Select all of the triggers for jobs that are requesting recovery. The - returned trigger objects will have unique "recoverXXX" trigger names and - will be in the - trigger group. - - - In order to preserve the ordering of the triggers, the fire time will be - set from the ColumnFiredTime column in the TableFiredTriggers - table. The caller is responsible for calling - on each returned trigger. It is also up to the caller to insert the - returned triggers to ensure that they are fired. - - The DB Connection - an array of objects - - - - Delete all fired triggers. - - The DB Connection. - The number of rows deleted. - - - - Delete all fired triggers of the given instance. - - The DB Connection - The instance id. - The number of rows deleted - - - - Insert the job detail record. - - The DB Connection. - The job to insert. - Number of rows inserted. - - - - Gets the db presentation for boolean value. Subclasses can overwrite this behaviour. - - Value to map to database. - - - - - Update the job detail record. - - The DB Connection. - The job to update. - Number of rows updated. - - - - Get the names of all of the triggers associated with the given job. - - The DB Connection. - The name of the job. - The group containing the job. - An array of objects - - - - Delete all job listeners for the given job. - - The DB Connection. - The name of the job. - The group containing the job. - The number of rows deleted. - - - - Delete the job detail record for the given job. - - the DB Connection - the name of the job - the group containing the job - the number of rows deleted - - - - Check whether or not the given job is stateful. - - the DB Connection - the name of the job - the group containing the job - - true if the job exists and is stateful, false otherwise - - - - - Check whether or not the given job exists. - - the DB Connection - the name of the job - the group containing the job - true if the job exists, false otherwise - - - - Update the job data map for the given job. - - The conn. - the job to update - the number of rows updated - - - - Associate a listener with a job. - - The DB Connection. - The job to associate with the listener. - The listener to insert. - The number of rows inserted. - - - - Get all of the listeners for a given job. - - The DB Connection. - The job name whose listeners are wanted. - The group containing the job. - Array of listener names. - - - - Select the JobDetail object for a given job name / group name. - - The DB Connection. - The job name whose listeners are wanted. - The group containing the job. - The load helper. - The populated JobDetail object. - - - build Map from java.util.Properties encoding. - - - - Select the total number of jobs stored. - - The DB Connection. - The total number of jobs stored. - - - - Select all of the job group names that are stored. - - The DB Connection. - An array of group names. - - - - Select all of the jobs contained in a given group. - - The DB Connection. - The group containing the jobs. - An array of job names. - - - - Insert the base trigger data. - - the DB Connection - the trigger to insert - the state that the trigger should be stored in - The job detail. - the number of rows inserted - - - - Insert the simple trigger data. - - The DB Connection. - The trigger to insert. - The number of rows inserted. - - - - Insert the cron trigger data. - - the DB Connection - the trigger to insert - the number of rows inserted - - - - Insert the blob trigger data. - - The DB Connection. - The trigger to insert. - The number of rows inserted. - - - - Update the base trigger data. - - The DB Connection. - The trigger to insert. - The state that the trigger should be stored in. - The job detail. - The number of rows updated. - - - - Update the simple trigger data. - - The DB Connection. - The trigger to insert. - The number of rows updated. - - - - Update the cron trigger data. - - The DB Connection. - The trigger to insert. - The number of rows updated. - - - - Update the blob trigger data. - - The DB Connection. - The trigger to insert. - The number of rows updated. - - - - Check whether or not a trigger exists. - - The DB Connection. - The name of the trigger. - The group containing the trigger. - true if the trigger exists, false otherwise - - - - Update the state for a given trigger. - - The DB Connection. - The name of the trigger. - The group containing the trigger. - The new state for the trigger. - The number of rows updated. - - - - Update the given trigger to the given new state, if it is one of the - given old states. - - The DB connection. - The name of the trigger. - The group containing the trigger. - The new state for the trigger. - One of the old state the trigger must be in. - One of the old state the trigger must be in. - One of the old state the trigger must be in. - The number of rows updated. - - - - Update the all triggers to the given new state, if they are in one of - the given old states AND its next fire time is before the given time. - - The DB connection - The new state for the trigger - One of the old state the trigger must be in - One of the old state the trigger must be in - The time before which the trigger's next fire time must be - int the number of rows updated - - - - Update all triggers in the given group to the given new state, if they - are in one of the given old states. - - The DB connection. - The group containing the trigger. - The new state for the trigger. - One of the old state the trigger must be in. - One of the old state the trigger must be in. - One of the old state the trigger must be in. - The number of rows updated. - - - - Update the given trigger to the given new state, if it is in the given - old state. - - the DB connection - the name of the trigger - the group containing the trigger - the new state for the trigger - the old state the trigger must be in - int the number of rows updated - - - - Update all of the triggers of the given group to the given new state, if - they are in the given old state. - - the DB connection - the group containing the triggers - the new state for the trigger group - the old state the triggers must be in - int the number of rows updated - - - - Update the states of all triggers associated with the given job. - - the DB Connection - the name of the job - the group containing the job - the new state for the triggers - the number of rows updated - - - - Updates the state of the trigger states for job from other. - - The conn. - Name of the job. - Name of the group. - The state. - The old state. - - - - - Delete all of the listeners associated with a given trigger. - - the DB Connection - the name of the trigger whose listeners will be deleted - the name of the group containing the trigger - the number of rows deleted - - - - Associate a listener with the given trigger. - - the DB Connection - the trigger - the name of the listener to associate with the trigger - the number of rows inserted - - - - Select the listeners associated with a given trigger. - - the DB Connection - the name of the trigger - the group containing the trigger - - array of trigger listener names - - - - - Delete the simple trigger data for a trigger. - - the DB Connection - the name of the trigger - the group containing the trigger - the number of rows deleted - - - - Delete the cron trigger data for a trigger. - - the DB Connection - the name of the trigger - the group containing the trigger - the number of rows deleted - - - - Delete the cron trigger data for a trigger. - - the DB Connection - the name of the trigger - the group containing the trigger - the number of rows deleted - - - - Delete the base trigger data for a trigger. - - the DB Connection - the name of the trigger - the group containing the trigger - the number of rows deleted - - - - Select the number of triggers associated with a given job. - - the DB Connection - the name of the job - the group containing the job - the number of triggers for the given job - - - - Select the job to which the trigger is associated. - - the DB Connection - the name of the trigger - the group containing the trigger - The load helper. - The object associated with the given trigger - - - - Select the triggers for a job - - the DB Connection - the name of the trigger - the group containing the trigger - - an array of objects - associated with a given job. - - - - - Select the triggers for a calendar - - The DB Connection. - Name of the calendar. - - An array of objects associated with a given job. - - - - - Selects the stateful jobs of trigger group. - - The database connection. - Name of the group. - - - - - Select a trigger. - - the DB Connection - the name of the trigger - the group containing the trigger - The object - - - - Select a trigger's JobDataMap. - - the DB Connection - the name of the trigger - the group containing the trigger - The of the Trigger, never null, but possibly empty. - - - - Select a trigger's state value. - - the DB Connection - the name of the trigger - the group containing the trigger - The object - - - - Select a trigger status (state and next fire time). - - the DB Connection - the name of the trigger - the group containing the trigger - - a object, or null - - - - - Select the total number of triggers stored. - - the DB Connection - the total number of triggers stored - - - - Select all of the trigger group names that are stored. - - the DB Connection - - an array of group names - - - - - Select all of the triggers contained in a given group. - - the DB Connection - the group containing the triggers - - an array of trigger names - - - - - Inserts the paused trigger group. - - The conn. - Name of the group. - - - - - Deletes the paused trigger group. - - The conn. - Name of the group. - - - - - Deletes all paused trigger groups. - - The conn. - - - - - Determines whether the specified trigger group is paused. - - The conn. - Name of the group. - - true if trigger group is paused; otherwise, false. - - - - - Determines whether given trigger group already exists. - - The conn. - Name of the group. - - true if trigger group exists; otherwise, false. - - - - - Insert a new calendar. - - the DB Connection - The name for the new calendar. - The calendar. - the number of rows inserted - IOException - - - - Update a calendar. - - the DB Connection - The name for the new calendar. - The calendar. - the number of rows updated - IOException - - - - Check whether or not a calendar exists. - - the DB Connection - The name of the calendar. - - true if the trigger exists, false otherwise - - - - - Select a calendar. - - the DB Connection - The name of the calendar. - the Calendar - ClassNotFoundException - IOException - - - - Check whether or not a calendar is referenced by any triggers. - - the DB Connection - The name of the calendar. - - true if any triggers reference the calendar, false otherwise - - - - - Delete a calendar. - - the DB Connection - The name of the trigger. - the number of rows deleted - - - - Select the total number of calendars stored. - - the DB Connection - the total number of calendars stored - - - - Select all of the stored calendars. - - the DB Connection - - an array of calendar names - - - - - Select the trigger that will be fired at the given fire time. - - the DB Connection - the time that the trigger will be fired - - a representing the - trigger that will be fired at the given fire time, or null if no - trigger will be fired at that time - - - - - Select the next trigger which will fire to fire between the two given timestamps - in ascending order of fire time, and then descending by priority. - - The conn. - highest value of of the triggers (exclusive) - highest value of of the triggers (inclusive) - A (never null, possibly empty) list of the identifiers (Key objects) of the next triggers to be fired. - - - - Gets the select next trigger to acquire SQL clause. - This can be overriden for a more performant, result limiting - SQL. For Example SQL Server, MySQL and SQLite support limiting returned rows. - - - - - - Insert a fired trigger. - - the DB Connection - the trigger - the state that the trigger should be stored in - The job. - the number of rows inserted - - - - Select the states of all fired-trigger records for a given trigger, or - trigger group if trigger name is . - - The DB connection. - Name of the trigger. - Name of the group. - a List of objects. - - - - Select the states of all fired-trigger records for a given job, or job - group if job name is . - - The DB connection. - Name of the job. - Name of the group. - a List of objects. - - - - Select the states of all fired-trigger records for a given scheduler - instance. - - The DB Connection - Name of the instance. - A list of FiredTriggerRecord objects. - - - - Select the distinct instance names of all fired-trigger records. - - The conn. - - - This is useful when trying to identify orphaned fired triggers (a - fired trigger without a scheduler state record.) - - - - - Delete a fired trigger. - - the DB Connection - the fired trigger entry to delete - the number of rows deleted - - - - Selects the job execution count. - - The DB connection. - Name of the job. - The job group. - - - - - Delete all volatile fired triggers. - - The DB Connection - The number of rows deleted - - - - Inserts the state of the scheduler. - - The conn. - The instance id. - The check in time. - The interval. - - - - - Deletes the state of the scheduler. - - The database connection. - The instance id. - - - - - Updates the state of the scheduler. - - The database connection. - The instance id. - The check in time. - - - - - A List of all current s. -

- If instanceId is not null, then only the record for the identified - instance will be returned. -

-
- The DB Connection - The instance id. - -
- - - Replace the table prefix in a query by replacing any occurrences of - "{0}" with the table prefix. - - The unsubstitued query - The query, with proper table prefix substituted - - - - Create a serialized version of an Object. - - the object to serialize - Serialized object as byte array. - - - - Remove the transient data from and then create a serialized - version of a and returns the underlying bytes. - - The data. - the serialized data as byte array - - - - serialize - - The data. - - - - - Convert the JobDataMap into a list of properties. - - - - - Convert the JobDataMap into a list of properties. - - - - - This method should be overridden by any delegate subclasses that need - special handling for BLOBs. The default implementation uses standard - ADO.NET operations. - - The data reader, already queued to the correct row. - The column index for the BLOB. - The deserialized object from the DataReader BLOB. - - - - Get the names of all of the triggers that are volatile. - - The DB Connection - An array of objects. - - - - Get the names of all of the jobs that are volatile. - - The DB Connection - An array of objects. - - - - This method should be overridden by any delegate subclasses that need - special handling for BLOBs for job details. - - The result set, already queued to the correct row. - The column index for the BLOB. - The deserialized Object from the ResultSet BLOB. - - - - Selects the paused trigger groups. - - The DB Connection. - - - - - Gets the triggers to acquire limit. - - The triggers to acquire limit. - - - - Initializes a new instance of the class. - - the logger to use during execution - the prefix of all table names - The instance id. - The db provider. - - - - Initializes a new instance of the class. - - The logger. - The table prefix. - The instance id. - The db provider. - if set to true [use properties]. - - - - Creates the SQL for select next trigger to acquire. - - - - - Gets the select next trigger to acquire SQL clause. - Firebird specific version with FIRST functionality - - - - - - Conveys the state of a fired-trigger record. - - James House - - - - Gets or sets the fire instance id. - - The fire instance id. - - - - Gets or sets the fire timestamp. - - The fire timestamp. - - - - Gets or sets a value indicating whether [job is stateful]. - - true if [job is stateful]; otherwise, false. - - - - Gets or sets the job key. - - The job key. - - - - Gets or sets the scheduler instance id. - - The scheduler instance id. - - - - Gets or sets the trigger key. - - The trigger key. - - - - Gets or sets the state of the fire instance. - - The state of the fire instance. - - - - Gets or sets a value indicating whether [job requests recovery]. - - true if [job requests recovery]; otherwise, false. - - - - Gets or sets a value indicating whether [trigger is volatile]. - - true if [trigger is volatile]; otherwise, false. - - - - Gets or sets the priority. - - The priority. - - - - Exception class for when a driver delegate cannot be found for a given - configuration, or lack thereof. - - Jeffrey Wescott - - - - - Base class for exceptions thrown by the Quartz . - - - SchedulerExceptions may contain a reference to another - , which was the underlying cause of the SchedulerException. - - James House - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The MSG. - - - - Initializes a new instance of the class. - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - The class name is null or is zero (0). - The info parameter is null. - - - - Initializes a new instance of the class. - - The MSG. - The error code. - - - - Initializes a new instance of the class. - - The cause. - - - - Initializes a new instance of the class. - - The MSG. - The cause. - - - - Initializes a new instance of the class. - - The MSG. - The cause. - The error code. - - - - Creates and returns a string representation of the current exception. - - - A string representation of the current exception. - - - - - - Return the exception that is the underlying cause of this exception. - This may be used to find more detail about the cause of the error. - - The underlying exception, or if there is not - one. - - - - - Get the error code associated with this exception. - This may be used to find more detail about the cause of the error. - - - One of the ERR_XXX constants defined in this class. - - - -

- Determine if the specified error code is in the - category of errors. -

-
-
- -

- Determine if the specified error code is in the - category of errors. -

-
-
- - - Determine if the specified error code is in the - category of errors. - - - - - Determine if the specified error code is in the - category of errors. - - - - - Determine if the specified error code is in the - category of errors. - - - - - Determine if the specified error code is in the - category of errors. - - - - - Initializes a new instance of the class. - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - The class name is null or is zero (0). - The info parameter is null. - - - - is meant to be used in an application-server - or other software framework environment that provides - container-managed-transactions. No commit / rollback will be handled by this class. - - - If you need commit / rollback, use - instead. - - Jeffrey Wescott - James House - Srinivas Venkatarangaiah - - - - Contains base functionality for ADO.NET-based JobStore implementations. - - Jeffrey Wescott - James House - Marko Lahma (.NET) - - - - The interface to be implemented by classes that want to provide a - and storage mechanism for the - 's use. - - - Storage of s and s should be keyed - on the combination of their name and group for uniqueness. - - - - - - - - James House - - - - Called by the QuartzScheduler before the is - used, in order to give the it a chance to Initialize. - - - - - Called by the QuartzScheduler to inform the that - the scheduler has started. - - - - - Called by the QuartzScheduler to inform the that - it should free up all of it's resources because the scheduler is - shutting down. - - - - - Store the given and . - - The scheduling context. - The to be stored. - The to be stored. - ObjectAlreadyExistsException - - - - returns true if the given JobGroup - is paused - - - - - - - - returns true if the given TriggerGroup - is paused - - - - - - - - Store the given . - - The context. - The to be stored. - - If , any existing in the - with the same name and group should be - over-written. - - - - - Remove (delete) the with the given - name, and any s that reference - it. - - - If removal of the results in an empty group, the - group should be removed from the 's list of - known group names. - - The context. - The name of the to be removed. - The group name of the to be removed. - - if a with the given name and - group was found and removed from the store. - - - - - Retrieve the for the given - . - - The context. - The name of the to be retrieved. - The group name of the to be retrieved. - - The desired , or null if there is no match. - - - - - Store the given . - - The context. - The to be stored. - If , any existing in - the with the same name and group should - be over-written. - ObjectAlreadyExistsException - - - - Remove (delete) the with the - given name. - - -

- If removal of the results in an empty group, the - group should be removed from the 's list of - known group names. -

-

- If removal of the results in an 'orphaned' - that is not 'durable', then the should be deleted - also. -

-
- The context. - The name of the to be removed. - The group name of the to be removed. - - if a with the given - name and group was found and removed from the store. - -
- - - Remove (delete) the with the - given name, and store the new given one - which must be associated - with the same job. - - The context. - The name of the to be removed. - The group name of the to be removed. - The new to be stored. - - if a with the given - name and group was found and removed from the store. - - - - - Retrieve the given . - - The context. - The name of the to be retrieved. - The group name of the to be retrieved. - - The desired , or null if there is no - match. - - - - - Store the given . - - The context. - The name. - The to be stored. - If , any existing - in the with the same name and group - should be over-written. - If , any s existing - in the that reference an existing - Calendar with the same name with have their next fire time - re-computed with the new . - ObjectAlreadyExistsException - - - - Remove (delete) the with the - given name. - - - If removal of the would result in - s pointing to non-existent calendars, then a - will be thrown. - - The context. - The name of the to be removed. - - if a with the given name - was found and removed from the store. - - - - - Retrieve the given . - - The context. - The name of the to be retrieved. - - The desired , or null if there is no - match. - - - - - Get the number of s that are - stored in the . - - The context. - - - - - Get the number of s that are - stored in the . - - The context. - - - - - Get the number of s that are - stored in the . - - The context. - - - - - Get the names of all of the s that - have the given group name. -

- If there are no jobs in the given group name, the result should be a - zero-length array (not ). -

-
- The CTX. - Name of the group. - -
- - - Get the names of all of the s - that have the given group name. -

- If there are no triggers in the given group name, the result should be a - zero-length array (not ). -

-
-
- - - Get the names of all of the - groups. -

- If there are no known group names, the result should be a zero-length - array (not ). -

-
-
- - - Get the names of all of the - groups. -

- If there are no known group names, the result should be a zero-length - array (not ). -

-
-
- - - Get the names of all of the s - in the . - -

- If there are no Calendars in the given group name, the result should be - a zero-length array (not ). -

-
-
- - - Get all of the Triggers that are associated to the given Job. - - - If there are no matches, a zero-length array should be returned. - - - - - Get the current state of the identified . - - - - - - - - - - Pause the with the given name. - - - - - Pause all of the s in the - given group. - - - The JobStore should "remember" that the group is paused, and impose the - pause on any new triggers that are added to the group while the group is - paused. - - - - - Pause the with the given name - by - pausing all of its current s. - - - - - Pause all of the s in the given - group - by pausing all of their s. -

- The JobStore should "remember" that the group is paused, and impose the - pause on any new jobs that are added to the group while the group is - paused. -

-
- - -
- - - Resume (un-pause) the with the - given name. - -

- If the missed one or more fire-times, then the - 's misfire instruction will be applied. -

-
- - -
- - - Resume (un-pause) all of the s - in the given group. -

- If any missed one or more fire-times, then the - 's misfire instruction will be applied. -

-
-
- - - Gets the paused trigger groups. - - The context. - - - - - Resume (un-pause) the with the - given name. -

- If any of the 's s missed one - or more fire-times, then the 's misfire - instruction will be applied. -

-
-
- - - Resume (un-pause) all of the s in - the given group. -

- If any of the s had s that - missed one or more fire-times, then the 's - misfire instruction will be applied. -

-
-
- - - Pause all triggers - equivalent of calling - on every group. -

- When is called (to un-pause), trigger misfire - instructions WILL be applied. -

-
- -
- - - Resume (un-pause) all triggers - equivalent of calling - on every group. -

- If any missed one or more fire-times, then the - 's misfire instruction will be applied. -

- -
- -
- - - Get a handle to the next trigger to be fired, and mark it as 'reserved' - by the calling scheduler. - - The context. - If > 0, the JobStore should only return a Trigger - that will fire no later than the time represented in this value as - milliseconds. - - - - - - - Inform the that the scheduler no longer plans to - fire the given , that it had previously acquired - (reserved). - - - - - Inform the that the scheduler is now firing the - given (executing its associated ), - that it had previously acquired (reserved). - - null if the trigger or it's job or calendar no longer exist, or - if the trigger was not successfully put into the 'executing' - state. - - - - - Inform the that the scheduler has completed the - firing of the given (and the execution its - associated ), and that the - in the given should be updated if the - is stateful. - - - - - Supports the persistence. - - - - - - Initializes a new instance of the class. - - - - - Gets the connection and starts a new transaction. - - - - - - Called by the QuartzScheduler before the is - used, in order to give it a chance to Initialize. - - - - - - - - Called by the QuartzScheduler to inform the that - it should free up all of it's resources because the scheduler is - shutting down. - - - - - Removes all volatile data. - - - - - Removes all volatile data. - - - - - Will recover any failed or misfired jobs and clean up the data store as - appropriate. - - - - - Will recover any failed or misfired jobs and clean up the data store as - appropriate. - - - - - Store the given and . - - SchedulingContext - Job to be stored. - Trigger to be stored. - - - - returns true if the given JobGroup - is paused - - - - - - - - returns true if the given TriggerGroup - is paused - - - - - - - - Stores the given . - - - The to be stored. - - If , any existing in the - with the same name & group should be over-written. - - - -

- Insert or update a job. -

-
-
- - - Check existence of a given job. - - - - - Store the given . - - - The to be stored. - - If , any existing in - the with the same name & group should - be over-written. - - - if a with the same name/group already - exists, and replaceExisting is set to false. - - - - - Insert or update a trigger. - - - - - Check existence of a given trigger. - - - - - Remove (delete) the with the given - name, and any s that reference - it. - - - - If removal of the results in an empty group, the - group should be removed from the 's list of - known group names. - - - The name of the to be removed. - The group name of the to be removed. - - if a with the given name & - group was found and removed from the store. - - - - - Delete a job and its listeners. - - - - - - - Delete a trigger, its listeners, and its Simple/Cron/BLOB sub-table entry. - - - - - - - - Retrieve the for the given - . - - The name of the to be retrieved. - The group name of the to be retrieved. - The desired , or null if there is no match. - - - - Remove (delete) the with the - given name. - - - -

- If removal of the results in an empty group, the - group should be removed from the 's list of - known group names. -

- -

- If removal of the results in an 'orphaned' - that is not 'durable', then the should be deleted - also. -

-
- The name of the to be removed. - The group name of the to be removed. - - if a with the given - name & group was found and removed from the store. - -
- - - - - - Retrieve the given . - - The name of the to be retrieved. - The group name of the to be retrieved. - The desired , or null if there is no match. - - - - Get the current state of the identified . - - - - - - - - - - Gets the state of the trigger. - - The conn. - The CTXT. - Name of the trigger. - Name of the group. - - - - - Store the given . - - The name of the calendar. - The to be stored. - - If , any existing - in the with the same name & group - should be over-written. - - - if a with the same name already - exists, and replaceExisting is set to false. - - - - - Remove (delete) the with the given name. - - - If removal of the would result in - s pointing to non-existent calendars, then a - will be thrown. - - The name of the to be removed. - - if a with the given name - was found and removed from the store. - - - - - Retrieve the given . - - The name of the to be retrieved. - The desired , or null if there is no match. - - - - Get the number of s that are - stored in the . - - - - - Get the number of s that are - stored in the . - - - - - Get the number of s that are - stored in the . - - - - - Get the names of all of the s that - have the given group name. - - - If there are no jobs in the given group name, the result should be a - zero-length array (not ). - - - - - Get the names of all of the s - that have the given group name. - - - If there are no triggers in the given group name, the result should be a - zero-length array (not ). - - - - - Get the names of all of the - groups. - - - - If there are no known group names, the result should be a zero-length - array (not ). - - - - - Get the names of all of the - groups. - - - - If there are no known group names, the result should be a zero-length - array (not ). - - - - - Get the names of all of the s - in the . - - - If there are no Calendars in the given group name, the result should be - a zero-length array (not ). - - - - - Get all of the Triggers that are associated to the given Job. - - - If there are no matches, a zero-length array should be returned. - - - - - Pause the with the given name. - - - - - - Pause the with the given name. - - - - - - Pause the with the given name - by - pausing all of its current s. - - - - - - Pause all of the s in the given - group - by pausing all of their s. - - - - - - Determines if a Trigger for the given job should be blocked. - State can only transition to StatePausedBlocked/StateBlocked from - StatePaused/StateWaiting respectively. - - StatePausedBlocked, StateBlocked, or the currentState. - - - - Resume (un-pause) the with the - given name. - - - If the missed one or more fire-times, then the - 's misfire instruction will be applied. - - - - - - Resume (un-pause) the with the - given name. - - - If any of the 's s missed one - or more fire-times, then the 's misfire - instruction will be applied. - - - - - - Resume (un-pause) all of the s in - the given group. - - - If any of the s had s that - missed one or more fire-times, then the 's - misfire instruction will be applied. - - - - - - Pause all of the s in the given group. - - - - - - Pause all of the s in the given group. - - - - - - Pause all of the s in the - given group. - - - - - - Resume (un-pause) all of the s - in the given group. -

- If any missed one or more fire-times, then the - 's misfire instruction will be applied. -

-
- -
- - - Pause all triggers - equivalent of calling - on every group. -

- When is called (to un-pause), trigger misfire - instructions WILL be applied. -

-
- - -
- - - Resume (un-pause) all triggers - equivalent of calling - on every group. - - - If any missed one or more fire-times, then the - 's misfire instruction will be applied. - - - - - - Resume (un-pause) all triggers - equivalent of calling - on every group. -

- If any missed one or more fire-times, then the - 's misfire instruction will be applied. -

-
- -
- - - Get a handle to the next N triggers to be fired, and mark them as 'reserved' - by the calling scheduler. - - - - - - Inform the that the scheduler no longer plans to - fire the given , that it had previously acquired - (reserved). - - - - - Inform the that the scheduler has completed the - firing of the given (and the execution its - associated ), and that the - in the given should be updated if the - is stateful. - - - - - Get a list of all scheduler instances in the cluster that may have failed. - This includes this scheduler if it is checking in for the first time. - - - - - Create dummy objects for fired triggers - that have no scheduler state record. Checkin timestamp and interval are - left as zero on these dummy objects. - - List of all current s - - - - Cleanup the given database connection. This means restoring - any modified auto commit or transaction isolation connection - attributes, and then closing the underlying connection. - - - - This is separate from closeConnection() because the Spring - integration relies on being able to overload closeConnection() and - expects the same connection back that it originally returned - from the datasource. - - - - - - Closes the supplied connection. - - (Optional) - - - - Rollback the supplied connection. - - (Optional) - - JobPersistenceException thrown if a SQLException occurs when the - connection is rolled back - - - - - Commit the supplied connection. - - The CTH. - if set to true opens a new transaction. - JobPersistenceException thrown if a SQLException occurs when the - - - - Execute the given callback in a transaction. Depending on the JobStore, - the surrounding transaction may be assumed to be already present - (managed). - - - This method just forwards to ExecuteInLock() with a null lockName. - - - - - - Execute the given callback having aquired the given lock. - Depending on the JobStore, the surrounding transaction may be - assumed to be already present (managed). This version is just a - handy wrapper around executeInLock that doesn't require a return - value. - - - The name of the lock to aquire, for example - "TRIGGER_ACCESS". If null, then no lock is aquired, but the - lockCallback is still executed in a transaction. - - - - - - Execute the given callback having aquired the given lock. - Depending on the JobStore, the surrounding transaction may be - assumed to be already present (managed). - - - The name of the lock to aquire, for example - "TRIGGER_ACCESS". If null, then no lock is aquired, but the - lockCallback is still executed in a transaction. - - - - - Execute the given callback having optionally aquired the given lock. - This uses the non-managed transaction connection. This version is just a - handy wrapper around executeInNonManagedTXLock that doesn't require a return - value. - - - The name of the lock to aquire, for example - "TRIGGER_ACCESS". If null, then no lock is aquired, but the - lockCallback is still executed in a non-managed transaction. - - - - - - Execute the given callback having optionally aquired the given lock. - This uses the non-managed transaction connection. - - - The name of the lock to aquire, for example - "TRIGGER_ACCESS". If null, then no lock is aquired, but the - lockCallback is still executed in a non-managed transaction. - - - - - Get or set the datasource name. - - - - - Gets the log. - - The log. - - - - Get or sets the prefix that should be pre-pended to all table names. - - - - - Set whether string-only properties will be handled in JobDataMaps. - - - - - Get or set the instance Id of the Scheduler (must be unique within a cluster). - - - - - Get or set the instance Id of the Scheduler (must be unique within this server instance). - - - - - Get or set whether this instance is part of a cluster. - - - - - Get or set the frequency at which this instance "checks-in" - with the other instances of the cluster. -- Affects the rate of - detecting failed instances. - - - - - Get or set the maximum number of misfired triggers that the misfire handling - thread will try to recover at one time (within one transaction). The - default is 20. - - - - - Gets or sets the database retry interval. - - The db retry interval. - - - - Get or set whether this instance should use database-based thread - synchronization. - - - - - Whether or not to obtain locks when inserting new jobs/triggers. - Defaults to , which is safest - some db's (such as - MS SQLServer) seem to require this to avoid deadlocks under high load, - while others seem to do fine without. - - - Setting this property to will provide a - significant performance increase during the addition of new jobs - and triggers. - - - - - The time span by which a trigger must have missed its - next-fire-time, in order for it to be considered "misfired" and thus - have its misfire instruction applied. - - - - - Don't call set autocommit(false) on connections obtained from the - DataSource. This can be helpfull in a few situations, such as if you - have a driver that complains if it is called when it is already off. - - - - - Set the transaction isolation level of DB connections to sequential. - - - - - Whether or not the query and update to acquire a Trigger for firing - should be performed after obtaining an explicit DB lock (to avoid - possible race conditions on the trigger's db row). This is - is considered unnecessary for most databases (due to the nature of - the SQL update that is performed), and therefore a superfluous performance hit. - - - - - Get or set the ADO.NET driver delegate class name. - - - - - set the SQL statement to use to select and lock a row in the "locks" - table. - - - - - - Get whether the threads spawned by this JobStore should be - marked as daemon. Possible threads include the - and the . - - - - - - Get whether to check to see if there are Triggers that have misfired - before actually acquiring the lock to recover them. This should be - set to false if the majority of the time, there are are misfired - Triggers. - - - - - - Get the driver delegate for DB operations. - - - - - Get whether String-only properties will be handled in JobDataMaps. - - - - - Indicates whether this job store supports persistence. - - - - - - - Implement this interface to provide the code to execute within - the a transaction template that has no return value. - - - - - - Implement this interface to provide the code to execute within - the a transaction template. If no return value is required, execute - should just return null. - - - - - - - - An interface for classes wishing to provide the service of loading classes - and resources within the scheduler... - - James House - - - - Called to give the ClassLoadHelper a chance to Initialize itself, - including the oportunity to "steal" the class loader off of the calling - thread, which is the thread that is initializing Quartz. - - - - - Return the class with the given name. - - - - - Finds a resource with a given name. This method returns null if no - resource with this name is found. - - name of the desired resource - - a java.net.URL object - - - - - Finds a resource with a given name. This method returns null if no - resource with this name is found. - - name of the desired resource - - a java.io.InputStream object - - - - - Helper class for returning the composite result of trying - to recover misfired jobs. - - - - - Initializes a new instance of the class. - - if set to true [has more misfired triggers]. - The processed misfired trigger count. - - - - - Gets a value indicating whether this instance has more misfired triggers. - - - true if this instance has more misfired triggers; otherwise, false. - - - - - Gets the processed misfired trigger count. - - The processed misfired trigger count. - - - - Called by the QuartzScheduler before the is - used, in order to give the it a chance to Initialize. - - - - - - - Called by the QuartzScheduler to inform the that - it should free up all of it's resources because the scheduler is - shutting down. - - - - - Gets the non managed TX connection. - - - - - - Execute the given callback having optionally aquired the given lock. - Because CMT assumes that the connection is already part of a managed - transaction, it does not attempt to commit or rollback the - enclosing transaction. - - - - - - - The name of the lock to aquire, for example - "TRIGGER_ACCESS". If null, then no lock is aquired, but the - txCallback is still executed in a transaction. - - Callback to execute. - - - - Utility class to keep track of both active transaction - and connection. - - - - - Initializes a new instance of the class. - - The connection. - The transaction. - - - - Gets or sets the connection. - - The connection. - - - - Gets or sets the transaction. - - The transaction. - - - - is meant to be used in a standalone environment. - Both commit and rollback will be handled by this class. - - Jeffrey Wescott - James House - - - - Called by the QuartzScheduler before the is - used, in order to give the it a chance to Initialize. - - - - - - - For , the non-managed TX connection is just - the normal connection because it is not CMT. - - - - - - Execute the given callback having optionally aquired the given lock. - For , because it manages its own transactions - and only has the one datasource, this is the same behavior as - . - - - The name of the lock to aquire, for example "TRIGGER_ACCESS". - If null, then no lock is aquired, but the lockCallback is still - executed in a transaction. - - Callback to execute. - - - - - - - - - Exception class for when there is a failure obtaining or releasing a - resource lock. - - - James House - - - - An exception that is thrown to indicate that there has been a failure in the - scheduler's underlying persistence mechanism. - - James House - - - -

- Create a with the given message. -

-
-
- - - Initializes a new instance of the class. - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - The class name is null or is zero (0). - The info parameter is null. - - -

- Create a with the given message - and error code. -

-
-
- -

- Create a with the given message - and cause. -

-
-
- -

- Create a with the given message, - cause and error code. -

-
-
- - - Initializes a new instance of the class. - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - The class name is null or is zero (0). - The info parameter is null. - - - - This is a driver delegate for the MySQL ADO.NET driver. - - Marko Lahma - - - - Initializes a new instance of the class. - - the logger to use during execution - the prefix of all table names - The instance id. - The db provider. - - - - Initializes a new instance of the class. - - The logger. - The table prefix. - The instance id. - The db provider. - if set to true [use properties]. - - - - Gets the select next trigger to acquire SQL clause. - MySQL version with LIMIT support. - - - - - - Exception class for when a driver delegate cannot be found for a given - configuration, or lack thereof. - - Jeffrey Wescott - - - - Initializes a new instance of the class. - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - The class name is null or is zero (0). - The info parameter is null. - - - - This is a driver delegate for the Oracle database. - - Marko Lahma - - - - Initializes a new instance of the class. - - the logger to use during execution - the prefix of all table names - The instance id. - The db provider. - - - - Initializes a new instance of the class. - - The logger. - The table prefix. - The instance id. - The db provider. - if set to true [use properties]. - - - - Creates the SQL for select next trigger to acquire. - - - - - Gets the select next trigger to acquire SQL clause. - Oracle version with rownum support. - - - - - - This is a driver delegate for the PostgreSQL ADO.NET driver. - - Marko Lahma - - - - Initializes a new instance of the class. - - The log. - The table prefix. - The instance id. - The db provider. - - - - Initializes a new instance of the class. - - The log. - The table prefix. - The instance id. - The db provider. - if set to true [use properties]. - - - - Gets the select next trigger to acquire SQL clause. - PostgreSQL version with LIMIT support. - - - - - - Conveys a scheduler-instance state record. - - James House - - - - Gets or sets the checkin interval. - - The checkin interval. - - - - Gets or sets the checkin timestamp. - - The checkin timestamp. - - - - Gets or sets the scheduler instance id. - - The scheduler instance id. - - - - Internal in-memory lock handler for providing thread/resource locking in - order to protect resources from being altered by multiple threads at the - same time. - - James House - - - - Grants a lock on the identified resource to the calling thread (blocking - until it is available). - - True if the lock was obtained. - - - Release the lock on the identified resource if it is held by the calling - thread. - - - - - Determine whether the calling thread owns a lock on the identified - resource. - - - - - Gets the thread locks. - - The thread locks. - - - - Whether this Semaphore implementation requires a database connection for - its lock management operations. - - - - - - - - - This is a driver delegate for the SQLiteDelegate ADO.NET driver. - - Marko Lahma - - - - Initializes a new instance of the class. - - the logger to use during execution - the prefix of all table names - The instance id. - The db provider. - - - - Initializes a new instance of the class. - - The logger. - The table prefix. - The instance id. - The db provider. - if set to true [use properties]. - - - - Gets the select next trigger to acquire SQL clause. - SQLite version with LIMIT support. - - - - - - A SQL Server specific driver delegate. - - Marko Lahma - - - - Initializes a new instance of the class. - - the logger to use during execution - the prefix of all table names - The instance id. - The db provider. - - - - Initializes a new instance of the class. - - The logger. - The table prefix. - The instance id. - The db provider. - if set to true [use properties]. - - - - Creates the SQL for select next trigger to acquire. - - - - - Gets the select next trigger to acquire SQL clause. - SQL Server specific version with TOP functionality - - - - - - Internal database based lock handler for providing thread/resource locking - in order to protect resources from being altered by multiple threads at the - same time. - - James House - - - - Initializes a new instance of the class. - - The table prefix. - The select with lock SQL. - - - - Execute the SQL select for update that will lock the proper database row. - - - - Provide thread/resource locking in order to protect - resources from being altered by multiple threads at the same time using - a db row update. - - - Note: This Semaphore implementation is useful for databases that do - not support row locking via "SELECT FOR UPDATE" type syntax, for example - Microsoft SQLServer (MSSQL). - - - - - Initializes a new instance of the class. - - - - - Execute the SQL that will lock the proper database row. - - - - - - - - This implementation of the Calendar excludes a set of days of the year. You - may use it to exclude bank holidays which are on the same date every year. - - - - Juergen Donnerstag - - - - This implementation of the Calendar may be used (you don't have to) as a - base class for more sophisticated one's. It merely implements the base - functionality required by each Calendar. - - - Regarded as base functionality is the treatment of base calendars. Base - calendar allow you to chain (stack) as much calendars as you may need. For - example to exclude weekends you may use WeeklyCalendar. In order to exclude - holidays as well you may define a WeeklyCalendar instance to be the base - calendar for HolidayCalendar instance. - - - Juergen Donnerstag - James House - - - - An interface to be implemented by objects that define spaces of time during - which an associated may fire. - - - Calendars do not define actual fire times, but rather are used to limit a - from firing on its normal schedule if necessary. Most - Calendars include all times by default and allow the user to specify times to - exclude. As such, it is often useful to think of Calendars as being used to - exclude a block of time, as opposed to include - a block of time. (i.e. the schedule "fire every five minutes except on Sundays" could be - implemented with a and a which excludes Sundays) - - James House - Juergen Donnerstag - - - - Determine whether the given UTC time is 'included' by the - Calendar. - - - - - Determine the next UTC time that is 'included' by the - Calendar after the given UTC time. - - - - - Gets or sets a description for the instance - may be - useful for remembering/displaying the purpose of the calendar, though - the description has no meaning to Quartz. - - - - - Set a new base calendar or remove the existing one. - Get the base calendar. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The base calendar. - - - - Initializes a new instance of the class. - - The time zone. - - - - Initializes a new instance of the class. - - The base calendar. - The time zone. - - - - checks whether two arrays have - the same length and - for any given place there are equal elements - in both arrays - - - - - - Get the base calendar. Will be null, if not set. - - - - - Check if date/time represented by timeStamp is included. If included - return true. The implementation of BaseCalendar simply calls the base - calendars IsTimeIncluded() method if base calendar is set. - - - - - - Determine the next UTC time (in milliseconds) that is 'included' by the - Calendar after the given time. Return the original value if timeStamp is - included. Return 0 if all days are excluded. - - - - - - Gets or sets the time zone. - - The time zone. - - - - Gets or sets the description given to the instance by - its creator (if any). - - - - - Set a new base calendar or remove the existing one - - - - - - Constructor - - - - - Constructor - - The base calendar. - - - - Return true, if day is defined to be exluded. - - - - - Redefine a certain day to be excluded (true) or included (false). - - - - - Determine whether the given UTC time (in milliseconds) is 'included' by the - Calendar. -

- Note that this Calendar is only has full-day precision. -

-
-
- - - Determine the next UTC time (in milliseconds) that is 'included' by the - Calendar after the given time. Return the original value if timeStampUtc is - included. Return 0 if all days are excluded. -

- Note that this Calendar is only has full-day precision. -

-
-
- - - Get or the array which defines the exclude-value of each day of month. - Setting will redefine the array of days excluded. The array must of size greater or - equal 31. - - - - - This implementation of the Calendar excludes the set of times expressed by a - given CronExpression. - - - For example, you could use this calendar to exclude all but business hours (8AM - 5PM) every - day using the expression "* * 0-7,18-23 ? * *". -

- It is important to remember that the cron expression here describes a set of - times to be excluded from firing. Whereas the cron expression in - CronTrigger describes a set of times that can - be included for firing. Thus, if a has a - given cron expression and is associated with a with - the same expression, the calendar will exclude all the times the - trigger includes, and they will cancel each other out. -

-
- Aaron Craven -
- - - Initializes a new instance of the class. - - a String representation of the desired cron expression - - - - Create a with the given cron expression and - . - - - the base calendar for this calendar instance - see BaseCalendar for more information on base - calendar functionality - - a String representation of the desired cron expression - - - - Create a with the given cron expression and - . - - - the base calendar for this calendar instance - see BaseCalendar for more information on base - calendar functionality - - a String representation of the desired cron expression - - - - - Determine whether the given time is 'included' by the - Calendar. - - the time to test - a boolean indicating whether the specified time is 'included' by the CronCalendar - - - - Determine the next time that is 'included' by the - Calendar after the given time. Return the original value if timeStamp is - included. Return 0 if all days are excluded. - - - - - - - Returns a that represents the current . - - - A that represents the current . - - - - - Sets the cron expression for the calendar to a new value. - - The expression. - - - - Returns the object representation of the cron expression that defines the - dates and times this calendar excludes. - - - - - This implementation of the Calendar excludes (or includes - see below) a - specified time range each day. - - - For example, you could use this calendar to - exclude business hours (8AM - 5PM) every day. Each - only allows a single time range to be specified, and that time range may not - * cross daily boundaries (i.e. you cannot specify a time range from 8PM - 5AM). - If the property is (default), - the time range defines a range of times in which triggers are not allowed to - * fire. If is , the time range - is inverted: that is, all times outside the defined time range - are excluded. -

- Note when using , it behaves on the same principals - as, for example, WeeklyCalendar defines a set of days that are - excluded every week. Likewise, defines a - set of times that are excluded every day. -

-
- Mike Funk - Aaron Craven -
- - - Create a with a time range defined by the - specified strings and no baseCalendar. - and - must be in the format "HH:MM[:SS[:mmm]]" where: -
    -
  • - HH is the hour of the specified time. The hour should be - specified using military (24-hour) time and must be in the range - 0 to 23. -
  • -
  • - MM is the minute of the specified time and must be in the range - 0 to 59. -
  • -
  • - SS is the second of the specified time and must be in the range - 0 to 59. -
  • -
  • - mmm is the millisecond of the specified time and must be in the - range 0 to 999. -
  • -
  • items enclosed in brackets ('[', ']') are optional.
  • -
  • - The time range starting time must be before the time range ending - time. Note this means that a time range may not cross daily - boundaries (10PM - 2AM) -
  • -
-
-
- - - Create a with a time range defined by the - specified strings and the specified baseCalendar. - and - must be in the format "HH:MM[:SS[:mmm]]" where: -
    -
  • - HH is the hour of the specified time. The hour should be - specified using military (24-hour) time and must be in the range - 0 to 23. -
  • -
  • - MM is the minute of the specified time and must be in the range - 0 to 59. -
  • -
  • - SS is the second of the specified time and must be in the range - 0 to 59. -
  • -
  • - mmm is the millisecond of the specified time and must be in the - range 0 to 999. -
  • -
  • - items enclosed in brackets ('[', ']') are optional. -
  • -
  • - The time range starting time must be before the time range ending - time. Note this means that a time range may not cross daily - boundaries (10PM - 2AM) -
  • -
-
- The base calendar for this calendar instance see BaseCalendar for more - information on base calendar functionality. -
- - - Create a with a time range defined by the - specified values and no baseCalendar. Values are subject to - the following validations: -
    -
  • - Hours must be in the range 0-23 and are expressed using military - (24-hour) time. -
  • -
  • Minutes must be in the range 0-59
  • -
  • Seconds must be in the range 0-59
  • -
  • Milliseconds must be in the range 0-999
  • -
  • - The time range starting time must be before the time range ending - time. Note this means that a time range may not cross daily - boundaries (10PM - 2AM) -
  • -
-
- The range starting hour of day. - The range starting minute. - The range starting second. - The range starting millis. - The range ending hour of day. - The range ending minute. - The range ending second. - The range ending millis. -
- - - Create a with a time range defined by the - specified values and the specified . Values are - subject to the following validations: -
    -
  • - Hours must be in the range 0-23 and are expressed using military - (24-hour) time. -
  • -
  • Minutes must be in the range 0-59
  • -
  • Seconds must be in the range 0-59
  • -
  • Milliseconds must be in the range 0-999
  • -
  • - The time range starting time must be before the time range ending - time. Note this means that a time range may not cross daily - boundaries (10PM - 2AM) -
  • -
-
- The range starting hour of day. - The range starting minute. - The range starting second. - The range starting millis. - The range ending hour of day. - The range ending minute. - The range ending second. - The range ending millis. -
- - - Create a with a time range defined by the - specified s and no - baseCalendar. The Calendars are subject to the following - considerations: -
    -
  • - Only the time-of-day fields of the specified Calendars will be - used (the date fields will be ignored) -
  • -
  • - The starting time must be before the ending time of the defined - time range. Note this means that a time range may not cross - daily boundaries (10PM - 2AM). (because only time fields are - are used, it is possible for two Calendars to represent a valid - time range and - rangeStartingCalendar.after(rangeEndingCalendar) == true) - -
  • -
-
- The range starting calendar. - The range ending calendar. -
- - - Create a with a time range defined by the - specified s and the specified - . The Calendars are subject to the following - considerations: -
    -
  • - Only the time-of-day fields of the specified Calendars will be - used (the date fields will be ignored) -
  • -
  • - The starting time must be before the ending time of the defined - time range. Note this means that a time range may not cross - daily boundaries (10PM - 2AM). (because only time fields are - are used, it is possible for two Calendars to represent a valid - time range and - rangeStartingCalendarUtc > rangeEndingCalendarUtc == true) -
  • -
-
- The range starting calendar. - The range ending calendar. -
- - - Create a with a time range defined by the - specified values and no baseCalendar. The values are - subject to the following considerations: -
    -
  • - Only the time-of-day portion of the specified values will be - used -
  • -
  • - The starting time must be before the ending time of the defined - time range. Note this means that a time range may not cross - daily boundaries (10PM - 2AM). (because only time value are - are used, it is possible for the two values to represent a valid - time range and rangeStartingTime > rangeEndingTime) -
  • -
-
- The range starting time in millis. - The range ending time in millis. -
- - - Create a with a time range defined by the - specified values and the specified . The values - are subject to the following considerations: -
    -
  • - Only the time-of-day portion of the specified values will be - used -
  • -
  • - The starting time must be before the ending time of the defined - time range. Note this means that a time range may not cross - daily boundaries (10PM - 2AM). (because only time value are - are used, it is possible for the two values to represent a valid - time range and rangeStartingTime > rangeEndingTime) -
  • -
-
- The range starting time in millis. - The range ending time in millis. -
- - - Determine whether the given time is 'included' by the - Calendar. - - - - - - - Determine the next time (in milliseconds) that is 'included' by the - Calendar after the given time. Return the original value if timeStamp is - included. Return 0 if all days are excluded. - - - - - - - - Returns the start time of the time range of the day - specified in . - - - a DateTime representing the start time of the - time range for the specified date. - - - - - Returns the end time of the time range of the day - specified in - - - A DateTime representing the end time of the - time range for the specified date. - - - - - Returns a that represents the current . - - - A that represents the current . - - - - - Sets the time range for the to the times - represented in the specified Strings. - - The range starting time string. - The range ending time string. - - - - Sets the time range for the to the times - represented in the specified values. - - The range starting hour of day. - The range starting minute. - The range starting second. - The range starting millis. - The range ending hour of day. - The range ending minute. - The range ending second. - The range ending millis. - - - - Sets the time range for the to the times - represented in the specified s. - - The range starting calendar. - The range ending calendar. - - - - Sets the time range for the to the times - represented in the specified values. - - The range starting time. - The range ending time. - - - - Gets the start of day, practically zeroes time part. - - The time. - - - - - Gets the end of day, pratically sets time parts to maximum allowed values. - - The time. - - - - - Checks the specified values for validity as a set of time values. - - The hour of day. - The minute. - The second. - The millis. - - - - Indicates whether the time range represents an inverted time range (see - class description). - - true if invert time range; otherwise, false. - - - - This implementation of the Calendar stores a list of holidays (full days - that are excluded from scheduling). - - - The implementation DOES take the year into consideration, so if you want to - exclude July 4th for the next 10 years, you need to add 10 entries to the - exclude list. - - Sharada Jambula - Juergen Donnerstag - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The base calendar. - - - - Determine whether the given time (in milliseconds) is 'included' by the - Calendar. -

- Note that this Calendar is only has full-day precision. -

-
-
- - - Determine the next time (in milliseconds) that is 'included' by the - Calendar after the given time. -

- Note that this Calendar is only has full-day precision. -

-
-
- - - Add the given Date to the list of excluded days. Only the month, day and - year of the returned dates are significant. - - - - - Removes the excluded date. - - The date to remove. - - - - Returns a of Dates representing the excluded - days. Only the month, day and year of the returned dates are - significant. - - - - - This implementation of the Calendar excludes a set of days of the month. You - may use it to exclude every 1. of each month for example. But you may define - any day of a month. - - - - Juergen Donnerstag - - - - Initializes a new instance of the class. - - - - - Constructor - - The base calendar. - - - - Initialize internal variables - - - - - Return true, if mday is defined to be exluded. - - - - - Redefine a certain day of the month to be excluded (true) or included - (false). - - - - - Check if all days are excluded. That is no day is included. - - boolean - - - - - Determine whether the given time (in milliseconds) is 'included' by the - Calendar. -

- Note that this Calendar is only has full-day precision. -

-
-
- - - Determine the next time (in milliseconds) that is 'included' by the - Calendar after the given time. Return the original value if timeStamp is - included. Return DateTime.MinValue if all days are excluded. -

- Note that this Calendar is only has full-day precision. -

-
-
- - - Get or set the array which defines the exclude-value of each day of month - Setting will redefine the array of days excluded. The array must of size greater or - equal 31. - - - - - This implementation of the Calendar excludes a set of days of the week. You - may use it to exclude weekends for example. But you may define any day of - the week. - - - - Juergen Donnerstag - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The base calendar. - - - - Initialize internal variables - - - - - Return true, if wday is defined to be exluded. E. g. - saturday and sunday. - - - - - Redefine a certain day of the week to be excluded (true) or included - (false). Use java.util.Calendar's constants like MONDAY to determine the - wday. - - - - - Check if all week ays are excluded. That is no day is included. - - - - - Determine whether the given time (in milliseconds) is 'included' by the - Calendar. -

- Note that this Calendar is only has full-day precision. -

-
-
- - - Determine the next time (in milliseconds) that is 'included' by the - Calendar after the given time. Return the original value if timeStamp is - included. Return DateTime.MinValue if all days are excluded. -

- Note that this Calendar is only has full-day precision. -

-
-
- - - Get the array with the week days. - Setting will redefine the array of days excluded. The array must of size greater or - equal 8. java.util.Calendar's constants like MONDAY should be used as - index. A value of true is regarded as: exclude it. - - - - - A singleton implementation of . - - - Here are some examples of using this class: -

- To create a scheduler that does not write anything to the database (is not - persistent), you can call : -

-
-            DirectSchedulerFactory.Instance.CreateVolatileScheduler(10); // 10 threads 
-            // don't forget to start the scheduler: 
-            DirectSchedulerFactory.Instance.GetScheduler().Start();
-            
-

- Several create methods are provided for convenience. All create methods - eventually end up calling the create method with all the parameters: -

-
-            public void createScheduler(String schedulerName, string schedulerInstanceId, ThreadPool threadPool, JobStore jobStore, string rmiRegistryHost, int rmiRegistryPort)
-            
-

- Here is an example of using this method: -

-
-            // create the thread pool 
-            SimpleThreadPool threadPool = new SimpleThreadPool(maxThreads, Thread.NORM_PRIORITY); 
-            threadPool.Initialize(); 
-            // create the job store 
-            JobStore jobStore = new RAMJobStore(); 
-            jobStore.Initialize();
-            
-            DirectSchedulerFactory.Instance.CreateScheduler("My Quartz Scheduler", "My Instance", threadPool, jobStore, "localhost", 1099); 
-            // don't forget to start the scheduler: 
-            DirectSchedulerFactory.Instance.GetScheduler("My Quartz Scheduler", "My Instance").start();
-            
-
> - Mohammad Rezaei - James House - - -
- - - Provides a mechanism for obtaining client-usable handles to - instances. - - - - James House - - - - Returns a client-usable handle to a . - - - - - Returns a handle to the Scheduler with the given name, if it exists. - - - - - Returns handles to all known Schedulers (made by any SchedulerFactory - within this app domain.). - - - - - Initializes a new instance of the class. - - - - - Creates an in memory job store () - The thread priority is set to Thread.NORM_PRIORITY - - The number of threads in the thread pool - - - - Creates a proxy to a remote scheduler. This scheduler can be retrieved - via . - - SchedulerException - - - - Same as , - with the addition of specifying the scheduler name and instance ID. This - scheduler can only be retrieved via . - - The name for the scheduler. - The instance ID for the scheduler. - - SchedulerException - - - - Creates a scheduler using the specified thread pool and job store. This - scheduler can be retrieved via DirectSchedulerFactory#GetScheduler() - - - The thread pool for executing jobs - - - The type of job store - - SchedulerException - if initialization failed - - - - - Same as DirectSchedulerFactory#createScheduler(ThreadPool threadPool, JobStore jobStore), - with the addition of specifying the scheduler name and instance ID. This - scheduler can only be retrieved via DirectSchedulerFactory#getScheduler(String) - - The name for the scheduler. - The instance ID for the scheduler. - The thread pool for executing jobs - The type of job store - - - - Creates a scheduler using the specified thread pool and job store and - binds it to RMI. - - The name for the scheduler. - The instance ID for the scheduler. - The thread pool for executing jobs - The type of job store - The idle wait time. You can specify "-1" for - the default value, which is currently 30000 ms. - The db failure retry interval. - - - - Creates a scheduler using the specified thread pool and job store and - binds it to RMI. - - The name for the scheduler. - The instance ID for the scheduler. - The thread pool for executing jobs - The type of job store - - The idle wait time. You can specify TimeSpan.Zero for - the default value, which is currently 30000 ms. - The db failure retry interval. - - - - Returns a handle to the Scheduler produced by this factory. -

- you must call createRemoteScheduler or createScheduler methods before - calling getScheduler() -

-
- - SchedulerException -
- - - Returns a handle to the Scheduler with the given name, if it exists. - - - - - Gets the log. - - The log. - - - - Gets the instance. - - The instance. - - -

- Returns a handle to all known Schedulers (made by any - StdSchedulerFactory instance.). -

-
-
- - - An implementation of the interface that remotely - proxies all method calls to the equivalent call on a given - instance, via remoting or similar technology. - - - - - James House - - - - This is the main interface of a Quartz Scheduler. - - - - A maintains a registry of - s and s. Once - registered, the is responsible for executing - s when their associated s - fire (when their scheduled time arrives). - - - instances are produced by a - . A scheduler that has already been - created/initialized can be found and used through the same factory that - produced it. After a has been created, it is in - "stand-by" mode, and must have its method - called before it will fire any s. - - - s are to be created by the 'client program', by - defining a class that implements the interface. - objects are then created (also by the client) to - define a individual instances of the . - instances can then be registered with the - via the %IScheduler.ScheduleJob(JobDetail, - Trigger)% or %IScheduler.AddJob(JobDetail, bool)% method. - - - s can then be defined to fire individual - instances based on given schedules. - s are most useful for one-time firings, or - firing at an exact moment in time, with N repeats with a given delay between - them. s allow scheduling based on time of day, - day of week, day of month, and month of year. - - - s and s have a name and - group associated with them, which should uniquely identify them within a single - . The 'group' feature may be useful for creating - logical groupings or categorizations of s and - s. If you don't have need for assigning a group to a - given s of s, then you can use - the constant defined on - this interface. - - - Stored s can also be 'manually' triggered through the - use of the %IScheduler.TriggerJob(string, string)% function. - - - Client programs may also be interested in the 'listener' interfaces that are - available from Quartz. The interface provides - notifications of executions. The - interface provides notifications of - firings. The - interface provides notifications of events and - errors. - - - The setup/configuration of a instance is very - customizable. Please consult the documentation distributed with Quartz. - - - - - - - - - - - - returns true if the given JobGroup - is paused - - - - - - - returns true if the given TriggerGroup - is paused - - - - - - - Get a object describiing the settings - and capabilities of the scheduler instance. - - - Note that the data returned is an 'instantaneous' snap-shot, and that as - soon as it's returned, the meta data values may be different. - - - - - Return a list of objects that - represent all currently executing Jobs in this Scheduler instance. - - -

- This method is not cluster aware. That is, it will only return Jobs - currently executing in this Scheduler instance, not across the entire - cluster. -

-

- Note that the list returned is an 'instantaneous' snap-shot, and that as - soon as it's returned, the true list of executing jobs may be different. - Also please read the doc associated with - - especially if you're using remoting. -

-
- -
- - - Get the names of all groups that are paused. - - - - - Get the global that has - the given name. - - Global job listener's name - - - - - Get the global that - has the given name. - - Global trigger listener's name - - - - - Starts the 's threads that fire s. - When a scheduler is first created it is in "stand-by" mode, and will not - fire triggers. The scheduler can also be put into stand-by mode by - calling the method. - - - The misfire/recovery process will be started, if it is the initial call - to this method on this scheduler instance. - - - - - - - - Calls after the indicated delay. - (This call does not block). This can be useful within applications that - have initializers that create the scheduler immediately, before the - resources needed by the executing jobs have been fully initialized. - - - - - - - - Temporarily halts the 's firing of s. - - -

- When is called (to bring the scheduler out of - stand-by mode), trigger misfire instructions will NOT be applied - during the execution of the method - any misfires - will be detected immediately afterward (by the 's - normal process). -

-

- The scheduler is not destroyed, and can be re-started at any time. -

-
- - -
- - - Halts the 's firing of s, - and cleans up all resources associated with the Scheduler. Equivalent to - . - - - The scheduler cannot be re-started. - - - - - - Halts the 's firing of s, - and cleans up all resources associated with the Scheduler. - - - The scheduler cannot be re-started. - - - if the scheduler will not allow this method - to return until all currently executing jobs have completed. - - - - - - Add the given to the - Scheduler, and associate the given with - it. - - - If the given Trigger does not reference any , then it - will be set to reference the Job passed with it into this method. - - - - - Schedule the given with the - identified by the 's settings. - - - - - Remove the indicated from the scheduler. - - - - - Remove (delete) the with the - given name, and store the new given one - which must be associated - with the same job (the new trigger must have the job name & group specified) - - however, the new trigger need not have the same name as the old trigger. - - - The name of the to be replaced. - - - The group name of the to be replaced. - - - The new to be stored. - - - if a with the given - name and group was not found and removed from the store, otherwise - the first fire time of the newly scheduled trigger. - - - - - Add the given to the Scheduler - with no associated - . The will be 'dormant' until - it is scheduled with a , or - is called for it. - - - The must by definition be 'durable', if it is not, - SchedulerException will be thrown. - - - - - Delete the identified from the Scheduler - and any - associated s. - - true if the Job was found and deleted. - - - - Trigger the identified - (Execute it now) - the generated trigger will be non-volatile. - - - - - Trigger the identified - (Execute it now) - the generated trigger will be volatile. - - - - - Trigger the identified - (Execute it now) - the generated trigger will be non-volatile. - - the name of the Job to trigger - the group name of the Job to trigger - - the (possibly ) JobDataMap to be - associated with the trigger that fires the job immediately. - - - - - Trigger the identified - (Execute it now) - the generated trigger will be volatile. - - the name of the Job to trigger - the group name of the Job to trigger - - the (possibly ) JobDataMap to be - associated with the trigger that fires the job immediately. - - - - - Pause the with the given - name - by pausing all of its current s. - - - - - Pause all of the s in the - given group - by pausing all of their s. - - - The Scheduler will "remember" that the group is paused, and impose the - pause on any new jobs that are added to the group while the group is - paused. - - - - - - Pause the with the given name. - - - - - Pause all of the s in the given group. - - - The Scheduler will "remember" that the group is paused, and impose the - pause on any new triggers that are added to the group while the group is - paused. - - - - - - Resume (un-pause) the with - the given name. - - - If any of the 's s missed one - or more fire-times, then the 's misfire - instruction will be applied. - - - - - Resume (un-pause) all of the s - in the given group. - - - If any of the s had s that - missed one or more fire-times, then the 's - misfire instruction will be applied. - - - - - - Resume (un-pause) the with the given - name. - - - If the missed one or more fire-times, then the - 's misfire instruction will be applied. - - - - - Resume (un-pause) all of the s in the - given group. - - - If any missed one or more fire-times, then the - 's misfire instruction will be applied. - - - - - - Pause all triggers - similar to calling - on every group, however, after using this method - must be called to clear the scheduler's state of 'remembering' that all - new triggers will be paused as they are added. - - - When is called (to un-pause), trigger misfire - instructions WILL be applied. - - - - - - - - Resume (un-pause) all triggers - similar to calling - on every group. - - - If any missed one or more fire-times, then the - 's misfire instruction will be applied. - - - - - - Get the names of all the s in the given group. - - - - - Get all s that are associated with the - identified . - - - - - Get the names of all the s in the given - group. - - - - - Get the for the - instance with the given name and group. - - - - - Get the instance with the given name and - group. - - - - - Get the current state of the identified . - - - - - - - - - - - Add (register) the given to the Scheduler. - - Name of the calendar. - The calendar. - if set to true [replace]. - whether or not to update existing triggers that - referenced the already existing calendar so that they are 'correct' - based on the new trigger. - - - - Delete the identified from the Scheduler. - - Name of the calendar. - - true if the Calendar was found and deleted. - - - - - Get the instance with the given name. - - - - - Get the names of all registered . - - An array of calendar names. - - - - Request the interruption, within this Scheduler instance, of all - currently executing instances of the identified , which - must be an implementor of the interface. - - -

- If more than one instance of the identified job is currently executing, - the method will be called on - each instance. However, there is a limitation that in the case that - on one instances throws an exception, all - remaining instances (that have not yet been interrupted) will not have - their method called. -

- -

- If you wish to interrupt a specific instance of a job (when more than - one is executing) you can do so by calling - to obtain a handle - to the job instance, and then invoke on it - yourself. -

-

- This method is not cluster aware. That is, it will only interrupt - instances of the identified InterruptableJob currently executing in this - Scheduler instance, not across the entire cluster. -

-
- - - - true is at least one instance of the identified job was found and interrupted. - - - -
- - - Add the given to the 's - global list. - - - Listeners in the 'global' list receive notification of execution events - for ALL s. - - - - - Add the given to the 's - list, of registered s. - - - - - Remove the given from the 's - list of global listeners. - - - true if the identifed listener was found in the list, and removed. - - - - - Remove the identifed from the 's - list of global listeners. - - Global job listener's name - true if the identifed listener was found in the list, and removed - - - - Remove the identifed from the 's - list of registered listeners. - - - true if the identifed listener was found in the list, and removed. - - - - - Get the non-global that has - the given name. - - - - - Add the given to the 's - global list. - - - Listeners in the 'global' list receive notification of execution events - for ALL s. - - - - - Add the given to the 's - list, of registered s. - - - - - Remove the given from the 's - list of global listeners. - - - true if the identifed listener was found in the list, and removed. - - - - - Remove the identifed from the 's - list of global listeners. - - The name. - true if the identifed listener was found in the list, and removed. - - - - Remove the identifed from the - 's list of registered listeners. - - - true if the identifed listener was found in the list, and removed. - - - - - Get the non-global that - has the given name. - - - - - Register the given with the - - - - - Remove the given from the - . - - true if the identifed listener was found in the list, and - removed. - - - - - Returns the name of the . - - - - - Returns the instance Id of the . - - - - - Returns the of the . - - - - - Reports whether the is in stand-by mode. - - - - - - - Reports whether the has been Shutdown. - - - - - Set the that will be responsible for producing - instances of classes. - - - JobFactories may be of use to those wishing to have their application - produce instances via some special mechanism, such as to - give the opertunity for dependency injection. - - - - - - Get the names of all known groups. - - - - - Get the names of all known groups. - - - - - Get the names of all registered s. - - - - - Get a List containing all of the s in - the 'sglobal list. - - - - - Get a Set containing the names of all the non-global - s registered with the . - - - - - Get a List containing all of the - s in the 'sglobal list. - - - - - Get a Set containing the names of all the non-global - s registered with the . - - - - - Get a List containing all of the - s registered with the . - - - - - Whether the scheduler has been started. - - - Note: This only reflects whether has ever - been called on this Scheduler, so it will return even - if the is currently in standby mode or has been - since shutdown. - - - - - - - - Construct a instance to proxy the given - RemoteableQuartzScheduler instance, and with the given - . - - - - - returns true if the given JobGroup - is paused - - - - - - - returns true if the given TriggerGroup - is paused - - - - - - - Get a object describiing the settings - and capabilities of the scheduler instance. -

- Note that the data returned is an 'instantaneous' snap-shot, and that as - soon as it's returned, the meta data values may be different. -

-
- -
- - - Calls the equivalent method on the 'proxied' . - - - - - Get the global that has - the given name. - - - - - - - Get the global that - has the given name. - - - - - - - Get the names of all groups that are paused. - - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Get the names of all registered . - - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Remove the identifed from the 's - list of global listeners. - - - - true if the identifed listener was found in the list, and removed - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Remove the identifed from the 's - list of global listeners. - - The name. - - true if the identifed listener was found in the list, and removed. - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Returns the name of the . - - - - - Returns the instance Id of the . - - - - - Gets or sets the remote scheduler address. - - The remote scheduler address. - - - - Returns the of the . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Gets a value indicating whether this instance is paused. - - true if this instance is paused; otherwise, false. - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equialent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Set the that will be responsible for producing - instances of classes. -

- JobFactories may be of use to those wishing to have their application - produce instances via some special mechanism, such as to - give the opertunity for dependency injection. -

-
- - - SchedulerException -
- - - Whether the scheduler has been started. - - - - Note: This only reflects whether has ever - been called on this Scheduler, so it will return even - if the is currently in standby mode or has been - since shutdown. - - - - - - - - Holds references to Scheduler instances - ensuring uniqueness, and - preventing garbage collection, and allowing 'global' lookups. - - James House - Marko Lahma (.NET) - - - - Binds the specified sched. - - The sched. - - - - Removes the specified sched name. - - Name of the sched. - - - - - Lookups the specified sched name. - - Name of the sched. - - - - - Lookups all. - - - - - - Gets the singleton instance. - - The instance. - - - - Responsible for creating the instances of - to be used within the instance. -

- This implementation does not re-use any objects, it simply makes a new - JobRunShell each time is called. -

-
- James House -
- - - Initialize the factory, providing a handle to the - that should be made available within the and - the s within it, and a handle to the - that the shell will use in its own - operations with the . - - - - - Called by the to obtain instances of - . - - - - - Called by the to return instances of - . - - - - - An implementation of the interface that directly - proxies all method calls to the equivalent call on a given - instance. - - - - - James House - - - - returns true if the given JobGroup - is paused - - - - - - - returns true if the given TriggerGroup - is paused - - - - - - - Get a object describiing the settings - and capabilities of the scheduler instance. -

- Note that the data returned is an 'instantaneous' snap-shot, and that as - soon as it's returned, the meta data values may be different. -

-
- -
- - - Calls the equivalent method on the 'proxied' . - - - - - - - - - Get the global that has - the given name. - - - - - - - Get the global that - has the given name. - - - - - - - Construct a instance to proxy the given - instance, and with the given . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Get the names of all registered . - - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Remove the identifed from the 's - list of global listeners. - - - - true if the identifed listener was found in the list, and removed - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Remove the identifed from the 's - list of global listeners. - - The name. - - true if the identifed listener was found in the list, and removed. - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Request the interruption, within this Scheduler instance, of all - currently executing instances of the identified , which - must be an implementor of the interface. - - -

- If more than one instance of the identified job is currently executing, - the method will be called on - each instance. However, there is a limitation that in the case that - on one instances throws an exception, all - remaining instances (that have not yet been interrupted) will not have - their method called. -

-

- If you wish to interrupt a specific instance of a job (when more than - one is executing) you can do so by calling - to obtain a handle - to the job instance, and then invoke on it - yourself. -

-

- This method is not cluster aware. That is, it will only interrupt - instances of the identified InterruptableJob currently executing in this - Scheduler instance, not across the entire cluster. -

-
- - - true is at least one instance of the identified job was found and interrupted. - UnableToInterruptJobException if the job does not implement - - -
- - - Returns the name of the . - - - - - Returns the instance Id of the . - - - - - Returns the of the . - - - - - Whether the scheduler has been started. - - - - Note: This only reflects whether has ever - been called on this Scheduler, so it will return even - if the is currently in standby mode or has been - since shutdown. - - - - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - - - - - An implementation of that - does all of it's work of creating a instance - based on the contenents of a properties file. - - -

- By default a properties are loaded from App.config's quartz section. - If that fails, then the "quartz.properties" - file located (as a embedded resource) in Quartz.dll is loaded. If you - wish to use a file other than these defaults, you must define the system - property 'quartz.properties' to point to the file you want. -

- -

- See the sample properties that are distributed with Quartz for - information about the various settings available within the file. -

- -

- Alternativly, you can explicitly Initialize the factory by calling one of - the methods before calling . -

- -

- Instances of the specified , - , classes will be created - by name, and then any additional properties specified for them in the config - file will be set on the instance by calling an equivalent 'set' method. For - example if the properties file contains the property 'quartz.jobStore. - myProp = 10' then after the JobStore class has been instantiated, the property - 'MyProp' will be set with the value. Type conversion to primitive CLR types - (int, long, float, double, boolean, enum and string) are performed before calling - the property's setter method. -

-
- James House - Anthony Eden - Mohammad Rezaei - Marko Lahma (.NET) -
- - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The props. - - - - Initialize the with - the contenents of a Properties file. - -

- By default a properties file named "quartz.properties" is loaded from - the 'current working directory'. If that fails, then the - "quartz.properties" file located (as a resource) in the org/quartz - package is loaded. If you wish to use a file other than these defaults, - you must define the system property 'quartz.properties' to point to - the file you want. -

-
-
- - - Creates a new name value collection and overrides its values - with system values (environment variables). - - The base properties to override. - A new NameValueCollection instance. - - - - Initialize the with - the contenents of the given Properties object. - - - - - - - - Returns a handle to the Scheduler produced by this factory. - - - - If one of the methods has not be previously - called, then the default (no-arg) method - will be called by this method. - - - -

- Returns a handle to the Scheduler with the given name, if it exists (if - it has already been instantiated). -

-
-
- - - Returns a handle to the default Scheduler, creating it if it does not - yet exist. - - - - - -

- Returns a handle to all known Schedulers (made by any - StdSchedulerFactory instance.). -

-
-
- - - Inspects a file and compares whether it's "last modified date" has changed - since the last time it was inspected. If the file has been updated, the - job invokes a "call-back" method on an identified - that can be found in the - . - - James House - - - - - A marker interface for s that - wish to have their state maintained between executions. - - - instances follow slightly different rules from - regular instances. The key difference is that their - associated is re-persisted after every - execution of the job, thus preserving state for the next execution. The - other difference is that stateful jobs are not allowed to Execute - concurrently, which means new triggers that occur before the completion of - the method will be delayed. - - - - - - James House - Marko Lahma (.NET) - - - - The interface to be implemented by classes which represent a 'job' to be - performed. - - - Instances of this interface must have a - no-argument constructor. provides a mechanism for 'instance member data' - that may be required by some implementations of this interface. - - - - - - James House - Marko Lahma (.NET) - - - - Called by the when a - fires that is associated with the . - - - The implementation may wish to set a result object on the - JobExecutionContext before this method exits. The result itself - is meaningless to Quartz, but may be informative to - s or - s that are watching the job's - execution. - - The execution context. - - - - Initializes a new instance of the class. - - - - - Called by the when a - fires that is associated with the . -

- The implementation may wish to set a result object on the - JobExecutionContext before this method exits. The result itself - is meaningless to Quartz, but may be informative to - s or - s that are watching the job's - execution. -

-
- The execution context. - - -
- - - Gets the last modified date. - - Name of the file. - - - - - Gets the log. - - The log. - - - - Interface for objects wishing to receive a 'call-back' from a - . - - James House - - - - - Ãnforms that certain file has been updated. - - Name of the file. - - - - Built in job for executing native executables in a separate process. - - Matthew Payne - James House - Steinar Overbeck Cook - - - - Required parameter that specifies the name of the command (executable) - to be ran. - - - - - Optional parameter that specifies the parameters to be passed to the - executed command. - - - - - Optional parameter (value should be 'true' or 'false') that specifies - whether the job should wait for the execution of the native process to - complete before it completes. - -

Defaults to .

-
-
- - - Optional parameter (value should be 'true' or 'false') that specifies - whether the spawned process's stdout and stderr streams should be - consumed. If the process creates output, it is possible that it might - 'hang' if the streams are not consumed. - -

Defaults to .

-
-
- - - Optional parameter that specifies the workling directory to be used by - the executed command. - - - - - Initializes a new instance of the class. - - - - - Called by the when a - fires that is associated with the . -

- The implementation may wish to set a result object on the - JobExecutionContext before this method exits. The result itself - is meaningless to Quartz, but may be informative to - s or - s that are watching the job's - execution. -

-
- -
- - - Gets the log. - - The log. - - - - Consumes data from the given input stream until EOF and prints the data to stdout - - cooste - James House - - - - Initializes a new instance of the class. - - The enclosing instance. - The input stream. - The type. - - - - Runs this object as a separate thread, printing the contents of the input stream - supplied during instantiation, to either Console. or stderr - - - - - An implementation of Job, that does absolutely nothing - useful for system - which only wish to use s - and s, rather than writing - Jobs that perform work. - - James House - - - - Do nothing. - - - - - A Job which sends an e-mail with the configured content to the configured - recipient. - - James House - Marko Lahma (.NET) - - - The host name of the smtp server. REQUIRED. - - - The e-mail address to send the mail to. REQUIRED. - - - The e-mail address to cc the mail to. Optional. - - - The e-mail address to claim the mail is from. REQUIRED. - - - The e-mail address the message should say to reply to. Optional. - - - The subject to place on the e-mail. REQUIRED. - - - The e-mail message body. REQUIRED. - - - - Executes the job. - - The job execution context. - - - - Holds a List of references to SchedulerListener instances and broadcasts all - events to them (in order). - - - This may be more convenient than registering all of the listeners - directly with the Scheduler, and provides the flexibility of easily changing - which listeners get notified. - - - - James House - - - - Construct an instance with the given List of listeners. - - The initial List of SchedulerListeners to broadcast to. - - - - Holds a List of references to JobListener instances and broadcasts all - events to them (in order) - if the event is not excluded via filtering - (read on). - - -

- The broadcasting behavior of this listener to delegate listeners may be - more convenient than registering all of the listeners directly with the - Trigger, and provides the flexibility of easily changing which listeners - get notified. -

- -

- You may also register a number of Regular Expression patterns to match - the events against. If one or more patterns are registered, the broadcast - will only take place if the event applies to a job who's name/group - matches one or more of the patterns. -

-
- - - - - - James House -
- - Construct an instance with the given name. - - (Remember to add some delegate listeners!) - - @param name the name of this instance - - - Construct an instance with the given name, and List of listeners. - - @param name the name of this instance - @param listeners the initial List of JobListeners to broadcast to. - - - - If one or more name patterns are specified, only events relating to - jobs who's name matches the given regular expression pattern - will be dispatched to the delegate listeners. - - - - - - If one or more group patterns are specified, only events relating to - jobs who's group matches the given regular expression pattern - will be dispatched to the delegate listeners. - - - - - - Holds a List of references to TriggerListener instances and broadcasts all - events to them (in order) - if the event is not excluded via filtering - (read on). - - -

- The broadcasting behavior of this listener to delegate listeners may be - more convenient than registering all of the listeners directly with the - Trigger, and provides the flexibility of easily changing which listeners - get notified. -

- -

- You may also register a number of Regular Expression patterns to match - the events against. If one or more patterns are registered, the broadcast - will only take place if the event applies to a trigger who's name/group - matches one or more of the patterns. -

-
- - - - - - James House -
- - - The interface to be implemented by classes that want to be informed when a - fires. In general, applications that use a - will not have use for this mechanism. - - - - - - James House - - - - Called by the when a - has fired, and it's associated - is about to be executed. -

- It is called before the method of this - interface. -

-
- The that has fired. - - The that will be passed to the 's method. - -
- - - Called by the when a - has fired, and it's associated - is about to be executed. -

- It is called after the method of this - interface. -

-
- The that has fired. - The that will be passed to - the 's method. - Returns true if job execution should be vetoed, false otherwise. -
- - - Called by the when a - has misfired. -

- Consideration should be given to how much time is spent in this method, - as it will affect all triggers that are misfiring. If you have lots - of triggers misfiring at once, it could be an issue it this method - does a lot. -

-
- The that has misfired. -
- - - Called by the when a - has fired, it's associated - has been executed, and it's method has been - called. - - The that was fired. - - The that was passed to the - 's method. - - - The result of the call on the 's method. - - - - - Get the name of the . - - - - - Construct an instance with the given name. - - (Remember to add some delegate listeners!) - - the name of this instance - - - - Construct an instance with the given name, and List of listeners. - - the name of this instance - the initial List of TriggerListeners to broadcast to - - - - If one or more name patterns are specified, only events relating to - triggers who's name matches the given regular expression pattern - will be dispatched to the delegate listeners. - - - - - - If one or more group patterns are specified, only events relating to - triggers who's group matches the given regular expression pattern - will be dispatched to the delegate listeners. - - - - - - Keeps a collection of mappings of which Job to trigger after the completion - of a given job. If this listener is notified of a job completing that has a - mapping, then it will then attempt to trigger the follow-up job. This - achieves "job chaining", or a "poor man's workflow". - - -

- Generally an instance of this listener would be registered as a global - job listener, rather than being registered directly to a given job. -

-

- If for some reason there is a failure creating the trigger for the - follow-up job (which would generally only be caused by a rare serious - failure in the system, or the non-existence of the follow-up job), an error - messsage is logged, but no other action is taken. If you need more rigorous - handling of the error, consider scheduling the triggering of the flow-up - job within your job itself. -

-
- James House -
- - - A helpful abstract base class for implementors of . - - -

- The methods in this class are empty so you only need to override the - subset for the events you care about. -

- -

- You are required to implement - to return the unique name of your . -

-
- -
- - - Initializes a new instance of the class. - - - - - Called by the when a - is about to be executed (an associated - has occured). -

- This method will not be invoked if the execution of the Job was vetoed - by a . -

-
- - -
- - - Called by the when a - was about to be executed (an associated - has occured), but a vetoed it's - execution. - - - - - - - Called by the after a - has been executed, and be for the associated 's - method has been called. - - - - - - - Get the for this class's category. - This should be used by subclasses for logging. - - - - - Get the name of the . - - - - - - Construct an instance with the given name. - - The name of this instance. - - - - Add a chain mapping - when the Job identified by the first key completes - the job identified by the second key will be triggered. - - a Key with the name and group of the first job - a Key with the name and group of the follow-up job - - - - A helpful abstract base class for implementors of - . - - -

- The methods in this class are empty so you only need to override the - subset for the events - you care about. -

- -

- You are required to implement - to return the unique name of your . -

-
- -
- - - Get the for this - class's category. This should be used by subclasses for logging. - - - - - Get the name of the . - - - - - - Logs a history of all job executions (and execution vetos) via common - logging. - - -

- The logged message is customizable by setting one of the following message - properties to a string that conforms to the syntax of . -

-

- JobToBeFiredMessage - available message data are: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ElementData TypeDescription
0StringThe Job's Name.
1StringThe Job's Group.
2DateThe current time.
3StringThe Trigger's name.
4StringThe Triggers's group.
5DateThe scheduled fire time.
6DateThe next scheduled fire time.
7IntegerThe re-fire count from the JobExecutionContext.
- The default message text is "Job {1}.{0} fired (by trigger {4}.{3}) at: - {2, date, HH:mm:ss MM/dd/yyyy" -

-

- JobSuccessMessage - available message data are: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ElementData TypeDescription
0StringThe Job's Name.
1StringThe Job's Group.
2DateThe current time.
3StringThe Trigger's name.
4StringThe Triggers's group.
5DateThe scheduled fire time.
6DateThe next scheduled fire time.
7IntegerThe re-fire count from the JobExecutionContext.
8ObjectThe string value (toString() having been called) of the result (if any) - that the Job set on the JobExecutionContext, with on it. "NULL" if no - result was set.
- The default message text is "Job {1}.{0} execution complete at {2, date, - HH:mm:ss MM/dd/yyyy} and reports: {8" -

-

- JobFailedMessage - available message data are: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ElementData TypeDescription
0StringThe Job's Name.
1StringThe Job's Group.
2DateThe current time.
3StringThe Trigger's name.
4StringThe Triggers's group.
5DateThe scheduled fire time.
6DateThe next scheduled fire time.
7IntegerThe re-fire count from the JobExecutionContext.
8StringThe message from the thrown JobExecution Exception. -
- The default message text is "Job {1}.{0} execution failed at {2, date, - HH:mm:ss MM/dd/yyyy} and reports: {8" -

-

- JobWasVetoedMessage - available message data are: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ElementData TypeDescription
0StringThe Job's Name.
1StringThe Job's Group.
2DateThe current time.
3StringThe Trigger's name.
4StringThe Triggers's group.
5DateThe scheduled fire time.
6DateThe next scheduled fire time.
7IntegerThe re-fire count from the JobExecutionContext.
- The default message text is "Job {1}.{0} was vetoed. It was to be fired - (by trigger {4}.{3}) at: {2, date, HH:mm:ss MM/dd/yyyy" -

-
-
- - - Provides an interface for a class to become a "plugin" to Quartz. - - - Plugins can do virtually anything you wish, though the most interesting ones - will obviously interact with the scheduler in some way - either actively: by - invoking actions on the scheduler, or passively: by being a , - , and/or . -

- If you use to - Initialize your Scheduler, it can also create and Initialize your plugins - - look at the configuration docs for details. -

-

- If you need direct access your plugin, you can have it explicitly put a - reference to itself in the 's - as part of its - method. -

-
- James House -
- - - Called during creation of the in order to give - the a chance to Initialize. - - - At this point, the Scheduler's is not yet -

- If you need direct access your plugin, you can have it explicitly put a - reference to itself in the 's - as part of its - method. -

-
- - The name by which the plugin is identified. - - - The scheduler to which the plugin is registered. - -
- - - Called when the associated is started, in order - to let the plug-in know it can now make calls into the scheduler if it - needs to. - - - - - Called in order to inform the that it - should free up all of it's resources because the scheduler is shutting - down. - - - - - Called during creation of the in order to give - the a chance to Initialize. - - - - - Called when the associated is started, in order - to let the plug-in know it can now make calls into the scheduler if it - needs to. - - - - - Called in order to inform the that it - should free up all of it's resources because the scheduler is shutting - down. - - - - - Called by the when a is - about to be executed (an associated has occurred). - - This method will not be invoked if the execution of the Job was vetoed by a - . - - - - - - - Called by the after a - has been executed, and be for the associated 's - method has been called. - - - - - - - Called by the when a - was about to be executed (an associated - has occured), but a vetoed it's - execution. - - - - - - - Logger instance to use. Defaults to common logging. - - - - - Get or sets the message that is logged when a Job successfully completes its - execution. - - - - - Get or sets the message that is logged when a Job fails its - execution. - - - - - Gets or sets the message that is logged when a Job is about to Execute. - - - - - Gets or sets the message that is logged when a Job execution is vetoed by a - trigger listener. - - - - - Get the name of the . - - - - - - Logs a history of all trigger firings via the Jakarta Commons-Logging - framework. - - -

- The logged message is customizable by setting one of the following message - properties to a string that conforms to the syntax of . -

- -

- TriggerFiredMessage - available message data are: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ElementData TypeDescription
0StringThe Trigger's Name.
1StringThe Trigger's Group.
2DateThe scheduled fire time.
3DateThe next scheduled fire time.
4DateThe actual fire time.
5StringThe Job's name.
6StringThe Job's group.
7IntegerThe re-fire count from the JobExecutionContext.
- - The default message text is "Trigger {1}.{0} fired job {6}.{5} at: {4, - date, HH:mm:ss MM/dd/yyyy" -

- -

- TriggerMisfiredMessage - available message data are: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ElementData TypeDescription
0StringThe Trigger's Name.
1StringThe Trigger's Group.
2DateThe scheduled fire time.
3DateThe next scheduled fire time.
4DateThe actual fire time. (the time the misfire was detected/handled)
5StringThe Job's name.
6StringThe Job's group.
- - The default message text is "Trigger {1}.{0} misfired job {6}.{5} at: - {4, date, HH:mm:ss MM/dd/yyyy}. Should have fired at: {3, date, HH:mm:ss - MM/dd/yyyy" -

- -

- TriggerCompleteMessage - available message data are: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ElementData TypeDescription
0StringThe Trigger's Name.
1StringThe Trigger's Group.
2DateThe scheduled fire time.
3DateThe next scheduled fire time.
4DateThe job completion time.
5StringThe Job's name.
6StringThe Job's group.
7IntegerThe re-fire count from the JobExecutionContext.
8IntegerThe trigger's resulting instruction code.
9StringA human-readable translation of the trigger's resulting instruction - code.
- - The default message text is "Trigger {1}.{0} completed firing job - {6}.{5} at {4, date, HH:mm:ss MM/dd/yyyy} with resulting trigger instruction - code: {9" -

-
- James House -
- - - Called during creation of the in order to give - the a chance to Initialize. - - - - - Called when the associated is started, in order - to let the plug-in know it can now make calls into the scheduler if it - needs to. - - - - - Called in order to inform the that it - should free up all of it's resources because the scheduler is shutting - down. - - - - - Called by the when a - has fired, and it's associated - is about to be executed. -

- It is called before the method of this - interface. -

-
- The that has fired. - The that will be passed to the 's method. -
- - - Called by the when a - has misfired. -

- Consideration should be given to how much time is spent in this method, - as it will affect all triggers that are misfiring. If you have lots - of triggers misfiring at once, it could be an issue it this method - does a lot. -

-
- The that has misfired. -
- - - Called by the when a - has fired, it's associated - has been executed, and it's method has been - called. - - The that was fired. - The that was passed to the - 's method. - The result of the call on the 's method. - - - - Called by the when a - has fired, and it's associated - is about to be executed. -

- It is called after the method of this - interface. -

-
- The that has fired. - The that will be passed to - the 's method. - -
- - - Logger instance to use. Defaults to common logging. - - - - - Get or set the message that is printed upon the completion of a trigger's - firing. - - - - - Get or set the message that is printed upon a trigger's firing. - - - - - Get or set the message that is printed upon a trigger's mis-firing. - - - - - Get the name of the . - - - - - - This plugin catches the event of the VM terminating (such as upon a CRTL-C) - and tells the scheuler to Shutdown. - - - James House - - - - Called during creation of the in order to give - the a chance to Initialize. - - - - - Called when the associated is started, in order - to let the plug-in know it can now make calls into the scheduler if it - needs to. - - - - - Called in order to inform the that it - should free up all of it's resources because the scheduler is shutting - down. - - - - - Determine whether or not the plug-in is configured to cause a clean - Shutdown of the scheduler. -

- The default value is . -

-
- -
- - - Attribute to use with public properties that - can be set with Quartz configuration. Attribute can be used to advice - parsing to use correct type of time span (milliseconds, seconds, minutes, hours) - as it may depend on property. - - - - - - Initializes a new instance of the class. - - The rule. - - - - Gets the rule. - - The rule. - - - - Possible parse rules for s. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - This plugin loads XML file(s) to add jobs and schedule them with triggers - as the scheduler is initialized, and can optionally periodically scan the - file for changes. - - - The periodically scanning of files for changes is not currently supported in a - clustered environment. - - James House - Pierre Awaragi - - - - Initializes a new instance of the class. - - - - - - - - - - - Called during creation of the in order to give - the a chance to initialize. - - The name. - The scheduler. - SchedulerConfigException - - - - Called when the associated is started, in order - to let the plug-in know it can now make calls into the scheduler if it - needs to. - - - - Helper method for generating unique job/trigger name for the - file scanning jobs (one per FileJob). The unique names are saved - in jobTriggerNameSet. - - - - Called in order to inform the that it - should free up all of it's resources because the scheduler is shutting - down. - - - - - Gets the log. - - The log. - - - - Comma separated list of file names (with paths) to the XML files that should be read. - - - - - Whether or not jobs defined in the XML file should be overwrite existing - jobs with the same name. - - - - - The interval at which to scan for changes to the file. - If the file has been changed, it is re-loaded and parsed. The default - value for the interval is 0, which disables scanning. - - - - - Whether or not initialization of the plugin should fail (throw an - exception) if the file cannot be found. Default is . - - - - - Whether or not the XML should be validated. Default is . - - - - - Whether or not the XML schema should be validated. Default is . - - - - - A uses all of the - types that are found in this package in its attempts to load a class, when - one scheme is found to work, it is promoted to the scheme that will be used - first the next time a class is loaded (in order to improve perfomance). - - - This approach is used because of the wide variance in class loader behavior - between the various environments in which Quartz runs (e.g. disparate - application servers, stand-alone, mobile devices, etc.). Because of this - disparity, Quartz ran into difficulty with a one class-load style fits-all - design. Thus, this class loader finds the approach that works, then - 'remembers' it. - - James House - - - - Called to give the ClassLoadHelper a chance to Initialize itself, - including the oportunity to "steal" the class loader off of the calling - thread, which is the thread that is initializing Quartz. - - - - - Return the class with the given name. - - - - Finds a resource with a given name. This method returns null if no - resource with this name is found. - - name of the desired resource - - a java.net.URL object - - - - Finds a resource with a given name. This method returns null if no - resource with this name is found. - - name of the desired resource - - a java.io.InputStream object - - - - - that names the scheduler instance using - just the machine hostname. -

- This class is useful when you know that your scheduler instance will be the - only one running on a particular machine. Each time the scheduler is - restarted, it will get the same instance id as long as the machine is not - renamed. -

- -
- - -
- - - An IInstanceIdGenerator is responsible for generating the clusterwide unique - instance id for a nodde. -

- This interface may be of use to those wishing to have specific control over - the mechanism by which the instances in their - application are named. -

- -
- -
- - Generate the instance id for a - - - The clusterwide unique instance id. - - - - - Generate the instance id for a - - The clusterwide unique instance id. - - - - A that uses either the loader of it's own - class. - - - - - James House - - - - Called to give the ClassLoadHelper a chance to Initialize itself, - including the oportunity to "steal" the class loader off of the calling - thread, which is the thread that is initializing Quartz. - - - - Return the class with the given name. - - - Finds a resource with a given name. This method returns null if no - resource with this name is found. - - name of the desired resource - - a java.net.URL object - - - - Finds a resource with a given name. This method returns null if no - resource with this name is found. - - name of the desired resource - - a java.io.InputStream object - - - - - A JobFactory that instantiates the Job instance (using the default no-arg - constructor, or more specifically: ), and - then attempts to set all values in the 's - onto bean properties of the . - - - - - - - James Houser - Marko Lahma (.NET) - - - - The default JobFactory used by Quartz - simply calls - on the job class. - - - - James House - Marko Lahma (.NET) - - - - A JobFactory is responsible for producing instances of - classes. - - - This interface may be of use to those wishing to have their application - produce instances via some special mechanism, such as to - give the opertunity for dependency injection. - - - - - James House - - - - Called by the scheduler at the time of the trigger firing, in order to - produce a instance on which to call Execute. - - -

- It should be extremely rare for this method to throw an exception - - basically only the the case where there is no way at all to instantiate - and prepare the Job for execution. When the exception is thrown, the - Scheduler will move all triggers associated with the Job into the - state, which will require human - intervention (e.g. an application restart after fixing whatever - configuration problem led to the issue wih instantiating the Job. -

- -
- - The TriggerFiredBundle from which the - and other info relating to the trigger firing can be obtained. - - SchedulerException if there is a problem instantiating the Job. - the newly instantiated Job - -
- - - Called by the scheduler at the time of the trigger firing, in order to - produce a instance on which to call Execute. - - - It should be extremely rare for this method to throw an exception - - basically only the the case where there is no way at all to instantiate - and prepare the Job for execution. When the exception is thrown, the - Scheduler will move all triggers associated with the Job into the - state, which will require human - intervention (e.g. an application restart after fixing whatever - configuration problem led to the issue wih instantiating the Job. - - The TriggerFiredBundle from which the - and other info relating to the trigger firing can be obtained. - the newly instantiated Job - SchedulerException if there is a problem instantiating the Job. - - - - Called by the scheduler at the time of the trigger firing, in order to - produce a instance on which to call Execute. - - -

- It should be extremely rare for this method to throw an exception - - basically only the the case where there is no way at all to instantiate - and prepare the Job for execution. When the exception is thrown, the - Scheduler will move all triggers associated with the Job into the - state, which will require human - intervention (e.g. an application restart after fixing whatever - configuration problem led to the issue wih instantiating the Job. -

-
- The TriggerFiredBundle from which the - and other info relating to the trigger firing can be obtained. - the newly instantiated Job - SchedulerException if there is a problem instantiating the Job. -
- - - Sets the object properties. - - The object to set properties to. - The data to set. - - - - Whether the JobInstantiation should fail and throw and exception if - a key (name) and value (type) found in the JobDataMap does not - correspond to a proptery setter on the Job class. - - - - - Get or set whether a warning should be logged if - a key (name) and value (type) found in the JobDataMap does not - correspond to a proptery setter on the Job class. - - - - - This class implements a that - utilizes RAM as its storage device. -

- As you should know, the ramification of this is that access is extrememly - fast, but the data is completely volatile - therefore this - should not be used if true persistence between program shutdowns is - required. -

-
- James House - Sharada Jambula - Marko Lahma (.NET) -
- - - Initializes a new instance of the class. - - - - - Called by the QuartzScheduler before the is - used, in order to give the it a chance to Initialize. - - - - - Called by the QuartzScheduler to inform the that - the scheduler has started. - - - - - Called by the QuartzScheduler to inform the that - it should free up all of it's resources because the scheduler is - shutting down. - - - - - Store the given and . - - The scheduling context. - The to be stored. - The to be stored. - - - - Returns true if the given job group is paused. - - - Job group name - - - - - returns true if the given TriggerGroup is paused. - - - - - - - - Store the given . - - The scheduling context. - The to be stored. - If , any existing in the - with the same name and group should be - over-written. - - - - Remove (delete) the with the given - name, and any s that reference - it. - - The scheduling context. - The name of the to be removed. - The group name of the to be removed. - - if a with the given name and - group was found and removed from the store. - - - - - Remove (delete) the with the - given name. - - The scheduling context. - The name of the to be removed. - The group name of the to be removed. - - if a with the given - name and group was found and removed from the store. - - - - - Store the given . - - The scheduling context. - The to be stored. - If , any existing in - the with the same name and group should - be over-written. - - - - Remove (delete) the with the - given name. - - The scheduling context. - The name of the to be removed. - The group name of the to be removed. - - if a with the given - name and group was found and removed from the store. - - Whether to delete orpahaned job details from scheduler if job becomes orphaned from removing the trigger. - - - - Replaces the trigger. - - The scheduling context. - Name of the trigger. - Name of the group. - The new trigger. - - - - - Retrieve the for the given - . - - The scheduling context. - The name of the to be retrieved. - The group name of the to be retrieved. - - The desired , or null if there is no match. - - - - - Retrieve the given . - - The scheduling context. - The name of the to be retrieved. - The group name of the to be retrieved. - - The desired , or null if there is no match. - - - - - Get the current state of the identified . - - - - - - - - - - - Store the given . - - The scheduling context. - The name. - The to be stored. - If , any existing - in the with the same name and group - should be over-written. - If , any s existing - in the that reference an existing - Calendar with the same name with have their next fire time - re-computed with the new . - - - - Remove (delete) the with the - given name. -

- If removal of the would result in - s pointing to non-existent calendars, then a - will be thrown.

-
- The scheduling context. - The name of the to be removed. - - if a with the given name - was found and removed from the store. - -
- - - Retrieve the given . - - The scheduling context. - The name of the to be retrieved. - - The desired , or null if there is no match. - - - - - Get the number of s that are - stored in the . - - - - - Get the number of s that are - stored in the . - - - - - Get the number of s that are - stored in the . - - - - - Get the names of all of the s that - have the given group name. - - - - - Get the names of all of the s - in the . -

- If there are no ICalendars in the given group name, the result should be - a zero-length array (not ). -

-
-
- - - Get the names of all of the s - that have the given group name. - - - - - Get the names of all of the - groups. - - - - - Get the names of all of the groups. - - - - - Get all of the Triggers that are associated to the given Job. -

- If there are no matches, a zero-length array should be returned. -

-
-
- - - Gets the trigger wrappers for job. - - Name of the job. - Name of the group. - - - - - Gets the trigger wrappers for calendar. - - Name of the cal. - - - - - Pause the with the given name. - - - - - Pause all of the s in the given group. -

- The JobStore should "remember" that the group is paused, and impose the - pause on any new triggers that are added to the group while the group is - paused. -

-
-
- - - Pause the with the given - name - by pausing all of its current s. - - - - - Pause all of the s in the - given group - by pausing all of their s. -

- The JobStore should "remember" that the group is paused, and impose the - pause on any new jobs that are added to the group while the group is - paused. -

-
-
- - - Resume (un-pause) the with the given name. - - - If the missed one or more fire-times, then the - 's misfire instruction will be applied. - - - - - Resume (un-pause) all of the s in the - given group. -

- If any missed one or more fire-times, then the - 's misfire instruction will be applied. -

-
-
- - - Resume (un-pause) the with - the given name. -

- If any of the 's s missed one - or more fire-times, then the 's misfire - instruction will be applied. -

-
-
- - - Resume (un-pause) all of the s - in the given group. -

- If any of the s had s that - missed one or more fire-times, then the 's - misfire instruction will be applied. -

-
-
- - - Pause all triggers - equivalent of calling - on every group. -

- When is called (to un-pause), trigger misfire - instructions WILL be applied. -

-
- -
- - - Resume (un-pause) all triggers - equivalent of calling - on every trigger group and setting all job groups unpaused />. -

- If any missed one or more fire-times, then the - 's misfire instruction will be applied. -

-
- -
- - - Applies the misfire. - - The trigger wrapper. - - - - - Get a handle to the next trigger to be fired, and mark it as 'reserved' - by the calling scheduler. - - - - - - Inform the that the scheduler no longer plans to - fire the given , that it had previously acquired - (reserved). - - - - - Inform the that the scheduler is now firing the - given (executing its associated ), - that it had previously acquired (reserved). - - - - - Inform the that the scheduler has completed the - firing of the given (and the execution its - associated ), and that the - in the given should be updated if the - is stateful. - - - - - Sets the state of all triggers of job to specified state. - - Name of the job. - The job group. - The internal state to set. - - - - Peeks the triggers. - - - - - - - - - The time span by which a trigger must have missed its - next-fire-time, in order for it to be considered "misfired" and thus - have its misfire instruction applied. - - - - - Gets the fired trigger record id. - - The fired trigger record id. - - - - Returns whether this instance supports persistence. - - - - - - - Comparer for triggers. - - - - - Possible internal trigger states - in RAMJobStore - - - - - Waiting - - - - - Acquired - - - - - Executing - - - - - Complete - - - - - Paused - - - - - Blocked - - - - - Paused and Blocked - - - - - Error - - - - - Helper wrapper class - - - - - The key used - - - - - Job's key - - - - - The trigger - - - - - Current state - - - - - Determines whether the specified is equal to the current . - - The to compare with the current . - - true if the specified is equal to the current ; otherwise, false. - - - - - Serves as a hash function for a particular type. is suitable for use in hashing algorithms and data structures like a hash table. - - - A hash code for the current . - - - - - Gets the trigger - - The trigger - - - - Scheduler exporter that exports scheduler to remoting context. - - Marko Lahma - - - - Service interface for scheduler exporters. - - Marko Lahma - - - - Binds (exports) scheduler to external context. - - - - - - Unbinds scheduler from external context. - - - - - - Registers remoting channel if needed. This is determined - by checking whether there is a positive value for port. - - - - - Gets or sets the port used for remoting. - - - - - Gets or sets the name to use when exporting - scheduler to remoting context. - - - - - Sets the channel type when registering remoting. - - - - - - Sets the used when - exporting to remoting context. Defaults to - . - - - - - A that simply calls . - - - - James House - - - - Called to give the ClassLoadHelper a chance to Initialize itself, - including the oportunity to "steal" the class loader off of the calling - thread, which is the thread that is initializing Quartz. - - - - Return the class with the given name. - - - - Finds a resource with a given name. This method returns null if no - resource with this name is found. - - name of the desired resource - - a Uri object - - - - Finds a resource with a given name. This method returns null if no - resource with this name is found. - - name of the desired resource - - a Stream object - - - - - The default InstanceIdGenerator used by Quartz when instance id is to be - automatically generated. Instance id is of the form HOSTNAME + CURRENT_TIME. - - - - - - - - - Generate the instance id for a - - The clusterwide unique instance id. - - - - This is class is a simple implementation of a thread pool, based on the - interface. -

- objects are sent to the pool with the - method, which blocks until a becomes available. -

- -

- The pool has a fixed number of s, and does not grow or - shrink based on demand. -

-
- James House - Juergen Donnerstag -
- - - The interface to be implemented by classes that want to provide a thread - pool for the 's use. - - - implementation instances should ideally be made - for the sole use of Quartz. Most importantly, when the method - returns a value of 1 or greater, - there must still be at least one available thread in the pool when the - method is called a few moments (or - many moments) later. If this assumption does not hold true, it may - result in extra JobStore queries and updates, and if clustering features - are being used, it may result in greater imballance of load. - - - James House - - - - Execute the given in the next - available . - - - The implementation of this interface should not throw exceptions unless - there is a serious problem (i.e. a serious misconfiguration). If there - are no available threads, rather it should either queue the Runnable, or - block until a thread is available, depending on the desired strategy. - - - - - Determines the number of threads that are currently available in in - the pool. Useful for determining the number of times - can be called before returning - false. - - - The implementation of this method should block until there is at - least one available thread. - - the number of currently available threads - - - - Called by the QuartzScheduler before the is - used, in order to give the it a chance to Initialize. - - - - - Called by the QuartzScheduler to inform the - that it should free up all of it's resources because the scheduler is - shutting down. - - - - - Gets the size of the pool. - - The size of the pool. - - - - Create a new (unconfigured) . - - - - - Create a new with the specified number - of s that have the given priority. - - - the number of worker s in the pool, must - be > 0. - - - the thread priority for the worker threads. - - - - - - Called by the QuartzScheduler before the is - used, in order to give the it a chance to Initialize. - - - - - Terminate any worker threads in this thread group. - Jobs currently in progress will complete. - - - - - Run the given object in the next available - . If while waiting the thread pool is asked to - shut down, the Runnable is executed immediately within a new additional - thread. - - The to be added. - - - - Creates the worker threads. - - The thread count. - - - - - Terminate any worker threads in this thread group. - Jobs currently in progress will complete. - - - - - Gets or sets the number of worker threads in the pool. - Set has no effect after has been called. - - - - - Get or set the thread priority of worker threads in the pool. - Set operation has no effect after has been called. - - - - - Gets or sets the thread name prefix. - - The thread name prefix. - - - - Gets or sets the value of makeThreadsDaemons. - - - - - Gets the size of the pool. - - The size of the pool. - - - - A Worker loops, waiting to Execute tasks. - - - - - Create a worker thread and start it. Waiting for the next Runnable, - executing it, and waiting for the next Runnable, until the Shutdown - flag is set. - - - - - Create a worker thread, start it, Execute the runnable and terminate - the thread (one time execution). - - - - - Signal the thread that it should terminate. - - - - - Loop, executing targets as they are received. - - - - - This is class is a simple implementation of a zero size thread pool, based on the - {@link org.quartz.spi.ThreadPool} interface. - - - The pool has zero s and does not grow or shrink based on demand. - Which means it is obviously not useful for most scenarios. When it may be useful - is to prevent creating any worker threads at all - which may be desirable for - the sole purpose of preserving system resources in the case where the scheduler - instance only exists in order to schedule jobs, but which will never execute - jobs (e.g. will never have Start() called on it). - - Wayne Fay - - - - Initializes a new instance of the class. - - - - - Called by the QuartzScheduler before the is - used, in order to give the it a chance to Initialize. - - - - - Shutdowns this instance. - - - - - Called by the QuartzScheduler to inform the - that it should free up all of it's resources because the scheduler is - shutting down. - - - - - - Execute the given in the next - available . - - - - - The implementation of this interface should not throw exceptions unless - there is a serious problem (i.e. a serious misconfiguration). If there - are no available threads, rather it should either queue the Runnable, or - block until a thread is available, depending on the desired strategy. - - - - - Determines the number of threads that are currently available in in - the pool. Useful for determining the number of times - can be called before returning - false. - - - the number of currently available threads - - - The implementation of this method should block until there is at - least one available thread. - - - - - Gets the log. - - The log. - - - - Gets the size of the pool. - - The size of the pool. - - - - A simple class (structure) used for returning execution-time data from the - JobStore to the . - - - James House - - - - Initializes a new instance of the class. - - The job. - The trigger. - The calendar. - if set to true [job is recovering]. - The fire time. - The scheduled fire time. - The previous fire time. - The next fire time. - - - - Gets the job detail. - - The job detail. - - - - Gets the trigger. - - The trigger. - - - - Gets the calendar. - - The calendar. - - - - Gets a value indicating whether this is recovering. - - true if recovering; otherwise, false. - - - - Returns the UTC fire time. - - - - - Gets the next UTC fire time. - - The next fire time. - Returns the nextFireTimeUtc. - - - - Gets the previous UTC fire time. - - The previous fire time. - Returns the previous fire time. - - - - Returns the scheduled UTC fire time. - - - - - DateTime related utility methods. - - - - - Assumes that given input is in UTC and sets the kind to be UTC. - Just a precaution if somebody does not set it explicitly. - This only works in .NET Framework 2.0 onwards. - - The datetime to check. - DateTime with kind set to UTC. - - - - Assumes that given input is in UTC and sets the kind to be UTC. - Just a precaution if somebody does not set it explicitly. - - The datetime to check. - DateTime with kind set to UTC. - - - - Manages a collection of IDbProviders, and provides transparent access - to their database. - - - James House - Sharada Jambula - Mohammad Rezaei - - - - Private constructor - - - - - Adds the connection provider. - - Name of the data source. - The provider. - - - - Get a database connection from the DataSource with the given name. - - a database connection - - - - Shuts down database connections from the DataSource with the given name, - if applicable for the underlying provider. - - a database connection - - - - Gets the db provider. - - Name of the ds. - - - - - Get the class instance. - - an instance of this class - - - - - An implementation of that wraps another - and flags itself 'dirty' when it is modified. - - James House - - - - Create a DirtyFlagMap that 'wraps' a . - - - - - Create a DirtyFlagMap that 'wraps' a that has the - given initial capacity. - - - - - Create a DirtyFlagMap that 'wraps' a that has the - given initial capacity and load factor. - - - - - Creates a new object that is a copy of the current instance. - - - A new object that is a copy of this instance. - - - - - When implemented by a class, removes all elements from the . - - - The is read-only. - - - - - When implemented by a class, determines whether the contains an element with the specified key. - - The key to locate in the . - - if the contains an element with the key; otherwise, . - - - is . - - - - When implemented by a class, removes the element with the - specified key from the . - - The key of the element to remove. - - is . - - The is read-only. - -or- - The has a fixed size. - - - - - When implemented by a class, returns an - for the . - - - An for the . - - - - - When implemented by a class, adds an element with the provided key and value to the . - - The to use as the key of the element to add. - The to use as the value of the element to add. - is . - - An element with the same key already exists in the . - - - The is read-only. - -or- - The has a fixed size. - - - - - When implemented by a class, copies the elements of - the to an , starting at a particular index. - - The one-dimensional that is the destination of the elements copied from . The must have zero-based indexing. - The zero-based index in at which copying begins. - - is . - - is less than zero. - - - is multidimensional. - -or- - - is equal to or greater than the length of . - -or- - The number of elements in the source is greater than the available space from to the end of the destination . - - The type of the source cannot be cast automatically to the type of the destination . - - - - Clear the 'dirty' flag (set dirty flag to ). - - - - - Determines whether the specified obj contains value. - - The obj. - - true if the specified obj contains value; otherwise, false. - - - - - Gets the entries as a set. - - - - - - Determines whether the specified is equal to the current . - - The to compare with the current . - - if the specified is equal to the - current ; otherwise, . - - - - - Serves as a hash function for a particular type, suitable - for use in hashing algorithms and data structures like a hash table. - - - A hash code for the current . - - - - - Gets keyset for this map. - - - - - - Puts the value behind a specified key. - - The key. - The val. - - - - - Puts all. - - The t. - - - - Determine whether the is flagged dirty. - - - - - Get a direct handle to the underlying Map. - - - - - Gets a value indicating whether this instance is empty. - - true if this instance is empty; otherwise, false. - - - - Gets or sets the with the specified key. - - - - - - When implemented by a class, gets the number of - elements contained in the . - - - - - - When implemented by a class, gets an containing the values in the . - - - - - - When implemented by a class, gets an containing the keys of the . - - - - - - When implemented by a class, gets a value indicating whether the - is read-only. - - - - - - When implemented by a class, gets a value indicating whether the - has a fixed size. - - - - - - When implemented by a class, gets an object that - can be used to synchronize access to the . - - - - - - When implemented by a class, gets a value - indicating whether access to the is synchronized - (thread-safe). - - - - - - Utility class for file handling related things. - - - - - Resolves file to actual file if for example relative '~' used. - - File name to check - Expanded file name or actual no resolving was done. - - - - object representing a job or trigger key. - - Jeffrey Wescott - - - - - Utility class for storing two pieces of information together. - - Jeffrey Wescott - - - - Test equality of this object with that. - - object to compare - true if objects are equal, false otherwise - - - - Serves as a hash function for a particular type. is suitable for use in hashing algorithms and data structures like a hash table. - - - A hash code for the current . - - - - - Get or sets the first object in the pair. - - - - - Get or sets the second object in the pair. - - - - Construct a new key with the given name and group. - - - - the name - - - the group - - - -

- Return the string representation of the key. The format will be: - <group>.<name>. -

- -
- the string representation of the key - -
- - - Get the name portion of the key. - - the name - - - -

- Get the group portion of the key. -

- -
- the group - -
- - - Wrapper class to access thread local data. - Data is either accessed from thread or HTTP Context's - data if HTTP Context is avaiable. - - Marko Lahma (.NET) - - - - Retrieves an object with the specified name. - - The name of the item. - The object in the call context associated with the specified name or null if no object has been stored previously - - - - Stores a given object and associates it with the specified name. - - The name with which to associate the new item. - The object to store in the call context. - - - - Empties a data slot with the specified name. - - The name of the data slot to empty. - - - - Utility methods that are used to convert objects from one type into another. - - Aleksandar Seovic - - - - Convert the value to the required (if necessary from a string). - - The proposed change value. - - The we must convert to. - - The new value, possibly the result of type conversion. - - - - Determines whether value is assignable to required type. - - The value to check. - Type of the required. - - true if value can be assigned as given type; otherwise, false. - - - - - Instantiates an instance of the type specified. - - The type to instantiate. - - - - - Sets the object properties using reflection. - - The object to set values to. - The properties to set to object. - - - - This is an utility class used to parse the properties. - - James House - - - - Initializes a new instance of the class. - - The props. - - - - Gets the string property. - - The name. - - - - - Gets the string property. - - The name. - The default value. - - - - - Gets the string array property. - - The name. - - - - - Gets the string array property. - - The name. - The default value. - - - - - Gets the boolean property. - - The name. - - - - - Gets the boolean property. - - The name. - if set to true [defaultValue]. - - - - - Gets the byte property. - - The name. - - - - - Gets the byte property. - - The name. - The default value. - - - - - Gets the char property. - - The name. - - - - - Gets the char property. - - The name. - The default value. - - - - - Gets the double property. - - The name. - - - - - Gets the double property. - - The name. - The default value. - - - - - Gets the float property. - - The name. - - - - - Gets the float property. - - The name. - The default value. - - - - - Gets the int property. - - The name. - - - - - Gets the int property. - - The name. - The default value. - - - - - Gets the int array property. - - The name. - - - - - Gets the int array property. - - The name. - The default value. - - - - - Gets the long property. - - The name. - - - - - Gets the long property. - - The name. - The def. - - - - - Gets the TimeSpan property. - - The name. - The def. - - - - - Gets the short property. - - The name. - - - - - Gets the short property. - - The name. - The default value. - - - - - Gets the property groups. - - The prefix. - - - - - Gets the property group. - - The prefix. - - - - - Gets the property group. - - The prefix. - if set to true [strip prefix]. - - - - - Get all properties that start with the given prefix. - - The prefix for which to search. If it does not end in a "." then one will be added to it for search purposes. - Whether to strip off the given in the result's keys. - Optional array of fully qualified prefixes to exclude. For example if is "a.b.c", then might be "a.b.c.ignore". - Group of that start with the given prefix, optionally have that prefix removed, and do not include properties that start with one of the given excluded prefixes. - - - - Reads the properties from assembly (embedded resource). - - The file name to read resources from. - - - - - Reads the properties from file system. - - The file name to read resources from. - - - - - Gets the underlying properties. - - The underlying properties. - - - - An implementation of that wraps another - and flags itself 'dirty' when it is modified, enforces that all keys are - strings. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The initial capacity. - - - - Initializes a new instance of the class. - - The initial capacity. - The load factor. - - - - Gets the keys. - - - - - - Adds the name-value pairs in the given to the . -

- All keys must be s, and all values must be serializable. -

-
-
- - - Adds the given value to the 's - data map. - - - - - Adds the given value to the 's - data map. - - - - - Adds the given value to the 's - data map. - - - - - Adds the given value to the 's - data map. - - - - - Adds the given value to the 's - data map. - - - - - Adds the given value to the 's - data map. - - - - - Adds the given value to the 's - data map. - - - - - Adds the given serializable object value to the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Object representing a job or trigger key. - - James House - - - - Construct a new TriggerStatus with the status name and nextFireTime. - - The trigger's status - The next UTC time the trigger will fire - - - - Return the string representation of the TriggerStatus. - - - - - Gets or sets the job key. - - The job key. - - - - Gets or sets the key. - - The key. - - - - Get the name portion of the key. - - the name - - - - Get the group portion of the key. - - the group - - - - Wraps a . - - Chris Bonham - - - - Gets or sets the name of the calendar. - - The name of the calendar. - - - - Gets or sets the name of the class. - - The name of the class. - - - - Gets or sets the calendar. - - The calendar. - - - - Gets or sets a description for the instance - may be - useful for remembering/displaying the purpose of the calendar, though - the description has no meaning to Quartz. - - - - - - Set a new base calendar or remove the existing one. - - - - - - Wraps a and . - - Chris Bonham - James House - - - - Adds a trigger to this bundle. - - The trigger. - - - - Removes the given trigger from this bundle. - - The trigger. - - - - Gets or sets the job detail. - - The job detail. - - - - Gets or sets the triggers associated with this bundle. - - The triggers. - - - - Gets the name of the bundle. - - The name. - - - - Gets the full name. - - The full name. - - - - Gets a value indicating whether this is valid. - - true if valid; otherwise, false. - - - - Parses an XML file that declares Jobs and their schedules (Triggers). - - -

- The xml document must conform to the format defined in - "job_scheduling_data.xsd" -

- -

- After creating an instance of this class, you should call one of the - functions, after which you may call the - function to get a handle to the defined Jobs and Triggers, which can then be - scheduled with the . Alternatively, you could call - the function to do all of this - in one step. -

- -

- The same instance can be used again and again, with the list of defined Jobs - being cleared each time you call a method, - however a single instance is not thread-safe. -

-
- Chris Bonham - James House - Marko Lahma (.NET) -
- - - XML Schema dateTime datatype format. -

- See - http://www.w3.org/TR/2001/REC-xmlschema-2-20010502/#dateTime -

-
-
- - - Constructor for JobSchedulingDataProcessor. - - - - - Constructor for JobSchedulingDataProcessor. - - whether or not to validate XML. - whether or not to validate XML schema. - - - - Process the xml file in the default location (a file named - "quartz_jobs.xml" in the current working directory). - - - - - Process the xml file named . - - meta data file name. - - - - Process the xmlfile named with the given system - ID. - - Name of the file. - The system id. - - - - Process the xmlfile named with the given system - ID. - - The stream. - The system id. - - - - Process the xml file in the default location, and schedule all of the - jobs defined within it. - - - - - Process the xml file in the given location, and schedule all of the - jobs defined within it. - - meta data file name. - The scheduler. - if set to true overwrite existing jobs. - - - - Process the xml file in the given location, and schedule all of the - jobs defined within it. - - Name of the file. - The system id. - The sched. - if set to true [over write existing jobs]. - - - - Add the Jobs and Triggers defined in the given map of - s to the given scheduler. - - The job bundles. - The sched. - if set to true [over write existing jobs]. - - - - Returns a for the job name. - - The name. - - a for the job name. - - - - - Returns an from the fileName as a resource. - - Name of the file. - - an from the fileName as a resource. - - - - - Schedules a given job and trigger (both wrapped by a ). - - job wrapper. - - if the Job or Trigger cannot be added to the Scheduler, or - there is an internal Scheduler error. - - - - - Schedules a given job and trigger (both wrapped by a ). - - The job. - The sched. - if set to true [local over write existing jobs]. - - if the Job or Trigger cannot be added to the Scheduler, or - there is an internal Scheduler error. - - - - - Adds a scheduled job. - - The job. - - - - Adds a calendar. - - The sched. - calendar bundle. - SchedulerException if the Calendar cannot be added to the Scheduler, or - - - - Adds a detected validation exception. - - The exception. - - - - Resets the the number of detected validation exceptions. - - - - - Throws a ValidationException if the number of validationExceptions - detected is greater than zero. - - - DTD validation exception. - - - - - Gets or sets whether to overwrite existing jobs. - - - - - Gets the log. - - The log. - - - - Returns a of scheduled jobs. -

- The key is the job name and the value is a - containing the and . -

-
- a of scheduled jobs. - -
- - - Helper class to map constant names to their values. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Reports JobSchedulingDataProcessor validation exceptions. - - Chris Bonham - - - - Constructor for ValidationException. - - - - - Constructor for ValidationException. - - exception message. - - - - Constructor for ValidationException. - - collection of validation exceptions. - - - - Gets the validation exceptions. - - The validation exceptions. - - - - Returns the detail message string. - - - - - An exception that is thrown to indicate that there has been a critical - failure within the scheduler's core services (such as loss of database - connectivity). - - James House - - - - Create a with the given message. - - - - - Initializes a new instance of the class. - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - The class name is null or is zero (0). - The info parameter is null. - - - - Provides a parser and evaluator for unix-like cron expressions. Cron - expressions provide the ability to specify complex time combinations such as - "At 8:00am every Monday through Friday" or "At 1:30am every - last Friday of the month". - - -

- Cron expressions are comprised of 6 required fields and one optional field - separated by white space. The fields respectively are described as follows: -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Field Name Allowed Values Allowed Special Characters
Seconds 0-59 , - /// /
Minutes 0-59 , - /// /
Hours 0-23 , - /// /
Day-of-month 1-31 , - /// ? / L W C
Month 1-12 or JAN-DEC , - /// /
Day-of-Week 1-7 or SUN-SAT , - /// ? / L #
Year (Optional) empty, 1970-2099 , - /// /
-

- The '*' character is used to specify all values. For example, "*" - in the minute field means "every minute". -

-

- The '?' character is allowed for the day-of-month and day-of-week fields. It - is used to specify 'no specific value'. This is useful when you need to - specify something in one of the two fields, but not the other. -

-

- The '-' character is used to specify ranges For example "10-12" in - the hour field means "the hours 10, 11 and 12". -

-

- The ',' character is used to specify additional values. For example - "MON,WED,FRI" in the day-of-week field means "the days Monday, - Wednesday, and Friday". -

-

- The '/' character is used to specify increments. For example "0/15" - in the seconds field means "the seconds 0, 15, 30, and 45". And - "5/15" in the seconds field means "the seconds 5, 20, 35, and - 50". Specifying '*' before the '/' is equivalent to specifying 0 is - the value to start with. Essentially, for each field in the expression, there - is a set of numbers that can be turned on or off. For seconds and minutes, - the numbers range from 0 to 59. For hours 0 to 23, for days of the month 0 to - 31, and for months 1 to 12. The "/" character simply helps you turn - on every "nth" value in the given set. Thus "7/6" in the - month field only turns on month "7", it does NOT mean every 6th - month, please note that subtlety. -

-

- The 'L' character is allowed for the day-of-month and day-of-week fields. - This character is short-hand for "last", but it has different - meaning in each of the two fields. For example, the value "L" in - the day-of-month field means "the last day of the month" - day 31 - for January, day 28 for February on non-leap years. If used in the - day-of-week field by itself, it simply means "7" or - "SAT". But if used in the day-of-week field after another value, it - means "the last xxx day of the month" - for example "6L" - means "the last friday of the month". When using the 'L' option, it - is important not to specify lists, or ranges of values, as you'll get - confusing results. -

-

- The 'W' character is allowed for the day-of-month field. This character - is used to specify the weekday (Monday-Friday) nearest the given day. As an - example, if you were to specify "15W" as the value for the - day-of-month field, the meaning is: "the nearest weekday to the 15th of - the month". So if the 15th is a Saturday, the trigger will fire on - Friday the 14th. If the 15th is a Sunday, the trigger will fire on Monday the - 16th. If the 15th is a Tuesday, then it will fire on Tuesday the 15th. - However if you specify "1W" as the value for day-of-month, and the - 1st is a Saturday, the trigger will fire on Monday the 3rd, as it will not - 'jump' over the boundary of a month's days. The 'W' character can only be - specified when the day-of-month is a single day, not a range or list of days. -

-

- The 'L' and 'W' characters can also be combined for the day-of-month - expression to yield 'LW', which translates to "last weekday of the - month". -

-

- The '#' character is allowed for the day-of-week field. This character is - used to specify "the nth" XXX day of the month. For example, the - value of "6#3" in the day-of-week field means the third Friday of - the month (day 6 = Friday and "#3" = the 3rd one in the month). - Other examples: "2#1" = the first Monday of the month and - "4#5" = the fifth Wednesday of the month. Note that if you specify - "#5" and there is not 5 of the given day-of-week in the month, then - no firing will occur that month. If the '#' character is used, there can - only be one expression in the day-of-week field ("3#1,6#3" is - not valid, since there are two expressions). -

-

- -

-

- The legal characters and the names of months and days of the week are not - case sensitive. -

-

- NOTES: -

    -
  • Support for specifying both a day-of-week and a day-of-month value is - not complete (you'll need to use the '?' character in one of these fields). -
  • -
  • Overflowing ranges is supported - that is, having a larger number on - the left hand side than the right. You might do 22-2 to catch 10 o'clock - at night until 2 o'clock in the morning, or you might have NOV-FEB. It is - very important to note that overuse of overflowing ranges creates ranges - that don't make sense and no effort has been made to determine which - interpretation CronExpression chooses. An example would be - "0 0 14-6 ? * FRI-MON".
  • -
-

-
- Sharada Jambula - James House - Contributions from Mads Henderson - Refactoring from CronTrigger to CronExpression by Aaron Craven -
- - - Field specification for second. - - - - - Field specification for minute. - - - - - Field specification for hour. - - - - - Field specification for day of month. - - - - - Field specification for month. - - - - - Field specification for day of week. - - - - - Field specification for year. - - - - - Field specification for all wildcard value '*'. - - - - - Field specification for not specified value '?'. - - - - - Field specification for wildcard '*'. - - - - - Field specification for no specification at all '?'. - - - - - Seconds. - - - - - minutes. - - - - - Hours. - - - - - Days of month. - - - - - Months. - - - - - Days of week. - - - - - Years. - - - - - Last day of week. - - - - - Nth day of week. - - - - - Last day of month. - - - - - Nearest weekday. - - - - - Calendar day of week. - - - - - Calendar day of month. - - - - - Expression parsed. - - - - - Constructs a new based on the specified - parameter. - - - String representation of the cron expression the new object should represent - - - - - - Indicates whether the given date satisfies the cron expression. - - - Note that milliseconds are ignored, so two Dates falling on different milliseconds - of the same second will always have the same result here. - - The date to evaluate. - a boolean indicating whether the given date satisfies the cron expression - - - - Returns the next date/time after the given date/time which - satisfies the cron expression. - - the date/time at which to begin the search for the next valid date/time - the next valid date/time - - - - Returns the next date/time after the given date/time which does - not satisfy the expression. - - the date/time at which to begin the search for the next invalid date/time - the next valid date/time - - - - Returns the string representation of the - - The string representation of the - - - - Indicates whether the specified cron expression can be parsed into a - valid cron expression - - the expression to evaluate - a boolean indicating whether the given expression is a valid cron - expression - - - - Builds the expression. - - The expression. - - - - Stores the expression values. - - The position. - The string to traverse. - The type of value. - - - - - Checks the next value. - - The position. - The string to check. - The value. - The type to search. - - - - - Gets the expression summary. - - - - - - Gets the expression set summary. - - The data. - - - - - Skips the white space. - - The i. - The s. - - - - - Finds the next white space. - - The i. - The s. - - - - - Adds to set. - - The val. - The end. - The incr. - The type. - - - - Gets the set of given type. - - The type of set to get. - - - - - Gets the value. - - The v. - The s. - The i. - - - - - Gets the numeric value from string. - - The string to parse from. - The i. - - - - - Gets the month number. - - The string to map with. - - - - - Gets the day of week number. - - The s. - - - - - Gets the time from given time parts. - - The seconds. - The minutes. - The hours. - The day of month. - The month. - - - - - Gets the next fire time after the given time. - - The UTC time to start searching from. - - - - - Creates the date time without milliseconds. - - The time. - - - - - Advance the calendar to the particular hour paying particular attention - to daylight saving problems. - - The date. - The hour. - - - - - Gets the time before. - - The end time. - - - - - NOT YET IMPLEMENTED: Returns the final time that the - will match. - - - - - - Determines whether given year is a leap year. - - The year. - - true if the specified year is a leap year; otherwise, false. - - - - - Gets the last day of month. - - The month num. - The year. - - - - - Creates a new object that is a copy of the current instance. - - - A new object that is a copy of this instance. - - - - - Sets or gets the time zone for which the of this - will be resolved. - - - - - Gets the cron expression string. - - The cron expression string. - - - - Helper class for cron expression handling. - - - - - The value. - - - - - The position. - - - - - A concrete that is used to fire a - at given moments in time, defined with Unix 'cron-like' definitions. - - -

- For those unfamiliar with "cron", this means being able to create a firing - schedule such as: "At 8:00am every Monday through Friday" or "At 1:30am - every last Friday of the month". -

- -

- The format of a "Cron-Expression" string is documented on the - class. -

- -

- Here are some full examples:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Expression Meaning
"0 0 12 * * ?"" /> Fire at 12pm (noon) every day" />
"0 15 10 ? * *"" /> Fire at 10:15am every day" />
"0 15 10 * * ?"" /> Fire at 10:15am every day" />
"0 15 10 * * ? *"" /> Fire at 10:15am every day" />
"0 15 10 * * ? 2005"" /> Fire at 10:15am every day during the year 2005" /> -
"0 * 14 * * ?"" /> Fire every minute starting at 2pm and ending at 2:59pm, every day" /> -
"0 0/5 14 * * ?"" /> Fire every 5 minutes starting at 2pm and ending at 2:55pm, every day" /> -
"0 0/5 14,18 * * ?"" /> Fire every 5 minutes starting at 2pm and ending at 2:55pm, AND fire every 5 minutes starting at 6pm and ending at 6:55pm, every day" /> -
"0 0-5 14 * * ?"" /> Fire every minute starting at 2pm and ending at 2:05pm, every day" /> -
"0 10,44 14 ? 3 WED"" /> Fire at 2:10pm and at 2:44pm every Wednesday in the month of March." /> -
"0 15 10 ? * MON-FRI"" /> Fire at 10:15am every Monday, Tuesday, Wednesday, Thursday and Friday" /> -
"0 15 10 15 * ?"" /> Fire at 10:15am on the 15th day of every month" /> -
"0 15 10 L * ?"" /> Fire at 10:15am on the last day of every month" /> -
"0 15 10 ? * 6L"" /> Fire at 10:15am on the last Friday of every month" /> -
"0 15 10 ? * 6L"" /> Fire at 10:15am on the last Friday of every month" /> -
"0 15 10 ? * 6L 2002-2005"" /> Fire at 10:15am on every last friday of every month during the years 2002, 2003, 2004 and 2005" /> -
"0 15 10 ? * 6#3"" /> Fire at 10:15am on the third Friday of every month" /> -
-

- -

- Pay attention to the effects of '?' and '*' in the day-of-week and - day-of-month fields! -

- -

- NOTES: -

    -
  • Support for specifying both a day-of-week and a day-of-month value is - not complete (you'll need to use the '?' character in on of these fields). -
  • -
  • Be careful when setting fire times between mid-night and 1:00 AM - - "daylight savings" can cause a skip or a repeat depending on whether the - time moves back or jumps forward.
  • -
-

-
- - - - Sharada Jambula - James House - Contributions from Mads Henderson -
- - - The base abstract class to be extended by all triggers. - - -

- s have a name and group associated with them, which - should uniquely identify them within a single . -

- -

- s are the 'mechanism' by which s - are scheduled. Many s can point to the same , - but a single can only point to one . -

- -

- Triggers can 'send' parameters/data to s by placing contents - into the on the . -

-
- - - - - - - James House - Sharada Jambula -
- - - The default value for priority. - - - - - Remove all s from the . - - - - - Create a with no specified name, group, or . - - - Note that the , and - the and properties - must be set before the can be placed into a - . - - - - - Create a with the given name, and default group. - - - Note that the and - properties must be set before the - can be placed into a . - - The name. - - - - Create a with the given name, and group. - - - Note that the and - properties must be set before the - can be placed into a . - - The name. - if , Scheduler.DefaultGroup will be used. - - - - Create a with the given name, and group. - - The name. - if , Scheduler.DefaultGroup will be used. - Name of the job. - The job group. - ArgumentException - if name is null or empty, or the group is an empty string. - - - - - Add the specified name of a to - the end of the 's list of listeners. - - Name of the listener. - - - - Remove the specified name of a - from the 's list of listeners. - - true if the given name was found in the list, and removed - - - - - This method should not be used by the Quartz client. -

- Called when the has decided to 'fire' - the trigger (Execute the associated ), in order to - give the a chance to update itself for its next - triggering (if any). -

- -
- - -
- - - This method should not be used by the Quartz client. - - -

- Called by the scheduler at the time a is first - added to the scheduler, in order to have the - compute its first fire time, based on any associated calendar. -

- -

- After this method has been called, - should return a valid answer. -

-
- - The first time at which the will be fired - by the scheduler, which is also the same value - will return (until after the first firing of the ). - -
- - - This method should not be used by the Quartz client. - - - Called after the has executed the - associated with the - in order to get the final instruction code from the trigger. - - - is the that was used by the - 's method. - is the thrown by the - , if any (may be null). - - - One of the members. - - - - - - - - - - Used by the to determine whether or not - it is possible for this to fire again. -

- If the returned value is then the - may remove the from the . -

-
-
- - - Returns the next time at which the is scheduled to fire. If - the trigger will not fire again, will be returned. Note that - the time returned can possibly be in the past, if the time that was computed - for the trigger to next fire has already arrived, but the scheduler has not yet - been able to fire the trigger (which would likely be due to lack of resources - e.g. threads). - - - The value returned is not guaranteed to be valid until after the - has been added to the scheduler. - - - - - - - Returns the previous time at which the fired. - If the trigger has not yet fired, will be returned. - - - - - Returns the next time at which the will fire, - after the given time. If the trigger will not fire after the given time, - will be returned. - - - - - Validates the misfire instruction. - - The misfire instruction. - - - - - This method should not be used by the Quartz client. -

- To be implemented by the concrete classes that extend this class. -

-

- The implementation should update the 's state - based on the MISFIRE_INSTRUCTION_XXX that was selected when the - was created. -

-
-
- - - This method should not be used by the Quartz client. -

- The implementation should update the 's state - based on the given new version of the associated - (the state should be updated so that it's next fire time is appropriate - given the Calendar's new settings). -

-
- - -
- - - Validates whether the properties of the are - valid for submission into a . - - - - - Return a simple string representation of this object. - - - - - Compare the next fire time of this to that of - another. - - - - - Determines whether the specified is equal to the current . - - The to compare with the current . - - true if the specified is equal to the current ; otherwise, false. - - - - - Serves as a hash function for a particular type. is suitable for use in hashing algorithms and data structures like a hash table. - - - A hash code for the current . - - - - - Creates a new object that is a copy of the current instance. - - - A new object that is a copy of this instance. - - - - - Get or sets the name of this . - - If name is null or empty. - - - - Get the group of this . If , Scheduler.DefaultGroup will be used. - - - if group is an empty string. - - - - - Get or set the name of the associated . - - - if jobName is null or empty. - - - - - Gets or sets the name of the associated 's - group. If set with , Scheduler.DefaultGroup will be used. - - ArgumentException - if group is an empty string. - - - - - Returns the 'full name' of the in the format - "group.name". - - - - - Gets the key. - - The key. - - - - Returns the 'full name' of the that the - points to, in the format "group.name". - - - - - Get or set the description given to the instance by - its creator (if any). - - - - - Get or set the with the given name with - this Trigger. Use when setting to dis-associate a Calendar. - - - - - Get or set the that is associated with the - . -

- Changes made to this map during job execution are not re-persisted, and - in fact typically result in an illegal state. -

-
-
- - - Whether or not the should be persisted in the - for re-use after program restarts. -

- If not explicitly set, the default value is . -

-
-
- - - Returns an array of s containing the names of all - s assigned to the , - in the order in which they should be notified. - - - - - Returns the last UTC time at which the will fire, if - the Trigger will repeat indefinitely, null will be returned. -

- Note that the return time *may* be in the past. -

-
-
- - - Get or set the instruction the should be given for - handling misfire situations for this - the - concrete type that you are using will have - defined a set of additional MISFIRE_INSTRUCTION_XXX - constants that may be passed to this method. -

- If not explicitly set, the default value is . -

-
- - - - -
- - - This method should not be used by the Quartz client. -

- Usable by - implementations, in order to facilitate 'recognizing' instances of fired - s as their jobs complete execution. -

-
-
- - - Returns the date/time on which the trigger must stop firing. This - defines the final boundary for trigger firings 舒 the trigger will - not fire after to this date and time. If this value is null, no end time - boundary is assumed, and the trigger can continue indefinitely. - - Sets the date/time on which the trigger must stop firing. This defines - the final boundary for trigger firings 舒 the trigger will not - fire after to this date and time. If this value is null, no end time - boundary is assumed, and the trigger can continue indefinitely. - - - - - The time at which the trigger's scheduling should start. May or may not - be the first actual fire time of the trigger, depending upon the type of - trigger and the settings of the other properties of the trigger. However - the first actual first time will not be before this date. - - - Setting a value in the past may cause a new trigger to compute a first - fire time that is in the past, which may cause an immediate misfire - of the trigger. - - - - - Tells whether this Trigger instance can handle events - in millisecond precision. - - - - - The priority of a acts as a tie breaker such that if - two s have the same scheduled fire time, then Quartz - will do its best to give the one with the higher priority first access - to a worker thread. - - - If not explicitly set, the default value is 5. - - - - - - - Gets a value indicating whether this instance has additional properties - that should be considered when for example saving to database. - - - If trigger implementation has additional properties that need to be saved - with base properties you need to make your class override this property with value true. - Returning true will effectively mean that ADOJobStore needs to serialize - this trigger instance to make sure additional properties are also saved. - - - true if this instance has additional properties; otherwise, false. - - - - - Create a with no settings. - - - The start-time will also be set to the current time, and the time zone - will be set the the system's default time zone. - - - - - Create a with the given name and default group. - - - The start-time will also be set to the current time, and the time zone - will be set the the system's default time zone. - - The name. - - - - Create a with the given name and group. - - - The start-time will also be set to the current time, and the time zone - will be set the the system's default time zone. - - The name. - The group. - - - - Create a with the given name, group and - expression. - - - The start-time will also be set to the current time, and the time zone - will be set the the system's default time zone. - - The name. - The group. - The cron expression. - - - - Create a with the given name and group, and - associated with the identified . - - - The start-time will also be set to the current time, and the time zone - will be set the the system's default time zone. - - The name. - The group. - Name of the job. - The job group. - - - - Create a with the given name and group, - associated with the identified , - and with the given "cron" expression. - - - The start-time will also be set to the current time, and the time zone - will be set the the system's default time zone. - - The name. - The group. - Name of the job. - The job group. - The cron expression. - - - - Create a with the given name and group, - associated with the identified , - and with the given "cron" expression resolved with respect to the . - - The name. - The group. - Name of the job. - The job group. - The cron expression. - The time zone. - - - - Create a that will occur at the given time, - until the given end time. -

- If null, the start-time will also be set to the current time, the time - zone will be set the the system's default. -

-
- The name. - The group. - Name of the job. - The job group. - The start time. - The end time. - The cron expression. -
- - - Create a with fire time dictated by the - resolved with respect to the specified - occuring from the until - the given . - - The name. - The group. - Name of the job. - The job group. - The start time. - The end time. - - - - Clones this instance. - - - - - - Returns the next time at which the is scheduled to fire. If - the trigger will not fire again, will be returned. Note that - the time returned can possibly be in the past, if the time that was computed - for the trigger to next fire has already arrived, but the scheduler has not yet - been able to fire the trigger (which would likely be due to lack of resources - e.g. threads). - - - The value returned is not guaranteed to be valid until after the - has been added to the scheduler. - - - - - - - Returns the previous time at which the fired. - If the trigger has not yet fired, will be returned. - - - - - - Sets the next fire time. -

- This method should not be invoked by client code. -

-
- The fire time. -
- - - Sets the previous fire time. -

- This method should not be invoked by client code. -

-
- The fire time. -
- - - Returns the next time at which the will fire, - after the given time. If the trigger will not fire after the given time, - will be returned. - - - - - - - Used by the to determine whether or not - it is possible for this to fire again. -

- If the returned value is then the - may remove the from the . -

-
- -
- - - Validates the misfire instruction. - - The misfire instruction. - - - - - This method should not be used by the Quartz client. -

- To be implemented by the concrete classes that extend this class. -

-

- The implementation should update the 's state - based on the MISFIRE_INSTRUCTION_XXX that was selected when the - was created. -

-
- -
- - -

- Determines whether the date and (optionally) time of the given Calendar - instance falls on a scheduled fire-time of this trigger. -

- -

- Equivalent to calling . -

-
- The date to compare. - -
- - - Determines whether the date and (optionally) time of the given Calendar - instance falls on a scheduled fire-time of this trigger. -

- Note that the value returned is NOT validated against the related - ICalendar (if any). -

-
- The date to compare - If set to true, the method will only determine if the - trigger will fire during the day represented by the given Calendar - (hours, minutes and seconds will be ignored). - -
- - - Called when the has decided to 'fire' - the trigger (Execute the associated ), in order to - give the a chance to update itself for its next - triggering (if any). - - - - - - - Updates the trigger with new calendar. - - The calendar to update with. - The misfire threshold. - - - - Called by the scheduler at the time a is first - added to the scheduler, in order to have the - compute its first fire time, based on any associated calendar. -

- After this method has been called, - should return a valid answer. -

-
- - - the first time at which the will be fired - by the scheduler, which is also the same value - will return (until after the first firing of the ). - -
- - - Gets the expression summary. - - - - - - Gets the next time to fire after the given time. - - The time to compute from. - - - - - NOT YET IMPLEMENTED: Returns the time before the given time - that this will fire. - - The date. - - - - - Gets or sets the cron expression string. - - The cron expression string. - - - - Set the CronExpression to the given one. The TimeZone on the passed-in - CronExpression over-rides any that was already set on the Trigger. - - The cron expression. - - - - Returns the date/time on which the trigger may begin firing. This - defines the initial boundary for trigger firings the trigger - will not fire prior to this date and time. - - - - - - Get or sets the time at which the CronTrigger should quit - repeating - even if repeastCount isn't yet satisfied. - - - - - Sets the time zone for which the of this - will be resolved. - - - If is set after this - property, the TimeZone setting on the CronExpression will "win". However - if is set after this property, the - time zone applied by this method will remain in effect, since the - string cron expression does not carry a time zone! - - The time zone. - - - - Returns the last UTC time at which the will fire, if - the Trigger will repeat indefinitely, null will be returned. -

- Note that the return time *may* be in the past. -

-
-
- - - Tells whether this Trigger instance can handle events - in millisecond precision. - - - - - - The interface to be implemented by s that provide a - mechanism for having their execution interrupted. It is NOT a requirment - for jobs to implement this interface - in fact, for most people, none of - their jobs will. - - -

- The means of actually interrupting the Job must be implemented within the - itself (the method of this - interface is simply a means for the scheduler to inform the - that a request has been made for it to be interrupted). The mechanism that - your jobs use to interrupt themselves might vary between implementations. - However the principle idea in any implementation should be to have the - body of the job's periodically check some flag to - see if an interruption has been requested, and if the flag is set, somehow - abort the performance of the rest of the job's work. An example of - interrupting a job can be found in the java source for the class - Quartz.Examples.Example7.DumbInterruptableJob. It is legal to use - some combination of and - synchronization within and - in order to have the method block until the - signals that it has noticed the set flag. -

- -

- If the Job performs some form of blocking I/O or similar functions, you may - want to consider having the method store a - reference to the calling as a member variable. Then the - impplementation of this interfaces method can call - on that Thread. Before attempting this, make - sure that you fully understand what - does and doesn't do. Also make sure that you clear the Job's member - reference to the Thread when the Execute(..) method exits (preferrably in a - block. -

-
- - - James House -
- - - Called by the when a user - interrupts the . - - void (nothing) if job interrupt is successful. - - - - Scheduler constants. - - - - - A (possibly) usefull constant that can be used for specifying the group - that and instances belong to. - - - - - A constant group name used internally by the - scheduler - clients should not use the value of this constant - ("MANUAL_TRIGGER") for thename of a 's group. - - - - - A constant group name used internally by the - scheduler - clients should not use the value of this constant - ("RECOVERING_JOBS") for thename of a 's group. - - - - - A constant group name used internally by the - scheduler - clients should not use the value of this constant - ("FAILED_OVER_JOBS") for thename of a 's group. - - - - - A constant key that can be used to retrieve the - name of the original from a recovery trigger's - data map in the case of a job recovering after a failed scheduler - instance. - - - - - - A constant key that can be used to retrieve the - group of the original from a recovery trigger's - data map in the case of a job recovering after a failed scheduler - instance. - - - - - - A constant key that can be used to retrieve the - scheduled fire time of the original from a recovery - trigger's data map in the case of a job recovering after a failed scheduler - instance. - - - - - - Holds state information for instances. - - - instances are stored once when the - is added to a scheduler. They are also re-persisted after every execution of - instances. -

- instances can also be stored with a - . This can be useful in the case where you have a Job - that is stored in the scheduler for regular/repeated use by multiple - Triggers, yet with each independent triggering, you want to supply the - Job with different data inputs. -

-

- The passed to a Job at execution time - also contains a convenience that is the result - of merging the contents of the trigger's JobDataMap (if any) over the - Job's JobDataMap (if any). -

-
- - - - - James House -
- - - Create an empty . - - - - - Create a with the given data. - - - - - Adds the given value as a string version to the - 's data map. - - - - - Adds the given value as a string version to the - 's data map. - - - - - Adds the given value as a string version to the - 's data map. - - - - - Adds the given value as a string version to the - 's data map. - - - - - Adds the given value as a string version to the - 's data map. - - - - - Adds the given value as a string version to the - 's data map. - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the - . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Gets the date time. - - The key. - - - - - Gets the value behind the specified key. - - The key. - - - - - Conveys the detail properties of a given instance. - - - Quartz does not store an actual instance of a type, but - instead allows you to define an instance of one, through the use of a . -

- s have a name and group associated with them, which - should uniquely identify them within a single . -

-

- s are the 'mechanism' by which s - are scheduled. Many s can point to the same , - but a single can only point to one . -

-
- - - - - James House - Sharada Jambula -
- - - Create a with no specified name or group, and - the default settings of all the other properties. -

- Note that the , and - properties must be set before the job can be - placed into a . -

-
-
- - - Create a with the given name, default group, and - the default settings of all the other properties. - If , Scheduler.DefaultGroup will be used. - - - If name is null or empty, or the group is an empty string. - - - - - Create a with the given name, and group, and - the default settings of all the other properties. - If , Scheduler.DefaultGroup will be used. - - - If name is null or empty, or the group is an empty string. - - - - - Create a with the given name, and group, and - the given settings of all the other properties. - - The name. - if , Scheduler.DefaultGroup will be used. - Type of the job. - if set to true, job will be volatile. - if set to true, job will be durable. - if set to true, job will request recovery. - - ArgumentException if name is null or empty, or the group is an empty string. - - - - - Validates whether the properties of the are - valid for submission into a . - - - - - Add the specified name of a to the - end of the 's list of listeners. - - - - - Remove the specified name of a from - the 's list of listeners. - - true if the given name was found in the list, and removed - - - - Return a simple string representation of this object. - - - - - Creates a new object that is a copy of the current instance. - - - A new object that is a copy of this instance. - - - - - Determines whether the specified detail is equal to this instance. - - The detail to examine. - - true if the specified detail is equal; otherwise, false. - - - - - Determines whether the specified is equal to the current . - - The to compare with the current . - - if the specified is equal to the - current ; otherwise, . - - - - - Checks equality between given job detail and this instance. - - The detail to compare this instance with. - - - - - Serves as a hash function for a particular type, suitable - for use in hashing algorithms and data structures like a hash table. - - - A hash code for the current . - - - - - Get or sets the name of this . - - - if name is null or empty. - - - - - Get or sets the group of this . - If , will be used. - - - If the group is an empty string. - - - - - Returns the 'full name' of the in the format - "group.name". - - - - - Gets the key. - - The key. - - - - Get or set the description given to the instance by its - creator (if any). - - - May be useful for remembering/displaying the purpose of the job, though the - description has no meaning to Quartz. - - - - - Get or sets the instance of that will be executed. - - - if jobType is null or the class is not a . - - - - - Get or set the that is associated with the . - - - - - Set whether or not the the should re-Execute - the if a 'recovery' or 'fail-over' situation is - encountered. -

- If not explicitly set, the default value is . -

-
- -
- - - Whether or not the should not be persisted in the - for re-use after program - restarts. -

- If not explicitly set, the default value is . -

-
- if the should be garbage - collected along with the . - -
- - - Whether or not the should remain stored after it is - orphaned (no s point to it). -

- If not explicitly set, the default value is . -

-
- - if the Job should remain persisted after - being orphaned. - -
- - - Whether or not the implements the interface . - - - - - Gets or sets an array of s containing the names of all - s assigned to the , - in the order in which they should be notified. Setting the array - clears any listener names that were in the list. - - - - - A context bundle containing handles to various environment information, that - is given to a instance as it is - executed, and to a instance after the - execution completes. - - -

- The found on this object (via the - method) serves as a convenience - - it is a merge of the found on the - and the one found on the , with - the value in the latter overriding any same-named values in the former. - It is thus considered a 'best practice' that the Execute code of a Job - retrieve data from the JobDataMap found on this object NOTE: Do not - expect value 'set' into this JobDataMap to somehow be set back onto a - 's own JobDataMap. -

- -

- s are also returned from the - - method. These are the same instances as those past into the jobs that are - currently executing within the scheduler. The exception to this is when your - application is using Quartz remotely (i.e. via RMI) - in which case you get - a clone of the s, and their references to - the and instances have been lost (a - clone of the is still available - just not a handle - to the job instance that is running). -

-
- - - - - - James House -
- - - Create a JobExcecutionContext with the given context data. - - - - - Increments the refire count. - - - - - Returns a that represents the current . - - - A that represents the current . - - - - - Put the specified value into the context's data map with the given key. - Possibly useful for sharing data between listeners and jobs. -

- NOTE: this data is volatile - it is lost after the job execution - completes, and all TriggerListeners and JobListeners have been - notified. -

-
- - - - -
- - - Get the value with the given key from the context's data map. - - - - - - - Get a handle to the instance that fired the - . - - - - - Get a handle to the instance that fired the - . - - - - - Get a handle to the referenced by the - instance that fired the . - - - - - If the is being re-executed because of a 'recovery' - situation, this method will return . - - - - - Gets the refire count. - - The refire count. - - - - Get the convenience of this execution context. - - -

- The found on this object serves as a convenience - - it is a merge of the found on the - and the one found on the , with - the value in the latter overriding any same-named values in the former. - It is thus considered a 'best practice' that the Execute code of a Job - retrieve data from the JobDataMap found on this object. -

- -

NOTE: Do not expect value 'set' into this JobDataMap to somehow be - set back onto a 's own JobDataMap. -

- -

- Attempts to change the contents of this map typically result in an - illegal state. -

- -
-
- - - Get the associated with the . - - - - - Get the instance of the that was created for this - execution. -

- Note: The Job instance is not available through remote scheduler - interfaces. -

-
-
- - - The actual time the trigger fired. For instance the scheduled time may - have been 10:00:00 but the actual fire time may have been 10:00:03 if - the scheduler was too busy. - - Returns the fireTimeUtc. - - - - - The scheduled time the trigger fired for. For instance the scheduled - time may have been 10:00:00 but the actual fire time may have been - 10:00:03 if the scheduler was too busy. - - Returns the scheduledFireTimeUtc. - - - - - Gets the previous fire time. - - The previous fire time. - - - - Gets the next fire time. - - The next fire time. - - - - Returns the result (if any) that the set before its - execution completed (the type of object set as the result is entirely up - to the particular job). - - -

- The result itself is meaningless to Quartz, but may be informative - to s or - s that are watching the job's - execution. -

- - Set the result (if any) of the 's execution (the type of - object set as the result is entirely up to the particular job). - -

- The result itself is meaningless to Quartz, but may be informative - to s or - s that are watching the job's - execution. -

-
-
- - - The amount of time the job ran for. The returned - value will be until the job has actually completed (or thrown an - exception), and is therefore generally only useful to - s and s. - - - - - An exception that can be thrown by a - to indicate to the Quartz that an error - occured while executing, and whether or not the requests - to be re-fired immediately (using the same , - or whether it wants to be unscheduled. - - - Note that if the flag for 'refire immediately' is set, the flags for - unscheduling the Job are ignored. - - - - - James House - - - - Create a JobExcecutionException, with the 're-fire immediately' flag set - to . - - - - - Create a JobExcecutionException, with the given cause. - - The cause. - - - - Create a JobExcecutionException, with the given message. - - - - - Initializes a new instance of the class. - - The message. - The original cause. - - - - Create a JobExcecutionException with the 're-fire immediately' flag set - to the given value. - - - - - Create a JobExcecutionException with the given underlying exception, and - the 're-fire immediately' flag set to the given value. - - - - - Create a JobExcecutionException with the given message, and underlying - exception, and the 're-fire immediately' flag set to the given value. - - - - - Initializes a new instance of the class. - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - The class name is null or is zero (0). - The info parameter is null. - - - - Creates and returns a string representation of the current exception. - - - A string representation of the current exception. - - - - - - Gets or sets a value indicating whether to unschedule firing trigger. - - - true if firing trigger should be unscheduled; otherwise, false. - - - - - Gets or sets a value indicating whether to unschedule all triggers. - - - true if all triggers should be unscheduled; otherwise, false. - - - - - Gets or sets a value indicating whether to refire immediately. - - true if to refire immediately; otherwise, false. - - - - Misfire instructions. - - - - - Instruction not set (yet). - - - - - Use smart policy. - - - - - Misfire policy settings for SimpleTrigger. - - - - - Instructs the that upon a mis-fire - situation, the wants to be fired - now by . -

- NOTE: This instruction should typically only be used for - 'one-shot' (non-repeating) Triggers. If it is used on a trigger with a - repeat count > 0 then it is equivalent to the instruction - . -

-
-
- - - Instructs the that upon a mis-fire - situation, the wants to be - re-scheduled to 'now' (even if the associated - excludes 'now') with the repeat count left as-is. This does obey the - end-time however, so if 'now' is after the - end-time the will not fire again. - - -

- NOTE: Use of this instruction causes the trigger to 'forget' - the start-time and repeat-count that it was originally setup with (this - is only an issue if you for some reason wanted to be able to tell what - the original values were at some later time). -

-
-
- - - Instructs the that upon a mis-fire - situation, the wants to be - re-scheduled to 'now' (even if the associated - excludes 'now') with the repeat count set to what it would be, if it had - not missed any firings. This does obey the end-time - however, so if 'now' is after the end-time the will - not fire again. - -

- NOTE: Use of this instruction causes the trigger to 'forget' - the start-time and repeat-count that it was originally setup with. - Instead, the repeat count on the trigger will be changed to whatever - the remaining repeat count is (this is only an issue if you for some - reason wanted to be able to tell what the original values were at some - later time). -

- -

- NOTE: This instruction could cause the - to go to the 'COMPLETE' state after firing 'now', if all the - repeat-fire-times where missed. -

-
-
- - - Instructs the that upon a mis-fire - situation, the wants to be - re-scheduled to the next scheduled time after 'now' - taking into - account any associated , and with the - repeat count set to what it would be, if it had not missed any firings. - - - NOTE/WARNING: This instruction could cause the - to go directly to the 'COMPLETE' state if all fire-times where missed. - - - - - Instructs the that upon a mis-fire - situation, the wants to be - re-scheduled to the next scheduled time after 'now' - taking into - account any associated , and with the - repeat count left unchanged. - - -

- NOTE/WARNING: This instruction could cause the - to go directly to the 'COMPLETE' state if all the end-time of the trigger - has arrived. -

-
-
- - - misfire instructions for CronTrigger - - - - - Instructs the that upon a mis-fire - situation, the wants to be fired now - by . - - - - - Instructs the that upon a mis-fire - situation, the wants to have it's - next-fire-time updated to the next time in the schedule after the - current time (taking into account any associated , - but it does not want to be fired now. - - - - - misfire instructions for NthIncludedDayTrigger - - - - - Instructs the that upon a mis-fire situation, the - wants to be fired now by the - - - - - - Instructs the that upon a mis-fire situation, the - wants to have - nextFireTime updated to the next time in the schedule after - the current time, but it does not want to be fired now. - - - - - A trigger which fires on the Nth day of every interval type - , or - that is not excluded by the associated - calendar. - - - When determining what the Nth day of the month or year - is, will skip excluded days on the - associated calendar. This would commonly be used in an Nth - business day situation, in which the user wishes to fire a particular job on - the Nth business day (i.e. the 5th business day of - every month). Each also has an associated - which indicates at what time of day the trigger is - to fire. -

- All s default to a monthly interval type - (fires on the Nth day of every month) with N = 1 (first - non-excluded day) and set to 12:00 PM (noon). These - values can be changed using the , , and - methods. Users may also want to note the - and - methods. -

-

- Take, for example, the following calendar: -

- - July August September - Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa - 1 W 1 2 3 4 5 W 1 2 W - W H 5 6 7 8 W W 8 9 10 11 12 W W H 6 7 8 9 W - W 11 12 13 14 15 W W 15 16 17 18 19 W W 12 13 14 15 16 W - W 18 19 20 21 22 W W 22 23 24 25 26 W W 19 20 21 22 23 W - W 25 26 27 28 29 W W 29 30 31 W 26 27 28 29 30 - W - - Where W's represent weekend days, and H's represent holidays, all of which - are excluded on a calendar associated with an - with n=5 and - intervalType=IntervalTypeMonthly. In this case, the trigger - would fire on the 8th of July (because of the July 4 holiday), - the 5th of August, and the 8th of September (because - of Labor Day). -
- Aaron Craven -
- - - Indicates a monthly trigger type (fires on the Nth included - day of every month). - - - - indicates a yearly trigger type (fires on the Nth included - day of every year). - - - - - Indicates a weekly trigger type (fires on the Nth included - day of every week). When using this interval type, care must be taken - not to think of the value of as an analog to - . Such a comparison can only - be drawn when there are no calendars associated with the trigger. To - illustrate, consider an with - n = 3 which is associated with a Calendar excluding - non-weekdays. The trigger would fire on the 3rd - included day of the week, which would be 4th - actual day of the week. - - - - - Create an with no specified name, - group, or . This will result initially in a - default monthly trigger that fires on the first day of every month at - 12:00 PM (n = 1, - intervalType=, - fireAtTime="12:00"). - - - Note that , , - , and , must be - called before the can be placed into - a . - - - - - Create an with the given name and - default group but no specified . This will result - initially in a default monthly trigger that fires on the first day of - every month at 12:00 PM (=1, - intervalType=, - fireAtTime=12:00"). -

- Note that and must - be called before the can be placed - into a . -

-
- the name for the -
- - - Create an with the given name and - group but no specified . This will result - initially in a default monthly trigger that fires on the first day of - every month at 12:00 PM (=1, - intervalType=, - fireAtTime=12:00"). -

- Note that and must - be called before the can be placed - into a . -

-
- the name for the - - the group for the - -
- - - Create an with the given name and - group and the specified . This will result - initially in a default monthly trigger that fires on the first day of - every month at 12:00 PM (=1, - intervalType=, - fireAtTime="12:00"). - - The name for the . - The group for the . - The name of the job to associate with the . - The group containing the job to associate with the . - - - - Returns the next UTC time at which the - will fire. If the trigger will not fire again, will be - returned. - - -

- Because of the conceptual design of , - it is not always possible to decide with certainty that the trigger - will never fire again. Therefore, it will search for the next - fire time up to a given cutoff. These cutoffs can be changed by using the - property. The default cutoff is 12 - of the intervals specified by intervalType. -

-

- The returned value is not guaranteed to be valid until after - the trigger has been added to the scheduler. -

-
- the next fire time for the trigger - -
- - - Returns the previous UTC time at which the - fired. If the trigger has not yet - fired, will be returned. - - the previous fire time for the trigger - - - - Returns the first time the will fire - after the specified date. - - -

- Because of the conceptual design of , - it is not always possible to decide with certainty that the trigger - will never fire again. Therefore, it will search for the next - fire time up to a given cutoff. These cutoffs can be changed by using the - property. The default cutoff is 12 - of the intervals specified by intervalType. -

-

- Therefore, for triggers with intervalType = - , if the trigger - will not fire within 12 - weeks after the given date/time, will be returned. For - triggers with intervalType = - - , if the trigger will not fire within 12 - months after the given date/time, will be returned. - For triggers with intervalType = - - , if the trigger will not fire within 12 - years after the given date/time, will be returned. In - all cases, if the trigger will not fire before , - will be returned. -

-
- The time after which to find the nearest fire time. - This argument is treated as exclusive 舒 that is, - if afterTime is a valid fire time for the trigger, it - will not be returned as the next fire time. - - - the first time the trigger will fire following the specified date - -
- - - Called when the has decided to 'fire' the trigger - (Execute the associated ), in order to give the - a chance to update itself for its next triggering - (if any). - - - - - Called by the scheduler at the time a is first - added to the scheduler, in order to have the - compute its first fire time, based on any associated calendar. -

- After this method has been called, - should return a valid answer. -

- -
- the first time at which the will be fired - by the scheduler, which is also the same value - will return (until after the first - firing of the ). - -
- - - Called after the has executed the - associated with the in order - to get the final instruction code from the trigger. - - - The that was used by the - 's method. - - - The thrown by the - , if any (may be ) - - one of the Trigger.INSTRUCTION_XXX constants. - - - - - Used by the to determine whether or not it is - possible for this to fire again. - ' - -

- If the returned value is then the - may remove the from the - -

-
- - A boolean indicator of whether the trigger could potentially fire - again. - -
- - - Indicates whether is a valid misfire - instruction for this . - - Whether is valid. - - - Updates the 's state based on the - MisfireInstruction that was selected when the - was created -

- If the misfire instruction is set to MISFIRE_INSTRUCTION_SMART_POLICY, - then the instruction will be interpreted as - . -

-
- a new or updated calendar to use for the trigger - -
- - - Updates the 's state based on the - given new version of the associated . - - A new or updated calendar to use for the trigger - the amount of time that must - be between "now" and the time the next - firing of the trigger is supposed to occur. - - - - - Calculates the first time an with - intervalType = IntervalTypeWeekly will fire - after the specified date. See for more - information. - - The time after which to find the nearest fire time. - This argument is treated as exclusive 舒 that is, - if afterTime is a valid fire time for the trigger, it - will not be returned as the next fire time. - - the first time the trigger will fire following the specified - date - - - - - Calculates the first UTC time an with - intervalType = will fire - after the specified date. See for more - information. - - - The UTC time after which to find the nearest fire time. - This argument is treated as exclusive 舒 that is, - if afterTime is a valid fire time for the trigger, it - will not be returned as the next fire time. - - the first time the trigger will fire following the specified date - - - - Calculates the first time an with - intervalType = will fire - after the specified date. See for more - information. - - - The UTC time after which to find the nearest fire time. - This argument is treated as exclusive 舒 that is, - if afterTime is a valid fire time for the trigger, it - will not be returned as the next fire time. - - the first time the trigger will fire following the specified - date - - - - - Gets or sets the day of the interval on which the - should fire. If the Nth - day of the interval does not exist (i.e. the 32nd of a - month), the trigger simply will never fire. N may not be less than 1. - - - - - Returns the interval type for the . - - - Sets the interval type for the . If - , the trigger will fire on the - Nth included day of every month. If - , the trigger will fire on the - Nth included day of every year. If - , the trigger will fire on the - Nth included day of every week. - - - - - - - - Returns the fire time for the as a - string with the format "HH:MM[:SS]", with HH representing the - 24-hour clock hour of the fire time. Seconds are optional and their - inclusion depends on whether or not they were provided to - . - - - - - Returns the for the - . - - -

- Because of the conceptual design of , - it is not always possible to decide with certainty that the trigger - will never fire again. Therefore, it will search for the next - fire time up to a given cutoff. These cutoffs can be changed by using the - property. The default cutoff is 12 - of the intervals specified by intervalType" />. -

-

- Because of the conceptual design of , - it is not always possible to decide with certainty that the trigger - will never fire again. Therefore, it will search for the next - fire time up to a given cutoff. These cutoffs can be changed by using the - method. The default cutoff is 12 - of the intervals specified by intervalType". -

-

- In most cases, the default value of this setting (12) is sufficient (it - is highly unlikely, for example, that you will need to look at more than - 12 months of dates to ensure that your trigger will never fire again). - However, this setting is included to allow for the rare exceptions where - this might not be true. -

-

- For example, if your trigger is associated with a calendar that excludes - a great many dates in the next 12 months, and hardly any following that, - it is possible (if is large enough) that you could run - into this situation. -

-
-
- - - Returns the last UTC time the will fire. - If the trigger will not fire at any point between - and , will be returned. - - the last time the trigger will fire. - - - - Tells whether this Trigger instance can handle events - in millisecond precision. - - - - - - Sets or gets the time zone in which the will be resolved. - If no time zone is provided, then the default time zone will be used. - - - - - - - Gets or sets the trigger's calendar week rule. - - The trigger calendar week rule. - - - - Gets or sets the trigger's calendar first day of week rule. - - The trigger calendar first day of week. - - - - An exception that is thrown to indicate that an attempt to store a new - object (i.e. , - or ) in a - failed, because one with the same name and group already exists. - - James House - - -

- Create a with the given - message. -

-
-
- - - Initializes a new instance of the class. - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - The class name is null or is zero (0). - The info parameter is null. - - -

- Create a and auto-generate a - message using the name/group from the given . -

- -

- The message will read:
"Unable to store Job with name: '__' and - group: '__', because one already exists with this identification." -

-
-
- -

- Create a and auto-generate a - message using the name/group from the given . -

- -

- The message will read:
"Unable to store Trigger with name: '__' and - group: '__', because one already exists with this identification." -

-
-
- - - An exception that is thrown to indicate that there is a misconfiguration of - the - or one of the components it - configures. - - James House - - - - Create a with the given message. - - - - - Create a with the given message - and cause. - - - - - Initializes a new instance of the class. - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - The class name is null or is zero (0). - The info parameter is null. - - - - Holds context/environment data that can be made available to Jobs as they - are executed. - - - James House - - - - Create an empty . - - - - - Create a with the given data. - - - - - Instructs Scheduler what to do with a trigger and job. - - - - - Instructs the that the - has no further instructions. - - - - - Instructs the that the - wants the to re-Execute - immediately. If not in a 'RECOVERING' or 'FAILED_OVER' situation, the - execution context will be re-used (giving the the - abilitiy to 'see' anything placed in the context by its last execution). - - - - - Instructs the that the - should be put in the state. - - - - - Instructs the that the - wants itself deleted. - - - - - Instructs the that all - s referencing the same as - this one should be put in the state. - - - - - Instructs the that all - s referencing the same as - this one should be put in the state. - - - - - Instructs the that the - should be put in the state. - - - - - Describes the settings and capabilities of a given - instance. - - James House - - - - Initializes a new instance of the class. - - Name of the scheduler. - The scheduler instance. - The scheduler type. - if set to true, scheduler is a remote scheduler. - if set to true, scheduler is started. - if set to true, scheduler is in standby mode. - if set to true, scheduler is shutdown. - The start time. - The number of jobs executed. - The job store type. - if set to true, job store is persistent. - The thread pool type. - Size of the thread pool. - The version string. - - - - Returns a formatted (human readable) string describing all the 's - meta-data values. - - -

- The format of the string looks something like this: -

-            Quartz Scheduler 'SchedulerName' with instanceId 'SchedulerInstanceId' Scheduler class: 'Quartz.Impl.StdScheduler' - running locally. Running since: '11:33am on Jul 19, 2002' Not currently paused. Number of Triggers fired: '123' Using thread pool 'Quartz.Simpl.SimpleThreadPool' - with '8' threads Using job-store 'Quartz.Impl.JobStore' - which supports persistence.
-            
-

-
-
- - - Return a simple string representation of this object. - - - - - Returns the name of the . - - - - - Returns the instance Id of the . - - - - - Returns the class-name of the instance. - - - - - Returns whether the is being used remotely (via remoting). - - - - - Returns whether the scheduler has been started. - - - Note: may return even if - returns . - - - - - Reports whether the is in standby mode. - - - Note: may return even if - returns . - - - - - Reports whether the has been Shutdown. - - - - - Returns the class-name of the instance that is - being used by the . - - - - - Returns the type name of the instance that is - being used by the . - - - - - Returns the number of threads currently in the 's - - - - - Returns the version of Quartz that is running. - - - - - Returns the at which the Scheduler started running. - - null if the scheduler has not been started. - - - - - Returns the number of jobs executed since the - started.. - - - - - Returns whether or not the 's - instance supports persistence. - - - - - A concrete that is used to fire a - at a given moment in time, and optionally repeated at a specified interval. - - - - - - James House - Contributions by Lieven Govaerts of Ebitec Nv, Belgium. - Marko Lahma (.NET) - - - - Used to indicate the 'repeat count' of the trigger is indefinite. Or in - other words, the trigger should repeat continually until the trigger's - ending timestamp. - - - - - Create a with no settings. - - - - - Create a that will occur immediately, and - not repeat. - - - - - Create a that will occur immediately, and - not repeat. - - - - - Create a that will occur immediately, and - repeat at the the given interval the given number of times. - - - - - Create a that will occur immediately, and - repeat at the the given interval the given number of times. - - - - - Create a that will occur at the given time, - and not repeat. - - - - - Create a that will occur at the given time, - and not repeat. - - - - - Create a that will occur at the given time, - and repeat at the the given interval the given number of times, or until - the given end time. - - The name. - A UTC set to the time for the to fire. - A UTC set to the time for the - to quit repeat firing. - The number of times for the to repeat - firing, use for unlimited times. - The time span to pause between the repeat firing. - - - - Create a that will occur at the given time, - and repeat at the the given interval the given number of times, or until - the given end time. - - The name. - The group. - A UTC set to the time for the to fire. - A UTC set to the time for the - to quit repeat firing. - The number of times for the to repeat - firing, use for unlimited times. - The time span to pause between the repeat firing. - - - - Create a that will occur at the given time, - fire the identified and repeat at the the given - interval the given number of times, or until the given end time. - - The name. - The group. - Name of the job. - The job group. - A set to the time for the - to fire. - A set to the time for the - to quit repeat firing. - The number of times for the to repeat - firing, use RepeatIndefinitely for unlimited times. - The time span to pause between the repeat firing. - - - - Validates the misfire instruction. - - The misfire instruction. - - - - - Updates the 's state based on the - MisfireInstruction value that was selected when the - was created. - - - If MisfireSmartPolicyEnabled is set to true, - then the following scheme will be used:
-
    -
  • If the Repeat Count is 0, then the instruction will - be interpreted as .
  • -
  • If the Repeat Count is , then - the instruction will be interpreted as . - WARNING: using MisfirePolicy.SimpleTrigger.RescheduleNowWithRemainingRepeatCount - with a trigger that has a non-null end-time may cause the trigger to - never fire again if the end-time arrived during the misfire time span. -
  • -
  • If the Repeat Count is > 0, then the instruction - will be interpreted as . -
  • -
-
-
- - - Called when the has decided to 'fire' - the trigger (Execute the associated ), in order to - give the a chance to update itself for its next - triggering (if any). - - - - - - Updates the instance with new calendar. - - The calendar. - The misfire threshold. - - - - Called by the scheduler at the time a is first - added to the scheduler, in order to have the - compute its first fire time, based on any associated calendar. -

- After this method has been called, - should return a valid answer. -

-
- - The first time at which the will be fired - by the scheduler, which is also the same value - will return (until after the first firing of the ). - -
- - - Returns the next time at which the will - fire. If the trigger will not fire again, will be - returned. The value returned is not guaranteed to be valid until after - the has been added to the scheduler. - - - - - Returns the previous time at which the fired. - If the trigger has not yet fired, will be - returned. - - - - - Set the next UTC time at which the should fire. - This method should not be invoked by client code. - - - - - Set the previous UTC time at which the fired. - This method should not be invoked by client code. - - - - - Returns the next UTC time at which the will - fire, after the given UTC time. If the trigger will not fire after the given - time, will be returned. - - - - - Returns the last UTC time at which the will - fire, before the given time. If the trigger will not fire before the - given time, will be returned. - - - - - Computes the number of times fired between the two UTC date times. - - The UTC start date and time. - The UTC end date and time. - - - - - Determines whether or not the will occur - again. - - - - - Validates whether the properties of the are - valid for submission into a . - - - - - Get or set thhe number of times the should - repeat, after which it will be automatically deleted. - - - - - - Get or set the the time interval at which the should repeat. - - - - - Get or set the number of times the has already - fired. - - - - - Returns the final UTC time at which the will - fire, if repeatCount is RepeatIndefinitely, null will be returned. -

- Note that the return time may be in the past. -

-
-
- - - Tells whether this Trigger instance can handle events - in millisecond precision. - - - - - - All trigger states known to Scheduler. - - - - - Indicates that the is in the "normal" state. - - - - - Indicates that the is in the "paused" state. - - - - - Indicates that the is in the "complete" state. - - - "Complete" indicates that the trigger has not remaining fire-times in - its schedule. - - - - - Indicates that the is in the "error" state. - - -

- A arrives at the error state when the scheduler - attempts to fire it, but cannot due to an error creating and executing - its related job. Often this is due to the 's - class not existing in the classpath. -

- -

- When the trigger is in the error state, the scheduler will make no - attempts to fire it. -

-
-
- - - Indicates that the is in the "blocked" state. - - - A arrives at the blocked state when the job that - it is associated with is a and it is - currently executing. - - - - - - Indicates that the does not exist. - - - - - Convenience and utility methods for simplifying the construction and - configuration of s. - - - Please submit suggestions for additional convenience methods to either the - Quartz user forum or the developer's mail list at - source forge. - - - - James House - - - - Constant indicating last day of month. - - - - - Milliseconds in minute. - - - - - Milliseconds in hour. - - - - - Seconds in day. - - - - - Milliseconds in day. - - - - - Initializes a new instance of the class. - - - - - Set the given 's name to the given value, and its - group to the default group (). - - the tigger to change name to - the new trigger name - - - - Set the given 's name to the given value, and its - group to the given group. - - the tigger to change name to - the new trigger name - the new trigger group - - - - Make a trigger that will fire every day at the given time. -

- The generated trigger will not have its name, group, - or end-time set. The Start time defaults to 'now'. -

-
- the hour (0-23) upon which to fire - the minute (0-59) upon which to fire - the new trigger -
- - - Make a trigger that will fire every day at the given time. -

- The generated trigger will not have its group or end-time set. - The Start time defaults to 'now'. -

-
- the trigger's name - the hour (0-23) upon which to fire - the minute (0-59) upon which to fire - the newly created trigger -
- - - Make a trigger that will fire every week at the given day and time. -

- The generated trigger will not have its name, group, - or end-time set. The Start time defaults to 'now'. -

-
- (1-7) the day of week upon which to fire - the hour (0-23) upon which to fire - the minute (0-59) upon which to fire - the new trigger -
- - - Make a trigger that will fire every week at the given day and time. -

- The generated trigger will not have its group, - or end-time set. The Start time defaults to 'now'. -

-
- the trigger's name - the day of week upon which to fire - the hour (0-23) upon which to fire - the minute (0-59) upon which to fire - the newly created trigger -
- - - Make a trigger that will fire every month at the given day and time. -

- The generated trigger will not have its name, group, - or end-time set. The Start time defaults to 'now'. -

-

- If the day of the month specified does not occur in a given month, a - firing will not occur that month. (i.e. if dayOfMonth is specified as - 31, no firing will occur in the months of the year with fewer than 31 - days). -

-
- (1-31, or -1) the day of week upon which to fire - the hour (0-23) upon which to fire - the minute (0-59) upon which to fire - the newly created trigger -
- - - Make a trigger that will fire every month at the given day and time. -

- The generated trigger will not have its group, - or end-time set. The Start time defaults to 'now'. -

-

- If the day of the month specified does not occur in a given month, a - firing will not occur that month. (i.e. if dayOfMonth is specified as - 31, no firing will occur in the months of the year with fewer than 31 - days). -

-
- the trigger's name - (1-31, or -1) the day of week upon which to fire - the hour (0-23) upon which to fire - the minute (0-59) upon which to fire - the newly created trigger -
- - - Make a trigger that will fire times, waiting - between each fire. - - - The generated trigger will not have its name, group, - or end-time set. The Start time defaults to 'now'. - - the newly created trigger - - - - Make a trigger that will fire times, waiting - between each fire. -

- The generated trigger will not have its name, group, - or end-time set. The Start time defaults to 'now'. -

-
- the trigger's name - the new trigger -
- - - Make a trigger that will fire every second, indefinitely. -

- The generated trigger will not have its name, group, - or end-time set. The Start time defaults to 'now'. -

-
- the new trigger -
- - - Make a trigger that will fire every second, indefinitely. -

- The generated trigger will not have its group, - or end-time set. The Start time defaults to 'now'. -

-
- the trigger's name - the new trigger -
- - - Make a trigger that will fire every N seconds, indefinitely. -

- The generated trigger will not have its name, group, - or end-time set. The Start time defaults to 'now'. -

-
- the number of seconds between firings - the new trigger -
- - - Make a trigger that will fire every N seconds, with the given number of - repeats. -

- The generated trigger will not have its name, group, - or end-time set. The Start time defaults to 'now'. -

-
- the number of seconds between firings - the number of times to repeat the firing - the new trigger -
- - - Make a trigger that will fire every N seconds, with the given number of - repeats. -

- The generated trigger will not have its group, - or end-time set. The Start time defaults to 'now'. -

-
- the trigger's name - the number of seconds between firings - the number of times to repeat the firing - the new trigger -
- - - Make a trigger that will fire every minute, indefinitely. -

- The generated trigger will not have its name, group, - or end-time set. The Start time defaults to 'now'. -

-
- the new trigger -
- - - Make a trigger that will fire every minute, indefinitely. -

- The generated trigger will not have its group, - or end-time set. The Start time defaults to 'now'. -

-
- the trigger's name - the new trigger -
- - - Make a trigger that will fire every N minutes, indefinitely. -

- The generated trigger will not have its name, group, - or end-time set. The Start time defaults to 'now'. -

-
- the number of minutes between firings - the new trigger -
- - - Make a trigger that will fire every N minutes, with the given number of - repeats. -

- The generated trigger will not have its name, group, - or end-time set. The Start time defaults to 'now'. -

-
- the number of minutes between firings - the number of times to repeat the firing - the new trigger -
- - - Make a trigger that will fire every N minutes, with the given number of - repeats. -

- The generated trigger will not have its group, - or end-time set. The Start time defaults to 'now'. -

-
- the trigger's name - the number of minutes between firings - the number of times to repeat the firing - the new trigger -
- - - Make a trigger that will fire every hour, indefinitely. -

- The generated trigger will not have its name, group, - or end-time set. The Start time defaults to 'now'. -

-
- the new trigger -
- - - Make a trigger that will fire every hour, indefinitely. -

- The generated trigger will not have its group, - or end-time set. The Start time defaults to 'now'. -

-
- the trigger's name - the new trigger -
- - - Make a trigger that will fire every N hours, indefinitely. -

- The generated trigger will not have its name, group, - or end-time set. The Start time defaults to 'now'. -

-
- the number of hours between firings - the new trigger -
- - - Make a trigger that will fire every N hours, with the given number of - repeats. -

- The generated trigger will not have its name, group, - or end-time set. The Start time defaults to 'now'. -

-
- the number of hours between firings - the number of times to repeat the firing - the new trigger -
- - - Make a trigger that will fire every N hours, with the given number of - repeats. -

- The generated trigger will not have its group, - or end-time set. The Start time defaults to 'now'. -

-
- the trigger's name - the number of hours between firings - the number of times to repeat the firing - the new trigger -
- - - Returns a date that is rounded to the next even hour above the given - date. -

- For example an input date with a time of 08:13:54 would result in a date - with the time of 09:00:00. If the date's time is in the 23rd hour, the - date's 'day' will be promoted, and the time will be set to 00:00:00. -

-
- the Date to round, if the current time will - be used - the new rounded date -
- - - Returns a date that is rounded to the previous even hour below the given - date. -

- For example an input date with a time of 08:13:54 would result in a date - with the time of 08:00:00. -

-
- the Date to round, if the current time will - be used - the new rounded date -
- - - Returns a date that is rounded to the next even minute above the given - date. -

- For example an input date with a time of 08:13:54 would result in a date - with the time of 08:14:00. If the date's time is in the 59th minute, - then the hour (and possibly the day) will be promoted. -

-
- The Date to round, if the current time will be used - The new rounded date -
- - - Returns a date that is rounded to the previous even minute below the - given date. -

- For example an input date with a time of 08:13:54 would result in a date - with the time of 08:13:00. -

-
- the Date to round, if the current time will - be used - the new rounded date -
- - - Returns a date that is rounded to the next even second above the given - date. - - the Date to round, if the current time will - be used - the new rounded date - - - - Returns a date that is rounded to the previous even second below the - given date. -

- For example an input date with a time of 08:13:54.341 would result in a - date with the time of 08:13:00.000. -

-
- the Date to round, if the current time will - be used - the new rounded date -
- - - Returns a date that is rounded to the next even multiple of the given - minute. -

- For example an input date with a time of 08:13:54, and an input - minute-base of 5 would result in a date with the time of 08:15:00. The - same input date with an input minute-base of 10 would result in a date - with the time of 08:20:00. But a date with the time 08:53:31 and an - input minute-base of 45 would result in 09:00:00, because the even-hour - is the next 'base' for 45-minute intervals. -

- -

- More examples: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Input TimeMinute-BaseResult Time
11:16:412011:20:00
11:36:412011:40:00
11:46:412012:00:00
11:26:413011:30:00
11:36:413012:00:00
11:16:411711:17:00
11:17:411711:34:00
11:52:411712:00:00
11:52:41511:55:00
11:57:41512:00:00
11:17:41012:00:00
11:17:41111:08:00
-

- -
- - the Date to round, if the current time will - be used - - - the base-minute to set the time on - - the new rounded date -
- - - Returns a date that is rounded to the next even multiple of the given - minute. -

- The rules for calculating the second are the same as those for - calculating the minute in the method - . -

-
- The date. - The second base. - -
- - - Returns a list of Dates that are the next fire times of a - . - The input trigger will be cloned before any work is done, so you need - not worry about its state being altered by this method. - - The trigger upon which to do the work - The calendar to apply to the trigger's schedule - The number of next fire times to produce - List of java.util.Date objects - - - - Returns a list of Dates that are the next fire times of a - that fall within the given date range. The input trigger will be cloned - before any work is done, so you need not worry about its state being - altered by this method. -

- NOTE: if this is a trigger that has previously fired within the given - date range, then firings which have already occured will not be listed - in the output List. -

-
- The trigger upon which to do the work - The calendar to apply to the trigger's schedule - The starting date at which to find fire times - The ending date at which to stop finding fire times - List of java.util.Date objects -
- - - Translate a date and time from a users timezone to the another - (probably server) timezone to assist in creating a simple trigger with - the right date and time. - - the date to translate - the original time-zone - the destination time-zone - the translated UTC date - - - - Gets the offset from UT for the given date in the given timezone, - taking into account daylight savings. - - the date that is the base for the offset - the time-zone to calculate to offset to - the offset - - - - This functions determines if the TimeZone uses daylight saving time - - TimeZone instance to validate - True or false depending if daylight savings time is used - - - - An exception that is thrown to indicate that a call to - failed without interrupting the Job. - - - James House - - - - Create a with the given message. - - - - - Create a with the given cause. - - - - - Initializes a new instance of the class. - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - The class name is null or is zero (0). - The info parameter is null. - -
-
+ + + + Quartz + + + + + Collection manipulation related utility methods. + + + + + Removes the specified item from list of items and returns + whether removal was success. + + The items to remove from. + The item to remove. + + + + + A hash based set. + + + + + Represents a collection ob objects that contains no duplicate elements. + + + + + Adds a new element to the Collection if it is not already present. + + The object to add to the collection. + Returns true if the object was added to the collection, otherwise false. + + + + Adds all the elements of the specified collection to the Set. + + Collection of objects to add. + true + + + + Returns the first item in the set. + + First object. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The whose elements are copied to the new list. + + is . + + + + Initializes a new instance of the class. + + The capacity. + + + + Unmodifiables the hash set. + + The collection. + + + + + Adds a new element to the ArrayList if it is not already present. + + Element to insert to the ArrayList. + Returns true if the new element was inserted, false otherwise. + + + + Adds all the elements of the specified collection that are not present to the list. + + Collection where the new elements will be added + Returns true if at least one element was added, false otherwise. + + + + Returns the first item in the set. + + First object. + + + + Returns a copy of the HashSet instance. + + Returns a shallow copy of the current HashSet. + + + + A sorted set. + + + + + Returns a portion of the list whose elements are greater than the limit object parameter. + + The start element of the portion to extract. + The portion of the collection whose elements are greater than the limit object parameter. + + + + SupportClass for the TreeSet class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The whose elements are copied to the new list. + + is . + + + + Initializes a new instance of the class. + + The c. + + + + Unmodifiables the tree set. + + The collection. + + + + + Adds a new element to the ArrayList if it is not already present and sorts the ArrayList. + + Element to insert to the ArrayList. + TRUE if the new element was inserted, FALSE otherwise. + + + + Adds all the elements of the specified collection that are not present to the list. + + Collection where the new elements will be added + Returns true if at least one element was added to the collection. + + + + Returns the first item in the set. + + First object. + + + + Determines whether an element is in the the current TreeSetSupport collection. The IComparer defined for + the current set will be used to make comparisons between the elements already inserted in the collection and + the item specified. + + The object to be locatet in the current collection. + true if item is found in the collection; otherwise, false. + + + + Returns a portion of the list whose elements are greater than the limit object parameter. + + The start element of the portion to extract. + The portion of the collection whose elements are greater than the limit object parameter. + + + + Gets the IComparator object used to sort this set. + + + + + Responsible for creating the instances of + to be used within the instance. + + + Although this interface looks a lot like an 'object pool', implementations + do not have to support the re-use of instances. If an implementation does + not wish to pool instances, then the + method would simply create a new instance, and the + method would do nothing. + + James House + Marko Lahma (.NET) + + + + Initialize the factory, providing a handle to the + that should be made available within the and + the s within it, and a handle to the + that the shell will use in its own + operations with the . + + + + + Called by the + to obtain instances of . + + + + + Called by the + to return instances of . + + + + + JobRunShell instances are responsible for providing the 'safe' environment + for s to run in, and for performing all of the work of + executing the , catching ANY thrown exceptions, updating + the with the 's completion code, + etc. +

+ A instance is created by a + on behalf of the which then runs the + shell in a thread from the configured when the + scheduler determines that a has been triggered. +

+
+ + + + + James House + Marko Lahma (.NET) +
+ + + This interface should be implemented by any class whose instances are intended + to be executed by a thread. + + + + + This method has to be implemented in order that starting of the thread causes the object's + run method to be called in that separately executing thread. + + + + + Create a JobRunShell instance with the given settings. + + A handle to the that produced + this . + The instance that should be made + available within the . + the that should be used by the + when making updates to the . + + + + Initializes the job execution context with given scheduler and bundle. + + The scheduler. + The bundle offired triggers. + + + + Requests the Shutdown. + + + + + This method has to be implemented in order that starting of the thread causes the object's + run method to be called in that separately executing thread. + + + + + Runs begin procedures on this instance. + + + + + Completes the execution. + + if set to true [successful execution]. + + + + Passivates this instance. + + + + + Completes the trigger retry loop. + + The trigger. + The job detail. + The inst code. + + + + + Vetoeds the job retry loop. + + The trigger. + The job detail. + The inst code. + + + + + This is the heart of Quartz, an indirect implementation of the + interface, containing methods to schedule s, + register instances, etc. + + + + + + James House + Marko Lahma (.NET) + + + + Starts this instance. + + + + + Standbies this instance. + + + + + Shutdowns this instance. + + + + + returns true if the given JobGroup + is paused + + The scheduling context. + + + + + + returns true if the given TriggerGroup + is paused + + + + + + + + Initializes the class. + + + + + Get the global + that has the given name. + + + + + + + Create a with the given configuration + properties. + + + + + + Bind the scheduler to remoting infrastructure. + + + + + Un-bind the scheduler from remoting infrastructure. + + + + + Adds an object that should be kept as reference to prevent + it from being garbage collected. + + The obj. + + + + Removes the object from garbae collection protected list. + + The obj. + + + + + Starts the 's threads that fire s. +

+ All s that have misfired will + be passed to the appropriate TriggerListener(s). +

+
+
+ + + Temporarily halts the 's firing of s. +

+ The scheduler is not destroyed, and can be re-started at any time. +

+
+
+ + + Halts the 's firing of s, + and cleans up all resources associated with the QuartzScheduler. + Equivalent to . +

+ The scheduler cannot be re-started. +

+
+
+ + + Halts the 's firing of s, + and cleans up all resources associated with the QuartzScheduler. +

+ The scheduler cannot be re-started. +

+
+ + if the scheduler will not allow this method + to return until all currently executing jobs have completed. + +
+ + + Validates the state. + + + + + Add the identified by the given + to the Scheduler, and + associate the given with it. +

+ If the given Trigger does not reference any , then it + will be set to reference the Job passed with it into this method. +

+
+
+ + + Schedule the given with the + identified by the 's settings. + + + + + Add the given to the Scheduler - with no associated + . The will be 'dormant' until + it is scheduled with a , or + is called for it. +

+ The must by definition be 'durable', if it is not, + SchedulerException will be thrown. +

+
+
+ + + Delete the identified from the Scheduler - and any + associated s. + + true if the Job was found and deleted. + + + + Remove the indicated from the + scheduler. + + + + + Remove (delete) the with the + given name, and store the new given one - which must be associated + with the same job. + + The scheduling context. + The name of the to be removed. + The group name of the to be removed. + The new to be stored. + + if a with the given + name and group was not found and removed from the store, otherwise + the first fire time of the newly scheduled trigger. + + + + + Creates a new positive random number + + The last random obtained + Returns a new positive random number + + + + Trigger the identified (Execute it now) - with a non-volatile trigger. + + + + + Trigger the identified (Execute it + now) - with a volatile trigger. + + + + + Pause the with the given name. + + + + + Pause all of the s in the given group. + + + + + Pause the with the given + name - by pausing all of its current s. + + + + + Pause all of the s in the + given group - by pausing all of their s. + + + + + Resume (un-pause) the with the given + name. +

+ If the missed one or more fire-times, then the + 's misfire instruction will be applied. +

+
+
+ + + Resume (un-pause) all of the s in the + given group. +

+ If any missed one or more fire-times, then the + 's misfire instruction will be applied. +

+
+
+ + + Gets the paused trigger groups. + + The the job scheduling context. + + + + + Resume (un-pause) the with + the given name. +

+ If any of the 's s missed one + or more fire-times, then the 's misfire + instruction will be applied. +

+
+
+ + + Resume (un-pause) all of the s + in the given group. +

+ If any of the s had s that + missed one or more fire-times, then the 's + misfire instruction will be applied. +

+
+
+ + + Pause all triggers - equivalent of calling + on every group. +

+ When is called (to un-pause), trigger misfire + instructions WILL be applied. +

+
+ + +
+ + + Resume (un-pause) all triggers - equivalent of calling + on every group. +

+ If any missed one or more fire-times, then the + 's misfire instruction will be applied. +

+
+ +
+ + + Get the names of all known groups. + + + + + Get the names of all the s in the + given group. + + + + + Get all s that are associated with the + identified . + + + + + Get the names of all known + groups. + + + + + Get the names of all the s in + the given group. + + + + + Get the for the + instance with the given name and group. + + + + + Get the instance with the given name and + group. + + + + + Get the current state of the identified . + + + + + + + + + Add (register) the given to the Scheduler. + + + + + Delete the identified from the Scheduler. + + true if the Calendar was found and deleted. + + + + Get the instance with the given name. + + + + + Get the names of all registered s. + + + + + Add the given to the + 'sglobal list. +

+ Listeners in the 'global' list receive notification of execution events + for ALL s. +

+
+
+ + + Add the given to the + 's list, of registered s. + + + + + Remove the given from the + 's list of global listeners. + + + true if the identifed listener was found in the list, and removed. + + + + + Remove the identifed from the 's + list of global listeners. + + + true if the identifed listener was found in the list, and removed. + + + + Remove the identifed from + the 's list of registered listeners. + + + true if the identifed listener was found in the list, and removed. + + + + + Get the non-global that has the given name. + + + + + Add the given to the + 'sglobal list. +

+ Listeners in the 'global' list receive notification of execution events + for ALL s. +

+
+
+ + + Add the given to the + 's list, of registered s. + + + + + Remove the given from + the 's list of global listeners. + + + true if the identifed listener was found in the list, and removed. + + + + + Remove the identifed from the 's + list of global listeners. + + + true if the identifed listener was found in the list, and removed + + + + Remove the identifed + from the 's list of registered listeners. + + + true if the identifed listener was found in the list, and removed. + + + + + Get the non-global + that has the given name. + + + + + Get the global that + has the given name. + + + + + + + Register the given with the + . + + + + + Remove the given from the + . + + + true if the identifed listener was found in the list, and removed. + + + + + Notifies the job store job complete. + + The job scheduling context. + The trigger. + The detail. + The instruction code. + + + + Notifies the scheduler thread. + + + + + Notifies the trigger listeners about fired trigger. + + The job execution context. + + + + + Notifies the trigger listeners about misfired trigger. + + The trigger. + + + + Notifies the trigger listeners of completion. + + The job executution context. + The instruction code to report to triggers. + + + + Notifies the job listeners about job to be executed. + + The jec. + + + + Notifies the job listeners that job exucution was vetoed. + + The job execution context. + + + + Notifies the job listeners that job was executed. + + The jec. + The je. + + + + Notifies the scheduler listeners about scheduler error. + + The MSG. + The se. + + + + Notifies the scheduler listeners about job that was scheduled. + + The trigger. + + + + Notifies the scheduler listeners about job that was unscheduled. + + Name of the trigger. + The trigger group. + + + + Notifies the scheduler listeners about finalized trigger. + + The trigger. + + + + Notifies the scheduler listeners about paused trigger. + + The name. + The group. + + + + Notifies the scheduler listeners resumed trigger. + + The name. + The group. + + + + Notifies the scheduler listeners about paused job. + + The name. + The group. + + + + Notifies the scheduler listeners about resumed job. + + The name. + The group. + + + + Notifies the scheduler listeners about scheduler shutdown. + + + + + Interrupt all instances of the identified InterruptableJob. + + + + + Obtains a lifetime service object to control the lifetime policy for this instance. + + + + + Gets the version of the Quartz Scheduler. + + The version. + + + + Gets the version major. + + The version major. + + + + Gets the version minor. + + The version minor. + + + + Gets the version iteration. + + The version iteration. + + + + Gets the scheduler signaler. + + The scheduler signaler. + + + + Returns the name of the . + + + + + Returns the instance Id of the . + + + + + Returns the of the . + + + + + Gets or sets a value indicating whether to signal on scheduling change. + + + true if schduler should signal on scheduling change; otherwise, false. + + + + + Reports whether the is paused. + + + + + Gets the job store class. + + The job store class. + + + + Gets the thread pool class. + + The thread pool class. + + + + Gets the size of the thread pool. + + The size of the thread pool. + + + + Reports whether the has been Shutdown. + + + + + Return a list of objects that + represent all currently executing Jobs in this Scheduler instance. +

+ This method is not cluster aware. That is, it will only return Jobs + currently executing in this Scheduler instance, not across the entire + cluster. +

+

+ Note that the list returned is an 'instantaneous' snap-shot, and that as + soon as it's returned, the true list of executing jobs may be different. +

+
+
+ + + Get a List containing all of the + s in the 'sglobal list. + + + + + Get a Set containing the names of all the non-global + s registered with the . + + + + + Get a list containing all of the + s in the 'sglobal list. + + + + + Get a Set containing the names of all the non-global + s registered with the . + + + + + Get a List containing all of the + s registered with the . + + + + + Gets or sets the job factory. + + The job factory. + + + + Gets the running since. + + The running since. + + + + Gets the number of jobs executed. + + The number of jobs executed. + + + + Gets a value indicating whether this scheduler supports persistence. + + true if supports persistence; otherwise, false. + + + + Helper class to start scheduler in a delayed fashion. + + + + + ErrorLogger - Scheduler Listener Class + + + + + A helpful abstract base class for implementors of + . + + + The methods in this class are empty so you only need to override the + subset for the events you care about. + + + + + + The interface to be implemented by classes that want to be informed of major + events. + + + + + James House + + + + Called by the when a + is scheduled. + + + + + Called by the when a + is unscheduled. + + + + + Called by the when a + has reached the condition in which it will never fire again. + + + + + Called by the when a + or group of s has been paused. +

+ If a group was paused, then the parameter + will be null. +

+
+ Name of the trigger. + The trigger group. +
+ + + Called by the when a + or group of s has been un-paused. +

+ If a group was resumed, then the parameter + will be null. +

+
+ Name of the trigger. + The trigger group. +
+ + + Called by the when a + or group of s has been paused. +

+ If a group was paused, then the parameter will be + null. If all jobs were paused, then both parameters will be null. +

+
+ Name of the job. + The job group. +
+ + + Called by the when a + or group of s has been un-paused. +

+ If a group was resumed, then the parameter will + be null. If all jobs were paused, then both parameters will be null. +

+
+ The job group. +
+ + + Called by the when a serious error has + occured within the scheduler - such as repeated failures in the , + or the inability to instantiate a instance when its + has fired. +

+ The property of the given SchedulerException + can be used to determine more specific information about the type of + error that was encountered. +

+
+
+ + + Called by the to inform the listener + that it has Shutdown. + + + + + Get the for this + type's category. This should be used by subclasses for logging. + + + + + The interface to be implemented by classes that want to be informed when a + executes. In general, applications that use a + will not have use for this mechanism. + + + + + + + James House + + + + Called by the when a + is about to be executed (an associated + has occured). +

+ This method will not be invoked if the execution of the Job was vetoed + by a . +

+
+ +
+ + + Called by the when a + was about to be executed (an associated + has occured), but a vetoed it's + execution. + + + + + + Called by the after a + has been executed, and be for the associated 's + method has been called. + + + + + Get the name of the . + + + + + Contains all of the resources (,, + etc.) necessary to create a instance. + + + James House + Marko Lahma (.NET) + + + + Gets the unique identifier. + + Name of the scheduler. + The scheduler instance id. + + + + + Gets the unique identifier. + + + + + + Add the given for the + to use. This method expects the plugin's + "initialize" method to be invoked externally (either before or after + this method is called). + + + + + + Get or set the name for the . + + + if name is null or empty. + + + + + Get or set the instance Id for the . + + + if name is null or empty. + + + + + Get or set the name for the . + + + if name is null or empty. + + + + + Get or set the for the + to use. + + + if threadPool is null. + + + + + Get or set the for the + to use. + + + if jobStore is null. + + + + + Get or set the for the + to use. + + + if jobRunShellFactory is null. + + + + + Get the of all + s for the + to use. + + + + + + Gets or sets a value indicating whether to make scheduler thread daemon. + + + true if scheduler should be thread daemon; otherwise, false. + + + + + Gets or sets the scheduler exporter. + + The scheduler exporter. + + + + The thread responsible for performing the work of firing + s that are registered with the . + + + + + James House + Marko Lahma (.NET) + + + + Support class used to handle threads + + + + + The instance of System.Threading.Thread + + + + + Initializes a new instance of the QuartzThread class + + + + + Initializes a new instance of the Thread class. + + The name of the thread + + + + Initializes a new instance of the Thread class. + + A ThreadStart delegate that references the methods to be invoked when this thread begins executing + + + + Initializes a new instance of the Thread class. + + A ThreadStart delegate that references the methods to be invoked when this thread begins executing + The name of the thread + + + + This method has no functionality unless the method is overridden + + + + + Causes the operating system to change the state of the current thread instance to ThreadState.Running + + + + + Interrupts a thread that is in the WaitSleepJoin thread state + + + + + Blocks the calling thread until a thread terminates + + + + + Blocks the calling thread until a thread terminates or the specified time elapses + + Time of wait in milliseconds + + + + Blocks the calling thread until a thread terminates or the specified time elapses + + Time of wait in milliseconds + Time of wait in nanoseconds + + + + Resumes a thread that has been suspended + + + + + Raises a ThreadAbortException in the thread on which it is invoked, + to begin the process of terminating the thread. Calling this method + usually terminates the thread + + + + + Raises a ThreadAbortException in the thread on which it is invoked, + to begin the process of terminating the thread while also providing + exception information about the thread termination. + Calling this method usually terminates the thread. + + An object that contains application-specific information, such as state, which can be used by the thread being aborted + + + + Suspends the thread, if the thread is already suspended it has no effect + + + + + Obtain a string that represents the current object + + A string that represents the current object + + + + Gets the currently running thread + + The currently running thread + + + + Gets the current thread instance + + + + + Gets or sets the name of the thread + + + + + Gets or sets a value indicating the scheduling priority of a thread + + + + + Gets a value indicating the execution status of the current thread + + + + + Gets or sets a value indicating whether or not a thread is a background thread. + + + + + Gets the randomized idle wait time. + + The randomized idle wait time. + + + + Construct a new for the given + as a non-daemon + with normal priority. + + + + + Construct a new for the given + as a with the given + attributes. + + + + + Signals the main processing loop to pause at the next possible point. + + + + + Signals the main processing loop to pause at the next possible point. + + + + + Signals the main processing loop that a change in scheduling has been + made - in order to interrupt any sleeping that may be occuring while + waiting for the fire time to arrive. + + + the time when the newly scheduled trigger + will fire. If this method is being called do to some other even (rather + than scheduling a trigger), the caller should pass null. + + + + + The main processing loop of the . + + + + + Trigger retry loop that is executed on error condition. + + The bndle. + + + + Releases the trigger retry loop. + + The trigger. + + + + Gets the log. + + The log. + + + + Sets the idle wait time. + + The idle wait time. + + + + Gets a value indicating whether this is paused. + + true if paused; otherwise, false. + + + + Gets or sets the db failure retry interval. + + The db failure retry interval. + + + + An interface to be used by instances in order to + communicate signals back to the . + + James House + Marko Lahma (.NET) + + + + An interface to be used by instances in order to + communicate signals back to the . + + James House + + + + Notifies the scheduler about misfired trigger. + + The trigger that misfired. + + + + Notifies the scheduler about finalized trigger. + + The trigger that has finalized. + + + + Signals the scheduling change. + + + + + Notifies the scheduler about misfired trigger. + + The trigger that misfired. + + + + Notifies the scheduler about finalized trigger. + + The trigger that has finalized. + + + + Signals the scheduling change. + + + + + An object used to pass information about the 'client' to the . + + + James House + Marko Lahma (.NET) + + + + get the instanceId in the cluster. + +

+ Set the instanceId. +

+
+
+ + + Metadata information about specific ADO.NET driver library. Metadata is used to + create correct types of object instances to interact with the underlying + database. + + + + + Initializes this instance. Parses information and initializes startup + values. + + + + + Gets the name of the parameter which includes the parameter prefix for this + database. + + Name of the parameter. + + + Gets or sets the name of the assembly that holds the connection library. + The name of the assembly. + + + + Gets or sets the name of the product. + + The name of the product. + + + + Gets or sets the type of the connection. + + The type of the connection. + + + + Gets or sets the type of the command. + + The type of the command. + + + + Gets or sets the type of the parameter. + + The type of the parameter. + + + + Gets the type of the command builder. + + The type of the command builder. + + + Gets the command builder's derive parameters method. + The command builder derive parameters method. + + + + Gets or sets the parameter name prefix. + + The parameter name prefix. + + + + Gets or sets the type of the exception that is thrown when using driver + library. + + The type of the exception. + + + + Gets or sets a value indicating whether parameters are bind by name when using + ADO.NET parameters. + + true if parameters are bind by name; otherwise, false. + + + Gets or sets the type of the database parameters. + The type of the parameter db. + + + + Gets the parameter db type property. + + The parameter db type property. + + + + Gets the parameter is nullable property. + + The parameter is nullable property. + + + + Gets or sets the type of the db binary column. This is a string representation of + Enum element because this information is database driver specific. + + The type of the db binary. + + + Gets the type of the db binary. + The type of the db binary. + + + + Sets the name of the parameter db type property. + + The name of the parameter db type property. + + + + Gets or sets a value indicating whether [use parameter name prefix in parameter collection]. + + + true if [use parameter name prefix in parameter collection]; otherwise, false. + + + + + + + + + + + + + + + Returns a new command object for executing SQL statments/Stored Procedures + against the database. + + An new + + + + Returns a new instance of the providers CommandBuilder class. + + In .NET 1.1 there was no common base class or interface + for command builders, hence the return signature is object to + be portable (but more loosely typed) across .NET 1.1/2.0 + A new Command Builder + + + + Returns a new connection object to communicate with the database. + + A new + + + + Returns a new parameter object for binding values to parameter + placeholders in SQL statements or Stored Procedure variables. + + A new + + + + Shutdowns this instance. + + + + + Connection string used to create connections. + + + + + Registers DB metadata information for given provider name. + + + + + + + Initializes a new instance of the class. + + Name of the db provider. + The connection string. + + + + Returns a new command object for executing SQL statments/Stored Procedures + against the database. + + An new + + + + Returns a new instance of the providers CommandBuilder class. + + A new Command Builder + In .NET 1.1 there was no common base class or interface + for command builders, hence the return signature is object to + be portable (but more loosely typed) across .NET 1.1/2.0 + + + + Returns a new connection object to communicate with the database. + + A new + + + + Returns a new parameter object for binding values to parameter + placeholders in SQL statements or Stored Procedure variables. + + A new + + + + Shutdowns this instance. + + + + + Connection string used to create connections. + + + + + + Gets the metadata. + + The metadata. + + + + Summary description for DbProviderFactory. + + + + + This interface can be implemented by any + class that needs to use the constants contained herein. + + Jeffrey Wescott + James House + + + @deprecated Whether a trigger has misfired is no longer a state, but + rather now identified dynamically by whether the trigger's next fire + time is more than the misfire threshold time in the past. + + + + This class contains utility functions for use in all delegate classes. + + Jeffrey Wescott + + + + Replace the table prefix in a query by replacing any occurrences of + "{0}" with the table prefix. + + The unsubstitued query + The table prefix + The query, with proper table prefix substituted + + + + Obtain a unique key for a given job. + + The job name + The group containing the job + + A unique key + + + + Obtain a unique key for a given trigger. + + The trigger name + The group containing the trigger + A unique key + + + + Base class for database based lock handlers for providing thread/resource locking + in order to protect resources from being altered by multiple threads at the + same time. + + + + + This class extends + to include the query string constants in use by the + class. + + Jeffrey Wescott + + + + An interface for providing thread/resource locking in order to protect + resources from being altered by multiple threads at the same time. + + James House + + + + Grants a lock on the identified resource to the calling thread (blocking + until it is available). + + true if the lock was obtained. + + + + Release the lock on the identified resource if it is held by the calling + thread. + + + + + Determine whether the calling thread owns a lock on the identified + resource. + + + + + Whether this Semaphore implementation requires a database connection for + its lock management operations. + + + + + + + + Interface for Quartz objects that need to know what the table prefix of + the tables used by a ADO.NET JobStore is. + + + + + Initializes a new instance of the class. + + The table prefix. + The SQL. + The default SQL. + The db provider. + + + + Execute the SQL that will lock the proper database row. + + + + + + + + Grants a lock on the identified resource to the calling thread (blocking + until it is available). + + + + + true if the lock was obtained. + + + + Release the lock on the identified resource if it is held by the calling + thread. + + + + + + + Determine whether the calling thread owns a lock on the identified + resource. + + + + + + + + Gets or sets the lock owners. + + The lock owners. + + + + Gets the log. + + The log. + + + + This Semaphore implementation does use the database. + + + + + Gets or sets the table prefix. + + The table prefix. + + + + A FirebirdDelegate specific driver delegate. + + Marko Lahma + + + + This is meant to be an abstract base class for most, if not all, + implementations. Subclasses should override only those methods that need + special handling for the DBMS driver in question. + + Jeffrey Wescott + James House + Marko Lahma (.NET) + + + + This is the base interface for all driver delegate classes. + + +

+ This interface is very similar to the + interface except each method has an additional + parameter. +

+

+ Unless a database driver has some extremely-DB-specific + requirements, any IDriverDelegate implementation classes should extend the + class. +

+
+ Jeffrey Wescott + James House + Marko Lahma (.NET) +
+ + + Update all triggers having one of the two given states, to the given new + state. + + The DB Connection + The new state for the triggers + The first old state to update + The second old state to update + Number of rows updated + + + + Get the names of all of the triggers that have misfired - according to + the given timestamp. + + The DB Connection + The timestamp. + An array of objects + + + + Get the names of all of the triggers in the given state that have + misfired - according to the given timestamp. + + The DB Connection + The state. + The time stamp. + An array of objects + + + + Get the names of all of the triggers in the given group and state that + have misfired - according to the given timestamp. + + The DB Connection + Name of the group. + The state. + The timestamp. + An array of objects + + + + Select all of the triggers for jobs that are requesting recovery. The + returned trigger objects will have unique "recoverXXX" trigger names and + will be in the trigger group. + + + In order to preserve the ordering of the triggers, the fire time will be + set from the ColumnFiredTime column in the TableFiredTriggers + table. The caller is responsible for calling + on each returned trigger. It is also up to the caller to insert the + returned triggers to ensure that they are fired. + + The DB Connection + An array of objects + + + + Delete all fired triggers. + + The DB Connection + The number of rows deleted + + + + Delete all fired triggers of the given instance. + + The DB Connection + The instance id. + The number of rows deleted + + + + Delete all volatile fired triggers. + + The DB Connection + The number of rows deleted + + + + Get the names of all of the triggers that are volatile. + + The DB Connection + An array of see cref="Key" /> objects. + + + + Get the names of all of the jobs that are volatile. + + The DB Connection + An array of objects. + + + + Insert the job detail record. + + The DB Connection + The job to insert. + Number of rows inserted. + + + + Update the job detail record. + + The DB Connection. + The job to update. + Number of rows updated. + + +

+ Get the names of all of the triggers associated with the given job. +

+ +
+ The DB Connection + The job name + The job group +
+ + + Delete all job listeners for the given job. + + The DB Connection + The name of the job + The group containing the job + The number of rows deleted + + + + Delete the job detail record for the given job. + + The DB Connection + the name of the job + Name of the group. + the number of rows deleted + + + + Check whether or not the given job is stateful. + + The DB Connection + The name of the job + The group containing the job + true if the job exists and is stateful, false otherwise + + + + Check whether or not the given job exists. + + The DB Connection + Name of the job. + Name of the group. + true if the job exists, false otherwise + + + + Update the job data map for the given job. + + The DB Connection + The job. + the number of rows updated + + + + Associate a listener with a job. + + The DB Connection + The job to associate with the listener. + The listener to insert. + The number of rows inserted. + + +

+ Get all of the listeners for a given job. +

+ +
+ The DB Connection + The job name whose listeners are wanted + The group containing the job + array of listener names +
+ + + Select the JobDetail object for a given job name / group name. + + The DB Connection + The job name whose listeners are wanted + The group containing the job + The class load helper. + The populated JobDetail object + + + + Select the total number of jobs stored. + + The DB Connection + the total number of jobs stored + + + + Select all of the job group names that are stored. + + The DB Connection. + an array of group names + + + + Select all of the jobs contained in a given group. + + The DB Connection + The group containing the jobs + an array of job names + + + + Insert the base trigger data. + + The DB Connection + The trigger to insert. + The state that the trigger should be stored in. + The job detail. + The number of rows inserted + + + + Insert the simple trigger data. + + The DB Connection + The trigger to insert + The number of rows inserted + + + + Insert the blob trigger data. + + The DB Connection + The trigger to insert + The number of rows inserted + + + + Insert the cron trigger data. + + the DB Connection + The trigger. + the number of rows inserted + + + + Update the base trigger data. + + the DB Connection + The trigger. + The state. + The job detail. + the number of rows updated + + + + Update the simple trigger data. + + the DB Connection + The trigger. + the number of rows updated + + + + Update the cron trigger data. + + the DB Connection + The trigger. + the number of rows updated + + + + Update the blob trigger data. + + the DB Connection + The trigger. + the number of rows updated + + + + Check whether or not a trigger exists. + + the DB Connection + Name of the trigger. + Name of the group. + the number of rows updated + + + + Update the state for a given trigger. + + The DB Connection + The name of the trigger. + The group containing the trigger. + The new state for the trigger. + the number of rows updated + + + + Update the given trigger to the given new state, if it is in the given + old state. + + The DB connection + The name of the trigger. + The group containing the trigger + The new state for the trigger + The old state the trigger must be in + int the number of rows updated + + + + Update the given trigger to the given new state, if it is one of the + given old states. + + The DB connection + The name of the trigger + The group containing the trigger + The new state for the trigger + One of the old state the trigger must be in + One of the old state the trigger must be in + One of the old state the trigger must be in + + int the number of rows updated + + SQLException + + + + Update the all triggers to the given new state, if they are in one of + the given old states AND its next fire time is before the given time. + + The DB connection + The new state for the trigger + One of the old state the trigger must be in + One of the old state the trigger must be in + The time before which the trigger's next fire time must be + int the number of rows updated + + + + Update all triggers in the given group to the given new state, if they + are in one of the given old states. + + The DB connection + The group containing the trigger + The new state for the trigger + One of the old state the trigger must be in + One of the old state the trigger must be in + One of the old state the trigger must be in + The number of rows updated + + + + Update all of the triggers of the given group to the given new state, if + they are in the given old state. + + The DB connection + The group containing the triggers + The new state for the trigger group + The old state the triggers must be in. + int the number of rows updated + + + + Update the states of all triggers associated with the given job. + + The DB Connection + The name of the job. + The group containing the job. + The new state for the triggers. + The number of rows updated + + + + Update the states of any triggers associated with the given job, that + are the given current state. + + The DB Connection + The name of the job + The group containing the job + The new state for the triggers + The old state of the triggers + the number of rows updated + + + + Delete all of the listeners associated with a given trigger. + + The DB Connection + The name of the trigger whose listeners will be deleted + The name of the group containing the trigger + the number of rows deleted + + + + Associate a listener with the given trigger. + + The DB Connectio + The trigger + The name of the listener to associate with the trigger + the number of rows inserted + + + + Select the listeners associated with a given trigger. + + The DB Connection + The name of the trigger + The group containing the trigger + array of trigger listener names + + + + Delete the simple trigger data for a trigger. + + The DB Connection + The name of the trigger + The group containing the trigger + The number of rows deleted + + + + Delete the BLOB trigger data for a trigger. + + The DB Connection + The name of the trigger + The group containing the trigger + The number of rows deleted + + + + Delete the cron trigger data for a trigger. + + The DB Connection + The name of the trigger + The group containing the trigger + the number of rows deleted + + + + Delete the base trigger data for a trigger. + + The DB Connection + The name of the trigger + The group containing the trigger + the number of rows deleted + + + + Select the number of triggers associated with a given job. + + The DB Connection + The name of the job + The group containing the job + the number of triggers for the given job + + + + Select the job to which the trigger is associated. + + The DB Connection + The name of the trigger + The group containing the trigger + The load helper. + + The object associated with the given trigger + + + + + Select the stateful jobs which are referenced by triggers in the given + trigger group. + + The DB Connection + The trigger group. + a List of Keys to jobs. + + + + Select the triggers for a job> + + The DB Connection + The name of the trigger + The group containing the trigger + an array of objects associated with a given job. + + + + Select the triggers for a calendar + + The DB Connection. + Name of the calendar. + + An array of objects associated with a given job. + + + + + Select a trigger. + + The DB Connection. + The name of the trigger. + The group containing the trigger. + The object. + + + + + Select a trigger's JobDataMap. + + The DB Connection. + The name of the trigger. + The group containing the trigger. + The of the Trigger, never null, but possibly empty. + + + + Select a trigger's state value. + + The DB Connection. + The name of the trigger. + The group containing the trigger. + The object. + + + + Select a triggers status (state and next fire time). + + The DB Connection. + The name of the trigger. + The group containing the trigger. + A object, or null + + + + Select the total number of triggers stored. + + The DB Connection. + The total number of triggers stored. + + + + Select all of the trigger group names that are stored. + + The DB Connection. + An array of group names. + + + + Select all of the triggers contained in a given group. + + The DB Connection. + The group containing the triggers. + An array of trigger names. + + + + Select all of the triggers in a given state. + + The DB Connection. + The state the triggers must be in. + An array of trigger s. + + + + Inserts the paused trigger group. + + The conn. + Name of the group. + + + + + Deletes the paused trigger group. + + The conn. + Name of the group. + + + + + Deletes all paused trigger groups. + + The conn. + + + + + Determines whether the specified trigger group is paused. + + The conn. + Name of the group. + + true if trigger group is paused; otherwise, false. + + + + + Selects the paused trigger groups. + + The DB Connection. + + + + + Determines whether given trigger group already exists. + + The conn. + Name of the group. + + true if trigger group exists; otherwise, false. + + + + + Insert a new calendar. + + The DB Connection. + The name for the new calendar. + The calendar. + The number of rows inserted. + + + + Update a calendar. + + The DB Connection. + The name for the new calendar. + The calendar. + The number of rows updated. + + + + Check whether or not a calendar exists. + + The DB Connection. + The name of the calendar. + true if the trigger exists, false otherwise. + + + + Select a calendar. + + The DB Connection. + The name of the calendar. + The Calendar. + + + + Check whether or not a calendar is referenced by any triggers. + + The DB Connection. + The name of the calendar. + true if any triggers reference the calendar, false otherwise + + + + Delete a calendar. + + The DB Connection + The name of the trigger. + The number of rows deleted. + + + + Select the total number of calendars stored. + + The DB Connection + The total number of calendars stored. + + + + Select all of the stored calendars. + + The DB Connection + An array of calendar names. + + + + Select the trigger that will be fired at the given fire time. + + The DB Connection + The time that the trigger will be fired. + + A representing the + trigger that will be fired at the given fire time, or null if no + trigger will be fired at that time + + + + + Insert a fired trigger. + + The DB Connection + The trigger. + The state that the trigger should be stored in. + The job detail. + The number of rows inserted. + + + + Select the states of all fired-trigger records for a given trigger, or + trigger group if trigger name is . + + The DB Connection + Name of the trigger. + Name of the group. + A list of FiredTriggerRecord objects. + + + + Select the states of all fired-trigger records for a given job, or job + group if job name is . + + The DB Connection + Name of the job. + Name of the group. + A List of FiredTriggerRecord objects. + + + + Select the states of all fired-trigger records for a given scheduler + instance. + + The DB Connection + Name of the instance. + A list of FiredTriggerRecord objects. + + + + Delete a fired trigger. + + The DB Connection + The fired trigger entry to delete. + The number of rows deleted. + + + + Get the number instances of the identified job currently executing. + + The DB Connection + Name of the job. + The job group. + + The number instances of the identified job currently executing. + + + + + Insert a scheduler-instance state record. + + The DB Connection + The instance id. + The check in time. + The interval. + The number of inserted rows. + + + + Delete a scheduler-instance state record. + + The DB Connection + The instance id. + The number of deleted rows. + + + + Update a scheduler-instance state record. + + The DB Connection + The instance id. + The check in time. + The number of updated rows. + + + + A List of all current s. +

+ If instanceId is not null, then only the record for the identified + instance will be returned. +

+
+ The DB Connection + The instance id. + +
+ + + Select the next trigger which will fire to fire between the two given timestamps + in ascending order of fire time, and then descending by priority. + + The conn. + highest value of of the triggers (exclusive) + highest value of of the triggers (inclusive) + A (never null, possibly empty) list of the identifiers (Key objects) of the next triggers to be fired. + + + + Select the distinct instance names of all fired-trigger records. + + + This is useful when trying to identify orphaned fired triggers (a + fired trigger without a scheduler state record.) + + The conn. + + + + + Counts the misfired triggers in states. + + The conn. + The state1. + The state2. + The ts. + + + + + Selects the misfired triggers in states. + + The conn. + The state1. + The state2. + The ts. + The count. + The result list. + + + + + Create new StdAdoDelegate instance. + + the logger to use during execution + the prefix of all table names + The instance id. + The db provider. + + + + Create new StdAdoDelegate instance. + + the logger to use during execution + the prefix of all table names + The instance id. + The db provider. + if set to true [use properties]. + + + + Insert the job detail record. + + the DB Connection + the new state for the triggers + the first old state to update + the second old state to update + number of rows updated + + + + Get the names of all of the triggers that have misfired. + + the DB Connection + The ts. + an array of objects + + + + Select all of the triggers in a given state. + + The DB Connection + The state the triggers must be in + an array of trigger s + + + + Get the names of all of the triggers in the given state that have + misfired - according to the given timestamp. + + The DB Connection + The state. + The time stamp. + An array of objects + + + + Get the names of all of the triggers in the given states that have + misfired - according to the given timestamp. No more than count will + be returned. + + The conn. + The state1. + The state2. + The ts. + The most misfired triggers to return, negative for all + + Output parameter. A List of objects. Must not be null + + Whether there are more misfired triggers left to find beyond the given count. + + + + Get the number of triggers in the given states that have + misfired - according to the given timestamp. + + + + + + + + + + Get the names of all of the triggers in the given group and state that + have misfired. + + The DB Connection + Name of the group. + The state. + The timestamp. + an array of objects + + + + Select all of the triggers for jobs that are requesting recovery. The + returned trigger objects will have unique "recoverXXX" trigger names and + will be in the + trigger group. + + + In order to preserve the ordering of the triggers, the fire time will be + set from the ColumnFiredTime column in the TableFiredTriggers + table. The caller is responsible for calling + on each returned trigger. It is also up to the caller to insert the + returned triggers to ensure that they are fired. + + The DB Connection + an array of objects + + + + Delete all fired triggers. + + The DB Connection. + The number of rows deleted. + + + + Delete all fired triggers of the given instance. + + The DB Connection + The instance id. + The number of rows deleted + + + + Insert the job detail record. + + The DB Connection. + The job to insert. + Number of rows inserted. + + + + Gets the db presentation for boolean value. Subclasses can overwrite this behaviour. + + Value to map to database. + + + + + Update the job detail record. + + The DB Connection. + The job to update. + Number of rows updated. + + + + Get the names of all of the triggers associated with the given job. + + The DB Connection. + The name of the job. + The group containing the job. + An array of objects + + + + Delete all job listeners for the given job. + + The DB Connection. + The name of the job. + The group containing the job. + The number of rows deleted. + + + + Delete the job detail record for the given job. + + the DB Connection + the name of the job + the group containing the job + the number of rows deleted + + + + Check whether or not the given job is stateful. + + the DB Connection + the name of the job + the group containing the job + + true if the job exists and is stateful, false otherwise + + + + + Check whether or not the given job exists. + + the DB Connection + the name of the job + the group containing the job + true if the job exists, false otherwise + + + + Update the job data map for the given job. + + The conn. + the job to update + the number of rows updated + + + + Associate a listener with a job. + + The DB Connection. + The job to associate with the listener. + The listener to insert. + The number of rows inserted. + + + + Get all of the listeners for a given job. + + The DB Connection. + The job name whose listeners are wanted. + The group containing the job. + Array of listener names. + + + + Select the JobDetail object for a given job name / group name. + + The DB Connection. + The job name whose listeners are wanted. + The group containing the job. + The load helper. + The populated JobDetail object. + + + build Map from java.util.Properties encoding. + + + + Select the total number of jobs stored. + + The DB Connection. + The total number of jobs stored. + + + + Select all of the job group names that are stored. + + The DB Connection. + An array of group names. + + + + Select all of the jobs contained in a given group. + + The DB Connection. + The group containing the jobs. + An array of job names. + + + + Insert the base trigger data. + + the DB Connection + the trigger to insert + the state that the trigger should be stored in + The job detail. + the number of rows inserted + + + + Insert the simple trigger data. + + The DB Connection. + The trigger to insert. + The number of rows inserted. + + + + Insert the cron trigger data. + + the DB Connection + the trigger to insert + the number of rows inserted + + + + Insert the blob trigger data. + + The DB Connection. + The trigger to insert. + The number of rows inserted. + + + + Update the base trigger data. + + The DB Connection. + The trigger to insert. + The state that the trigger should be stored in. + The job detail. + The number of rows updated. + + + + Update the simple trigger data. + + The DB Connection. + The trigger to insert. + The number of rows updated. + + + + Update the cron trigger data. + + The DB Connection. + The trigger to insert. + The number of rows updated. + + + + Update the blob trigger data. + + The DB Connection. + The trigger to insert. + The number of rows updated. + + + + Check whether or not a trigger exists. + + The DB Connection. + The name of the trigger. + The group containing the trigger. + true if the trigger exists, false otherwise + + + + Update the state for a given trigger. + + The DB Connection. + The name of the trigger. + The group containing the trigger. + The new state for the trigger. + The number of rows updated. + + + + Update the given trigger to the given new state, if it is one of the + given old states. + + The DB connection. + The name of the trigger. + The group containing the trigger. + The new state for the trigger. + One of the old state the trigger must be in. + One of the old state the trigger must be in. + One of the old state the trigger must be in. + The number of rows updated. + + + + Update the all triggers to the given new state, if they are in one of + the given old states AND its next fire time is before the given time. + + The DB connection + The new state for the trigger + One of the old state the trigger must be in + One of the old state the trigger must be in + The time before which the trigger's next fire time must be + int the number of rows updated + + + + Update all triggers in the given group to the given new state, if they + are in one of the given old states. + + The DB connection. + The group containing the trigger. + The new state for the trigger. + One of the old state the trigger must be in. + One of the old state the trigger must be in. + One of the old state the trigger must be in. + The number of rows updated. + + + + Update the given trigger to the given new state, if it is in the given + old state. + + the DB connection + the name of the trigger + the group containing the trigger + the new state for the trigger + the old state the trigger must be in + int the number of rows updated + + + + Update all of the triggers of the given group to the given new state, if + they are in the given old state. + + the DB connection + the group containing the triggers + the new state for the trigger group + the old state the triggers must be in + int the number of rows updated + + + + Update the states of all triggers associated with the given job. + + the DB Connection + the name of the job + the group containing the job + the new state for the triggers + the number of rows updated + + + + Updates the state of the trigger states for job from other. + + The conn. + Name of the job. + Name of the group. + The state. + The old state. + + + + + Delete all of the listeners associated with a given trigger. + + the DB Connection + the name of the trigger whose listeners will be deleted + the name of the group containing the trigger + the number of rows deleted + + + + Associate a listener with the given trigger. + + the DB Connection + the trigger + the name of the listener to associate with the trigger + the number of rows inserted + + + + Select the listeners associated with a given trigger. + + the DB Connection + the name of the trigger + the group containing the trigger + + array of trigger listener names + + + + + Delete the simple trigger data for a trigger. + + the DB Connection + the name of the trigger + the group containing the trigger + the number of rows deleted + + + + Delete the cron trigger data for a trigger. + + the DB Connection + the name of the trigger + the group containing the trigger + the number of rows deleted + + + + Delete the cron trigger data for a trigger. + + the DB Connection + the name of the trigger + the group containing the trigger + the number of rows deleted + + + + Delete the base trigger data for a trigger. + + the DB Connection + the name of the trigger + the group containing the trigger + the number of rows deleted + + + + Select the number of triggers associated with a given job. + + the DB Connection + the name of the job + the group containing the job + the number of triggers for the given job + + + + Select the job to which the trigger is associated. + + the DB Connection + the name of the trigger + the group containing the trigger + The load helper. + The object associated with the given trigger + + + + Select the triggers for a job + + the DB Connection + the name of the trigger + the group containing the trigger + + an array of objects + associated with a given job. + + + + + Select the triggers for a calendar + + The DB Connection. + Name of the calendar. + + An array of objects associated with a given job. + + + + + Selects the stateful jobs of trigger group. + + The database connection. + Name of the group. + + + + + Select a trigger. + + the DB Connection + the name of the trigger + the group containing the trigger + The object + + + + Select a trigger's JobDataMap. + + the DB Connection + the name of the trigger + the group containing the trigger + The of the Trigger, never null, but possibly empty. + + + + Select a trigger's state value. + + the DB Connection + the name of the trigger + the group containing the trigger + The object + + + + Select a trigger status (state and next fire time). + + the DB Connection + the name of the trigger + the group containing the trigger + + a object, or null + + + + + Select the total number of triggers stored. + + the DB Connection + the total number of triggers stored + + + + Select all of the trigger group names that are stored. + + the DB Connection + + an array of group names + + + + + Select all of the triggers contained in a given group. + + the DB Connection + the group containing the triggers + + an array of trigger names + + + + + Inserts the paused trigger group. + + The conn. + Name of the group. + + + + + Deletes the paused trigger group. + + The conn. + Name of the group. + + + + + Deletes all paused trigger groups. + + The conn. + + + + + Determines whether the specified trigger group is paused. + + The conn. + Name of the group. + + true if trigger group is paused; otherwise, false. + + + + + Determines whether given trigger group already exists. + + The conn. + Name of the group. + + true if trigger group exists; otherwise, false. + + + + + Insert a new calendar. + + the DB Connection + The name for the new calendar. + The calendar. + the number of rows inserted + IOException + + + + Update a calendar. + + the DB Connection + The name for the new calendar. + The calendar. + the number of rows updated + IOException + + + + Check whether or not a calendar exists. + + the DB Connection + The name of the calendar. + + true if the trigger exists, false otherwise + + + + + Select a calendar. + + the DB Connection + The name of the calendar. + the Calendar + ClassNotFoundException + IOException + + + + Check whether or not a calendar is referenced by any triggers. + + the DB Connection + The name of the calendar. + + true if any triggers reference the calendar, false otherwise + + + + + Delete a calendar. + + the DB Connection + The name of the trigger. + the number of rows deleted + + + + Select the total number of calendars stored. + + the DB Connection + the total number of calendars stored + + + + Select all of the stored calendars. + + the DB Connection + + an array of calendar names + + + + + Select the trigger that will be fired at the given fire time. + + the DB Connection + the time that the trigger will be fired + + a representing the + trigger that will be fired at the given fire time, or null if no + trigger will be fired at that time + + + + + Select the next trigger which will fire to fire between the two given timestamps + in ascending order of fire time, and then descending by priority. + + The conn. + highest value of of the triggers (exclusive) + highest value of of the triggers (inclusive) + A (never null, possibly empty) list of the identifiers (Key objects) of the next triggers to be fired. + + + + Gets the select next trigger to acquire SQL clause. + This can be overriden for a more performant, result limiting + SQL. For Example SQL Server, MySQL and SQLite support limiting returned rows. + + + + + + Insert a fired trigger. + + the DB Connection + the trigger + the state that the trigger should be stored in + The job. + the number of rows inserted + + + + Select the states of all fired-trigger records for a given trigger, or + trigger group if trigger name is . + + The DB connection. + Name of the trigger. + Name of the group. + a List of objects. + + + + Select the states of all fired-trigger records for a given job, or job + group if job name is . + + The DB connection. + Name of the job. + Name of the group. + a List of objects. + + + + Select the states of all fired-trigger records for a given scheduler + instance. + + The DB Connection + Name of the instance. + A list of FiredTriggerRecord objects. + + + + Select the distinct instance names of all fired-trigger records. + + The conn. + + + This is useful when trying to identify orphaned fired triggers (a + fired trigger without a scheduler state record.) + + + + + Delete a fired trigger. + + the DB Connection + the fired trigger entry to delete + the number of rows deleted + + + + Selects the job execution count. + + The DB connection. + Name of the job. + The job group. + + + + + Delete all volatile fired triggers. + + The DB Connection + The number of rows deleted + + + + Inserts the state of the scheduler. + + The conn. + The instance id. + The check in time. + The interval. + + + + + Deletes the state of the scheduler. + + The database connection. + The instance id. + + + + + Updates the state of the scheduler. + + The database connection. + The instance id. + The check in time. + + + + + A List of all current s. +

+ If instanceId is not null, then only the record for the identified + instance will be returned. +

+
+ The DB Connection + The instance id. + +
+ + + Replace the table prefix in a query by replacing any occurrences of + "{0}" with the table prefix. + + The unsubstitued query + The query, with proper table prefix substituted + + + + Create a serialized version of an Object. + + the object to serialize + Serialized object as byte array. + + + + Remove the transient data from and then create a serialized + version of a and returns the underlying bytes. + + The data. + the serialized data as byte array + + + + serialize + + The data. + + + + + Convert the JobDataMap into a list of properties. + + + + + Convert the JobDataMap into a list of properties. + + + + + This method should be overridden by any delegate subclasses that need + special handling for BLOBs. The default implementation uses standard + ADO.NET operations. + + The data reader, already queued to the correct row. + The column index for the BLOB. + The deserialized object from the DataReader BLOB. + + + + Get the names of all of the triggers that are volatile. + + The DB Connection + An array of objects. + + + + Get the names of all of the jobs that are volatile. + + The DB Connection + An array of objects. + + + + This method should be overridden by any delegate subclasses that need + special handling for BLOBs for job details. + + The result set, already queued to the correct row. + The column index for the BLOB. + The deserialized Object from the ResultSet BLOB. + + + + Selects the paused trigger groups. + + The DB Connection. + + + + + Gets the triggers to acquire limit. + + The triggers to acquire limit. + + + + Initializes a new instance of the class. + + the logger to use during execution + the prefix of all table names + The instance id. + The db provider. + + + + Initializes a new instance of the class. + + The logger. + The table prefix. + The instance id. + The db provider. + if set to true [use properties]. + + + + Creates the SQL for select next trigger to acquire. + + + + + Gets the select next trigger to acquire SQL clause. + Firebird specific version with FIRST functionality + + + + + + Conveys the state of a fired-trigger record. + + James House + + + + Gets or sets the fire instance id. + + The fire instance id. + + + + Gets or sets the fire timestamp. + + The fire timestamp. + + + + Gets or sets a value indicating whether [job is stateful]. + + true if [job is stateful]; otherwise, false. + + + + Gets or sets the job key. + + The job key. + + + + Gets or sets the scheduler instance id. + + The scheduler instance id. + + + + Gets or sets the trigger key. + + The trigger key. + + + + Gets or sets the state of the fire instance. + + The state of the fire instance. + + + + Gets or sets a value indicating whether [job requests recovery]. + + true if [job requests recovery]; otherwise, false. + + + + Gets or sets a value indicating whether [trigger is volatile]. + + true if [trigger is volatile]; otherwise, false. + + + + Gets or sets the priority. + + The priority. + + + + Exception class for when a driver delegate cannot be found for a given + configuration, or lack thereof. + + Jeffrey Wescott + + + + + Base class for exceptions thrown by the Quartz . + + + SchedulerExceptions may contain a reference to another + , which was the underlying cause of the SchedulerException. + + James House + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The MSG. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + Initializes a new instance of the class. + + The MSG. + The error code. + + + + Initializes a new instance of the class. + + The cause. + + + + Initializes a new instance of the class. + + The MSG. + The cause. + + + + Initializes a new instance of the class. + + The MSG. + The cause. + The error code. + + + + Creates and returns a string representation of the current exception. + + + A string representation of the current exception. + + + + + + Return the exception that is the underlying cause of this exception. + This may be used to find more detail about the cause of the error. + + The underlying exception, or if there is not + one. + + + + + Get the error code associated with this exception. + This may be used to find more detail about the cause of the error. + + + One of the ERR_XXX constants defined in this class. + + + +

+ Determine if the specified error code is in the + category of errors. +

+
+
+ +

+ Determine if the specified error code is in the + category of errors. +

+
+
+ + + Determine if the specified error code is in the + category of errors. + + + + + Determine if the specified error code is in the + category of errors. + + + + + Determine if the specified error code is in the + category of errors. + + + + + Determine if the specified error code is in the + category of errors. + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + is meant to be used in an application-server + or other software framework environment that provides + container-managed-transactions. No commit / rollback will be handled by this class. + + + If you need commit / rollback, use + instead. + + Jeffrey Wescott + James House + Srinivas Venkatarangaiah + + + + Contains base functionality for ADO.NET-based JobStore implementations. + + Jeffrey Wescott + James House + Marko Lahma (.NET) + + + + The interface to be implemented by classes that want to provide a + and storage mechanism for the + 's use. + + + Storage of s and s should be keyed + on the combination of their name and group for uniqueness. + + + + + + + + James House + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + Called by the QuartzScheduler to inform the that + the scheduler has started. + + + + + Called by the QuartzScheduler to inform the that + it should free up all of it's resources because the scheduler is + shutting down. + + + + + Store the given and . + + The scheduling context. + The to be stored. + The to be stored. + ObjectAlreadyExistsException + + + + returns true if the given JobGroup + is paused + + + + + + + + returns true if the given TriggerGroup + is paused + + + + + + + + Store the given . + + The context. + The to be stored. + + If , any existing in the + with the same name and group should be + over-written. + + + + + Remove (delete) the with the given + name, and any s that reference + it. + + + If removal of the results in an empty group, the + group should be removed from the 's list of + known group names. + + The context. + The name of the to be removed. + The group name of the to be removed. + + if a with the given name and + group was found and removed from the store. + + + + + Retrieve the for the given + . + + The context. + The name of the to be retrieved. + The group name of the to be retrieved. + + The desired , or null if there is no match. + + + + + Store the given . + + The context. + The to be stored. + If , any existing in + the with the same name and group should + be over-written. + ObjectAlreadyExistsException + + + + Remove (delete) the with the + given name. + + +

+ If removal of the results in an empty group, the + group should be removed from the 's list of + known group names. +

+

+ If removal of the results in an 'orphaned' + that is not 'durable', then the should be deleted + also. +

+
+ The context. + The name of the to be removed. + The group name of the to be removed. + + if a with the given + name and group was found and removed from the store. + +
+ + + Remove (delete) the with the + given name, and store the new given one - which must be associated + with the same job. + + The context. + The name of the to be removed. + The group name of the to be removed. + The new to be stored. + + if a with the given + name and group was found and removed from the store. + + + + + Retrieve the given . + + The context. + The name of the to be retrieved. + The group name of the to be retrieved. + + The desired , or null if there is no + match. + + + + + Store the given . + + The context. + The name. + The to be stored. + If , any existing + in the with the same name and group + should be over-written. + If , any s existing + in the that reference an existing + Calendar with the same name with have their next fire time + re-computed with the new . + ObjectAlreadyExistsException + + + + Remove (delete) the with the + given name. + + + If removal of the would result in + s pointing to non-existent calendars, then a + will be thrown. + + The context. + The name of the to be removed. + + if a with the given name + was found and removed from the store. + + + + + Retrieve the given . + + The context. + The name of the to be retrieved. + + The desired , or null if there is no + match. + + + + + Get the number of s that are + stored in the . + + The context. + + + + + Get the number of s that are + stored in the . + + The context. + + + + + Get the number of s that are + stored in the . + + The context. + + + + + Get the names of all of the s that + have the given group name. +

+ If there are no jobs in the given group name, the result should be a + zero-length array (not ). +

+
+ The CTX. + Name of the group. + +
+ + + Get the names of all of the s + that have the given group name. +

+ If there are no triggers in the given group name, the result should be a + zero-length array (not ). +

+
+
+ + + Get the names of all of the + groups. +

+ If there are no known group names, the result should be a zero-length + array (not ). +

+
+
+ + + Get the names of all of the + groups. +

+ If there are no known group names, the result should be a zero-length + array (not ). +

+
+
+ + + Get the names of all of the s + in the . + +

+ If there are no Calendars in the given group name, the result should be + a zero-length array (not ). +

+
+
+ + + Get all of the Triggers that are associated to the given Job. + + + If there are no matches, a zero-length array should be returned. + + + + + Get the current state of the identified . + + + + + + + + + + Pause the with the given name. + + + + + Pause all of the s in the + given group. + + + The JobStore should "remember" that the group is paused, and impose the + pause on any new triggers that are added to the group while the group is + paused. + + + + + Pause the with the given name - by + pausing all of its current s. + + + + + Pause all of the s in the given + group - by pausing all of their s. +

+ The JobStore should "remember" that the group is paused, and impose the + pause on any new jobs that are added to the group while the group is + paused. +

+
+ + +
+ + + Resume (un-pause) the with the + given name. + +

+ If the missed one or more fire-times, then the + 's misfire instruction will be applied. +

+
+ + +
+ + + Resume (un-pause) all of the s + in the given group. +

+ If any missed one or more fire-times, then the + 's misfire instruction will be applied. +

+
+
+ + + Gets the paused trigger groups. + + The context. + + + + + Resume (un-pause) the with the + given name. +

+ If any of the 's s missed one + or more fire-times, then the 's misfire + instruction will be applied. +

+
+
+ + + Resume (un-pause) all of the s in + the given group. +

+ If any of the s had s that + missed one or more fire-times, then the 's + misfire instruction will be applied. +

+
+
+ + + Pause all triggers - equivalent of calling + on every group. +

+ When is called (to un-pause), trigger misfire + instructions WILL be applied. +

+
+ +
+ + + Resume (un-pause) all triggers - equivalent of calling + on every group. +

+ If any missed one or more fire-times, then the + 's misfire instruction will be applied. +

+ +
+ +
+ + + Get a handle to the next trigger to be fired, and mark it as 'reserved' + by the calling scheduler. + + The context. + If > 0, the JobStore should only return a Trigger + that will fire no later than the time represented in this value as + milliseconds. + + + + + + + Inform the that the scheduler no longer plans to + fire the given , that it had previously acquired + (reserved). + + + + + Inform the that the scheduler is now firing the + given (executing its associated ), + that it had previously acquired (reserved). + + null if the trigger or it's job or calendar no longer exist, or + if the trigger was not successfully put into the 'executing' + state. + + + + + Inform the that the scheduler has completed the + firing of the given (and the execution its + associated ), and that the + in the given should be updated if the + is stateful. + + + + + Supports the persistence. + + + + + + Initializes a new instance of the class. + + + + + Gets the connection and starts a new transaction. + + + + + + Called by the QuartzScheduler before the is + used, in order to give it a chance to Initialize. + + + + + + + + Called by the QuartzScheduler to inform the that + it should free up all of it's resources because the scheduler is + shutting down. + + + + + Removes all volatile data. + + + + + Removes all volatile data. + + + + + Will recover any failed or misfired jobs and clean up the data store as + appropriate. + + + + + Will recover any failed or misfired jobs and clean up the data store as + appropriate. + + + + + Store the given and . + + SchedulingContext + Job to be stored. + Trigger to be stored. + + + + returns true if the given JobGroup + is paused + + + + + + + + returns true if the given TriggerGroup + is paused + + + + + + + + Stores the given . + + + The to be stored. + + If , any existing in the + with the same name & group should be over-written. + + + +

+ Insert or update a job. +

+
+
+ + + Check existence of a given job. + + + + + Store the given . + + + The to be stored. + + If , any existing in + the with the same name & group should + be over-written. + + + if a with the same name/group already + exists, and replaceExisting is set to false. + + + + + Insert or update a trigger. + + + + + Check existence of a given trigger. + + + + + Remove (delete) the with the given + name, and any s that reference + it. + + + + If removal of the results in an empty group, the + group should be removed from the 's list of + known group names. + + + The name of the to be removed. + The group name of the to be removed. + + if a with the given name & + group was found and removed from the store. + + + + + Delete a job and its listeners. + + + + + + + Delete a trigger, its listeners, and its Simple/Cron/BLOB sub-table entry. + + + + + + + + Retrieve the for the given + . + + The name of the to be retrieved. + The group name of the to be retrieved. + The desired , or null if there is no match. + + + + Remove (delete) the with the + given name. + + + +

+ If removal of the results in an empty group, the + group should be removed from the 's list of + known group names. +

+ +

+ If removal of the results in an 'orphaned' + that is not 'durable', then the should be deleted + also. +

+
+ The name of the to be removed. + The group name of the to be removed. + + if a with the given + name & group was found and removed from the store. + +
+ + + + + + Retrieve the given . + + The name of the to be retrieved. + The group name of the to be retrieved. + The desired , or null if there is no match. + + + + Get the current state of the identified . + + + + + + + + + + Gets the state of the trigger. + + The conn. + The CTXT. + Name of the trigger. + Name of the group. + + + + + Store the given . + + The name of the calendar. + The to be stored. + + If , any existing + in the with the same name & group + should be over-written. + + + if a with the same name already + exists, and replaceExisting is set to false. + + + + + Remove (delete) the with the given name. + + + If removal of the would result in + s pointing to non-existent calendars, then a + will be thrown. + + The name of the to be removed. + + if a with the given name + was found and removed from the store. + + + + + Retrieve the given . + + The name of the to be retrieved. + The desired , or null if there is no match. + + + + Get the number of s that are + stored in the . + + + + + Get the number of s that are + stored in the . + + + + + Get the number of s that are + stored in the . + + + + + Get the names of all of the s that + have the given group name. + + + If there are no jobs in the given group name, the result should be a + zero-length array (not ). + + + + + Get the names of all of the s + that have the given group name. + + + If there are no triggers in the given group name, the result should be a + zero-length array (not ). + + + + + Get the names of all of the + groups. + + + + If there are no known group names, the result should be a zero-length + array (not ). + + + + + Get the names of all of the + groups. + + + + If there are no known group names, the result should be a zero-length + array (not ). + + + + + Get the names of all of the s + in the . + + + If there are no Calendars in the given group name, the result should be + a zero-length array (not ). + + + + + Get all of the Triggers that are associated to the given Job. + + + If there are no matches, a zero-length array should be returned. + + + + + Pause the with the given name. + + + + + + Pause the with the given name. + + + + + + Pause the with the given name - by + pausing all of its current s. + + + + + + Pause all of the s in the given + group - by pausing all of their s. + + + + + + Determines if a Trigger for the given job should be blocked. + State can only transition to StatePausedBlocked/StateBlocked from + StatePaused/StateWaiting respectively. + + StatePausedBlocked, StateBlocked, or the currentState. + + + + Resume (un-pause) the with the + given name. + + + If the missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Resume (un-pause) the with the + given name. + + + If any of the 's s missed one + or more fire-times, then the 's misfire + instruction will be applied. + + + + + + Resume (un-pause) all of the s in + the given group. + + + If any of the s had s that + missed one or more fire-times, then the 's + misfire instruction will be applied. + + + + + + Pause all of the s in the given group. + + + + + + Pause all of the s in the given group. + + + + + + Pause all of the s in the + given group. + + + + + + Resume (un-pause) all of the s + in the given group. +

+ If any missed one or more fire-times, then the + 's misfire instruction will be applied. +

+
+ +
+ + + Pause all triggers - equivalent of calling + on every group. +

+ When is called (to un-pause), trigger misfire + instructions WILL be applied. +

+
+ + +
+ + + Resume (un-pause) all triggers - equivalent of calling + on every group. + + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Resume (un-pause) all triggers - equivalent of calling + on every group. +

+ If any missed one or more fire-times, then the + 's misfire instruction will be applied. +

+
+ +
+ + + Get a handle to the next N triggers to be fired, and mark them as 'reserved' + by the calling scheduler. + + + + + + Inform the that the scheduler no longer plans to + fire the given , that it had previously acquired + (reserved). + + + + + Inform the that the scheduler has completed the + firing of the given (and the execution its + associated ), and that the + in the given should be updated if the + is stateful. + + + + + Get a list of all scheduler instances in the cluster that may have failed. + This includes this scheduler if it is checking in for the first time. + + + + + Create dummy objects for fired triggers + that have no scheduler state record. Checkin timestamp and interval are + left as zero on these dummy objects. + + List of all current s + + + + Cleanup the given database connection. This means restoring + any modified auto commit or transaction isolation connection + attributes, and then closing the underlying connection. + + + + This is separate from closeConnection() because the Spring + integration relies on being able to overload closeConnection() and + expects the same connection back that it originally returned + from the datasource. + + + + + + Closes the supplied connection. + + (Optional) + + + + Rollback the supplied connection. + + (Optional) + + JobPersistenceException thrown if a SQLException occurs when the + connection is rolled back + + + + + Commit the supplied connection. + + The CTH. + if set to true opens a new transaction. + JobPersistenceException thrown if a SQLException occurs when the + + + + Execute the given callback in a transaction. Depending on the JobStore, + the surrounding transaction may be assumed to be already present + (managed). + + + This method just forwards to ExecuteInLock() with a null lockName. + + + + + + Execute the given callback having aquired the given lock. + Depending on the JobStore, the surrounding transaction may be + assumed to be already present (managed). This version is just a + handy wrapper around executeInLock that doesn't require a return + value. + + + The name of the lock to aquire, for example + "TRIGGER_ACCESS". If null, then no lock is aquired, but the + lockCallback is still executed in a transaction. + + + + + + Execute the given callback having aquired the given lock. + Depending on the JobStore, the surrounding transaction may be + assumed to be already present (managed). + + + The name of the lock to aquire, for example + "TRIGGER_ACCESS". If null, then no lock is aquired, but the + lockCallback is still executed in a transaction. + + + + + Execute the given callback having optionally aquired the given lock. + This uses the non-managed transaction connection. This version is just a + handy wrapper around executeInNonManagedTXLock that doesn't require a return + value. + + + The name of the lock to aquire, for example + "TRIGGER_ACCESS". If null, then no lock is aquired, but the + lockCallback is still executed in a non-managed transaction. + + + + + + Execute the given callback having optionally aquired the given lock. + This uses the non-managed transaction connection. + + + The name of the lock to aquire, for example + "TRIGGER_ACCESS". If null, then no lock is aquired, but the + lockCallback is still executed in a non-managed transaction. + + + + + Get or set the datasource name. + + + + + Gets the log. + + The log. + + + + Get or sets the prefix that should be pre-pended to all table names. + + + + + Set whether string-only properties will be handled in JobDataMaps. + + + + + Get or set the instance Id of the Scheduler (must be unique within a cluster). + + + + + Get or set the instance Id of the Scheduler (must be unique within this server instance). + + + + + Get or set whether this instance is part of a cluster. + + + + + Get or set the frequency at which this instance "checks-in" + with the other instances of the cluster. -- Affects the rate of + detecting failed instances. + + + + + Get or set the maximum number of misfired triggers that the misfire handling + thread will try to recover at one time (within one transaction). The + default is 20. + + + + + Gets or sets the database retry interval. + + The db retry interval. + + + + Get or set whether this instance should use database-based thread + synchronization. + + + + + Whether or not to obtain locks when inserting new jobs/triggers. + Defaults to , which is safest - some db's (such as + MS SQLServer) seem to require this to avoid deadlocks under high load, + while others seem to do fine without. + + + Setting this property to will provide a + significant performance increase during the addition of new jobs + and triggers. + + + + + The time span by which a trigger must have missed its + next-fire-time, in order for it to be considered "misfired" and thus + have its misfire instruction applied. + + + + + Don't call set autocommit(false) on connections obtained from the + DataSource. This can be helpfull in a few situations, such as if you + have a driver that complains if it is called when it is already off. + + + + + Set the transaction isolation level of DB connections to sequential. + + + + + Whether or not the query and update to acquire a Trigger for firing + should be performed after obtaining an explicit DB lock (to avoid + possible race conditions on the trigger's db row). This is + is considered unnecessary for most databases (due to the nature of + the SQL update that is performed), and therefore a superfluous performance hit. + + + + + Get or set the ADO.NET driver delegate class name. + + + + + set the SQL statement to use to select and lock a row in the "locks" + table. + + + + + + Get whether the threads spawned by this JobStore should be + marked as daemon. Possible threads include the + and the . + + + + + + Get whether to check to see if there are Triggers that have misfired + before actually acquiring the lock to recover them. This should be + set to false if the majority of the time, there are are misfired + Triggers. + + + + + + Get the driver delegate for DB operations. + + + + + Get whether String-only properties will be handled in JobDataMaps. + + + + + Indicates whether this job store supports persistence. + + + + + + + Implement this interface to provide the code to execute within + the a transaction template that has no return value. + + + + + + Implement this interface to provide the code to execute within + the a transaction template. If no return value is required, execute + should just return null. + + + + + + + + An interface for classes wishing to provide the service of loading classes + and resources within the scheduler... + + James House + + + + Called to give the ClassLoadHelper a chance to Initialize itself, + including the oportunity to "steal" the class loader off of the calling + thread, which is the thread that is initializing Quartz. + + + + + Return the class with the given name. + + + + + Finds a resource with a given name. This method returns null if no + resource with this name is found. + + name of the desired resource + + a java.net.URL object + + + + + Finds a resource with a given name. This method returns null if no + resource with this name is found. + + name of the desired resource + + a java.io.InputStream object + + + + + Helper class for returning the composite result of trying + to recover misfired jobs. + + + + + Initializes a new instance of the class. + + if set to true [has more misfired triggers]. + The processed misfired trigger count. + + + + + Gets a value indicating whether this instance has more misfired triggers. + + + true if this instance has more misfired triggers; otherwise, false. + + + + + Gets the processed misfired trigger count. + + The processed misfired trigger count. + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + + + Called by the QuartzScheduler to inform the that + it should free up all of it's resources because the scheduler is + shutting down. + + + + + Gets the non managed TX connection. + + + + + + Execute the given callback having optionally aquired the given lock. + Because CMT assumes that the connection is already part of a managed + transaction, it does not attempt to commit or rollback the + enclosing transaction. + + + + + + + The name of the lock to aquire, for example + "TRIGGER_ACCESS". If null, then no lock is aquired, but the + txCallback is still executed in a transaction. + + Callback to execute. + + + + Utility class to keep track of both active transaction + and connection. + + + + + Initializes a new instance of the class. + + The connection. + The transaction. + + + + Gets or sets the connection. + + The connection. + + + + Gets or sets the transaction. + + The transaction. + + + + is meant to be used in a standalone environment. + Both commit and rollback will be handled by this class. + + Jeffrey Wescott + James House + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + + + For , the non-managed TX connection is just + the normal connection because it is not CMT. + + + + + + Execute the given callback having optionally aquired the given lock. + For , because it manages its own transactions + and only has the one datasource, this is the same behavior as + . + + + The name of the lock to aquire, for example "TRIGGER_ACCESS". + If null, then no lock is aquired, but the lockCallback is still + executed in a transaction. + + Callback to execute. + + + + + + + + + Exception class for when there is a failure obtaining or releasing a + resource lock. + + + James House + + + + An exception that is thrown to indicate that there has been a failure in the + scheduler's underlying persistence mechanism. + + James House + + + +

+ Create a with the given message. +

+
+
+ + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + +

+ Create a with the given message + and error code. +

+
+
+ +

+ Create a with the given message + and cause. +

+
+
+ +

+ Create a with the given message, + cause and error code. +

+
+
+ + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + This is a driver delegate for the MySQL ADO.NET driver. + + Marko Lahma + + + + Initializes a new instance of the class. + + the logger to use during execution + the prefix of all table names + The instance id. + The db provider. + + + + Initializes a new instance of the class. + + The logger. + The table prefix. + The instance id. + The db provider. + if set to true [use properties]. + + + + Gets the select next trigger to acquire SQL clause. + MySQL version with LIMIT support. + + + + + + Exception class for when a driver delegate cannot be found for a given + configuration, or lack thereof. + + Jeffrey Wescott + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + This is a driver delegate for the Oracle database. + + Marko Lahma + + + + Initializes a new instance of the class. + + the logger to use during execution + the prefix of all table names + The instance id. + The db provider. + + + + Initializes a new instance of the class. + + The logger. + The table prefix. + The instance id. + The db provider. + if set to true [use properties]. + + + + Creates the SQL for select next trigger to acquire. + + + + + Gets the select next trigger to acquire SQL clause. + Oracle version with rownum support. + + + + + + This is a driver delegate for the PostgreSQL ADO.NET driver. + + Marko Lahma + + + + Initializes a new instance of the class. + + The log. + The table prefix. + The instance id. + The db provider. + + + + Initializes a new instance of the class. + + The log. + The table prefix. + The instance id. + The db provider. + if set to true [use properties]. + + + + Gets the select next trigger to acquire SQL clause. + PostgreSQL version with LIMIT support. + + + + + + Conveys a scheduler-instance state record. + + James House + + + + Gets or sets the checkin interval. + + The checkin interval. + + + + Gets or sets the checkin timestamp. + + The checkin timestamp. + + + + Gets or sets the scheduler instance id. + + The scheduler instance id. + + + + Internal in-memory lock handler for providing thread/resource locking in + order to protect resources from being altered by multiple threads at the + same time. + + James House + + + + Grants a lock on the identified resource to the calling thread (blocking + until it is available). + + True if the lock was obtained. + + + Release the lock on the identified resource if it is held by the calling + thread. + + + + + Determine whether the calling thread owns a lock on the identified + resource. + + + + + Gets the thread locks. + + The thread locks. + + + + Whether this Semaphore implementation requires a database connection for + its lock management operations. + + + + + + + + + This is a driver delegate for the SQLiteDelegate ADO.NET driver. + + Marko Lahma + + + + Initializes a new instance of the class. + + the logger to use during execution + the prefix of all table names + The instance id. + The db provider. + + + + Initializes a new instance of the class. + + The logger. + The table prefix. + The instance id. + The db provider. + if set to true [use properties]. + + + + Gets the select next trigger to acquire SQL clause. + SQLite version with LIMIT support. + + + + + + A SQL Server specific driver delegate. + + Marko Lahma + + + + Initializes a new instance of the class. + + the logger to use during execution + the prefix of all table names + The instance id. + The db provider. + + + + Initializes a new instance of the class. + + The logger. + The table prefix. + The instance id. + The db provider. + if set to true [use properties]. + + + + Creates the SQL for select next trigger to acquire. + + + + + Gets the select next trigger to acquire SQL clause. + SQL Server specific version with TOP functionality + + + + + + Internal database based lock handler for providing thread/resource locking + in order to protect resources from being altered by multiple threads at the + same time. + + James House + + + + Initializes a new instance of the class. + + The table prefix. + The select with lock SQL. + + + + Execute the SQL select for update that will lock the proper database row. + + + + Provide thread/resource locking in order to protect + resources from being altered by multiple threads at the same time using + a db row update. + + + Note: This Semaphore implementation is useful for databases that do + not support row locking via "SELECT FOR UPDATE" type syntax, for example + Microsoft SQLServer (MSSQL). + + + + + Initializes a new instance of the class. + + + + + Execute the SQL that will lock the proper database row. + + + + + + + + This implementation of the Calendar excludes a set of days of the year. You + may use it to exclude bank holidays which are on the same date every year. + + + + Juergen Donnerstag + + + + This implementation of the Calendar may be used (you don't have to) as a + base class for more sophisticated one's. It merely implements the base + functionality required by each Calendar. + + + Regarded as base functionality is the treatment of base calendars. Base + calendar allow you to chain (stack) as much calendars as you may need. For + example to exclude weekends you may use WeeklyCalendar. In order to exclude + holidays as well you may define a WeeklyCalendar instance to be the base + calendar for HolidayCalendar instance. + + + Juergen Donnerstag + James House + + + + An interface to be implemented by objects that define spaces of time during + which an associated may fire. + + + Calendars do not define actual fire times, but rather are used to limit a + from firing on its normal schedule if necessary. Most + Calendars include all times by default and allow the user to specify times to + exclude. As such, it is often useful to think of Calendars as being used to + exclude a block of time, as opposed to include + a block of time. (i.e. the schedule "fire every five minutes except on Sundays" could be + implemented with a and a which excludes Sundays) + + James House + Juergen Donnerstag + + + + Determine whether the given UTC time is 'included' by the + Calendar. + + + + + Determine the next UTC time that is 'included' by the + Calendar after the given UTC time. + + + + + Gets or sets a description for the instance - may be + useful for remembering/displaying the purpose of the calendar, though + the description has no meaning to Quartz. + + + + + Set a new base calendar or remove the existing one. + Get the base calendar. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The base calendar. + + + + Initializes a new instance of the class. + + The time zone. + + + + Initializes a new instance of the class. + + The base calendar. + The time zone. + + + + checks whether two arrays have + the same length and + for any given place there are equal elements + in both arrays + + + + + + Get the base calendar. Will be null, if not set. + + + + + Check if date/time represented by timeStamp is included. If included + return true. The implementation of BaseCalendar simply calls the base + calendars IsTimeIncluded() method if base calendar is set. + + + + + + Determine the next UTC time (in milliseconds) that is 'included' by the + Calendar after the given time. Return the original value if timeStamp is + included. Return 0 if all days are excluded. + + + + + + Gets or sets the time zone. + + The time zone. + + + + Gets or sets the description given to the instance by + its creator (if any). + + + + + Set a new base calendar or remove the existing one + + + + + + Constructor + + + + + Constructor + + The base calendar. + + + + Return true, if day is defined to be exluded. + + + + + Redefine a certain day to be excluded (true) or included (false). + + + + + Determine whether the given UTC time (in milliseconds) is 'included' by the + Calendar. +

+ Note that this Calendar is only has full-day precision. +

+
+
+ + + Determine the next UTC time (in milliseconds) that is 'included' by the + Calendar after the given time. Return the original value if timeStampUtc is + included. Return 0 if all days are excluded. +

+ Note that this Calendar is only has full-day precision. +

+
+
+ + + Get or the array which defines the exclude-value of each day of month. + Setting will redefine the array of days excluded. The array must of size greater or + equal 31. + + + + + This implementation of the Calendar excludes the set of times expressed by a + given CronExpression. + + + For example, you could use this calendar to exclude all but business hours (8AM - 5PM) every + day using the expression "* * 0-7,18-23 ? * *". +

+ It is important to remember that the cron expression here describes a set of + times to be excluded from firing. Whereas the cron expression in + CronTrigger describes a set of times that can + be included for firing. Thus, if a has a + given cron expression and is associated with a with + the same expression, the calendar will exclude all the times the + trigger includes, and they will cancel each other out. +

+
+ Aaron Craven +
+ + + Initializes a new instance of the class. + + a String representation of the desired cron expression + + + + Create a with the given cron expression and + . + + + the base calendar for this calendar instance + see BaseCalendar for more information on base + calendar functionality + + a String representation of the desired cron expression + + + + Create a with the given cron expression and + . + + + the base calendar for this calendar instance + see BaseCalendar for more information on base + calendar functionality + + a String representation of the desired cron expression + + + + + Determine whether the given time is 'included' by the + Calendar. + + the time to test + a boolean indicating whether the specified time is 'included' by the CronCalendar + + + + Determine the next time that is 'included' by the + Calendar after the given time. Return the original value if timeStamp is + included. Return 0 if all days are excluded. + + + + + + + Returns a that represents the current . + + + A that represents the current . + + + + + Sets the cron expression for the calendar to a new value. + + The expression. + + + + Returns the object representation of the cron expression that defines the + dates and times this calendar excludes. + + + + + This implementation of the Calendar excludes (or includes - see below) a + specified time range each day. + + + For example, you could use this calendar to + exclude business hours (8AM - 5PM) every day. Each + only allows a single time range to be specified, and that time range may not + * cross daily boundaries (i.e. you cannot specify a time range from 8PM - 5AM). + If the property is (default), + the time range defines a range of times in which triggers are not allowed to + * fire. If is , the time range + is inverted: that is, all times outside the defined time range + are excluded. +

+ Note when using , it behaves on the same principals + as, for example, WeeklyCalendar defines a set of days that are + excluded every week. Likewise, defines a + set of times that are excluded every day. +

+
+ Mike Funk + Aaron Craven +
+ + + Create a with a time range defined by the + specified strings and no baseCalendar. + and + must be in the format "HH:MM[:SS[:mmm]]" where: +
    +
  • + HH is the hour of the specified time. The hour should be + specified using military (24-hour) time and must be in the range + 0 to 23. +
  • +
  • + MM is the minute of the specified time and must be in the range + 0 to 59. +
  • +
  • + SS is the second of the specified time and must be in the range + 0 to 59. +
  • +
  • + mmm is the millisecond of the specified time and must be in the + range 0 to 999. +
  • +
  • items enclosed in brackets ('[', ']') are optional.
  • +
  • + The time range starting time must be before the time range ending + time. Note this means that a time range may not cross daily + boundaries (10PM - 2AM) +
  • +
+
+
+ + + Create a with a time range defined by the + specified strings and the specified baseCalendar. + and + must be in the format "HH:MM[:SS[:mmm]]" where: +
    +
  • + HH is the hour of the specified time. The hour should be + specified using military (24-hour) time and must be in the range + 0 to 23. +
  • +
  • + MM is the minute of the specified time and must be in the range + 0 to 59. +
  • +
  • + SS is the second of the specified time and must be in the range + 0 to 59. +
  • +
  • + mmm is the millisecond of the specified time and must be in the + range 0 to 999. +
  • +
  • + items enclosed in brackets ('[', ']') are optional. +
  • +
  • + The time range starting time must be before the time range ending + time. Note this means that a time range may not cross daily + boundaries (10PM - 2AM) +
  • +
+
+ The base calendar for this calendar instance see BaseCalendar for more + information on base calendar functionality. +
+ + + Create a with a time range defined by the + specified values and no baseCalendar. Values are subject to + the following validations: +
    +
  • + Hours must be in the range 0-23 and are expressed using military + (24-hour) time. +
  • +
  • Minutes must be in the range 0-59
  • +
  • Seconds must be in the range 0-59
  • +
  • Milliseconds must be in the range 0-999
  • +
  • + The time range starting time must be before the time range ending + time. Note this means that a time range may not cross daily + boundaries (10PM - 2AM) +
  • +
+
+ The range starting hour of day. + The range starting minute. + The range starting second. + The range starting millis. + The range ending hour of day. + The range ending minute. + The range ending second. + The range ending millis. +
+ + + Create a with a time range defined by the + specified values and the specified . Values are + subject to the following validations: +
    +
  • + Hours must be in the range 0-23 and are expressed using military + (24-hour) time. +
  • +
  • Minutes must be in the range 0-59
  • +
  • Seconds must be in the range 0-59
  • +
  • Milliseconds must be in the range 0-999
  • +
  • + The time range starting time must be before the time range ending + time. Note this means that a time range may not cross daily + boundaries (10PM - 2AM) +
  • +
+
+ The range starting hour of day. + The range starting minute. + The range starting second. + The range starting millis. + The range ending hour of day. + The range ending minute. + The range ending second. + The range ending millis. +
+ + + Create a with a time range defined by the + specified s and no + baseCalendar. The Calendars are subject to the following + considerations: +
    +
  • + Only the time-of-day fields of the specified Calendars will be + used (the date fields will be ignored) +
  • +
  • + The starting time must be before the ending time of the defined + time range. Note this means that a time range may not cross + daily boundaries (10PM - 2AM). (because only time fields are + are used, it is possible for two Calendars to represent a valid + time range and + rangeStartingCalendar.after(rangeEndingCalendar) == true) + +
  • +
+
+ The range starting calendar. + The range ending calendar. +
+ + + Create a with a time range defined by the + specified s and the specified + . The Calendars are subject to the following + considerations: +
    +
  • + Only the time-of-day fields of the specified Calendars will be + used (the date fields will be ignored) +
  • +
  • + The starting time must be before the ending time of the defined + time range. Note this means that a time range may not cross + daily boundaries (10PM - 2AM). (because only time fields are + are used, it is possible for two Calendars to represent a valid + time range and + rangeStartingCalendarUtc > rangeEndingCalendarUtc == true) +
  • +
+
+ The range starting calendar. + The range ending calendar. +
+ + + Create a with a time range defined by the + specified values and no baseCalendar. The values are + subject to the following considerations: +
    +
  • + Only the time-of-day portion of the specified values will be + used +
  • +
  • + The starting time must be before the ending time of the defined + time range. Note this means that a time range may not cross + daily boundaries (10PM - 2AM). (because only time value are + are used, it is possible for the two values to represent a valid + time range and rangeStartingTime > rangeEndingTime) +
  • +
+
+ The range starting time in millis. + The range ending time in millis. +
+ + + Create a with a time range defined by the + specified values and the specified . The values + are subject to the following considerations: +
    +
  • + Only the time-of-day portion of the specified values will be + used +
  • +
  • + The starting time must be before the ending time of the defined + time range. Note this means that a time range may not cross + daily boundaries (10PM - 2AM). (because only time value are + are used, it is possible for the two values to represent a valid + time range and rangeStartingTime > rangeEndingTime) +
  • +
+
+ The range starting time in millis. + The range ending time in millis. +
+ + + Determine whether the given time is 'included' by the + Calendar. + + + + + + + Determine the next time (in milliseconds) that is 'included' by the + Calendar after the given time. Return the original value if timeStamp is + included. Return 0 if all days are excluded. + + + + + + + + Returns the start time of the time range of the day + specified in . + + + a DateTime representing the start time of the + time range for the specified date. + + + + + Returns the end time of the time range of the day + specified in + + + A DateTime representing the end time of the + time range for the specified date. + + + + + Returns a that represents the current . + + + A that represents the current . + + + + + Sets the time range for the to the times + represented in the specified Strings. + + The range starting time string. + The range ending time string. + + + + Sets the time range for the to the times + represented in the specified values. + + The range starting hour of day. + The range starting minute. + The range starting second. + The range starting millis. + The range ending hour of day. + The range ending minute. + The range ending second. + The range ending millis. + + + + Sets the time range for the to the times + represented in the specified s. + + The range starting calendar. + The range ending calendar. + + + + Sets the time range for the to the times + represented in the specified values. + + The range starting time. + The range ending time. + + + + Gets the start of day, practically zeroes time part. + + The time. + + + + + Gets the end of day, pratically sets time parts to maximum allowed values. + + The time. + + + + + Checks the specified values for validity as a set of time values. + + The hour of day. + The minute. + The second. + The millis. + + + + Indicates whether the time range represents an inverted time range (see + class description). + + true if invert time range; otherwise, false. + + + + This implementation of the Calendar stores a list of holidays (full days + that are excluded from scheduling). + + + The implementation DOES take the year into consideration, so if you want to + exclude July 4th for the next 10 years, you need to add 10 entries to the + exclude list. + + Sharada Jambula + Juergen Donnerstag + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The base calendar. + + + + Determine whether the given time (in milliseconds) is 'included' by the + Calendar. +

+ Note that this Calendar is only has full-day precision. +

+
+
+ + + Determine the next time (in milliseconds) that is 'included' by the + Calendar after the given time. +

+ Note that this Calendar is only has full-day precision. +

+
+
+ + + Add the given Date to the list of excluded days. Only the month, day and + year of the returned dates are significant. + + + + + Removes the excluded date. + + The date to remove. + + + + Returns a of Dates representing the excluded + days. Only the month, day and year of the returned dates are + significant. + + + + + This implementation of the Calendar excludes a set of days of the month. You + may use it to exclude every 1. of each month for example. But you may define + any day of a month. + + + + Juergen Donnerstag + + + + Initializes a new instance of the class. + + + + + Constructor + + The base calendar. + + + + Initialize internal variables + + + + + Return true, if mday is defined to be exluded. + + + + + Redefine a certain day of the month to be excluded (true) or included + (false). + + + + + Check if all days are excluded. That is no day is included. + + boolean + + + + + Determine whether the given time (in milliseconds) is 'included' by the + Calendar. +

+ Note that this Calendar is only has full-day precision. +

+
+
+ + + Determine the next time (in milliseconds) that is 'included' by the + Calendar after the given time. Return the original value if timeStamp is + included. Return DateTime.MinValue if all days are excluded. +

+ Note that this Calendar is only has full-day precision. +

+
+
+ + + Get or set the array which defines the exclude-value of each day of month + Setting will redefine the array of days excluded. The array must of size greater or + equal 31. + + + + + This implementation of the Calendar excludes a set of days of the week. You + may use it to exclude weekends for example. But you may define any day of + the week. + + + + Juergen Donnerstag + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The base calendar. + + + + Initialize internal variables + + + + + Return true, if wday is defined to be exluded. E. g. + saturday and sunday. + + + + + Redefine a certain day of the week to be excluded (true) or included + (false). Use java.util.Calendar's constants like MONDAY to determine the + wday. + + + + + Check if all week ays are excluded. That is no day is included. + + + + + Determine whether the given time (in milliseconds) is 'included' by the + Calendar. +

+ Note that this Calendar is only has full-day precision. +

+
+
+ + + Determine the next time (in milliseconds) that is 'included' by the + Calendar after the given time. Return the original value if timeStamp is + included. Return DateTime.MinValue if all days are excluded. +

+ Note that this Calendar is only has full-day precision. +

+
+
+ + + Get the array with the week days. + Setting will redefine the array of days excluded. The array must of size greater or + equal 8. java.util.Calendar's constants like MONDAY should be used as + index. A value of true is regarded as: exclude it. + + + + + A singleton implementation of . + + + Here are some examples of using this class: +

+ To create a scheduler that does not write anything to the database (is not + persistent), you can call : +

+
+            DirectSchedulerFactory.Instance.CreateVolatileScheduler(10); // 10 threads 
+            // don't forget to start the scheduler: 
+            DirectSchedulerFactory.Instance.GetScheduler().Start();
+            
+

+ Several create methods are provided for convenience. All create methods + eventually end up calling the create method with all the parameters: +

+
+            public void createScheduler(String schedulerName, string schedulerInstanceId, ThreadPool threadPool, JobStore jobStore, string rmiRegistryHost, int rmiRegistryPort)
+            
+

+ Here is an example of using this method: +

+
+            // create the thread pool 
+            SimpleThreadPool threadPool = new SimpleThreadPool(maxThreads, Thread.NORM_PRIORITY); 
+            threadPool.Initialize(); 
+            // create the job store 
+            JobStore jobStore = new RAMJobStore(); 
+            jobStore.Initialize();
+            
+            DirectSchedulerFactory.Instance.CreateScheduler("My Quartz Scheduler", "My Instance", threadPool, jobStore, "localhost", 1099); 
+            // don't forget to start the scheduler: 
+            DirectSchedulerFactory.Instance.GetScheduler("My Quartz Scheduler", "My Instance").start();
+            
+
> + Mohammad Rezaei + James House + + +
+ + + Provides a mechanism for obtaining client-usable handles to + instances. + + + + James House + + + + Returns a client-usable handle to a . + + + + + Returns a handle to the Scheduler with the given name, if it exists. + + + + + Returns handles to all known Schedulers (made by any SchedulerFactory + within this app domain.). + + + + + Initializes a new instance of the class. + + + + + Creates an in memory job store () + The thread priority is set to Thread.NORM_PRIORITY + + The number of threads in the thread pool + + + + Creates a proxy to a remote scheduler. This scheduler can be retrieved + via . + + SchedulerException + + + + Same as , + with the addition of specifying the scheduler name and instance ID. This + scheduler can only be retrieved via . + + The name for the scheduler. + The instance ID for the scheduler. + + SchedulerException + + + + Creates a scheduler using the specified thread pool and job store. This + scheduler can be retrieved via DirectSchedulerFactory#GetScheduler() + + + The thread pool for executing jobs + + + The type of job store + + SchedulerException + if initialization failed + + + + + Same as DirectSchedulerFactory#createScheduler(ThreadPool threadPool, JobStore jobStore), + with the addition of specifying the scheduler name and instance ID. This + scheduler can only be retrieved via DirectSchedulerFactory#getScheduler(String) + + The name for the scheduler. + The instance ID for the scheduler. + The thread pool for executing jobs + The type of job store + + + + Creates a scheduler using the specified thread pool and job store and + binds it to RMI. + + The name for the scheduler. + The instance ID for the scheduler. + The thread pool for executing jobs + The type of job store + The idle wait time. You can specify "-1" for + the default value, which is currently 30000 ms. + The db failure retry interval. + + + + Creates a scheduler using the specified thread pool and job store and + binds it to RMI. + + The name for the scheduler. + The instance ID for the scheduler. + The thread pool for executing jobs + The type of job store + + The idle wait time. You can specify TimeSpan.Zero for + the default value, which is currently 30000 ms. + The db failure retry interval. + + + + Returns a handle to the Scheduler produced by this factory. +

+ you must call createRemoteScheduler or createScheduler methods before + calling getScheduler() +

+
+ + SchedulerException +
+ + + Returns a handle to the Scheduler with the given name, if it exists. + + + + + Gets the log. + + The log. + + + + Gets the instance. + + The instance. + + +

+ Returns a handle to all known Schedulers (made by any + StdSchedulerFactory instance.). +

+
+
+ + + An implementation of the interface that remotely + proxies all method calls to the equivalent call on a given + instance, via remoting or similar technology. + + + + + James House + + + + This is the main interface of a Quartz Scheduler. + + + + A maintains a registry of + s and s. Once + registered, the is responsible for executing + s when their associated s + fire (when their scheduled time arrives). + + + instances are produced by a + . A scheduler that has already been + created/initialized can be found and used through the same factory that + produced it. After a has been created, it is in + "stand-by" mode, and must have its method + called before it will fire any s. + + + s are to be created by the 'client program', by + defining a class that implements the interface. + objects are then created (also by the client) to + define a individual instances of the . + instances can then be registered with the + via the %IScheduler.ScheduleJob(JobDetail, + Trigger)% or %IScheduler.AddJob(JobDetail, bool)% method. + + + s can then be defined to fire individual + instances based on given schedules. + s are most useful for one-time firings, or + firing at an exact moment in time, with N repeats with a given delay between + them. s allow scheduling based on time of day, + day of week, day of month, and month of year. + + + s and s have a name and + group associated with them, which should uniquely identify them within a single + . The 'group' feature may be useful for creating + logical groupings or categorizations of s and + s. If you don't have need for assigning a group to a + given s of s, then you can use + the constant defined on + this interface. + + + Stored s can also be 'manually' triggered through the + use of the %IScheduler.TriggerJob(string, string)% function. + + + Client programs may also be interested in the 'listener' interfaces that are + available from Quartz. The interface provides + notifications of executions. The + interface provides notifications of + firings. The + interface provides notifications of events and + errors. + + + The setup/configuration of a instance is very + customizable. Please consult the documentation distributed with Quartz. + + + + + + + + + + + + returns true if the given JobGroup + is paused + + + + + + + returns true if the given TriggerGroup + is paused + + + + + + + Get a object describiing the settings + and capabilities of the scheduler instance. + + + Note that the data returned is an 'instantaneous' snap-shot, and that as + soon as it's returned, the meta data values may be different. + + + + + Return a list of objects that + represent all currently executing Jobs in this Scheduler instance. + + +

+ This method is not cluster aware. That is, it will only return Jobs + currently executing in this Scheduler instance, not across the entire + cluster. +

+

+ Note that the list returned is an 'instantaneous' snap-shot, and that as + soon as it's returned, the true list of executing jobs may be different. + Also please read the doc associated with - + especially if you're using remoting. +

+
+ +
+ + + Get the names of all groups that are paused. + + + + + Get the global that has + the given name. + + Global job listener's name + + + + + Get the global that + has the given name. + + Global trigger listener's name + + + + + Starts the 's threads that fire s. + When a scheduler is first created it is in "stand-by" mode, and will not + fire triggers. The scheduler can also be put into stand-by mode by + calling the method. + + + The misfire/recovery process will be started, if it is the initial call + to this method on this scheduler instance. + + + + + + + + Calls after the indicated delay. + (This call does not block). This can be useful within applications that + have initializers that create the scheduler immediately, before the + resources needed by the executing jobs have been fully initialized. + + + + + + + + Temporarily halts the 's firing of s. + + +

+ When is called (to bring the scheduler out of + stand-by mode), trigger misfire instructions will NOT be applied + during the execution of the method - any misfires + will be detected immediately afterward (by the 's + normal process). +

+

+ The scheduler is not destroyed, and can be re-started at any time. +

+
+ + +
+ + + Halts the 's firing of s, + and cleans up all resources associated with the Scheduler. Equivalent to + . + + + The scheduler cannot be re-started. + + + + + + Halts the 's firing of s, + and cleans up all resources associated with the Scheduler. + + + The scheduler cannot be re-started. + + + if the scheduler will not allow this method + to return until all currently executing jobs have completed. + + + + + + Add the given to the + Scheduler, and associate the given with + it. + + + If the given Trigger does not reference any , then it + will be set to reference the Job passed with it into this method. + + + + + Schedule the given with the + identified by the 's settings. + + + + + Remove the indicated from the scheduler. + + + + + Remove (delete) the with the + given name, and store the new given one - which must be associated + with the same job (the new trigger must have the job name & group specified) + - however, the new trigger need not have the same name as the old trigger. + + + The name of the to be replaced. + + + The group name of the to be replaced. + + + The new to be stored. + + + if a with the given + name and group was not found and removed from the store, otherwise + the first fire time of the newly scheduled trigger. + + + + + Add the given to the Scheduler - with no associated + . The will be 'dormant' until + it is scheduled with a , or + is called for it. + + + The must by definition be 'durable', if it is not, + SchedulerException will be thrown. + + + + + Delete the identified from the Scheduler - and any + associated s. + + true if the Job was found and deleted. + + + + Trigger the identified + (Execute it now) - the generated trigger will be non-volatile. + + + + + Trigger the identified + (Execute it now) - the generated trigger will be volatile. + + + + + Trigger the identified + (Execute it now) - the generated trigger will be non-volatile. + + the name of the Job to trigger + the group name of the Job to trigger + + the (possibly ) JobDataMap to be + associated with the trigger that fires the job immediately. + + + + + Trigger the identified + (Execute it now) - the generated trigger will be volatile. + + the name of the Job to trigger + the group name of the Job to trigger + + the (possibly ) JobDataMap to be + associated with the trigger that fires the job immediately. + + + + + Pause the with the given + name - by pausing all of its current s. + + + + + Pause all of the s in the + given group - by pausing all of their s. + + + The Scheduler will "remember" that the group is paused, and impose the + pause on any new jobs that are added to the group while the group is + paused. + + + + + + Pause the with the given name. + + + + + Pause all of the s in the given group. + + + The Scheduler will "remember" that the group is paused, and impose the + pause on any new triggers that are added to the group while the group is + paused. + + + + + + Resume (un-pause) the with + the given name. + + + If any of the 's s missed one + or more fire-times, then the 's misfire + instruction will be applied. + + + + + Resume (un-pause) all of the s + in the given group. + + + If any of the s had s that + missed one or more fire-times, then the 's + misfire instruction will be applied. + + + + + + Resume (un-pause) the with the given + name. + + + If the missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + Resume (un-pause) all of the s in the + given group. + + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Pause all triggers - similar to calling + on every group, however, after using this method + must be called to clear the scheduler's state of 'remembering' that all + new triggers will be paused as they are added. + + + When is called (to un-pause), trigger misfire + instructions WILL be applied. + + + + + + + + Resume (un-pause) all triggers - similar to calling + on every group. + + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Get the names of all the s in the given group. + + + + + Get all s that are associated with the + identified . + + + + + Get the names of all the s in the given + group. + + + + + Get the for the + instance with the given name and group. + + + + + Get the instance with the given name and + group. + + + + + Get the current state of the identified . + + + + + + + + + + + Add (register) the given to the Scheduler. + + Name of the calendar. + The calendar. + if set to true [replace]. + whether or not to update existing triggers that + referenced the already existing calendar so that they are 'correct' + based on the new trigger. + + + + Delete the identified from the Scheduler. + + Name of the calendar. + + true if the Calendar was found and deleted. + + + + + Get the instance with the given name. + + + + + Get the names of all registered . + + An array of calendar names. + + + + Request the interruption, within this Scheduler instance, of all + currently executing instances of the identified , which + must be an implementor of the interface. + + +

+ If more than one instance of the identified job is currently executing, + the method will be called on + each instance. However, there is a limitation that in the case that + on one instances throws an exception, all + remaining instances (that have not yet been interrupted) will not have + their method called. +

+ +

+ If you wish to interrupt a specific instance of a job (when more than + one is executing) you can do so by calling + to obtain a handle + to the job instance, and then invoke on it + yourself. +

+

+ This method is not cluster aware. That is, it will only interrupt + instances of the identified InterruptableJob currently executing in this + Scheduler instance, not across the entire cluster. +

+
+ + + + true is at least one instance of the identified job was found and interrupted. + + + +
+ + + Add the given to the 's + global list. + + + Listeners in the 'global' list receive notification of execution events + for ALL s. + + + + + Add the given to the 's + list, of registered s. + + + + + Remove the given from the 's + list of global listeners. + + + true if the identifed listener was found in the list, and removed. + + + + + Remove the identifed from the 's + list of global listeners. + + Global job listener's name + true if the identifed listener was found in the list, and removed + + + + Remove the identifed from the 's + list of registered listeners. + + + true if the identifed listener was found in the list, and removed. + + + + + Get the non-global that has + the given name. + + + + + Add the given to the 's + global list. + + + Listeners in the 'global' list receive notification of execution events + for ALL s. + + + + + Add the given to the 's + list, of registered s. + + + + + Remove the given from the 's + list of global listeners. + + + true if the identifed listener was found in the list, and removed. + + + + + Remove the identifed from the 's + list of global listeners. + + The name. + true if the identifed listener was found in the list, and removed. + + + + Remove the identifed from the + 's list of registered listeners. + + + true if the identifed listener was found in the list, and removed. + + + + + Get the non-global that + has the given name. + + + + + Register the given with the + + + + + Remove the given from the + . + + true if the identifed listener was found in the list, and + removed. + + + + + Returns the name of the . + + + + + Returns the instance Id of the . + + + + + Returns the of the . + + + + + Reports whether the is in stand-by mode. + + + + + + + Reports whether the has been Shutdown. + + + + + Set the that will be responsible for producing + instances of classes. + + + JobFactories may be of use to those wishing to have their application + produce instances via some special mechanism, such as to + give the opertunity for dependency injection. + + + + + + Get the names of all known groups. + + + + + Get the names of all known groups. + + + + + Get the names of all registered s. + + + + + Get a List containing all of the s in + the 'sglobal list. + + + + + Get a Set containing the names of all the non-global + s registered with the . + + + + + Get a List containing all of the + s in the 'sglobal list. + + + + + Get a Set containing the names of all the non-global + s registered with the . + + + + + Get a List containing all of the + s registered with the . + + + + + Whether the scheduler has been started. + + + Note: This only reflects whether has ever + been called on this Scheduler, so it will return even + if the is currently in standby mode or has been + since shutdown. + + + + + + + + Construct a instance to proxy the given + RemoteableQuartzScheduler instance, and with the given + . + + + + + returns true if the given JobGroup + is paused + + + + + + + returns true if the given TriggerGroup + is paused + + + + + + + Get a object describiing the settings + and capabilities of the scheduler instance. +

+ Note that the data returned is an 'instantaneous' snap-shot, and that as + soon as it's returned, the meta data values may be different. +

+
+ +
+ + + Calls the equivalent method on the 'proxied' . + + + + + Get the global that has + the given name. + + + + + + + Get the global that + has the given name. + + + + + + + Get the names of all groups that are paused. + + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Get the names of all registered . + + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Remove the identifed from the 's + list of global listeners. + + + + true if the identifed listener was found in the list, and removed + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Remove the identifed from the 's + list of global listeners. + + The name. + + true if the identifed listener was found in the list, and removed. + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Returns the name of the . + + + + + Returns the instance Id of the . + + + + + Gets or sets the remote scheduler address. + + The remote scheduler address. + + + + Returns the of the . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Gets a value indicating whether this instance is paused. + + true if this instance is paused; otherwise, false. + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equialent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Set the that will be responsible for producing + instances of classes. +

+ JobFactories may be of use to those wishing to have their application + produce instances via some special mechanism, such as to + give the opertunity for dependency injection. +

+
+ + + SchedulerException +
+ + + Whether the scheduler has been started. + + + + Note: This only reflects whether has ever + been called on this Scheduler, so it will return even + if the is currently in standby mode or has been + since shutdown. + + + + + + + + Holds references to Scheduler instances - ensuring uniqueness, and + preventing garbage collection, and allowing 'global' lookups. + + James House + Marko Lahma (.NET) + + + + Binds the specified sched. + + The sched. + + + + Removes the specified sched name. + + Name of the sched. + + + + + Lookups the specified sched name. + + Name of the sched. + + + + + Lookups all. + + + + + + Gets the singleton instance. + + The instance. + + + + Responsible for creating the instances of + to be used within the instance. +

+ This implementation does not re-use any objects, it simply makes a new + JobRunShell each time is called. +

+
+ James House +
+ + + Initialize the factory, providing a handle to the + that should be made available within the and + the s within it, and a handle to the + that the shell will use in its own + operations with the . + + + + + Called by the to obtain instances of + . + + + + + Called by the to return instances of + . + + + + + An implementation of the interface that directly + proxies all method calls to the equivalent call on a given + instance. + + + + + James House + + + + returns true if the given JobGroup + is paused + + + + + + + returns true if the given TriggerGroup + is paused + + + + + + + Get a object describiing the settings + and capabilities of the scheduler instance. +

+ Note that the data returned is an 'instantaneous' snap-shot, and that as + soon as it's returned, the meta data values may be different. +

+
+ +
+ + + Calls the equivalent method on the 'proxied' . + + + + + + + + + Get the global that has + the given name. + + + + + + + Get the global that + has the given name. + + + + + + + Construct a instance to proxy the given + instance, and with the given . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Get the names of all registered . + + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Remove the identifed from the 's + list of global listeners. + + + + true if the identifed listener was found in the list, and removed + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Remove the identifed from the 's + list of global listeners. + + The name. + + true if the identifed listener was found in the list, and removed. + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Request the interruption, within this Scheduler instance, of all + currently executing instances of the identified , which + must be an implementor of the interface. + + +

+ If more than one instance of the identified job is currently executing, + the method will be called on + each instance. However, there is a limitation that in the case that + on one instances throws an exception, all + remaining instances (that have not yet been interrupted) will not have + their method called. +

+

+ If you wish to interrupt a specific instance of a job (when more than + one is executing) you can do so by calling + to obtain a handle + to the job instance, and then invoke on it + yourself. +

+

+ This method is not cluster aware. That is, it will only interrupt + instances of the identified InterruptableJob currently executing in this + Scheduler instance, not across the entire cluster. +

+
+ + + true is at least one instance of the identified job was found and interrupted. + UnableToInterruptJobException if the job does not implement + + +
+ + + Returns the name of the . + + + + + Returns the instance Id of the . + + + + + Returns the of the . + + + + + Whether the scheduler has been started. + + + + Note: This only reflects whether has ever + been called on this Scheduler, so it will return even + if the is currently in standby mode or has been + since shutdown. + + + + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + + + + + An implementation of that + does all of it's work of creating a instance + based on the contenents of a properties file. + + +

+ By default a properties are loaded from App.config's quartz section. + If that fails, then the "quartz.properties" + file located (as a embedded resource) in Quartz.dll is loaded. If you + wish to use a file other than these defaults, you must define the system + property 'quartz.properties' to point to the file you want. +

+ +

+ See the sample properties that are distributed with Quartz for + information about the various settings available within the file. +

+ +

+ Alternativly, you can explicitly Initialize the factory by calling one of + the methods before calling . +

+ +

+ Instances of the specified , + , classes will be created + by name, and then any additional properties specified for them in the config + file will be set on the instance by calling an equivalent 'set' method. For + example if the properties file contains the property 'quartz.jobStore. + myProp = 10' then after the JobStore class has been instantiated, the property + 'MyProp' will be set with the value. Type conversion to primitive CLR types + (int, long, float, double, boolean, enum and string) are performed before calling + the property's setter method. +

+
+ James House + Anthony Eden + Mohammad Rezaei + Marko Lahma (.NET) +
+ + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The props. + + + + Initialize the with + the contenents of a Properties file. + +

+ By default a properties file named "quartz.properties" is loaded from + the 'current working directory'. If that fails, then the + "quartz.properties" file located (as a resource) in the org/quartz + package is loaded. If you wish to use a file other than these defaults, + you must define the system property 'quartz.properties' to point to + the file you want. +

+
+
+ + + Creates a new name value collection and overrides its values + with system values (environment variables). + + The base properties to override. + A new NameValueCollection instance. + + + + Initialize the with + the contenents of the given Properties object. + + + + + + + + Returns a handle to the Scheduler produced by this factory. + + + + If one of the methods has not be previously + called, then the default (no-arg) method + will be called by this method. + + + +

+ Returns a handle to the Scheduler with the given name, if it exists (if + it has already been instantiated). +

+
+
+ + + Returns a handle to the default Scheduler, creating it if it does not + yet exist. + + + + + +

+ Returns a handle to all known Schedulers (made by any + StdSchedulerFactory instance.). +

+
+
+ + + Inspects a file and compares whether it's "last modified date" has changed + since the last time it was inspected. If the file has been updated, the + job invokes a "call-back" method on an identified + that can be found in the + . + + James House + + + + + A marker interface for s that + wish to have their state maintained between executions. + + + instances follow slightly different rules from + regular instances. The key difference is that their + associated is re-persisted after every + execution of the job, thus preserving state for the next execution. The + other difference is that stateful jobs are not allowed to Execute + concurrently, which means new triggers that occur before the completion of + the method will be delayed. + + + + + + James House + Marko Lahma (.NET) + + + + The interface to be implemented by classes which represent a 'job' to be + performed. + + + Instances of this interface must have a + no-argument constructor. provides a mechanism for 'instance member data' + that may be required by some implementations of this interface. + + + + + + James House + Marko Lahma (.NET) + + + + Called by the when a + fires that is associated with the . + + + The implementation may wish to set a result object on the + JobExecutionContext before this method exits. The result itself + is meaningless to Quartz, but may be informative to + s or + s that are watching the job's + execution. + + The execution context. + + + + Initializes a new instance of the class. + + + + + Called by the when a + fires that is associated with the . +

+ The implementation may wish to set a result object on the + JobExecutionContext before this method exits. The result itself + is meaningless to Quartz, but may be informative to + s or + s that are watching the job's + execution. +

+
+ The execution context. + + +
+ + + Gets the last modified date. + + Name of the file. + + + + + Gets the log. + + The log. + + + + Interface for objects wishing to receive a 'call-back' from a + . + + James House + + + + + Ãnforms that certain file has been updated. + + Name of the file. + + + + Built in job for executing native executables in a separate process. + + Matthew Payne + James House + Steinar Overbeck Cook + + + + Required parameter that specifies the name of the command (executable) + to be ran. + + + + + Optional parameter that specifies the parameters to be passed to the + executed command. + + + + + Optional parameter (value should be 'true' or 'false') that specifies + whether the job should wait for the execution of the native process to + complete before it completes. + +

Defaults to .

+
+
+ + + Optional parameter (value should be 'true' or 'false') that specifies + whether the spawned process's stdout and stderr streams should be + consumed. If the process creates output, it is possible that it might + 'hang' if the streams are not consumed. + +

Defaults to .

+
+
+ + + Optional parameter that specifies the workling directory to be used by + the executed command. + + + + + Initializes a new instance of the class. + + + + + Called by the when a + fires that is associated with the . +

+ The implementation may wish to set a result object on the + JobExecutionContext before this method exits. The result itself + is meaningless to Quartz, but may be informative to + s or + s that are watching the job's + execution. +

+
+ +
+ + + Gets the log. + + The log. + + + + Consumes data from the given input stream until EOF and prints the data to stdout + + cooste + James House + + + + Initializes a new instance of the class. + + The enclosing instance. + The input stream. + The type. + + + + Runs this object as a separate thread, printing the contents of the input stream + supplied during instantiation, to either Console. or stderr + + + + + An implementation of Job, that does absolutely nothing - useful for system + which only wish to use s + and s, rather than writing + Jobs that perform work. + + James House + + + + Do nothing. + + + + + A Job which sends an e-mail with the configured content to the configured + recipient. + + James House + Marko Lahma (.NET) + + + The host name of the smtp server. REQUIRED. + + + The e-mail address to send the mail to. REQUIRED. + + + The e-mail address to cc the mail to. Optional. + + + The e-mail address to claim the mail is from. REQUIRED. + + + The e-mail address the message should say to reply to. Optional. + + + The subject to place on the e-mail. REQUIRED. + + + The e-mail message body. REQUIRED. + + + + Executes the job. + + The job execution context. + + + + Holds a List of references to SchedulerListener instances and broadcasts all + events to them (in order). + + + This may be more convenient than registering all of the listeners + directly with the Scheduler, and provides the flexibility of easily changing + which listeners get notified. + + + + James House + + + + Construct an instance with the given List of listeners. + + The initial List of SchedulerListeners to broadcast to. + + + + Holds a List of references to JobListener instances and broadcasts all + events to them (in order) - if the event is not excluded via filtering + (read on). + + +

+ The broadcasting behavior of this listener to delegate listeners may be + more convenient than registering all of the listeners directly with the + Trigger, and provides the flexibility of easily changing which listeners + get notified. +

+ +

+ You may also register a number of Regular Expression patterns to match + the events against. If one or more patterns are registered, the broadcast + will only take place if the event applies to a job who's name/group + matches one or more of the patterns. +

+
+ + + + + + James House +
+ + Construct an instance with the given name. + + (Remember to add some delegate listeners!) + + @param name the name of this instance + + + Construct an instance with the given name, and List of listeners. + + @param name the name of this instance + @param listeners the initial List of JobListeners to broadcast to. + + + + If one or more name patterns are specified, only events relating to + jobs who's name matches the given regular expression pattern + will be dispatched to the delegate listeners. + + + + + + If one or more group patterns are specified, only events relating to + jobs who's group matches the given regular expression pattern + will be dispatched to the delegate listeners. + + + + + + Holds a List of references to TriggerListener instances and broadcasts all + events to them (in order) - if the event is not excluded via filtering + (read on). + + +

+ The broadcasting behavior of this listener to delegate listeners may be + more convenient than registering all of the listeners directly with the + Trigger, and provides the flexibility of easily changing which listeners + get notified. +

+ +

+ You may also register a number of Regular Expression patterns to match + the events against. If one or more patterns are registered, the broadcast + will only take place if the event applies to a trigger who's name/group + matches one or more of the patterns. +

+
+ + + + + + James House +
+ + + The interface to be implemented by classes that want to be informed when a + fires. In general, applications that use a + will not have use for this mechanism. + + + + + + James House + + + + Called by the when a + has fired, and it's associated + is about to be executed. +

+ It is called before the method of this + interface. +

+
+ The that has fired. + + The that will be passed to the 's method. + +
+ + + Called by the when a + has fired, and it's associated + is about to be executed. +

+ It is called after the method of this + interface. +

+
+ The that has fired. + The that will be passed to + the 's method. + Returns true if job execution should be vetoed, false otherwise. +
+ + + Called by the when a + has misfired. +

+ Consideration should be given to how much time is spent in this method, + as it will affect all triggers that are misfiring. If you have lots + of triggers misfiring at once, it could be an issue it this method + does a lot. +

+
+ The that has misfired. +
+ + + Called by the when a + has fired, it's associated + has been executed, and it's method has been + called. + + The that was fired. + + The that was passed to the + 's method. + + + The result of the call on the 's method. + + + + + Get the name of the . + + + + + Construct an instance with the given name. + + (Remember to add some delegate listeners!) + + the name of this instance + + + + Construct an instance with the given name, and List of listeners. + + the name of this instance + the initial List of TriggerListeners to broadcast to + + + + If one or more name patterns are specified, only events relating to + triggers who's name matches the given regular expression pattern + will be dispatched to the delegate listeners. + + + + + + If one or more group patterns are specified, only events relating to + triggers who's group matches the given regular expression pattern + will be dispatched to the delegate listeners. + + + + + + Keeps a collection of mappings of which Job to trigger after the completion + of a given job. If this listener is notified of a job completing that has a + mapping, then it will then attempt to trigger the follow-up job. This + achieves "job chaining", or a "poor man's workflow". + + +

+ Generally an instance of this listener would be registered as a global + job listener, rather than being registered directly to a given job. +

+

+ If for some reason there is a failure creating the trigger for the + follow-up job (which would generally only be caused by a rare serious + failure in the system, or the non-existence of the follow-up job), an error + messsage is logged, but no other action is taken. If you need more rigorous + handling of the error, consider scheduling the triggering of the flow-up + job within your job itself. +

+
+ James House +
+ + + A helpful abstract base class for implementors of . + + +

+ The methods in this class are empty so you only need to override the + subset for the events you care about. +

+ +

+ You are required to implement + to return the unique name of your . +

+
+ +
+ + + Initializes a new instance of the class. + + + + + Called by the when a + is about to be executed (an associated + has occured). +

+ This method will not be invoked if the execution of the Job was vetoed + by a . +

+
+ + +
+ + + Called by the when a + was about to be executed (an associated + has occured), but a vetoed it's + execution. + + + + + + + Called by the after a + has been executed, and be for the associated 's + method has been called. + + + + + + + Get the for this class's category. + This should be used by subclasses for logging. + + + + + Get the name of the . + + + + + + Construct an instance with the given name. + + The name of this instance. + + + + Add a chain mapping - when the Job identified by the first key completes + the job identified by the second key will be triggered. + + a Key with the name and group of the first job + a Key with the name and group of the follow-up job + + + + A helpful abstract base class for implementors of + . + + +

+ The methods in this class are empty so you only need to override the + subset for the events + you care about. +

+ +

+ You are required to implement + to return the unique name of your . +

+
+ +
+ + + Get the for this + class's category. This should be used by subclasses for logging. + + + + + Get the name of the . + + + + + + Logs a history of all job executions (and execution vetos) via common + logging. + + +

+ The logged message is customizable by setting one of the following message + properties to a string that conforms to the syntax of . +

+

+ JobToBeFiredMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Job's Name.
1StringThe Job's Group.
2DateThe current time.
3StringThe Trigger's name.
4StringThe Triggers's group.
5DateThe scheduled fire time.
6DateThe next scheduled fire time.
7IntegerThe re-fire count from the JobExecutionContext.
+ The default message text is "Job {1}.{0} fired (by trigger {4}.{3}) at: + {2, date, HH:mm:ss MM/dd/yyyy" +

+

+ JobSuccessMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Job's Name.
1StringThe Job's Group.
2DateThe current time.
3StringThe Trigger's name.
4StringThe Triggers's group.
5DateThe scheduled fire time.
6DateThe next scheduled fire time.
7IntegerThe re-fire count from the JobExecutionContext.
8ObjectThe string value (toString() having been called) of the result (if any) + that the Job set on the JobExecutionContext, with on it. "NULL" if no + result was set.
+ The default message text is "Job {1}.{0} execution complete at {2, date, + HH:mm:ss MM/dd/yyyy} and reports: {8" +

+

+ JobFailedMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Job's Name.
1StringThe Job's Group.
2DateThe current time.
3StringThe Trigger's name.
4StringThe Triggers's group.
5DateThe scheduled fire time.
6DateThe next scheduled fire time.
7IntegerThe re-fire count from the JobExecutionContext.
8StringThe message from the thrown JobExecution Exception. +
+ The default message text is "Job {1}.{0} execution failed at {2, date, + HH:mm:ss MM/dd/yyyy} and reports: {8" +

+

+ JobWasVetoedMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Job's Name.
1StringThe Job's Group.
2DateThe current time.
3StringThe Trigger's name.
4StringThe Triggers's group.
5DateThe scheduled fire time.
6DateThe next scheduled fire time.
7IntegerThe re-fire count from the JobExecutionContext.
+ The default message text is "Job {1}.{0} was vetoed. It was to be fired + (by trigger {4}.{3}) at: {2, date, HH:mm:ss MM/dd/yyyy" +

+
+
+ + + Provides an interface for a class to become a "plugin" to Quartz. + + + Plugins can do virtually anything you wish, though the most interesting ones + will obviously interact with the scheduler in some way - either actively: by + invoking actions on the scheduler, or passively: by being a , + , and/or . +

+ If you use to + Initialize your Scheduler, it can also create and Initialize your plugins - + look at the configuration docs for details. +

+

+ If you need direct access your plugin, you can have it explicitly put a + reference to itself in the 's + as part of its + method. +

+
+ James House +
+ + + Called during creation of the in order to give + the a chance to Initialize. + + + At this point, the Scheduler's is not yet +

+ If you need direct access your plugin, you can have it explicitly put a + reference to itself in the 's + as part of its + method. +

+
+ + The name by which the plugin is identified. + + + The scheduler to which the plugin is registered. + +
+ + + Called when the associated is started, in order + to let the plug-in know it can now make calls into the scheduler if it + needs to. + + + + + Called in order to inform the that it + should free up all of it's resources because the scheduler is shutting + down. + + + + + Called during creation of the in order to give + the a chance to Initialize. + + + + + Called when the associated is started, in order + to let the plug-in know it can now make calls into the scheduler if it + needs to. + + + + + Called in order to inform the that it + should free up all of it's resources because the scheduler is shutting + down. + + + + + Called by the when a is + about to be executed (an associated has occurred). + + This method will not be invoked if the execution of the Job was vetoed by a + . + + + + + + + Called by the after a + has been executed, and be for the associated 's + method has been called. + + + + + + + Called by the when a + was about to be executed (an associated + has occured), but a vetoed it's + execution. + + + + + + + Logger instance to use. Defaults to common logging. + + + + + Get or sets the message that is logged when a Job successfully completes its + execution. + + + + + Get or sets the message that is logged when a Job fails its + execution. + + + + + Gets or sets the message that is logged when a Job is about to Execute. + + + + + Gets or sets the message that is logged when a Job execution is vetoed by a + trigger listener. + + + + + Get the name of the . + + + + + + Logs a history of all trigger firings via the Jakarta Commons-Logging + framework. + + +

+ The logged message is customizable by setting one of the following message + properties to a string that conforms to the syntax of . +

+ +

+ TriggerFiredMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Trigger's Name.
1StringThe Trigger's Group.
2DateThe scheduled fire time.
3DateThe next scheduled fire time.
4DateThe actual fire time.
5StringThe Job's name.
6StringThe Job's group.
7IntegerThe re-fire count from the JobExecutionContext.
+ + The default message text is "Trigger {1}.{0} fired job {6}.{5} at: {4, + date, HH:mm:ss MM/dd/yyyy" +

+ +

+ TriggerMisfiredMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Trigger's Name.
1StringThe Trigger's Group.
2DateThe scheduled fire time.
3DateThe next scheduled fire time.
4DateThe actual fire time. (the time the misfire was detected/handled)
5StringThe Job's name.
6StringThe Job's group.
+ + The default message text is "Trigger {1}.{0} misfired job {6}.{5} at: + {4, date, HH:mm:ss MM/dd/yyyy}. Should have fired at: {3, date, HH:mm:ss + MM/dd/yyyy" +

+ +

+ TriggerCompleteMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Trigger's Name.
1StringThe Trigger's Group.
2DateThe scheduled fire time.
3DateThe next scheduled fire time.
4DateThe job completion time.
5StringThe Job's name.
6StringThe Job's group.
7IntegerThe re-fire count from the JobExecutionContext.
8IntegerThe trigger's resulting instruction code.
9StringA human-readable translation of the trigger's resulting instruction + code.
+ + The default message text is "Trigger {1}.{0} completed firing job + {6}.{5} at {4, date, HH:mm:ss MM/dd/yyyy} with resulting trigger instruction + code: {9" +

+
+ James House +
+ + + Called during creation of the in order to give + the a chance to Initialize. + + + + + Called when the associated is started, in order + to let the plug-in know it can now make calls into the scheduler if it + needs to. + + + + + Called in order to inform the that it + should free up all of it's resources because the scheduler is shutting + down. + + + + + Called by the when a + has fired, and it's associated + is about to be executed. +

+ It is called before the method of this + interface. +

+
+ The that has fired. + The that will be passed to the 's method. +
+ + + Called by the when a + has misfired. +

+ Consideration should be given to how much time is spent in this method, + as it will affect all triggers that are misfiring. If you have lots + of triggers misfiring at once, it could be an issue it this method + does a lot. +

+
+ The that has misfired. +
+ + + Called by the when a + has fired, it's associated + has been executed, and it's method has been + called. + + The that was fired. + The that was passed to the + 's method. + The result of the call on the 's method. + + + + Called by the when a + has fired, and it's associated + is about to be executed. +

+ It is called after the method of this + interface. +

+
+ The that has fired. + The that will be passed to + the 's method. + +
+ + + Logger instance to use. Defaults to common logging. + + + + + Get or set the message that is printed upon the completion of a trigger's + firing. + + + + + Get or set the message that is printed upon a trigger's firing. + + + + + Get or set the message that is printed upon a trigger's mis-firing. + + + + + Get the name of the . + + + + + + This plugin catches the event of the VM terminating (such as upon a CRTL-C) + and tells the scheuler to Shutdown. + + + James House + + + + Called during creation of the in order to give + the a chance to Initialize. + + + + + Called when the associated is started, in order + to let the plug-in know it can now make calls into the scheduler if it + needs to. + + + + + Called in order to inform the that it + should free up all of it's resources because the scheduler is shutting + down. + + + + + Determine whether or not the plug-in is configured to cause a clean + Shutdown of the scheduler. +

+ The default value is . +

+
+ +
+ + + Attribute to use with public properties that + can be set with Quartz configuration. Attribute can be used to advice + parsing to use correct type of time span (milliseconds, seconds, minutes, hours) + as it may depend on property. + + + + + + Initializes a new instance of the class. + + The rule. + + + + Gets the rule. + + The rule. + + + + Possible parse rules for s. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This plugin loads XML file(s) to add jobs and schedule them with triggers + as the scheduler is initialized, and can optionally periodically scan the + file for changes. + + + The periodically scanning of files for changes is not currently supported in a + clustered environment. + + James House + Pierre Awaragi + + + + Initializes a new instance of the class. + + + + + + + + + + + Called during creation of the in order to give + the a chance to initialize. + + The name. + The scheduler. + SchedulerConfigException + + + + Called when the associated is started, in order + to let the plug-in know it can now make calls into the scheduler if it + needs to. + + + + Helper method for generating unique job/trigger name for the + file scanning jobs (one per FileJob). The unique names are saved + in jobTriggerNameSet. + + + + Called in order to inform the that it + should free up all of it's resources because the scheduler is shutting + down. + + + + + Gets the log. + + The log. + + + + Comma separated list of file names (with paths) to the XML files that should be read. + + + + + Whether or not jobs defined in the XML file should be overwrite existing + jobs with the same name. + + + + + The interval at which to scan for changes to the file. + If the file has been changed, it is re-loaded and parsed. The default + value for the interval is 0, which disables scanning. + + + + + Whether or not initialization of the plugin should fail (throw an + exception) if the file cannot be found. Default is . + + + + + Whether or not the XML should be validated. Default is . + + + + + Whether or not the XML schema should be validated. Default is . + + + + + A uses all of the + types that are found in this package in its attempts to load a class, when + one scheme is found to work, it is promoted to the scheme that will be used + first the next time a class is loaded (in order to improve perfomance). + + + This approach is used because of the wide variance in class loader behavior + between the various environments in which Quartz runs (e.g. disparate + application servers, stand-alone, mobile devices, etc.). Because of this + disparity, Quartz ran into difficulty with a one class-load style fits-all + design. Thus, this class loader finds the approach that works, then + 'remembers' it. + + James House + + + + Called to give the ClassLoadHelper a chance to Initialize itself, + including the oportunity to "steal" the class loader off of the calling + thread, which is the thread that is initializing Quartz. + + + + + Return the class with the given name. + + + + Finds a resource with a given name. This method returns null if no + resource with this name is found. + + name of the desired resource + + a java.net.URL object + + + + Finds a resource with a given name. This method returns null if no + resource with this name is found. + + name of the desired resource + + a java.io.InputStream object + + + + + that names the scheduler instance using + just the machine hostname. +

+ This class is useful when you know that your scheduler instance will be the + only one running on a particular machine. Each time the scheduler is + restarted, it will get the same instance id as long as the machine is not + renamed. +

+ +
+ + +
+ + + An IInstanceIdGenerator is responsible for generating the clusterwide unique + instance id for a nodde. +

+ This interface may be of use to those wishing to have specific control over + the mechanism by which the instances in their + application are named. +

+ +
+ +
+ + Generate the instance id for a + + + The clusterwide unique instance id. + + + + + Generate the instance id for a + + The clusterwide unique instance id. + + + + A that uses either the loader of it's own + class. + + + + + James House + + + + Called to give the ClassLoadHelper a chance to Initialize itself, + including the oportunity to "steal" the class loader off of the calling + thread, which is the thread that is initializing Quartz. + + + + Return the class with the given name. + + + Finds a resource with a given name. This method returns null if no + resource with this name is found. + + name of the desired resource + + a java.net.URL object + + + + Finds a resource with a given name. This method returns null if no + resource with this name is found. + + name of the desired resource + + a java.io.InputStream object + + + + + A JobFactory that instantiates the Job instance (using the default no-arg + constructor, or more specifically: ), and + then attempts to set all values in the 's + onto bean properties of the . + + + + + + + James Houser + Marko Lahma (.NET) + + + + The default JobFactory used by Quartz - simply calls + on the job class. + + + + James House + Marko Lahma (.NET) + + + + A JobFactory is responsible for producing instances of + classes. + + + This interface may be of use to those wishing to have their application + produce instances via some special mechanism, such as to + give the opertunity for dependency injection. + + + + + James House + + + + Called by the scheduler at the time of the trigger firing, in order to + produce a instance on which to call Execute. + + +

+ It should be extremely rare for this method to throw an exception - + basically only the the case where there is no way at all to instantiate + and prepare the Job for execution. When the exception is thrown, the + Scheduler will move all triggers associated with the Job into the + state, which will require human + intervention (e.g. an application restart after fixing whatever + configuration problem led to the issue wih instantiating the Job. +

+ +
+ + The TriggerFiredBundle from which the + and other info relating to the trigger firing can be obtained. + + SchedulerException if there is a problem instantiating the Job. + the newly instantiated Job + +
+ + + Called by the scheduler at the time of the trigger firing, in order to + produce a instance on which to call Execute. + + + It should be extremely rare for this method to throw an exception - + basically only the the case where there is no way at all to instantiate + and prepare the Job for execution. When the exception is thrown, the + Scheduler will move all triggers associated with the Job into the + state, which will require human + intervention (e.g. an application restart after fixing whatever + configuration problem led to the issue wih instantiating the Job. + + The TriggerFiredBundle from which the + and other info relating to the trigger firing can be obtained. + the newly instantiated Job + SchedulerException if there is a problem instantiating the Job. + + + + Called by the scheduler at the time of the trigger firing, in order to + produce a instance on which to call Execute. + + +

+ It should be extremely rare for this method to throw an exception - + basically only the the case where there is no way at all to instantiate + and prepare the Job for execution. When the exception is thrown, the + Scheduler will move all triggers associated with the Job into the + state, which will require human + intervention (e.g. an application restart after fixing whatever + configuration problem led to the issue wih instantiating the Job. +

+
+ The TriggerFiredBundle from which the + and other info relating to the trigger firing can be obtained. + the newly instantiated Job + SchedulerException if there is a problem instantiating the Job. +
+ + + Sets the object properties. + + The object to set properties to. + The data to set. + + + + Whether the JobInstantiation should fail and throw and exception if + a key (name) and value (type) found in the JobDataMap does not + correspond to a proptery setter on the Job class. + + + + + Get or set whether a warning should be logged if + a key (name) and value (type) found in the JobDataMap does not + correspond to a proptery setter on the Job class. + + + + + This class implements a that + utilizes RAM as its storage device. +

+ As you should know, the ramification of this is that access is extrememly + fast, but the data is completely volatile - therefore this + should not be used if true persistence between program shutdowns is + required. +

+
+ James House + Sharada Jambula + Marko Lahma (.NET) +
+ + + Initializes a new instance of the class. + + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + Called by the QuartzScheduler to inform the that + the scheduler has started. + + + + + Called by the QuartzScheduler to inform the that + it should free up all of it's resources because the scheduler is + shutting down. + + + + + Store the given and . + + The scheduling context. + The to be stored. + The to be stored. + + + + Returns true if the given job group is paused. + + + Job group name + + + + + returns true if the given TriggerGroup is paused. + + + + + + + + Store the given . + + The scheduling context. + The to be stored. + If , any existing in the + with the same name and group should be + over-written. + + + + Remove (delete) the with the given + name, and any s that reference + it. + + The scheduling context. + The name of the to be removed. + The group name of the to be removed. + + if a with the given name and + group was found and removed from the store. + + + + + Remove (delete) the with the + given name. + + The scheduling context. + The name of the to be removed. + The group name of the to be removed. + + if a with the given + name and group was found and removed from the store. + + + + + Store the given . + + The scheduling context. + The to be stored. + If , any existing in + the with the same name and group should + be over-written. + + + + Remove (delete) the with the + given name. + + The scheduling context. + The name of the to be removed. + The group name of the to be removed. + + if a with the given + name and group was found and removed from the store. + + Whether to delete orpahaned job details from scheduler if job becomes orphaned from removing the trigger. + + + + Replaces the trigger. + + The scheduling context. + Name of the trigger. + Name of the group. + The new trigger. + + + + + Retrieve the for the given + . + + The scheduling context. + The name of the to be retrieved. + The group name of the to be retrieved. + + The desired , or null if there is no match. + + + + + Retrieve the given . + + The scheduling context. + The name of the to be retrieved. + The group name of the to be retrieved. + + The desired , or null if there is no match. + + + + + Get the current state of the identified . + + + + + + + + + + + Store the given . + + The scheduling context. + The name. + The to be stored. + If , any existing + in the with the same name and group + should be over-written. + If , any s existing + in the that reference an existing + Calendar with the same name with have their next fire time + re-computed with the new . + + + + Remove (delete) the with the + given name. +

+ If removal of the would result in + s pointing to non-existent calendars, then a + will be thrown.

+
+ The scheduling context. + The name of the to be removed. + + if a with the given name + was found and removed from the store. + +
+ + + Retrieve the given . + + The scheduling context. + The name of the to be retrieved. + + The desired , or null if there is no match. + + + + + Get the number of s that are + stored in the . + + + + + Get the number of s that are + stored in the . + + + + + Get the number of s that are + stored in the . + + + + + Get the names of all of the s that + have the given group name. + + + + + Get the names of all of the s + in the . +

+ If there are no ICalendars in the given group name, the result should be + a zero-length array (not ). +

+
+
+ + + Get the names of all of the s + that have the given group name. + + + + + Get the names of all of the + groups. + + + + + Get the names of all of the groups. + + + + + Get all of the Triggers that are associated to the given Job. +

+ If there are no matches, a zero-length array should be returned. +

+
+
+ + + Gets the trigger wrappers for job. + + Name of the job. + Name of the group. + + + + + Gets the trigger wrappers for calendar. + + Name of the cal. + + + + + Pause the with the given name. + + + + + Pause all of the s in the given group. +

+ The JobStore should "remember" that the group is paused, and impose the + pause on any new triggers that are added to the group while the group is + paused. +

+
+
+ + + Pause the with the given + name - by pausing all of its current s. + + + + + Pause all of the s in the + given group - by pausing all of their s. +

+ The JobStore should "remember" that the group is paused, and impose the + pause on any new jobs that are added to the group while the group is + paused. +

+
+
+ + + Resume (un-pause) the with the given name. + + + If the missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + Resume (un-pause) all of the s in the + given group. +

+ If any missed one or more fire-times, then the + 's misfire instruction will be applied. +

+
+
+ + + Resume (un-pause) the with + the given name. +

+ If any of the 's s missed one + or more fire-times, then the 's misfire + instruction will be applied. +

+
+
+ + + Resume (un-pause) all of the s + in the given group. +

+ If any of the s had s that + missed one or more fire-times, then the 's + misfire instruction will be applied. +

+
+
+ + + Pause all triggers - equivalent of calling + on every group. +

+ When is called (to un-pause), trigger misfire + instructions WILL be applied. +

+
+ +
+ + + Resume (un-pause) all triggers - equivalent of calling + on every trigger group and setting all job groups unpaused />. +

+ If any missed one or more fire-times, then the + 's misfire instruction will be applied. +

+
+ +
+ + + Applies the misfire. + + The trigger wrapper. + + + + + Get a handle to the next trigger to be fired, and mark it as 'reserved' + by the calling scheduler. + + + + + + Inform the that the scheduler no longer plans to + fire the given , that it had previously acquired + (reserved). + + + + + Inform the that the scheduler is now firing the + given (executing its associated ), + that it had previously acquired (reserved). + + + + + Inform the that the scheduler has completed the + firing of the given (and the execution its + associated ), and that the + in the given should be updated if the + is stateful. + + + + + Sets the state of all triggers of job to specified state. + + Name of the job. + The job group. + The internal state to set. + + + + Peeks the triggers. + + + + + + + + + The time span by which a trigger must have missed its + next-fire-time, in order for it to be considered "misfired" and thus + have its misfire instruction applied. + + + + + Gets the fired trigger record id. + + The fired trigger record id. + + + + Returns whether this instance supports persistence. + + + + + + + Comparer for triggers. + + + + + Possible internal trigger states + in RAMJobStore + + + + + Waiting + + + + + Acquired + + + + + Executing + + + + + Complete + + + + + Paused + + + + + Blocked + + + + + Paused and Blocked + + + + + Error + + + + + Helper wrapper class + + + + + The key used + + + + + Job's key + + + + + The trigger + + + + + Current state + + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + + Serves as a hash function for a particular type. is suitable for use in hashing algorithms and data structures like a hash table. + + + A hash code for the current . + + + + + Gets the trigger + + The trigger + + + + Scheduler exporter that exports scheduler to remoting context. + + Marko Lahma + + + + Service interface for scheduler exporters. + + Marko Lahma + + + + Binds (exports) scheduler to external context. + + + + + + Unbinds scheduler from external context. + + + + + + Registers remoting channel if needed. This is determined + by checking whether there is a positive value for port. + + + + + Gets or sets the port used for remoting. + + + + + Gets or sets the name to use when exporting + scheduler to remoting context. + + + + + Sets the channel type when registering remoting. + + + + + + Sets the used when + exporting to remoting context. Defaults to + . + + + + + A that simply calls . + + + + James House + + + + Called to give the ClassLoadHelper a chance to Initialize itself, + including the oportunity to "steal" the class loader off of the calling + thread, which is the thread that is initializing Quartz. + + + + Return the class with the given name. + + + + Finds a resource with a given name. This method returns null if no + resource with this name is found. + + name of the desired resource + + a Uri object + + + + Finds a resource with a given name. This method returns null if no + resource with this name is found. + + name of the desired resource + + a Stream object + + + + + The default InstanceIdGenerator used by Quartz when instance id is to be + automatically generated. Instance id is of the form HOSTNAME + CURRENT_TIME. + + + + + + + + + Generate the instance id for a + + The clusterwide unique instance id. + + + + This is class is a simple implementation of a thread pool, based on the + interface. +

+ objects are sent to the pool with the + method, which blocks until a becomes available. +

+ +

+ The pool has a fixed number of s, and does not grow or + shrink based on demand. +

+
+ James House + Juergen Donnerstag +
+ + + The interface to be implemented by classes that want to provide a thread + pool for the 's use. + + + implementation instances should ideally be made + for the sole use of Quartz. Most importantly, when the method + returns a value of 1 or greater, + there must still be at least one available thread in the pool when the + method is called a few moments (or + many moments) later. If this assumption does not hold true, it may + result in extra JobStore queries and updates, and if clustering features + are being used, it may result in greater imballance of load. + + + James House + + + + Execute the given in the next + available . + + + The implementation of this interface should not throw exceptions unless + there is a serious problem (i.e. a serious misconfiguration). If there + are no available threads, rather it should either queue the Runnable, or + block until a thread is available, depending on the desired strategy. + + + + + Determines the number of threads that are currently available in in + the pool. Useful for determining the number of times + can be called before returning + false. + + + The implementation of this method should block until there is at + least one available thread. + + the number of currently available threads + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + Called by the QuartzScheduler to inform the + that it should free up all of it's resources because the scheduler is + shutting down. + + + + + Gets the size of the pool. + + The size of the pool. + + + + Create a new (unconfigured) . + + + + + Create a new with the specified number + of s that have the given priority. + + + the number of worker s in the pool, must + be > 0. + + + the thread priority for the worker threads. + + + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + Terminate any worker threads in this thread group. + Jobs currently in progress will complete. + + + + + Run the given object in the next available + . If while waiting the thread pool is asked to + shut down, the Runnable is executed immediately within a new additional + thread. + + The to be added. + + + + Creates the worker threads. + + The thread count. + + + + + Terminate any worker threads in this thread group. + Jobs currently in progress will complete. + + + + + Gets or sets the number of worker threads in the pool. + Set has no effect after has been called. + + + + + Get or set the thread priority of worker threads in the pool. + Set operation has no effect after has been called. + + + + + Gets or sets the thread name prefix. + + The thread name prefix. + + + + Gets or sets the value of makeThreadsDaemons. + + + + + Gets the size of the pool. + + The size of the pool. + + + + A Worker loops, waiting to Execute tasks. + + + + + Create a worker thread and start it. Waiting for the next Runnable, + executing it, and waiting for the next Runnable, until the Shutdown + flag is set. + + + + + Create a worker thread, start it, Execute the runnable and terminate + the thread (one time execution). + + + + + Signal the thread that it should terminate. + + + + + Loop, executing targets as they are received. + + + + + This is class is a simple implementation of a zero size thread pool, based on the + {@link org.quartz.spi.ThreadPool} interface. + + + The pool has zero s and does not grow or shrink based on demand. + Which means it is obviously not useful for most scenarios. When it may be useful + is to prevent creating any worker threads at all - which may be desirable for + the sole purpose of preserving system resources in the case where the scheduler + instance only exists in order to schedule jobs, but which will never execute + jobs (e.g. will never have Start() called on it). + + Wayne Fay + + + + Initializes a new instance of the class. + + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + Shutdowns this instance. + + + + + Called by the QuartzScheduler to inform the + that it should free up all of it's resources because the scheduler is + shutting down. + + + + + + Execute the given in the next + available . + + + + + The implementation of this interface should not throw exceptions unless + there is a serious problem (i.e. a serious misconfiguration). If there + are no available threads, rather it should either queue the Runnable, or + block until a thread is available, depending on the desired strategy. + + + + + Determines the number of threads that are currently available in in + the pool. Useful for determining the number of times + can be called before returning + false. + + + the number of currently available threads + + + The implementation of this method should block until there is at + least one available thread. + + + + + Gets the log. + + The log. + + + + Gets the size of the pool. + + The size of the pool. + + + + A simple class (structure) used for returning execution-time data from the + JobStore to the . + + + James House + + + + Initializes a new instance of the class. + + The job. + The trigger. + The calendar. + if set to true [job is recovering]. + The fire time. + The scheduled fire time. + The previous fire time. + The next fire time. + + + + Gets the job detail. + + The job detail. + + + + Gets the trigger. + + The trigger. + + + + Gets the calendar. + + The calendar. + + + + Gets a value indicating whether this is recovering. + + true if recovering; otherwise, false. + + + + Returns the UTC fire time. + + + + + Gets the next UTC fire time. + + The next fire time. + Returns the nextFireTimeUtc. + + + + Gets the previous UTC fire time. + + The previous fire time. + Returns the previous fire time. + + + + Returns the scheduled UTC fire time. + + + + + DateTime related utility methods. + + + + + Assumes that given input is in UTC and sets the kind to be UTC. + Just a precaution if somebody does not set it explicitly. + This only works in .NET Framework 2.0 onwards. + + The datetime to check. + DateTime with kind set to UTC. + + + + Assumes that given input is in UTC and sets the kind to be UTC. + Just a precaution if somebody does not set it explicitly. + + The datetime to check. + DateTime with kind set to UTC. + + + + Manages a collection of IDbProviders, and provides transparent access + to their database. + + + James House + Sharada Jambula + Mohammad Rezaei + + + + Private constructor + + + + + Adds the connection provider. + + Name of the data source. + The provider. + + + + Get a database connection from the DataSource with the given name. + + a database connection + + + + Shuts down database connections from the DataSource with the given name, + if applicable for the underlying provider. + + a database connection + + + + Gets the db provider. + + Name of the ds. + + + + + Get the class instance. + + an instance of this class + + + + + An implementation of that wraps another + and flags itself 'dirty' when it is modified. + + James House + + + + Create a DirtyFlagMap that 'wraps' a . + + + + + Create a DirtyFlagMap that 'wraps' a that has the + given initial capacity. + + + + + Create a DirtyFlagMap that 'wraps' a that has the + given initial capacity and load factor. + + + + + Creates a new object that is a copy of the current instance. + + + A new object that is a copy of this instance. + + + + + When implemented by a class, removes all elements from the . + + + The is read-only. + + + + + When implemented by a class, determines whether the contains an element with the specified key. + + The key to locate in the . + + if the contains an element with the key; otherwise, . + + + is . + + + + When implemented by a class, removes the element with the + specified key from the . + + The key of the element to remove. + + is . + + The is read-only. + -or- + The has a fixed size. + + + + + When implemented by a class, returns an + for the . + + + An for the . + + + + + When implemented by a class, adds an element with the provided key and value to the . + + The to use as the key of the element to add. + The to use as the value of the element to add. + is . + + An element with the same key already exists in the . + + + The is read-only. + -or- + The has a fixed size. + + + + + When implemented by a class, copies the elements of + the to an , starting at a particular index. + + The one-dimensional that is the destination of the elements copied from . The must have zero-based indexing. + The zero-based index in at which copying begins. + + is . + + is less than zero. + + + is multidimensional. + -or- + + is equal to or greater than the length of . + -or- + The number of elements in the source is greater than the available space from to the end of the destination . + + The type of the source cannot be cast automatically to the type of the destination . + + + + Clear the 'dirty' flag (set dirty flag to ). + + + + + Determines whether the specified obj contains value. + + The obj. + + true if the specified obj contains value; otherwise, false. + + + + + Gets the entries as a set. + + + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + if the specified is equal to the + current ; otherwise, . + + + + + Serves as a hash function for a particular type, suitable + for use in hashing algorithms and data structures like a hash table. + + + A hash code for the current . + + + + + Gets keyset for this map. + + + + + + Puts the value behind a specified key. + + The key. + The val. + + + + + Puts all. + + The t. + + + + Determine whether the is flagged dirty. + + + + + Get a direct handle to the underlying Map. + + + + + Gets a value indicating whether this instance is empty. + + true if this instance is empty; otherwise, false. + + + + Gets or sets the with the specified key. + + + + + + When implemented by a class, gets the number of + elements contained in the . + + + + + + When implemented by a class, gets an containing the values in the . + + + + + + When implemented by a class, gets an containing the keys of the . + + + + + + When implemented by a class, gets a value indicating whether the + is read-only. + + + + + + When implemented by a class, gets a value indicating whether the + has a fixed size. + + + + + + When implemented by a class, gets an object that + can be used to synchronize access to the . + + + + + + When implemented by a class, gets a value + indicating whether access to the is synchronized + (thread-safe). + + + + + + Utility class for file handling related things. + + + + + Resolves file to actual file if for example relative '~' used. + + File name to check + Expanded file name or actual no resolving was done. + + + + object representing a job or trigger key. + + Jeffrey Wescott + + + + + Utility class for storing two pieces of information together. + + Jeffrey Wescott + + + + Test equality of this object with that. + + object to compare + true if objects are equal, false otherwise + + + + Serves as a hash function for a particular type. is suitable for use in hashing algorithms and data structures like a hash table. + + + A hash code for the current . + + + + + Get or sets the first object in the pair. + + + + + Get or sets the second object in the pair. + + + + Construct a new key with the given name and group. + + + + the name + + + the group + + + +

+ Return the string representation of the key. The format will be: + <group>.<name>. +

+ +
+ the string representation of the key + +
+ + + Get the name portion of the key. + + the name + + + +

+ Get the group portion of the key. +

+ +
+ the group + +
+ + + Wrapper class to access thread local data. + Data is either accessed from thread or HTTP Context's + data if HTTP Context is avaiable. + + Marko Lahma (.NET) + + + + Retrieves an object with the specified name. + + The name of the item. + The object in the call context associated with the specified name or null if no object has been stored previously + + + + Stores a given object and associates it with the specified name. + + The name with which to associate the new item. + The object to store in the call context. + + + + Empties a data slot with the specified name. + + The name of the data slot to empty. + + + + Utility methods that are used to convert objects from one type into another. + + Aleksandar Seovic + + + + Convert the value to the required (if necessary from a string). + + The proposed change value. + + The we must convert to. + + The new value, possibly the result of type conversion. + + + + Determines whether value is assignable to required type. + + The value to check. + Type of the required. + + true if value can be assigned as given type; otherwise, false. + + + + + Instantiates an instance of the type specified. + + The type to instantiate. + + + + + Sets the object properties using reflection. + + The object to set values to. + The properties to set to object. + + + + This is an utility class used to parse the properties. + + James House + + + + Initializes a new instance of the class. + + The props. + + + + Gets the string property. + + The name. + + + + + Gets the string property. + + The name. + The default value. + + + + + Gets the string array property. + + The name. + + + + + Gets the string array property. + + The name. + The default value. + + + + + Gets the boolean property. + + The name. + + + + + Gets the boolean property. + + The name. + if set to true [defaultValue]. + + + + + Gets the byte property. + + The name. + + + + + Gets the byte property. + + The name. + The default value. + + + + + Gets the char property. + + The name. + + + + + Gets the char property. + + The name. + The default value. + + + + + Gets the double property. + + The name. + + + + + Gets the double property. + + The name. + The default value. + + + + + Gets the float property. + + The name. + + + + + Gets the float property. + + The name. + The default value. + + + + + Gets the int property. + + The name. + + + + + Gets the int property. + + The name. + The default value. + + + + + Gets the int array property. + + The name. + + + + + Gets the int array property. + + The name. + The default value. + + + + + Gets the long property. + + The name. + + + + + Gets the long property. + + The name. + The def. + + + + + Gets the TimeSpan property. + + The name. + The def. + + + + + Gets the short property. + + The name. + + + + + Gets the short property. + + The name. + The default value. + + + + + Gets the property groups. + + The prefix. + + + + + Gets the property group. + + The prefix. + + + + + Gets the property group. + + The prefix. + if set to true [strip prefix]. + + + + + Get all properties that start with the given prefix. + + The prefix for which to search. If it does not end in a "." then one will be added to it for search purposes. + Whether to strip off the given in the result's keys. + Optional array of fully qualified prefixes to exclude. For example if is "a.b.c", then might be "a.b.c.ignore". + Group of that start with the given prefix, optionally have that prefix removed, and do not include properties that start with one of the given excluded prefixes. + + + + Reads the properties from assembly (embedded resource). + + The file name to read resources from. + + + + + Reads the properties from file system. + + The file name to read resources from. + + + + + Gets the underlying properties. + + The underlying properties. + + + + An implementation of that wraps another + and flags itself 'dirty' when it is modified, enforces that all keys are + strings. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The initial capacity. + + + + Initializes a new instance of the class. + + The initial capacity. + The load factor. + + + + Gets the keys. + + + + + + Adds the name-value pairs in the given to the . +

+ All keys must be s, and all values must be serializable. +

+
+
+ + + Adds the given value to the 's + data map. + + + + + Adds the given value to the 's + data map. + + + + + Adds the given value to the 's + data map. + + + + + Adds the given value to the 's + data map. + + + + + Adds the given value to the 's + data map. + + + + + Adds the given value to the 's + data map. + + + + + Adds the given value to the 's + data map. + + + + + Adds the given serializable object value to the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Object representing a job or trigger key. + + James House + + + + Construct a new TriggerStatus with the status name and nextFireTime. + + The trigger's status + The next UTC time the trigger will fire + + + + Return the string representation of the TriggerStatus. + + + + + Gets or sets the job key. + + The job key. + + + + Gets or sets the key. + + The key. + + + + Get the name portion of the key. + + the name + + + + Get the group portion of the key. + + the group + + + + Wraps a . + + Chris Bonham + + + + Gets or sets the name of the calendar. + + The name of the calendar. + + + + Gets or sets the name of the class. + + The name of the class. + + + + Gets or sets the calendar. + + The calendar. + + + + Gets or sets a description for the instance - may be + useful for remembering/displaying the purpose of the calendar, though + the description has no meaning to Quartz. + + + + + + Set a new base calendar or remove the existing one. + + + + + + Wraps a and . + + Chris Bonham + James House + + + + Adds a trigger to this bundle. + + The trigger. + + + + Removes the given trigger from this bundle. + + The trigger. + + + + Gets or sets the job detail. + + The job detail. + + + + Gets or sets the triggers associated with this bundle. + + The triggers. + + + + Gets the name of the bundle. + + The name. + + + + Gets the full name. + + The full name. + + + + Gets a value indicating whether this is valid. + + true if valid; otherwise, false. + + + + Parses an XML file that declares Jobs and their schedules (Triggers). + + +

+ The xml document must conform to the format defined in + "job_scheduling_data.xsd" +

+ +

+ After creating an instance of this class, you should call one of the + functions, after which you may call the + function to get a handle to the defined Jobs and Triggers, which can then be + scheduled with the . Alternatively, you could call + the function to do all of this + in one step. +

+ +

+ The same instance can be used again and again, with the list of defined Jobs + being cleared each time you call a method, + however a single instance is not thread-safe. +

+
+ Chris Bonham + James House + Marko Lahma (.NET) +
+ + + XML Schema dateTime datatype format. +

+ See + http://www.w3.org/TR/2001/REC-xmlschema-2-20010502/#dateTime +

+
+
+ + + Constructor for JobSchedulingDataProcessor. + + + + + Constructor for JobSchedulingDataProcessor. + + whether or not to validate XML. + whether or not to validate XML schema. + + + + Process the xml file in the default location (a file named + "quartz_jobs.xml" in the current working directory). + + + + + Process the xml file named . + + meta data file name. + + + + Process the xmlfile named with the given system + ID. + + Name of the file. + The system id. + + + + Process the xmlfile named with the given system + ID. + + The stream. + The system id. + + + + Process the xml file in the default location, and schedule all of the + jobs defined within it. + + + + + Process the xml file in the given location, and schedule all of the + jobs defined within it. + + meta data file name. + The scheduler. + if set to true overwrite existing jobs. + + + + Process the xml file in the given location, and schedule all of the + jobs defined within it. + + Name of the file. + The system id. + The sched. + if set to true [over write existing jobs]. + + + + Add the Jobs and Triggers defined in the given map of + s to the given scheduler. + + The job bundles. + The sched. + if set to true [over write existing jobs]. + + + + Returns a for the job name. + + The name. + + a for the job name. + + + + + Returns an from the fileName as a resource. + + Name of the file. + + an from the fileName as a resource. + + + + + Schedules a given job and trigger (both wrapped by a ). + + job wrapper. + + if the Job or Trigger cannot be added to the Scheduler, or + there is an internal Scheduler error. + + + + + Schedules a given job and trigger (both wrapped by a ). + + The job. + The sched. + if set to true [local over write existing jobs]. + + if the Job or Trigger cannot be added to the Scheduler, or + there is an internal Scheduler error. + + + + + Adds a scheduled job. + + The job. + + + + Adds a calendar. + + The sched. + calendar bundle. + SchedulerException if the Calendar cannot be added to the Scheduler, or + + + + Adds a detected validation exception. + + The exception. + + + + Resets the the number of detected validation exceptions. + + + + + Throws a ValidationException if the number of validationExceptions + detected is greater than zero. + + + DTD validation exception. + + + + + Gets or sets whether to overwrite existing jobs. + + + + + Gets the log. + + The log. + + + + Returns a of scheduled jobs. +

+ The key is the job name and the value is a + containing the and . +

+
+ a of scheduled jobs. + +
+ + + Helper class to map constant names to their values. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Reports JobSchedulingDataProcessor validation exceptions. + + Chris Bonham + + + + Constructor for ValidationException. + + + + + Constructor for ValidationException. + + exception message. + + + + Constructor for ValidationException. + + collection of validation exceptions. + + + + Gets the validation exceptions. + + The validation exceptions. + + + + Returns the detail message string. + + + + + An exception that is thrown to indicate that there has been a critical + failure within the scheduler's core services (such as loss of database + connectivity). + + James House + + + + Create a with the given message. + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + Provides a parser and evaluator for unix-like cron expressions. Cron + expressions provide the ability to specify complex time combinations such as + "At 8:00am every Monday through Friday" or "At 1:30am every + last Friday of the month". + + +

+ Cron expressions are comprised of 6 required fields and one optional field + separated by white space. The fields respectively are described as follows: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Name Allowed Values Allowed Special Characters
Seconds 0-59 , - /// /
Minutes 0-59 , - /// /
Hours 0-23 , - /// /
Day-of-month 1-31 , - /// ? / L W C
Month 1-12 or JAN-DEC , - /// /
Day-of-Week 1-7 or SUN-SAT , - /// ? / L #
Year (Optional) empty, 1970-2099 , - /// /
+

+ The '*' character is used to specify all values. For example, "*" + in the minute field means "every minute". +

+

+ The '?' character is allowed for the day-of-month and day-of-week fields. It + is used to specify 'no specific value'. This is useful when you need to + specify something in one of the two fields, but not the other. +

+

+ The '-' character is used to specify ranges For example "10-12" in + the hour field means "the hours 10, 11 and 12". +

+

+ The ',' character is used to specify additional values. For example + "MON,WED,FRI" in the day-of-week field means "the days Monday, + Wednesday, and Friday". +

+

+ The '/' character is used to specify increments. For example "0/15" + in the seconds field means "the seconds 0, 15, 30, and 45". And + "5/15" in the seconds field means "the seconds 5, 20, 35, and + 50". Specifying '*' before the '/' is equivalent to specifying 0 is + the value to start with. Essentially, for each field in the expression, there + is a set of numbers that can be turned on or off. For seconds and minutes, + the numbers range from 0 to 59. For hours 0 to 23, for days of the month 0 to + 31, and for months 1 to 12. The "/" character simply helps you turn + on every "nth" value in the given set. Thus "7/6" in the + month field only turns on month "7", it does NOT mean every 6th + month, please note that subtlety. +

+

+ The 'L' character is allowed for the day-of-month and day-of-week fields. + This character is short-hand for "last", but it has different + meaning in each of the two fields. For example, the value "L" in + the day-of-month field means "the last day of the month" - day 31 + for January, day 28 for February on non-leap years. If used in the + day-of-week field by itself, it simply means "7" or + "SAT". But if used in the day-of-week field after another value, it + means "the last xxx day of the month" - for example "6L" + means "the last friday of the month". When using the 'L' option, it + is important not to specify lists, or ranges of values, as you'll get + confusing results. +

+

+ The 'W' character is allowed for the day-of-month field. This character + is used to specify the weekday (Monday-Friday) nearest the given day. As an + example, if you were to specify "15W" as the value for the + day-of-month field, the meaning is: "the nearest weekday to the 15th of + the month". So if the 15th is a Saturday, the trigger will fire on + Friday the 14th. If the 15th is a Sunday, the trigger will fire on Monday the + 16th. If the 15th is a Tuesday, then it will fire on Tuesday the 15th. + However if you specify "1W" as the value for day-of-month, and the + 1st is a Saturday, the trigger will fire on Monday the 3rd, as it will not + 'jump' over the boundary of a month's days. The 'W' character can only be + specified when the day-of-month is a single day, not a range or list of days. +

+

+ The 'L' and 'W' characters can also be combined for the day-of-month + expression to yield 'LW', which translates to "last weekday of the + month". +

+

+ The '#' character is allowed for the day-of-week field. This character is + used to specify "the nth" XXX day of the month. For example, the + value of "6#3" in the day-of-week field means the third Friday of + the month (day 6 = Friday and "#3" = the 3rd one in the month). + Other examples: "2#1" = the first Monday of the month and + "4#5" = the fifth Wednesday of the month. Note that if you specify + "#5" and there is not 5 of the given day-of-week in the month, then + no firing will occur that month. If the '#' character is used, there can + only be one expression in the day-of-week field ("3#1,6#3" is + not valid, since there are two expressions). +

+

+ +

+

+ The legal characters and the names of months and days of the week are not + case sensitive. +

+

+ NOTES: +

    +
  • Support for specifying both a day-of-week and a day-of-month value is + not complete (you'll need to use the '?' character in one of these fields). +
  • +
  • Overflowing ranges is supported - that is, having a larger number on + the left hand side than the right. You might do 22-2 to catch 10 o'clock + at night until 2 o'clock in the morning, or you might have NOV-FEB. It is + very important to note that overuse of overflowing ranges creates ranges + that don't make sense and no effort has been made to determine which + interpretation CronExpression chooses. An example would be + "0 0 14-6 ? * FRI-MON".
  • +
+

+
+ Sharada Jambula + James House + Contributions from Mads Henderson + Refactoring from CronTrigger to CronExpression by Aaron Craven +
+ + + Field specification for second. + + + + + Field specification for minute. + + + + + Field specification for hour. + + + + + Field specification for day of month. + + + + + Field specification for month. + + + + + Field specification for day of week. + + + + + Field specification for year. + + + + + Field specification for all wildcard value '*'. + + + + + Field specification for not specified value '?'. + + + + + Field specification for wildcard '*'. + + + + + Field specification for no specification at all '?'. + + + + + Seconds. + + + + + minutes. + + + + + Hours. + + + + + Days of month. + + + + + Months. + + + + + Days of week. + + + + + Years. + + + + + Last day of week. + + + + + Nth day of week. + + + + + Last day of month. + + + + + Nearest weekday. + + + + + Calendar day of week. + + + + + Calendar day of month. + + + + + Expression parsed. + + + + + Constructs a new based on the specified + parameter. + + + String representation of the cron expression the new object should represent + + + + + + Indicates whether the given date satisfies the cron expression. + + + Note that milliseconds are ignored, so two Dates falling on different milliseconds + of the same second will always have the same result here. + + The date to evaluate. + a boolean indicating whether the given date satisfies the cron expression + + + + Returns the next date/time after the given date/time which + satisfies the cron expression. + + the date/time at which to begin the search for the next valid date/time + the next valid date/time + + + + Returns the next date/time after the given date/time which does + not satisfy the expression. + + the date/time at which to begin the search for the next invalid date/time + the next valid date/time + + + + Returns the string representation of the + + The string representation of the + + + + Indicates whether the specified cron expression can be parsed into a + valid cron expression + + the expression to evaluate + a boolean indicating whether the given expression is a valid cron + expression + + + + Builds the expression. + + The expression. + + + + Stores the expression values. + + The position. + The string to traverse. + The type of value. + + + + + Checks the next value. + + The position. + The string to check. + The value. + The type to search. + + + + + Gets the expression summary. + + + + + + Gets the expression set summary. + + The data. + + + + + Skips the white space. + + The i. + The s. + + + + + Finds the next white space. + + The i. + The s. + + + + + Adds to set. + + The val. + The end. + The incr. + The type. + + + + Gets the set of given type. + + The type of set to get. + + + + + Gets the value. + + The v. + The s. + The i. + + + + + Gets the numeric value from string. + + The string to parse from. + The i. + + + + + Gets the month number. + + The string to map with. + + + + + Gets the day of week number. + + The s. + + + + + Gets the time from given time parts. + + The seconds. + The minutes. + The hours. + The day of month. + The month. + + + + + Gets the next fire time after the given time. + + The UTC time to start searching from. + + + + + Creates the date time without milliseconds. + + The time. + + + + + Advance the calendar to the particular hour paying particular attention + to daylight saving problems. + + The date. + The hour. + + + + + Gets the time before. + + The end time. + + + + + NOT YET IMPLEMENTED: Returns the final time that the + will match. + + + + + + Determines whether given year is a leap year. + + The year. + + true if the specified year is a leap year; otherwise, false. + + + + + Gets the last day of month. + + The month num. + The year. + + + + + Creates a new object that is a copy of the current instance. + + + A new object that is a copy of this instance. + + + + + Sets or gets the time zone for which the of this + will be resolved. + + + + + Gets the cron expression string. + + The cron expression string. + + + + Helper class for cron expression handling. + + + + + The value. + + + + + The position. + + + + + A concrete that is used to fire a + at given moments in time, defined with Unix 'cron-like' definitions. + + +

+ For those unfamiliar with "cron", this means being able to create a firing + schedule such as: "At 8:00am every Monday through Friday" or "At 1:30am + every last Friday of the month". +

+ +

+ The format of a "Cron-Expression" string is documented on the + class. +

+ +

+ Here are some full examples:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Expression Meaning
"0 0 12 * * ?"" /> Fire at 12pm (noon) every day" />
"0 15 10 ? * *"" /> Fire at 10:15am every day" />
"0 15 10 * * ?"" /> Fire at 10:15am every day" />
"0 15 10 * * ? *"" /> Fire at 10:15am every day" />
"0 15 10 * * ? 2005"" /> Fire at 10:15am every day during the year 2005" /> +
"0 * 14 * * ?"" /> Fire every minute starting at 2pm and ending at 2:59pm, every day" /> +
"0 0/5 14 * * ?"" /> Fire every 5 minutes starting at 2pm and ending at 2:55pm, every day" /> +
"0 0/5 14,18 * * ?"" /> Fire every 5 minutes starting at 2pm and ending at 2:55pm, AND fire every 5 minutes starting at 6pm and ending at 6:55pm, every day" /> +
"0 0-5 14 * * ?"" /> Fire every minute starting at 2pm and ending at 2:05pm, every day" /> +
"0 10,44 14 ? 3 WED"" /> Fire at 2:10pm and at 2:44pm every Wednesday in the month of March." /> +
"0 15 10 ? * MON-FRI"" /> Fire at 10:15am every Monday, Tuesday, Wednesday, Thursday and Friday" /> +
"0 15 10 15 * ?"" /> Fire at 10:15am on the 15th day of every month" /> +
"0 15 10 L * ?"" /> Fire at 10:15am on the last day of every month" /> +
"0 15 10 ? * 6L"" /> Fire at 10:15am on the last Friday of every month" /> +
"0 15 10 ? * 6L"" /> Fire at 10:15am on the last Friday of every month" /> +
"0 15 10 ? * 6L 2002-2005"" /> Fire at 10:15am on every last friday of every month during the years 2002, 2003, 2004 and 2005" /> +
"0 15 10 ? * 6#3"" /> Fire at 10:15am on the third Friday of every month" /> +
+

+ +

+ Pay attention to the effects of '?' and '*' in the day-of-week and + day-of-month fields! +

+ +

+ NOTES: +

    +
  • Support for specifying both a day-of-week and a day-of-month value is + not complete (you'll need to use the '?' character in on of these fields). +
  • +
  • Be careful when setting fire times between mid-night and 1:00 AM - + "daylight savings" can cause a skip or a repeat depending on whether the + time moves back or jumps forward.
  • +
+

+
+ + + + Sharada Jambula + James House + Contributions from Mads Henderson +
+ + + The base abstract class to be extended by all triggers. + + +

+ s have a name and group associated with them, which + should uniquely identify them within a single . +

+ +

+ s are the 'mechanism' by which s + are scheduled. Many s can point to the same , + but a single can only point to one . +

+ +

+ Triggers can 'send' parameters/data to s by placing contents + into the on the . +

+
+ + + + + + + James House + Sharada Jambula +
+ + + The default value for priority. + + + + + Remove all s from the . + + + + + Create a with no specified name, group, or . + + + Note that the , and + the and properties + must be set before the can be placed into a + . + + + + + Create a with the given name, and default group. + + + Note that the and + properties must be set before the + can be placed into a . + + The name. + + + + Create a with the given name, and group. + + + Note that the and + properties must be set before the + can be placed into a . + + The name. + if , Scheduler.DefaultGroup will be used. + + + + Create a with the given name, and group. + + The name. + if , Scheduler.DefaultGroup will be used. + Name of the job. + The job group. + ArgumentException + if name is null or empty, or the group is an empty string. + + + + + Add the specified name of a to + the end of the 's list of listeners. + + Name of the listener. + + + + Remove the specified name of a + from the 's list of listeners. + + true if the given name was found in the list, and removed + + + + + This method should not be used by the Quartz client. +

+ Called when the has decided to 'fire' + the trigger (Execute the associated ), in order to + give the a chance to update itself for its next + triggering (if any). +

+ +
+ + +
+ + + This method should not be used by the Quartz client. + + +

+ Called by the scheduler at the time a is first + added to the scheduler, in order to have the + compute its first fire time, based on any associated calendar. +

+ +

+ After this method has been called, + should return a valid answer. +

+
+ + The first time at which the will be fired + by the scheduler, which is also the same value + will return (until after the first firing of the ). + +
+ + + This method should not be used by the Quartz client. + + + Called after the has executed the + associated with the + in order to get the final instruction code from the trigger. + + + is the that was used by the + 's method. + is the thrown by the + , if any (may be null). + + + One of the members. + + + + + + + + + + Used by the to determine whether or not + it is possible for this to fire again. +

+ If the returned value is then the + may remove the from the . +

+
+
+ + + Returns the next time at which the is scheduled to fire. If + the trigger will not fire again, will be returned. Note that + the time returned can possibly be in the past, if the time that was computed + for the trigger to next fire has already arrived, but the scheduler has not yet + been able to fire the trigger (which would likely be due to lack of resources + e.g. threads). + + + The value returned is not guaranteed to be valid until after the + has been added to the scheduler. + + + + + + + Returns the previous time at which the fired. + If the trigger has not yet fired, will be returned. + + + + + Returns the next time at which the will fire, + after the given time. If the trigger will not fire after the given time, + will be returned. + + + + + Validates the misfire instruction. + + The misfire instruction. + + + + + This method should not be used by the Quartz client. +

+ To be implemented by the concrete classes that extend this class. +

+

+ The implementation should update the 's state + based on the MISFIRE_INSTRUCTION_XXX that was selected when the + was created. +

+
+
+ + + This method should not be used by the Quartz client. +

+ The implementation should update the 's state + based on the given new version of the associated + (the state should be updated so that it's next fire time is appropriate + given the Calendar's new settings). +

+
+ + +
+ + + Validates whether the properties of the are + valid for submission into a . + + + + + Return a simple string representation of this object. + + + + + Compare the next fire time of this to that of + another. + + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + + Serves as a hash function for a particular type. is suitable for use in hashing algorithms and data structures like a hash table. + + + A hash code for the current . + + + + + Creates a new object that is a copy of the current instance. + + + A new object that is a copy of this instance. + + + + + Get or sets the name of this . + + If name is null or empty. + + + + Get the group of this . If , Scheduler.DefaultGroup will be used. + + + if group is an empty string. + + + + + Get or set the name of the associated . + + + if jobName is null or empty. + + + + + Gets or sets the name of the associated 's + group. If set with , Scheduler.DefaultGroup will be used. + + ArgumentException + if group is an empty string. + + + + + Returns the 'full name' of the in the format + "group.name". + + + + + Gets the key. + + The key. + + + + Returns the 'full name' of the that the + points to, in the format "group.name". + + + + + Get or set the description given to the instance by + its creator (if any). + + + + + Get or set the with the given name with + this Trigger. Use when setting to dis-associate a Calendar. + + + + + Get or set the that is associated with the + . +

+ Changes made to this map during job execution are not re-persisted, and + in fact typically result in an illegal state. +

+
+
+ + + Whether or not the should be persisted in the + for re-use after program restarts. +

+ If not explicitly set, the default value is . +

+
+
+ + + Returns an array of s containing the names of all + s assigned to the , + in the order in which they should be notified. + + + + + Returns the last UTC time at which the will fire, if + the Trigger will repeat indefinitely, null will be returned. +

+ Note that the return time *may* be in the past. +

+
+
+ + + Get or set the instruction the should be given for + handling misfire situations for this - the + concrete type that you are using will have + defined a set of additional MISFIRE_INSTRUCTION_XXX + constants that may be passed to this method. +

+ If not explicitly set, the default value is . +

+
+ + + + +
+ + + This method should not be used by the Quartz client. +

+ Usable by + implementations, in order to facilitate 'recognizing' instances of fired + s as their jobs complete execution. +

+
+
+ + + Returns the date/time on which the trigger must stop firing. This + defines the final boundary for trigger firings 舒 the trigger will + not fire after to this date and time. If this value is null, no end time + boundary is assumed, and the trigger can continue indefinitely. + + Sets the date/time on which the trigger must stop firing. This defines + the final boundary for trigger firings 舒 the trigger will not + fire after to this date and time. If this value is null, no end time + boundary is assumed, and the trigger can continue indefinitely. + + + + + The time at which the trigger's scheduling should start. May or may not + be the first actual fire time of the trigger, depending upon the type of + trigger and the settings of the other properties of the trigger. However + the first actual first time will not be before this date. + + + Setting a value in the past may cause a new trigger to compute a first + fire time that is in the past, which may cause an immediate misfire + of the trigger. + + + + + Tells whether this Trigger instance can handle events + in millisecond precision. + + + + + The priority of a acts as a tie breaker such that if + two s have the same scheduled fire time, then Quartz + will do its best to give the one with the higher priority first access + to a worker thread. + + + If not explicitly set, the default value is 5. + + + + + + + Gets a value indicating whether this instance has additional properties + that should be considered when for example saving to database. + + + If trigger implementation has additional properties that need to be saved + with base properties you need to make your class override this property with value true. + Returning true will effectively mean that ADOJobStore needs to serialize + this trigger instance to make sure additional properties are also saved. + + + true if this instance has additional properties; otherwise, false. + + + + + Create a with no settings. + + + The start-time will also be set to the current time, and the time zone + will be set the the system's default time zone. + + + + + Create a with the given name and default group. + + + The start-time will also be set to the current time, and the time zone + will be set the the system's default time zone. + + The name. + + + + Create a with the given name and group. + + + The start-time will also be set to the current time, and the time zone + will be set the the system's default time zone. + + The name. + The group. + + + + Create a with the given name, group and + expression. + + + The start-time will also be set to the current time, and the time zone + will be set the the system's default time zone. + + The name. + The group. + The cron expression. + + + + Create a with the given name and group, and + associated with the identified . + + + The start-time will also be set to the current time, and the time zone + will be set the the system's default time zone. + + The name. + The group. + Name of the job. + The job group. + + + + Create a with the given name and group, + associated with the identified , + and with the given "cron" expression. + + + The start-time will also be set to the current time, and the time zone + will be set the the system's default time zone. + + The name. + The group. + Name of the job. + The job group. + The cron expression. + + + + Create a with the given name and group, + associated with the identified , + and with the given "cron" expression resolved with respect to the . + + The name. + The group. + Name of the job. + The job group. + The cron expression. + The time zone. + + + + Create a that will occur at the given time, + until the given end time. +

+ If null, the start-time will also be set to the current time, the time + zone will be set the the system's default. +

+
+ The name. + The group. + Name of the job. + The job group. + The start time. + The end time. + The cron expression. +
+ + + Create a with fire time dictated by the + resolved with respect to the specified + occuring from the until + the given . + + The name. + The group. + Name of the job. + The job group. + The start time. + The end time. + + + + Clones this instance. + + + + + + Returns the next time at which the is scheduled to fire. If + the trigger will not fire again, will be returned. Note that + the time returned can possibly be in the past, if the time that was computed + for the trigger to next fire has already arrived, but the scheduler has not yet + been able to fire the trigger (which would likely be due to lack of resources + e.g. threads). + + + The value returned is not guaranteed to be valid until after the + has been added to the scheduler. + + + + + + + Returns the previous time at which the fired. + If the trigger has not yet fired, will be returned. + + + + + + Sets the next fire time. +

+ This method should not be invoked by client code. +

+
+ The fire time. +
+ + + Sets the previous fire time. +

+ This method should not be invoked by client code. +

+
+ The fire time. +
+ + + Returns the next time at which the will fire, + after the given time. If the trigger will not fire after the given time, + will be returned. + + + + + + + Used by the to determine whether or not + it is possible for this to fire again. +

+ If the returned value is then the + may remove the from the . +

+
+ +
+ + + Validates the misfire instruction. + + The misfire instruction. + + + + + This method should not be used by the Quartz client. +

+ To be implemented by the concrete classes that extend this class. +

+

+ The implementation should update the 's state + based on the MISFIRE_INSTRUCTION_XXX that was selected when the + was created. +

+
+ +
+ + +

+ Determines whether the date and (optionally) time of the given Calendar + instance falls on a scheduled fire-time of this trigger. +

+ +

+ Equivalent to calling . +

+
+ The date to compare. + +
+ + + Determines whether the date and (optionally) time of the given Calendar + instance falls on a scheduled fire-time of this trigger. +

+ Note that the value returned is NOT validated against the related + ICalendar (if any). +

+
+ The date to compare + If set to true, the method will only determine if the + trigger will fire during the day represented by the given Calendar + (hours, minutes and seconds will be ignored). + +
+ + + Called when the has decided to 'fire' + the trigger (Execute the associated ), in order to + give the a chance to update itself for its next + triggering (if any). + + + + + + + Updates the trigger with new calendar. + + The calendar to update with. + The misfire threshold. + + + + Called by the scheduler at the time a is first + added to the scheduler, in order to have the + compute its first fire time, based on any associated calendar. +

+ After this method has been called, + should return a valid answer. +

+
+ + + the first time at which the will be fired + by the scheduler, which is also the same value + will return (until after the first firing of the ). + +
+ + + Gets the expression summary. + + + + + + Gets the next time to fire after the given time. + + The time to compute from. + + + + + NOT YET IMPLEMENTED: Returns the time before the given time + that this will fire. + + The date. + + + + + Gets or sets the cron expression string. + + The cron expression string. + + + + Set the CronExpression to the given one. The TimeZone on the passed-in + CronExpression over-rides any that was already set on the Trigger. + + The cron expression. + + + + Returns the date/time on which the trigger may begin firing. This + defines the initial boundary for trigger firings the trigger + will not fire prior to this date and time. + + + + + + Get or sets the time at which the CronTrigger should quit + repeating - even if repeastCount isn't yet satisfied. + + + + + Sets the time zone for which the of this + will be resolved. + + + If is set after this + property, the TimeZone setting on the CronExpression will "win". However + if is set after this property, the + time zone applied by this method will remain in effect, since the + string cron expression does not carry a time zone! + + The time zone. + + + + Returns the last UTC time at which the will fire, if + the Trigger will repeat indefinitely, null will be returned. +

+ Note that the return time *may* be in the past. +

+
+
+ + + Tells whether this Trigger instance can handle events + in millisecond precision. + + + + + + The interface to be implemented by s that provide a + mechanism for having their execution interrupted. It is NOT a requirment + for jobs to implement this interface - in fact, for most people, none of + their jobs will. + + +

+ The means of actually interrupting the Job must be implemented within the + itself (the method of this + interface is simply a means for the scheduler to inform the + that a request has been made for it to be interrupted). The mechanism that + your jobs use to interrupt themselves might vary between implementations. + However the principle idea in any implementation should be to have the + body of the job's periodically check some flag to + see if an interruption has been requested, and if the flag is set, somehow + abort the performance of the rest of the job's work. An example of + interrupting a job can be found in the java source for the class + Quartz.Examples.Example7.DumbInterruptableJob. It is legal to use + some combination of and + synchronization within and + in order to have the method block until the + signals that it has noticed the set flag. +

+ +

+ If the Job performs some form of blocking I/O or similar functions, you may + want to consider having the method store a + reference to the calling as a member variable. Then the + impplementation of this interfaces method can call + on that Thread. Before attempting this, make + sure that you fully understand what + does and doesn't do. Also make sure that you clear the Job's member + reference to the Thread when the Execute(..) method exits (preferrably in a + block. +

+
+ + + James House +
+ + + Called by the when a user + interrupts the . + + void (nothing) if job interrupt is successful. + + + + Scheduler constants. + + + + + A (possibly) usefull constant that can be used for specifying the group + that and instances belong to. + + + + + A constant group name used internally by the + scheduler - clients should not use the value of this constant + ("MANUAL_TRIGGER") for thename of a 's group. + + + + + A constant group name used internally by the + scheduler - clients should not use the value of this constant + ("RECOVERING_JOBS") for thename of a 's group. + + + + + A constant group name used internally by the + scheduler - clients should not use the value of this constant + ("FAILED_OVER_JOBS") for thename of a 's group. + + + + + A constant key that can be used to retrieve the + name of the original from a recovery trigger's + data map in the case of a job recovering after a failed scheduler + instance. + + + + + + A constant key that can be used to retrieve the + group of the original from a recovery trigger's + data map in the case of a job recovering after a failed scheduler + instance. + + + + + + A constant key that can be used to retrieve the + scheduled fire time of the original from a recovery + trigger's data map in the case of a job recovering after a failed scheduler + instance. + + + + + + Holds state information for instances. + + + instances are stored once when the + is added to a scheduler. They are also re-persisted after every execution of + instances. +

+ instances can also be stored with a + . This can be useful in the case where you have a Job + that is stored in the scheduler for regular/repeated use by multiple + Triggers, yet with each independent triggering, you want to supply the + Job with different data inputs. +

+

+ The passed to a Job at execution time + also contains a convenience that is the result + of merging the contents of the trigger's JobDataMap (if any) over the + Job's JobDataMap (if any). +

+
+ + + + + James House +
+ + + Create an empty . + + + + + Create a with the given data. + + + + + Adds the given value as a string version to the + 's data map. + + + + + Adds the given value as a string version to the + 's data map. + + + + + Adds the given value as a string version to the + 's data map. + + + + + Adds the given value as a string version to the + 's data map. + + + + + Adds the given value as a string version to the + 's data map. + + + + + Adds the given value as a string version to the + 's data map. + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the + . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Gets the date time. + + The key. + + + + + Gets the value behind the specified key. + + The key. + + + + + Conveys the detail properties of a given instance. + + + Quartz does not store an actual instance of a type, but + instead allows you to define an instance of one, through the use of a . +

+ s have a name and group associated with them, which + should uniquely identify them within a single . +

+

+ s are the 'mechanism' by which s + are scheduled. Many s can point to the same , + but a single can only point to one . +

+
+ + + + + James House + Sharada Jambula +
+ + + Create a with no specified name or group, and + the default settings of all the other properties. +

+ Note that the , and + properties must be set before the job can be + placed into a . +

+
+
+ + + Create a with the given name, default group, and + the default settings of all the other properties. + If , Scheduler.DefaultGroup will be used. + + + If name is null or empty, or the group is an empty string. + + + + + Create a with the given name, and group, and + the default settings of all the other properties. + If , Scheduler.DefaultGroup will be used. + + + If name is null or empty, or the group is an empty string. + + + + + Create a with the given name, and group, and + the given settings of all the other properties. + + The name. + if , Scheduler.DefaultGroup will be used. + Type of the job. + if set to true, job will be volatile. + if set to true, job will be durable. + if set to true, job will request recovery. + + ArgumentException if name is null or empty, or the group is an empty string. + + + + + Validates whether the properties of the are + valid for submission into a . + + + + + Add the specified name of a to the + end of the 's list of listeners. + + + + + Remove the specified name of a from + the 's list of listeners. + + true if the given name was found in the list, and removed + + + + Return a simple string representation of this object. + + + + + Creates a new object that is a copy of the current instance. + + + A new object that is a copy of this instance. + + + + + Determines whether the specified detail is equal to this instance. + + The detail to examine. + + true if the specified detail is equal; otherwise, false. + + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + if the specified is equal to the + current ; otherwise, . + + + + + Checks equality between given job detail and this instance. + + The detail to compare this instance with. + + + + + Serves as a hash function for a particular type, suitable + for use in hashing algorithms and data structures like a hash table. + + + A hash code for the current . + + + + + Get or sets the name of this . + + + if name is null or empty. + + + + + Get or sets the group of this . + If , will be used. + + + If the group is an empty string. + + + + + Returns the 'full name' of the in the format + "group.name". + + + + + Gets the key. + + The key. + + + + Get or set the description given to the instance by its + creator (if any). + + + May be useful for remembering/displaying the purpose of the job, though the + description has no meaning to Quartz. + + + + + Get or sets the instance of that will be executed. + + + if jobType is null or the class is not a . + + + + + Get or set the that is associated with the . + + + + + Set whether or not the the should re-Execute + the if a 'recovery' or 'fail-over' situation is + encountered. +

+ If not explicitly set, the default value is . +

+
+ +
+ + + Whether or not the should not be persisted in the + for re-use after program + restarts. +

+ If not explicitly set, the default value is . +

+
+ if the should be garbage + collected along with the . + +
+ + + Whether or not the should remain stored after it is + orphaned (no s point to it). +

+ If not explicitly set, the default value is . +

+
+ + if the Job should remain persisted after + being orphaned. + +
+ + + Whether or not the implements the interface . + + + + + Gets or sets an array of s containing the names of all + s assigned to the , + in the order in which they should be notified. Setting the array + clears any listener names that were in the list. + + + + + A context bundle containing handles to various environment information, that + is given to a instance as it is + executed, and to a instance after the + execution completes. + + +

+ The found on this object (via the + method) serves as a convenience - + it is a merge of the found on the + and the one found on the , with + the value in the latter overriding any same-named values in the former. + It is thus considered a 'best practice' that the Execute code of a Job + retrieve data from the JobDataMap found on this object NOTE: Do not + expect value 'set' into this JobDataMap to somehow be set back onto a + 's own JobDataMap. +

+ +

+ s are also returned from the + + method. These are the same instances as those past into the jobs that are + currently executing within the scheduler. The exception to this is when your + application is using Quartz remotely (i.e. via RMI) - in which case you get + a clone of the s, and their references to + the and instances have been lost (a + clone of the is still available - just not a handle + to the job instance that is running). +

+
+ + + + + + James House +
+ + + Create a JobExcecutionContext with the given context data. + + + + + Increments the refire count. + + + + + Returns a that represents the current . + + + A that represents the current . + + + + + Put the specified value into the context's data map with the given key. + Possibly useful for sharing data between listeners and jobs. +

+ NOTE: this data is volatile - it is lost after the job execution + completes, and all TriggerListeners and JobListeners have been + notified. +

+
+ + + + +
+ + + Get the value with the given key from the context's data map. + + + + + + + Get a handle to the instance that fired the + . + + + + + Get a handle to the instance that fired the + . + + + + + Get a handle to the referenced by the + instance that fired the . + + + + + If the is being re-executed because of a 'recovery' + situation, this method will return . + + + + + Gets the refire count. + + The refire count. + + + + Get the convenience of this execution context. + + +

+ The found on this object serves as a convenience - + it is a merge of the found on the + and the one found on the , with + the value in the latter overriding any same-named values in the former. + It is thus considered a 'best practice' that the Execute code of a Job + retrieve data from the JobDataMap found on this object. +

+ +

NOTE: Do not expect value 'set' into this JobDataMap to somehow be + set back onto a 's own JobDataMap. +

+ +

+ Attempts to change the contents of this map typically result in an + illegal state. +

+ +
+
+ + + Get the associated with the . + + + + + Get the instance of the that was created for this + execution. +

+ Note: The Job instance is not available through remote scheduler + interfaces. +

+
+
+ + + The actual time the trigger fired. For instance the scheduled time may + have been 10:00:00 but the actual fire time may have been 10:00:03 if + the scheduler was too busy. + + Returns the fireTimeUtc. + + + + + The scheduled time the trigger fired for. For instance the scheduled + time may have been 10:00:00 but the actual fire time may have been + 10:00:03 if the scheduler was too busy. + + Returns the scheduledFireTimeUtc. + + + + + Gets the previous fire time. + + The previous fire time. + + + + Gets the next fire time. + + The next fire time. + + + + Returns the result (if any) that the set before its + execution completed (the type of object set as the result is entirely up + to the particular job). + + +

+ The result itself is meaningless to Quartz, but may be informative + to s or + s that are watching the job's + execution. +

+ + Set the result (if any) of the 's execution (the type of + object set as the result is entirely up to the particular job). + +

+ The result itself is meaningless to Quartz, but may be informative + to s or + s that are watching the job's + execution. +

+
+
+ + + The amount of time the job ran for. The returned + value will be until the job has actually completed (or thrown an + exception), and is therefore generally only useful to + s and s. + + + + + An exception that can be thrown by a + to indicate to the Quartz that an error + occured while executing, and whether or not the requests + to be re-fired immediately (using the same , + or whether it wants to be unscheduled. + + + Note that if the flag for 'refire immediately' is set, the flags for + unscheduling the Job are ignored. + + + + + James House + + + + Create a JobExcecutionException, with the 're-fire immediately' flag set + to . + + + + + Create a JobExcecutionException, with the given cause. + + The cause. + + + + Create a JobExcecutionException, with the given message. + + + + + Initializes a new instance of the class. + + The message. + The original cause. + + + + Create a JobExcecutionException with the 're-fire immediately' flag set + to the given value. + + + + + Create a JobExcecutionException with the given underlying exception, and + the 're-fire immediately' flag set to the given value. + + + + + Create a JobExcecutionException with the given message, and underlying + exception, and the 're-fire immediately' flag set to the given value. + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + Creates and returns a string representation of the current exception. + + + A string representation of the current exception. + + + + + + Gets or sets a value indicating whether to unschedule firing trigger. + + + true if firing trigger should be unscheduled; otherwise, false. + + + + + Gets or sets a value indicating whether to unschedule all triggers. + + + true if all triggers should be unscheduled; otherwise, false. + + + + + Gets or sets a value indicating whether to refire immediately. + + true if to refire immediately; otherwise, false. + + + + Misfire instructions. + + + + + Instruction not set (yet). + + + + + Use smart policy. + + + + + Misfire policy settings for SimpleTrigger. + + + + + Instructs the that upon a mis-fire + situation, the wants to be fired + now by . +

+ NOTE: This instruction should typically only be used for + 'one-shot' (non-repeating) Triggers. If it is used on a trigger with a + repeat count > 0 then it is equivalent to the instruction + . +

+
+
+ + + Instructs the that upon a mis-fire + situation, the wants to be + re-scheduled to 'now' (even if the associated + excludes 'now') with the repeat count left as-is. This does obey the + end-time however, so if 'now' is after the + end-time the will not fire again. + + +

+ NOTE: Use of this instruction causes the trigger to 'forget' + the start-time and repeat-count that it was originally setup with (this + is only an issue if you for some reason wanted to be able to tell what + the original values were at some later time). +

+
+
+ + + Instructs the that upon a mis-fire + situation, the wants to be + re-scheduled to 'now' (even if the associated + excludes 'now') with the repeat count set to what it would be, if it had + not missed any firings. This does obey the end-time + however, so if 'now' is after the end-time the will + not fire again. + +

+ NOTE: Use of this instruction causes the trigger to 'forget' + the start-time and repeat-count that it was originally setup with. + Instead, the repeat count on the trigger will be changed to whatever + the remaining repeat count is (this is only an issue if you for some + reason wanted to be able to tell what the original values were at some + later time). +

+ +

+ NOTE: This instruction could cause the + to go to the 'COMPLETE' state after firing 'now', if all the + repeat-fire-times where missed. +

+
+
+ + + Instructs the that upon a mis-fire + situation, the wants to be + re-scheduled to the next scheduled time after 'now' - taking into + account any associated , and with the + repeat count set to what it would be, if it had not missed any firings. + + + NOTE/WARNING: This instruction could cause the + to go directly to the 'COMPLETE' state if all fire-times where missed. + + + + + Instructs the that upon a mis-fire + situation, the wants to be + re-scheduled to the next scheduled time after 'now' - taking into + account any associated , and with the + repeat count left unchanged. + + +

+ NOTE/WARNING: This instruction could cause the + to go directly to the 'COMPLETE' state if all the end-time of the trigger + has arrived. +

+
+
+ + + misfire instructions for CronTrigger + + + + + Instructs the that upon a mis-fire + situation, the wants to be fired now + by . + + + + + Instructs the that upon a mis-fire + situation, the wants to have it's + next-fire-time updated to the next time in the schedule after the + current time (taking into account any associated , + but it does not want to be fired now. + + + + + misfire instructions for NthIncludedDayTrigger + + + + + Instructs the that upon a mis-fire situation, the + wants to be fired now by the + + + + + + Instructs the that upon a mis-fire situation, the + wants to have + nextFireTime updated to the next time in the schedule after + the current time, but it does not want to be fired now. + + + + + A trigger which fires on the Nth day of every interval type + , or + that is not excluded by the associated + calendar. + + + When determining what the Nth day of the month or year + is, will skip excluded days on the + associated calendar. This would commonly be used in an Nth + business day situation, in which the user wishes to fire a particular job on + the Nth business day (i.e. the 5th business day of + every month). Each also has an associated + which indicates at what time of day the trigger is + to fire. +

+ All s default to a monthly interval type + (fires on the Nth day of every month) with N = 1 (first + non-excluded day) and set to 12:00 PM (noon). These + values can be changed using the , , and + methods. Users may also want to note the + and + methods. +

+

+ Take, for example, the following calendar: +

+ + July August September + Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa + 1 W 1 2 3 4 5 W 1 2 W + W H 5 6 7 8 W W 8 9 10 11 12 W W H 6 7 8 9 W + W 11 12 13 14 15 W W 15 16 17 18 19 W W 12 13 14 15 16 W + W 18 19 20 21 22 W W 22 23 24 25 26 W W 19 20 21 22 23 W + W 25 26 27 28 29 W W 29 30 31 W 26 27 28 29 30 + W + + Where W's represent weekend days, and H's represent holidays, all of which + are excluded on a calendar associated with an + with n=5 and + intervalType=IntervalTypeMonthly. In this case, the trigger + would fire on the 8th of July (because of the July 4 holiday), + the 5th of August, and the 8th of September (because + of Labor Day). +
+ Aaron Craven +
+ + + Indicates a monthly trigger type (fires on the Nth included + day of every month). + + + + indicates a yearly trigger type (fires on the Nth included + day of every year). + + + + + Indicates a weekly trigger type (fires on the Nth included + day of every week). When using this interval type, care must be taken + not to think of the value of as an analog to + . Such a comparison can only + be drawn when there are no calendars associated with the trigger. To + illustrate, consider an with + n = 3 which is associated with a Calendar excluding + non-weekdays. The trigger would fire on the 3rd + included day of the week, which would be 4th + actual day of the week. + + + + + Create an with no specified name, + group, or . This will result initially in a + default monthly trigger that fires on the first day of every month at + 12:00 PM (n = 1, + intervalType=, + fireAtTime="12:00"). + + + Note that , , + , and , must be + called before the can be placed into + a . + + + + + Create an with the given name and + default group but no specified . This will result + initially in a default monthly trigger that fires on the first day of + every month at 12:00 PM (=1, + intervalType=, + fireAtTime=12:00"). +

+ Note that and must + be called before the can be placed + into a . +

+
+ the name for the +
+ + + Create an with the given name and + group but no specified . This will result + initially in a default monthly trigger that fires on the first day of + every month at 12:00 PM (=1, + intervalType=, + fireAtTime=12:00"). +

+ Note that and must + be called before the can be placed + into a . +

+
+ the name for the + + the group for the + +
+ + + Create an with the given name and + group and the specified . This will result + initially in a default monthly trigger that fires on the first day of + every month at 12:00 PM (=1, + intervalType=, + fireAtTime="12:00"). + + The name for the . + The group for the . + The name of the job to associate with the . + The group containing the job to associate with the . + + + + Returns the next UTC time at which the + will fire. If the trigger will not fire again, will be + returned. + + +

+ Because of the conceptual design of , + it is not always possible to decide with certainty that the trigger + will never fire again. Therefore, it will search for the next + fire time up to a given cutoff. These cutoffs can be changed by using the + property. The default cutoff is 12 + of the intervals specified by intervalType. +

+

+ The returned value is not guaranteed to be valid until after + the trigger has been added to the scheduler. +

+
+ the next fire time for the trigger + +
+ + + Returns the previous UTC time at which the + fired. If the trigger has not yet + fired, will be returned. + + the previous fire time for the trigger + + + + Returns the first time the will fire + after the specified date. + + +

+ Because of the conceptual design of , + it is not always possible to decide with certainty that the trigger + will never fire again. Therefore, it will search for the next + fire time up to a given cutoff. These cutoffs can be changed by using the + property. The default cutoff is 12 + of the intervals specified by intervalType. +

+

+ Therefore, for triggers with intervalType = + , if the trigger + will not fire within 12 + weeks after the given date/time, will be returned. For + triggers with intervalType = + + , if the trigger will not fire within 12 + months after the given date/time, will be returned. + For triggers with intervalType = + + , if the trigger will not fire within 12 + years after the given date/time, will be returned. In + all cases, if the trigger will not fire before , + will be returned. +

+
+ The time after which to find the nearest fire time. + This argument is treated as exclusive 舒 that is, + if afterTime is a valid fire time for the trigger, it + will not be returned as the next fire time. + + + the first time the trigger will fire following the specified date + +
+ + + Called when the has decided to 'fire' the trigger + (Execute the associated ), in order to give the + a chance to update itself for its next triggering + (if any). + + + + + Called by the scheduler at the time a is first + added to the scheduler, in order to have the + compute its first fire time, based on any associated calendar. +

+ After this method has been called, + should return a valid answer. +

+ +
+ the first time at which the will be fired + by the scheduler, which is also the same value + will return (until after the first + firing of the ). + +
+ + + Called after the has executed the + associated with the in order + to get the final instruction code from the trigger. + + + The that was used by the + 's method. + + + The thrown by the + , if any (may be ) + + one of the Trigger.INSTRUCTION_XXX constants. + + + + + Used by the to determine whether or not it is + possible for this to fire again. + ' + +

+ If the returned value is then the + may remove the from the + +

+
+ + A boolean indicator of whether the trigger could potentially fire + again. + +
+ + + Indicates whether is a valid misfire + instruction for this . + + Whether is valid. + + + Updates the 's state based on the + MisfireInstruction that was selected when the + was created +

+ If the misfire instruction is set to MISFIRE_INSTRUCTION_SMART_POLICY, + then the instruction will be interpreted as + . +

+
+ a new or updated calendar to use for the trigger + +
+ + + Updates the 's state based on the + given new version of the associated . + + A new or updated calendar to use for the trigger + the amount of time that must + be between "now" and the time the next + firing of the trigger is supposed to occur. + + + + + Calculates the first time an with + intervalType = IntervalTypeWeekly will fire + after the specified date. See for more + information. + + The time after which to find the nearest fire time. + This argument is treated as exclusive 舒 that is, + if afterTime is a valid fire time for the trigger, it + will not be returned as the next fire time. + + the first time the trigger will fire following the specified + date + + + + + Calculates the first UTC time an with + intervalType = will fire + after the specified date. See for more + information. + + + The UTC time after which to find the nearest fire time. + This argument is treated as exclusive 舒 that is, + if afterTime is a valid fire time for the trigger, it + will not be returned as the next fire time. + + the first time the trigger will fire following the specified date + + + + Calculates the first time an with + intervalType = will fire + after the specified date. See for more + information. + + + The UTC time after which to find the nearest fire time. + This argument is treated as exclusive 舒 that is, + if afterTime is a valid fire time for the trigger, it + will not be returned as the next fire time. + + the first time the trigger will fire following the specified + date + + + + + Gets or sets the day of the interval on which the + should fire. If the Nth + day of the interval does not exist (i.e. the 32nd of a + month), the trigger simply will never fire. N may not be less than 1. + + + + + Returns the interval type for the . + + + Sets the interval type for the . If + , the trigger will fire on the + Nth included day of every month. If + , the trigger will fire on the + Nth included day of every year. If + , the trigger will fire on the + Nth included day of every week. + + + + + + + + Returns the fire time for the as a + string with the format "HH:MM[:SS]", with HH representing the + 24-hour clock hour of the fire time. Seconds are optional and their + inclusion depends on whether or not they were provided to + . + + + + + Returns the for the + . + + +

+ Because of the conceptual design of , + it is not always possible to decide with certainty that the trigger + will never fire again. Therefore, it will search for the next + fire time up to a given cutoff. These cutoffs can be changed by using the + property. The default cutoff is 12 + of the intervals specified by intervalType" />. +

+

+ Because of the conceptual design of , + it is not always possible to decide with certainty that the trigger + will never fire again. Therefore, it will search for the next + fire time up to a given cutoff. These cutoffs can be changed by using the + method. The default cutoff is 12 + of the intervals specified by intervalType". +

+

+ In most cases, the default value of this setting (12) is sufficient (it + is highly unlikely, for example, that you will need to look at more than + 12 months of dates to ensure that your trigger will never fire again). + However, this setting is included to allow for the rare exceptions where + this might not be true. +

+

+ For example, if your trigger is associated with a calendar that excludes + a great many dates in the next 12 months, and hardly any following that, + it is possible (if is large enough) that you could run + into this situation. +

+
+
+ + + Returns the last UTC time the will fire. + If the trigger will not fire at any point between + and , will be returned. + + the last time the trigger will fire. + + + + Tells whether this Trigger instance can handle events + in millisecond precision. + + + + + + Sets or gets the time zone in which the will be resolved. + If no time zone is provided, then the default time zone will be used. + + + + + + + Gets or sets the trigger's calendar week rule. + + The trigger calendar week rule. + + + + Gets or sets the trigger's calendar first day of week rule. + + The trigger calendar first day of week. + + + + An exception that is thrown to indicate that an attempt to store a new + object (i.e. , + or ) in a + failed, because one with the same name and group already exists. + + James House + + +

+ Create a with the given + message. +

+
+
+ + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + +

+ Create a and auto-generate a + message using the name/group from the given . +

+ +

+ The message will read:
"Unable to store Job with name: '__' and + group: '__', because one already exists with this identification." +

+
+
+ +

+ Create a and auto-generate a + message using the name/group from the given . +

+ +

+ The message will read:
"Unable to store Trigger with name: '__' and + group: '__', because one already exists with this identification." +

+
+
+ + + An exception that is thrown to indicate that there is a misconfiguration of + the - or one of the components it + configures. + + James House + + + + Create a with the given message. + + + + + Create a with the given message + and cause. + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + Holds context/environment data that can be made available to Jobs as they + are executed. + + + James House + + + + Create an empty . + + + + + Create a with the given data. + + + + + Instructs Scheduler what to do with a trigger and job. + + + + + Instructs the that the + has no further instructions. + + + + + Instructs the that the + wants the to re-Execute + immediately. If not in a 'RECOVERING' or 'FAILED_OVER' situation, the + execution context will be re-used (giving the the + abilitiy to 'see' anything placed in the context by its last execution). + + + + + Instructs the that the + should be put in the state. + + + + + Instructs the that the + wants itself deleted. + + + + + Instructs the that all + s referencing the same as + this one should be put in the state. + + + + + Instructs the that all + s referencing the same as + this one should be put in the state. + + + + + Instructs the that the + should be put in the state. + + + + + Describes the settings and capabilities of a given + instance. + + James House + + + + Initializes a new instance of the class. + + Name of the scheduler. + The scheduler instance. + The scheduler type. + if set to true, scheduler is a remote scheduler. + if set to true, scheduler is started. + if set to true, scheduler is in standby mode. + if set to true, scheduler is shutdown. + The start time. + The number of jobs executed. + The job store type. + if set to true, job store is persistent. + The thread pool type. + Size of the thread pool. + The version string. + + + + Returns a formatted (human readable) string describing all the 's + meta-data values. + + +

+ The format of the string looks something like this: +

+            Quartz Scheduler 'SchedulerName' with instanceId 'SchedulerInstanceId' Scheduler class: 'Quartz.Impl.StdScheduler' - running locally. Running since: '11:33am on Jul 19, 2002' Not currently paused. Number of Triggers fired: '123' Using thread pool 'Quartz.Simpl.SimpleThreadPool' - with '8' threads Using job-store 'Quartz.Impl.JobStore' - which supports persistence.
+            
+

+
+
+ + + Return a simple string representation of this object. + + + + + Returns the name of the . + + + + + Returns the instance Id of the . + + + + + Returns the class-name of the instance. + + + + + Returns whether the is being used remotely (via remoting). + + + + + Returns whether the scheduler has been started. + + + Note: may return even if + returns . + + + + + Reports whether the is in standby mode. + + + Note: may return even if + returns . + + + + + Reports whether the has been Shutdown. + + + + + Returns the class-name of the instance that is + being used by the . + + + + + Returns the type name of the instance that is + being used by the . + + + + + Returns the number of threads currently in the 's + + + + + Returns the version of Quartz that is running. + + + + + Returns the at which the Scheduler started running. + + null if the scheduler has not been started. + + + + + Returns the number of jobs executed since the + started.. + + + + + Returns whether or not the 's + instance supports persistence. + + + + + A concrete that is used to fire a + at a given moment in time, and optionally repeated at a specified interval. + + + + + + James House + Contributions by Lieven Govaerts of Ebitec Nv, Belgium. + Marko Lahma (.NET) + + + + Used to indicate the 'repeat count' of the trigger is indefinite. Or in + other words, the trigger should repeat continually until the trigger's + ending timestamp. + + + + + Create a with no settings. + + + + + Create a that will occur immediately, and + not repeat. + + + + + Create a that will occur immediately, and + not repeat. + + + + + Create a that will occur immediately, and + repeat at the the given interval the given number of times. + + + + + Create a that will occur immediately, and + repeat at the the given interval the given number of times. + + + + + Create a that will occur at the given time, + and not repeat. + + + + + Create a that will occur at the given time, + and not repeat. + + + + + Create a that will occur at the given time, + and repeat at the the given interval the given number of times, or until + the given end time. + + The name. + A UTC set to the time for the to fire. + A UTC set to the time for the + to quit repeat firing. + The number of times for the to repeat + firing, use for unlimited times. + The time span to pause between the repeat firing. + + + + Create a that will occur at the given time, + and repeat at the the given interval the given number of times, or until + the given end time. + + The name. + The group. + A UTC set to the time for the to fire. + A UTC set to the time for the + to quit repeat firing. + The number of times for the to repeat + firing, use for unlimited times. + The time span to pause between the repeat firing. + + + + Create a that will occur at the given time, + fire the identified and repeat at the the given + interval the given number of times, or until the given end time. + + The name. + The group. + Name of the job. + The job group. + A set to the time for the + to fire. + A set to the time for the + to quit repeat firing. + The number of times for the to repeat + firing, use RepeatIndefinitely for unlimited times. + The time span to pause between the repeat firing. + + + + Validates the misfire instruction. + + The misfire instruction. + + + + + Updates the 's state based on the + MisfireInstruction value that was selected when the + was created. + + + If MisfireSmartPolicyEnabled is set to true, + then the following scheme will be used:
+
    +
  • If the Repeat Count is 0, then the instruction will + be interpreted as .
  • +
  • If the Repeat Count is , then + the instruction will be interpreted as . + WARNING: using MisfirePolicy.SimpleTrigger.RescheduleNowWithRemainingRepeatCount + with a trigger that has a non-null end-time may cause the trigger to + never fire again if the end-time arrived during the misfire time span. +
  • +
  • If the Repeat Count is > 0, then the instruction + will be interpreted as . +
  • +
+
+
+ + + Called when the has decided to 'fire' + the trigger (Execute the associated ), in order to + give the a chance to update itself for its next + triggering (if any). + + + + + + Updates the instance with new calendar. + + The calendar. + The misfire threshold. + + + + Called by the scheduler at the time a is first + added to the scheduler, in order to have the + compute its first fire time, based on any associated calendar. +

+ After this method has been called, + should return a valid answer. +

+
+ + The first time at which the will be fired + by the scheduler, which is also the same value + will return (until after the first firing of the ). + +
+ + + Returns the next time at which the will + fire. If the trigger will not fire again, will be + returned. The value returned is not guaranteed to be valid until after + the has been added to the scheduler. + + + + + Returns the previous time at which the fired. + If the trigger has not yet fired, will be + returned. + + + + + Set the next UTC time at which the should fire. + This method should not be invoked by client code. + + + + + Set the previous UTC time at which the fired. + This method should not be invoked by client code. + + + + + Returns the next UTC time at which the will + fire, after the given UTC time. If the trigger will not fire after the given + time, will be returned. + + + + + Returns the last UTC time at which the will + fire, before the given time. If the trigger will not fire before the + given time, will be returned. + + + + + Computes the number of times fired between the two UTC date times. + + The UTC start date and time. + The UTC end date and time. + + + + + Determines whether or not the will occur + again. + + + + + Validates whether the properties of the are + valid for submission into a . + + + + + Get or set thhe number of times the should + repeat, after which it will be automatically deleted. + + + + + + Get or set the the time interval at which the should repeat. + + + + + Get or set the number of times the has already + fired. + + + + + Returns the final UTC time at which the will + fire, if repeatCount is RepeatIndefinitely, null will be returned. +

+ Note that the return time may be in the past. +

+
+
+ + + Tells whether this Trigger instance can handle events + in millisecond precision. + + + + + + All trigger states known to Scheduler. + + + + + Indicates that the is in the "normal" state. + + + + + Indicates that the is in the "paused" state. + + + + + Indicates that the is in the "complete" state. + + + "Complete" indicates that the trigger has not remaining fire-times in + its schedule. + + + + + Indicates that the is in the "error" state. + + +

+ A arrives at the error state when the scheduler + attempts to fire it, but cannot due to an error creating and executing + its related job. Often this is due to the 's + class not existing in the classpath. +

+ +

+ When the trigger is in the error state, the scheduler will make no + attempts to fire it. +

+
+
+ + + Indicates that the is in the "blocked" state. + + + A arrives at the blocked state when the job that + it is associated with is a and it is + currently executing. + + + + + + Indicates that the does not exist. + + + + + Convenience and utility methods for simplifying the construction and + configuration of s. + + + Please submit suggestions for additional convenience methods to either the + Quartz user forum or the developer's mail list at + source forge. + + + + James House + + + + Constant indicating last day of month. + + + + + Milliseconds in minute. + + + + + Milliseconds in hour. + + + + + Seconds in day. + + + + + Milliseconds in day. + + + + + Initializes a new instance of the class. + + + + + Set the given 's name to the given value, and its + group to the default group (). + + the tigger to change name to + the new trigger name + + + + Set the given 's name to the given value, and its + group to the given group. + + the tigger to change name to + the new trigger name + the new trigger group + + + + Make a trigger that will fire every day at the given time. +

+ The generated trigger will not have its name, group, + or end-time set. The Start time defaults to 'now'. +

+
+ the hour (0-23) upon which to fire + the minute (0-59) upon which to fire + the new trigger +
+ + + Make a trigger that will fire every day at the given time. +

+ The generated trigger will not have its group or end-time set. + The Start time defaults to 'now'. +

+
+ the trigger's name + the hour (0-23) upon which to fire + the minute (0-59) upon which to fire + the newly created trigger +
+ + + Make a trigger that will fire every week at the given day and time. +

+ The generated trigger will not have its name, group, + or end-time set. The Start time defaults to 'now'. +

+
+ (1-7) the day of week upon which to fire + the hour (0-23) upon which to fire + the minute (0-59) upon which to fire + the new trigger +
+ + + Make a trigger that will fire every week at the given day and time. +

+ The generated trigger will not have its group, + or end-time set. The Start time defaults to 'now'. +

+
+ the trigger's name + the day of week upon which to fire + the hour (0-23) upon which to fire + the minute (0-59) upon which to fire + the newly created trigger +
+ + + Make a trigger that will fire every month at the given day and time. +

+ The generated trigger will not have its name, group, + or end-time set. The Start time defaults to 'now'. +

+

+ If the day of the month specified does not occur in a given month, a + firing will not occur that month. (i.e. if dayOfMonth is specified as + 31, no firing will occur in the months of the year with fewer than 31 + days). +

+
+ (1-31, or -1) the day of week upon which to fire + the hour (0-23) upon which to fire + the minute (0-59) upon which to fire + the newly created trigger +
+ + + Make a trigger that will fire every month at the given day and time. +

+ The generated trigger will not have its group, + or end-time set. The Start time defaults to 'now'. +

+

+ If the day of the month specified does not occur in a given month, a + firing will not occur that month. (i.e. if dayOfMonth is specified as + 31, no firing will occur in the months of the year with fewer than 31 + days). +

+
+ the trigger's name + (1-31, or -1) the day of week upon which to fire + the hour (0-23) upon which to fire + the minute (0-59) upon which to fire + the newly created trigger +
+ + + Make a trigger that will fire times, waiting + between each fire. + + + The generated trigger will not have its name, group, + or end-time set. The Start time defaults to 'now'. + + the newly created trigger + + + + Make a trigger that will fire times, waiting + between each fire. +

+ The generated trigger will not have its name, group, + or end-time set. The Start time defaults to 'now'. +

+
+ the trigger's name + the new trigger +
+ + + Make a trigger that will fire every second, indefinitely. +

+ The generated trigger will not have its name, group, + or end-time set. The Start time defaults to 'now'. +

+
+ the new trigger +
+ + + Make a trigger that will fire every second, indefinitely. +

+ The generated trigger will not have its group, + or end-time set. The Start time defaults to 'now'. +

+
+ the trigger's name + the new trigger +
+ + + Make a trigger that will fire every N seconds, indefinitely. +

+ The generated trigger will not have its name, group, + or end-time set. The Start time defaults to 'now'. +

+
+ the number of seconds between firings + the new trigger +
+ + + Make a trigger that will fire every N seconds, with the given number of + repeats. +

+ The generated trigger will not have its name, group, + or end-time set. The Start time defaults to 'now'. +

+
+ the number of seconds between firings + the number of times to repeat the firing + the new trigger +
+ + + Make a trigger that will fire every N seconds, with the given number of + repeats. +

+ The generated trigger will not have its group, + or end-time set. The Start time defaults to 'now'. +

+
+ the trigger's name + the number of seconds between firings + the number of times to repeat the firing + the new trigger +
+ + + Make a trigger that will fire every minute, indefinitely. +

+ The generated trigger will not have its name, group, + or end-time set. The Start time defaults to 'now'. +

+
+ the new trigger +
+ + + Make a trigger that will fire every minute, indefinitely. +

+ The generated trigger will not have its group, + or end-time set. The Start time defaults to 'now'. +

+
+ the trigger's name + the new trigger +
+ + + Make a trigger that will fire every N minutes, indefinitely. +

+ The generated trigger will not have its name, group, + or end-time set. The Start time defaults to 'now'. +

+
+ the number of minutes between firings + the new trigger +
+ + + Make a trigger that will fire every N minutes, with the given number of + repeats. +

+ The generated trigger will not have its name, group, + or end-time set. The Start time defaults to 'now'. +

+
+ the number of minutes between firings + the number of times to repeat the firing + the new trigger +
+ + + Make a trigger that will fire every N minutes, with the given number of + repeats. +

+ The generated trigger will not have its group, + or end-time set. The Start time defaults to 'now'. +

+
+ the trigger's name + the number of minutes between firings + the number of times to repeat the firing + the new trigger +
+ + + Make a trigger that will fire every hour, indefinitely. +

+ The generated trigger will not have its name, group, + or end-time set. The Start time defaults to 'now'. +

+
+ the new trigger +
+ + + Make a trigger that will fire every hour, indefinitely. +

+ The generated trigger will not have its group, + or end-time set. The Start time defaults to 'now'. +

+
+ the trigger's name + the new trigger +
+ + + Make a trigger that will fire every N hours, indefinitely. +

+ The generated trigger will not have its name, group, + or end-time set. The Start time defaults to 'now'. +

+
+ the number of hours between firings + the new trigger +
+ + + Make a trigger that will fire every N hours, with the given number of + repeats. +

+ The generated trigger will not have its name, group, + or end-time set. The Start time defaults to 'now'. +

+
+ the number of hours between firings + the number of times to repeat the firing + the new trigger +
+ + + Make a trigger that will fire every N hours, with the given number of + repeats. +

+ The generated trigger will not have its group, + or end-time set. The Start time defaults to 'now'. +

+
+ the trigger's name + the number of hours between firings + the number of times to repeat the firing + the new trigger +
+ + + Returns a date that is rounded to the next even hour above the given + date. +

+ For example an input date with a time of 08:13:54 would result in a date + with the time of 09:00:00. If the date's time is in the 23rd hour, the + date's 'day' will be promoted, and the time will be set to 00:00:00. +

+
+ the Date to round, if the current time will + be used + the new rounded date +
+ + + Returns a date that is rounded to the previous even hour below the given + date. +

+ For example an input date with a time of 08:13:54 would result in a date + with the time of 08:00:00. +

+
+ the Date to round, if the current time will + be used + the new rounded date +
+ + + Returns a date that is rounded to the next even minute above the given + date. +

+ For example an input date with a time of 08:13:54 would result in a date + with the time of 08:14:00. If the date's time is in the 59th minute, + then the hour (and possibly the day) will be promoted. +

+
+ The Date to round, if the current time will be used + The new rounded date +
+ + + Returns a date that is rounded to the previous even minute below the + given date. +

+ For example an input date with a time of 08:13:54 would result in a date + with the time of 08:13:00. +

+
+ the Date to round, if the current time will + be used + the new rounded date +
+ + + Returns a date that is rounded to the next even second above the given + date. + + the Date to round, if the current time will + be used + the new rounded date + + + + Returns a date that is rounded to the previous even second below the + given date. +

+ For example an input date with a time of 08:13:54.341 would result in a + date with the time of 08:13:00.000. +

+
+ the Date to round, if the current time will + be used + the new rounded date +
+ + + Returns a date that is rounded to the next even multiple of the given + minute. +

+ For example an input date with a time of 08:13:54, and an input + minute-base of 5 would result in a date with the time of 08:15:00. The + same input date with an input minute-base of 10 would result in a date + with the time of 08:20:00. But a date with the time 08:53:31 and an + input minute-base of 45 would result in 09:00:00, because the even-hour + is the next 'base' for 45-minute intervals. +

+ +

+ More examples: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Input TimeMinute-BaseResult Time
11:16:412011:20:00
11:36:412011:40:00
11:46:412012:00:00
11:26:413011:30:00
11:36:413012:00:00
11:16:411711:17:00
11:17:411711:34:00
11:52:411712:00:00
11:52:41511:55:00
11:57:41512:00:00
11:17:41012:00:00
11:17:41111:08:00
+

+ +
+ + the Date to round, if the current time will + be used + + + the base-minute to set the time on + + the new rounded date +
+ + + Returns a date that is rounded to the next even multiple of the given + minute. +

+ The rules for calculating the second are the same as those for + calculating the minute in the method + . +

+
+ The date. + The second base. + +
+ + + Returns a list of Dates that are the next fire times of a + . + The input trigger will be cloned before any work is done, so you need + not worry about its state being altered by this method. + + The trigger upon which to do the work + The calendar to apply to the trigger's schedule + The number of next fire times to produce + List of java.util.Date objects + + + + Returns a list of Dates that are the next fire times of a + that fall within the given date range. The input trigger will be cloned + before any work is done, so you need not worry about its state being + altered by this method. +

+ NOTE: if this is a trigger that has previously fired within the given + date range, then firings which have already occured will not be listed + in the output List. +

+
+ The trigger upon which to do the work + The calendar to apply to the trigger's schedule + The starting date at which to find fire times + The ending date at which to stop finding fire times + List of java.util.Date objects +
+ + + Translate a date and time from a users timezone to the another + (probably server) timezone to assist in creating a simple trigger with + the right date and time. + + the date to translate + the original time-zone + the destination time-zone + the translated UTC date + + + + Gets the offset from UT for the given date in the given timezone, + taking into account daylight savings. + + the date that is the base for the offset + the time-zone to calculate to offset to + the offset + + + + This functions determines if the TimeZone uses daylight saving time + + TimeZone instance to validate + True or false depending if daylight savings time is used + + + + An exception that is thrown to indicate that a call to + failed without interrupting the Job. + + + James House + + + + Create a with the given message. + + + + + Create a with the given cause. + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + +
+
diff --git a/lib/Quartz10/net/3.5/Common.Logging.pdb b/lib/Quartz10/net/3.5/Common.Logging.pdb new file mode 100644 index 0000000000000000000000000000000000000000..117b5bccc4c1ebbd26199f62b1a9d6b850fb3fff GIT binary patch literal 52736 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�|Q`N)Uv27i1=VwlT1C*VIpzQn{ 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 - - - Quartz - - - - - Collection manipulation related utility methods. - - - - - Removes the specified item from list of items and returns - whether removal was success. - - The items to remove from. - The item to remove. - - - - - A hash based set. - - - - - Represents a collection ob objects that contains no duplicate elements. - - - - - Adds a new element to the Collection if it is not already present. - - The object to add to the collection. - Returns true if the object was added to the collection, otherwise false. - - - - Adds all the elements of the specified collection to the Set. - - Collection of objects to add. - true - - - - Returns the first item in the set. - - First object. - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The whose elements are copied to the new list. - - is . - - - - Initializes a new instance of the class. - - The capacity. - - - - Unmodifiables the hash set. - - The collection. - - - - - Adds a new element to the ArrayList if it is not already present. - - Element to insert to the ArrayList. - Returns true if the new element was inserted, false otherwise. - - - - Adds all the elements of the specified collection that are not present to the list. - - Collection where the new elements will be added - Returns true if at least one element was added, false otherwise. - - - - Returns the first item in the set. - - First object. - - - - Returns a copy of the HashSet instance. - - Returns a shallow copy of the current HashSet. - - - - A sorted set. - - - - - Returns a portion of the list whose elements are greater than the limit object parameter. - - The start element of the portion to extract. - The portion of the collection whose elements are greater than the limit object parameter. - - - - SupportClass for the TreeSet class. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The whose elements are copied to the new list. - - is . - - - - Initializes a new instance of the class. - - The c. - - - - Unmodifiables the tree set. - - The collection. - - - - - Adds a new element to the ArrayList if it is not already present and sorts the ArrayList. - - Element to insert to the ArrayList. - TRUE if the new element was inserted, FALSE otherwise. - - - - Adds all the elements of the specified collection that are not present to the list. - - Collection where the new elements will be added - Returns true if at least one element was added to the collection. - - - - Returns the first item in the set. - - First object. - - - - Determines whether an element is in the the current TreeSetSupport collection. The IComparer defined for - the current set will be used to make comparisons between the elements already inserted in the collection and - the item specified. - - The object to be locatet in the current collection. - true if item is found in the collection; otherwise, false. - - - - Returns a portion of the list whose elements are greater than the limit object parameter. - - The start element of the portion to extract. - The portion of the collection whose elements are greater than the limit object parameter. - - - - Gets the IComparator object used to sort this set. - - - - - Responsible for creating the instances of - to be used within the instance. - - - Although this interface looks a lot like an 'object pool', implementations - do not have to support the re-use of instances. If an implementation does - not wish to pool instances, then the - method would simply create a new instance, and the - method would do nothing. - - James House - Marko Lahma (.NET) - - - - Initialize the factory, providing a handle to the - that should be made available within the and - the s within it, and a handle to the - that the shell will use in its own - operations with the . - - - - - Called by the - to obtain instances of . - - - - - Called by the - to return instances of . - - - - - JobRunShell instances are responsible for providing the 'safe' environment - for s to run in, and for performing all of the work of - executing the , catching ANY thrown exceptions, updating - the with the 's completion code, - etc. -

- A instance is created by a - on behalf of the which then runs the - shell in a thread from the configured when the - scheduler determines that a has been triggered. -

-
- - - - - James House - Marko Lahma (.NET) -
- - - This interface should be implemented by any class whose instances are intended - to be executed by a thread. - - - - - This method has to be implemented in order that starting of the thread causes the object's - run method to be called in that separately executing thread. - - - - - Create a JobRunShell instance with the given settings. - - A handle to the that produced - this . - The instance that should be made - available within the . - the that should be used by the - when making updates to the . - - - - Initializes the job execution context with given scheduler and bundle. - - The scheduler. - The bundle offired triggers. - - - - Requests the Shutdown. - - - - - This method has to be implemented in order that starting of the thread causes the object's - run method to be called in that separately executing thread. - - - - - Runs begin procedures on this instance. - - - - - Completes the execution. - - if set to true [successful execution]. - - - - Passivates this instance. - - - - - Completes the trigger retry loop. - - The trigger. - The job detail. - The inst code. - - - - - Vetoeds the job retry loop. - - The trigger. - The job detail. - The inst code. - - - - - This is the heart of Quartz, an indirect implementation of the - interface, containing methods to schedule s, - register instances, etc. - - - - - - James House - Marko Lahma (.NET) - - - - Starts this instance. - - - - - Standbies this instance. - - - - - Shutdowns this instance. - - - - - returns true if the given JobGroup - is paused - - The scheduling context. - - - - - - returns true if the given TriggerGroup - is paused - - - - - - - - Initializes the class. - - - - - Get the global - that has the given name. - - - - - - - Create a with the given configuration - properties. - - - - - - Bind the scheduler to remoting infrastructure. - - - - - Un-bind the scheduler from remoting infrastructure. - - - - - Adds an object that should be kept as reference to prevent - it from being garbage collected. - - The obj. - - - - Removes the object from garbae collection protected list. - - The obj. - - - - - Starts the 's threads that fire s. -

- All s that have misfired will - be passed to the appropriate TriggerListener(s). -

-
-
- - - Temporarily halts the 's firing of s. -

- The scheduler is not destroyed, and can be re-started at any time. -

-
-
- - - Halts the 's firing of s, - and cleans up all resources associated with the QuartzScheduler. - Equivalent to . -

- The scheduler cannot be re-started. -

-
-
- - - Halts the 's firing of s, - and cleans up all resources associated with the QuartzScheduler. -

- The scheduler cannot be re-started. -

-
- - if the scheduler will not allow this method - to return until all currently executing jobs have completed. - -
- - - Validates the state. - - - - - Add the identified by the given - to the Scheduler, and - associate the given with it. -

- If the given Trigger does not reference any , then it - will be set to reference the Job passed with it into this method. -

-
-
- - - Schedule the given with the - identified by the 's settings. - - - - - Add the given to the Scheduler - with no associated - . The will be 'dormant' until - it is scheduled with a , or - is called for it. -

- The must by definition be 'durable', if it is not, - SchedulerException will be thrown. -

-
-
- - - Delete the identified from the Scheduler - and any - associated s. - - true if the Job was found and deleted. - - - - Remove the indicated from the - scheduler. - - - - - Remove (delete) the with the - given name, and store the new given one - which must be associated - with the same job. - - The scheduling context. - The name of the to be removed. - The group name of the to be removed. - The new to be stored. - - if a with the given - name and group was not found and removed from the store, otherwise - the first fire time of the newly scheduled trigger. - - - - - Creates a new positive random number - - The last random obtained - Returns a new positive random number - - - - Trigger the identified (Execute it now) - with a non-volatile trigger. - - - - - Trigger the identified (Execute it - now) - with a volatile trigger. - - - - - Pause the with the given name. - - - - - Pause all of the s in the given group. - - - - - Pause the with the given - name - by pausing all of its current s. - - - - - Pause all of the s in the - given group - by pausing all of their s. - - - - - Resume (un-pause) the with the given - name. -

- If the missed one or more fire-times, then the - 's misfire instruction will be applied. -

-
-
- - - Resume (un-pause) all of the s in the - given group. -

- If any missed one or more fire-times, then the - 's misfire instruction will be applied. -

-
-
- - - Gets the paused trigger groups. - - The the job scheduling context. - - - - - Resume (un-pause) the with - the given name. -

- If any of the 's s missed one - or more fire-times, then the 's misfire - instruction will be applied. -

-
-
- - - Resume (un-pause) all of the s - in the given group. -

- If any of the s had s that - missed one or more fire-times, then the 's - misfire instruction will be applied. -

-
-
- - - Pause all triggers - equivalent of calling - on every group. -

- When is called (to un-pause), trigger misfire - instructions WILL be applied. -

-
- - -
- - - Resume (un-pause) all triggers - equivalent of calling - on every group. -

- If any missed one or more fire-times, then the - 's misfire instruction will be applied. -

-
- -
- - - Get the names of all known groups. - - - - - Get the names of all the s in the - given group. - - - - - Get all s that are associated with the - identified . - - - - - Get the names of all known - groups. - - - - - Get the names of all the s in - the given group. - - - - - Get the for the - instance with the given name and group. - - - - - Get the instance with the given name and - group. - - - - - Get the current state of the identified . - - - - - - - - - Add (register) the given to the Scheduler. - - - - - Delete the identified from the Scheduler. - - true if the Calendar was found and deleted. - - - - Get the instance with the given name. - - - - - Get the names of all registered s. - - - - - Add the given to the - 'sglobal list. -

- Listeners in the 'global' list receive notification of execution events - for ALL s. -

-
-
- - - Add the given to the - 's list, of registered s. - - - - - Remove the given from the - 's list of global listeners. - - - true if the identifed listener was found in the list, and removed. - - - - - Remove the identifed from the 's - list of global listeners. - - - true if the identifed listener was found in the list, and removed. - - - - Remove the identifed from - the 's list of registered listeners. - - - true if the identifed listener was found in the list, and removed. - - - - - Get the non-global that has the given name. - - - - - Add the given to the - 'sglobal list. -

- Listeners in the 'global' list receive notification of execution events - for ALL s. -

-
-
- - - Add the given to the - 's list, of registered s. - - - - - Remove the given from - the 's list of global listeners. - - - true if the identifed listener was found in the list, and removed. - - - - - Remove the identifed from the 's - list of global listeners. - - - true if the identifed listener was found in the list, and removed - - - - Remove the identifed - from the 's list of registered listeners. - - - true if the identifed listener was found in the list, and removed. - - - - - Get the non-global - that has the given name. - - - - - Get the global that - has the given name. - - - - - - - Register the given with the - . - - - - - Remove the given from the - . - - - true if the identifed listener was found in the list, and removed. - - - - - Notifies the job store job complete. - - The job scheduling context. - The trigger. - The detail. - The instruction code. - - - - Notifies the scheduler thread. - - - - - Notifies the trigger listeners about fired trigger. - - The job execution context. - - - - - Notifies the trigger listeners about misfired trigger. - - The trigger. - - - - Notifies the trigger listeners of completion. - - The job executution context. - The instruction code to report to triggers. - - - - Notifies the job listeners about job to be executed. - - The jec. - - - - Notifies the job listeners that job exucution was vetoed. - - The job execution context. - - - - Notifies the job listeners that job was executed. - - The jec. - The je. - - - - Notifies the scheduler listeners about scheduler error. - - The MSG. - The se. - - - - Notifies the scheduler listeners about job that was scheduled. - - The trigger. - - - - Notifies the scheduler listeners about job that was unscheduled. - - Name of the trigger. - The trigger group. - - - - Notifies the scheduler listeners about finalized trigger. - - The trigger. - - - - Notifies the scheduler listeners about paused trigger. - - The name. - The group. - - - - Notifies the scheduler listeners resumed trigger. - - The name. - The group. - - - - Notifies the scheduler listeners about paused job. - - The name. - The group. - - - - Notifies the scheduler listeners about resumed job. - - The name. - The group. - - - - Notifies the scheduler listeners about scheduler shutdown. - - - - - Interrupt all instances of the identified InterruptableJob. - - - - - Obtains a lifetime service object to control the lifetime policy for this instance. - - - - - Gets the version of the Quartz Scheduler. - - The version. - - - - Gets the version major. - - The version major. - - - - Gets the version minor. - - The version minor. - - - - Gets the version iteration. - - The version iteration. - - - - Gets the scheduler signaler. - - The scheduler signaler. - - - - Returns the name of the . - - - - - Returns the instance Id of the . - - - - - Returns the of the . - - - - - Gets or sets a value indicating whether to signal on scheduling change. - - - true if schduler should signal on scheduling change; otherwise, false. - - - - - Reports whether the is paused. - - - - - Gets the job store class. - - The job store class. - - - - Gets the thread pool class. - - The thread pool class. - - - - Gets the size of the thread pool. - - The size of the thread pool. - - - - Reports whether the has been Shutdown. - - - - - Return a list of objects that - represent all currently executing Jobs in this Scheduler instance. -

- This method is not cluster aware. That is, it will only return Jobs - currently executing in this Scheduler instance, not across the entire - cluster. -

-

- Note that the list returned is an 'instantaneous' snap-shot, and that as - soon as it's returned, the true list of executing jobs may be different. -

-
-
- - - Get a List containing all of the - s in the 'sglobal list. - - - - - Get a Set containing the names of all the non-global - s registered with the . - - - - - Get a list containing all of the - s in the 'sglobal list. - - - - - Get a Set containing the names of all the non-global - s registered with the . - - - - - Get a List containing all of the - s registered with the . - - - - - Gets or sets the job factory. - - The job factory. - - - - Gets the running since. - - The running since. - - - - Gets the number of jobs executed. - - The number of jobs executed. - - - - Gets a value indicating whether this scheduler supports persistence. - - true if supports persistence; otherwise, false. - - - - Helper class to start scheduler in a delayed fashion. - - - - - ErrorLogger - Scheduler Listener Class - - - - - A helpful abstract base class for implementors of - . - - - The methods in this class are empty so you only need to override the - subset for the events you care about. - - - - - - The interface to be implemented by classes that want to be informed of major - events. - - - - - James House - - - - Called by the when a - is scheduled. - - - - - Called by the when a - is unscheduled. - - - - - Called by the when a - has reached the condition in which it will never fire again. - - - - - Called by the when a - or group of s has been paused. -

- If a group was paused, then the parameter - will be null. -

-
- Name of the trigger. - The trigger group. -
- - - Called by the when a - or group of s has been un-paused. -

- If a group was resumed, then the parameter - will be null. -

-
- Name of the trigger. - The trigger group. -
- - - Called by the when a - or group of s has been paused. -

- If a group was paused, then the parameter will be - null. If all jobs were paused, then both parameters will be null. -

-
- Name of the job. - The job group. -
- - - Called by the when a - or group of s has been un-paused. -

- If a group was resumed, then the parameter will - be null. If all jobs were paused, then both parameters will be null. -

-
- The job group. -
- - - Called by the when a serious error has - occured within the scheduler - such as repeated failures in the , - or the inability to instantiate a instance when its - has fired. -

- The property of the given SchedulerException - can be used to determine more specific information about the type of - error that was encountered. -

-
-
- - - Called by the to inform the listener - that it has Shutdown. - - - - - Get the for this - type's category. This should be used by subclasses for logging. - - - - - The interface to be implemented by classes that want to be informed when a - executes. In general, applications that use a - will not have use for this mechanism. - - - - - - - James House - - - - Called by the when a - is about to be executed (an associated - has occured). -

- This method will not be invoked if the execution of the Job was vetoed - by a . -

-
- -
- - - Called by the when a - was about to be executed (an associated - has occured), but a vetoed it's - execution. - - - - - - Called by the after a - has been executed, and be for the associated 's - method has been called. - - - - - Get the name of the . - - - - - Contains all of the resources (,, - etc.) necessary to create a instance. - - - James House - Marko Lahma (.NET) - - - - Gets the unique identifier. - - Name of the scheduler. - The scheduler instance id. - - - - - Gets the unique identifier. - - - - - - Add the given for the - to use. This method expects the plugin's - "initialize" method to be invoked externally (either before or after - this method is called). - - - - - - Get or set the name for the . - - - if name is null or empty. - - - - - Get or set the instance Id for the . - - - if name is null or empty. - - - - - Get or set the name for the . - - - if name is null or empty. - - - - - Get or set the for the - to use. - - - if threadPool is null. - - - - - Get or set the for the - to use. - - - if jobStore is null. - - - - - Get or set the for the - to use. - - - if jobRunShellFactory is null. - - - - - Get the of all - s for the - to use. - - - - - - Gets or sets a value indicating whether to make scheduler thread daemon. - - - true if scheduler should be thread daemon; otherwise, false. - - - - - Gets or sets the scheduler exporter. - - The scheduler exporter. - - - - The thread responsible for performing the work of firing - s that are registered with the . - - - - - James House - Marko Lahma (.NET) - - - - Support class used to handle threads - - - - - The instance of System.Threading.Thread - - - - - Initializes a new instance of the QuartzThread class - - - - - Initializes a new instance of the Thread class. - - The name of the thread - - - - Initializes a new instance of the Thread class. - - A ThreadStart delegate that references the methods to be invoked when this thread begins executing - - - - Initializes a new instance of the Thread class. - - A ThreadStart delegate that references the methods to be invoked when this thread begins executing - The name of the thread - - - - This method has no functionality unless the method is overridden - - - - - Causes the operating system to change the state of the current thread instance to ThreadState.Running - - - - - Interrupts a thread that is in the WaitSleepJoin thread state - - - - - Blocks the calling thread until a thread terminates - - - - - Blocks the calling thread until a thread terminates or the specified time elapses - - Time of wait in milliseconds - - - - Blocks the calling thread until a thread terminates or the specified time elapses - - Time of wait in milliseconds - Time of wait in nanoseconds - - - - Resumes a thread that has been suspended - - - - - Raises a ThreadAbortException in the thread on which it is invoked, - to begin the process of terminating the thread. Calling this method - usually terminates the thread - - - - - Raises a ThreadAbortException in the thread on which it is invoked, - to begin the process of terminating the thread while also providing - exception information about the thread termination. - Calling this method usually terminates the thread. - - An object that contains application-specific information, such as state, which can be used by the thread being aborted - - - - Suspends the thread, if the thread is already suspended it has no effect - - - - - Obtain a string that represents the current object - - A string that represents the current object - - - - Gets the currently running thread - - The currently running thread - - - - Gets the current thread instance - - - - - Gets or sets the name of the thread - - - - - Gets or sets a value indicating the scheduling priority of a thread - - - - - Gets a value indicating the execution status of the current thread - - - - - Gets or sets a value indicating whether or not a thread is a background thread. - - - - - Gets the randomized idle wait time. - - The randomized idle wait time. - - - - Construct a new for the given - as a non-daemon - with normal priority. - - - - - Construct a new for the given - as a with the given - attributes. - - - - - Signals the main processing loop to pause at the next possible point. - - - - - Signals the main processing loop to pause at the next possible point. - - - - - Signals the main processing loop that a change in scheduling has been - made - in order to interrupt any sleeping that may be occuring while - waiting for the fire time to arrive. - - - the time when the newly scheduled trigger - will fire. If this method is being called do to some other even (rather - than scheduling a trigger), the caller should pass null. - - - - - The main processing loop of the . - - - - - Trigger retry loop that is executed on error condition. - - The bndle. - - - - Releases the trigger retry loop. - - The trigger. - - - - Gets the log. - - The log. - - - - Sets the idle wait time. - - The idle wait time. - - - - Gets a value indicating whether this is paused. - - true if paused; otherwise, false. - - - - Gets or sets the db failure retry interval. - - The db failure retry interval. - - - - An interface to be used by instances in order to - communicate signals back to the . - - James House - Marko Lahma (.NET) - - - - An interface to be used by instances in order to - communicate signals back to the . - - James House - - - - Notifies the scheduler about misfired trigger. - - The trigger that misfired. - - - - Notifies the scheduler about finalized trigger. - - The trigger that has finalized. - - - - Signals the scheduling change. - - - - - Notifies the scheduler about misfired trigger. - - The trigger that misfired. - - - - Notifies the scheduler about finalized trigger. - - The trigger that has finalized. - - - - Signals the scheduling change. - - - - - An object used to pass information about the 'client' to the . - - - James House - Marko Lahma (.NET) - - - - get the instanceId in the cluster. - -

- Set the instanceId. -

-
-
- - - Metadata information about specific ADO.NET driver library. Metadata is used to - create correct types of object instances to interact with the underlying - database. - - - - - Initializes this instance. Parses information and initializes startup - values. - - - - - Gets the name of the parameter which includes the parameter prefix for this - database. - - Name of the parameter. - - - Gets or sets the name of the assembly that holds the connection library. - The name of the assembly. - - - - Gets or sets the name of the product. - - The name of the product. - - - - Gets or sets the type of the connection. - - The type of the connection. - - - - Gets or sets the type of the command. - - The type of the command. - - - - Gets or sets the type of the parameter. - - The type of the parameter. - - - - Gets the type of the command builder. - - The type of the command builder. - - - Gets the command builder's derive parameters method. - The command builder derive parameters method. - - - - Gets or sets the parameter name prefix. - - The parameter name prefix. - - - - Gets or sets the type of the exception that is thrown when using driver - library. - - The type of the exception. - - - - Gets or sets a value indicating whether parameters are bind by name when using - ADO.NET parameters. - - true if parameters are bind by name; otherwise, false. - - - Gets or sets the type of the database parameters. - The type of the parameter db. - - - - Gets the parameter db type property. - - The parameter db type property. - - - - Gets the parameter is nullable property. - - The parameter is nullable property. - - - - Gets or sets the type of the db binary column. This is a string representation of - Enum element because this information is database driver specific. - - The type of the db binary. - - - Gets the type of the db binary. - The type of the db binary. - - - - Sets the name of the parameter db type property. - - The name of the parameter db type property. - - - - Gets or sets a value indicating whether [use parameter name prefix in parameter collection]. - - - true if [use parameter name prefix in parameter collection]; otherwise, false. - - - - - - - - - - - - - - - Returns a new command object for executing SQL statments/Stored Procedures - against the database. - - An new - - - - Returns a new instance of the providers CommandBuilder class. - - In .NET 1.1 there was no common base class or interface - for command builders, hence the return signature is object to - be portable (but more loosely typed) across .NET 1.1/2.0 - A new Command Builder - - - - Returns a new connection object to communicate with the database. - - A new - - - - Returns a new parameter object for binding values to parameter - placeholders in SQL statements or Stored Procedure variables. - - A new - - - - Shutdowns this instance. - - - - - Connection string used to create connections. - - - - - Registers DB metadata information for given provider name. - - - - - - - Initializes a new instance of the class. - - Name of the db provider. - The connection string. - - - - Returns a new command object for executing SQL statments/Stored Procedures - against the database. - - An new - - - - Returns a new instance of the providers CommandBuilder class. - - A new Command Builder - In .NET 1.1 there was no common base class or interface - for command builders, hence the return signature is object to - be portable (but more loosely typed) across .NET 1.1/2.0 - - - - Returns a new connection object to communicate with the database. - - A new - - - - Returns a new parameter object for binding values to parameter - placeholders in SQL statements or Stored Procedure variables. - - A new - - - - Shutdowns this instance. - - - - - Connection string used to create connections. - - - - - - Gets the metadata. - - The metadata. - - - - Summary description for DbProviderFactory. - - - - - This interface can be implemented by any - class that needs to use the constants contained herein. - - Jeffrey Wescott - James House - - - @deprecated Whether a trigger has misfired is no longer a state, but - rather now identified dynamically by whether the trigger's next fire - time is more than the misfire threshold time in the past. - - - - This class contains utility functions for use in all delegate classes. - - Jeffrey Wescott - - - - Replace the table prefix in a query by replacing any occurrences of - "{0}" with the table prefix. - - The unsubstitued query - The table prefix - The query, with proper table prefix substituted - - - - Obtain a unique key for a given job. - - The job name - The group containing the job - - A unique key - - - - Obtain a unique key for a given trigger. - - The trigger name - The group containing the trigger - A unique key - - - - Base class for database based lock handlers for providing thread/resource locking - in order to protect resources from being altered by multiple threads at the - same time. - - - - - This class extends - to include the query string constants in use by the - class. - - Jeffrey Wescott - - - - An interface for providing thread/resource locking in order to protect - resources from being altered by multiple threads at the same time. - - James House - - - - Grants a lock on the identified resource to the calling thread (blocking - until it is available). - - true if the lock was obtained. - - - - Release the lock on the identified resource if it is held by the calling - thread. - - - - - Determine whether the calling thread owns a lock on the identified - resource. - - - - - Whether this Semaphore implementation requires a database connection for - its lock management operations. - - - - - - - - Interface for Quartz objects that need to know what the table prefix of - the tables used by a ADO.NET JobStore is. - - - - - Initializes a new instance of the class. - - The table prefix. - The SQL. - The default SQL. - The db provider. - - - - Execute the SQL that will lock the proper database row. - - - - - - - - Grants a lock on the identified resource to the calling thread (blocking - until it is available). - - - - - true if the lock was obtained. - - - - Release the lock on the identified resource if it is held by the calling - thread. - - - - - - - Determine whether the calling thread owns a lock on the identified - resource. - - - - - - - - Gets or sets the lock owners. - - The lock owners. - - - - Gets the log. - - The log. - - - - This Semaphore implementation does use the database. - - - - - Gets or sets the table prefix. - - The table prefix. - - - - A FirebirdDelegate specific driver delegate. - - Marko Lahma - - - - This is meant to be an abstract base class for most, if not all, - implementations. Subclasses should override only those methods that need - special handling for the DBMS driver in question. - - Jeffrey Wescott - James House - Marko Lahma (.NET) - - - - This is the base interface for all driver delegate classes. - - -

- This interface is very similar to the - interface except each method has an additional - parameter. -

-

- Unless a database driver has some extremely-DB-specific - requirements, any IDriverDelegate implementation classes should extend the - class. -

-
- Jeffrey Wescott - James House - Marko Lahma (.NET) -
- - - Update all triggers having one of the two given states, to the given new - state. - - The DB Connection - The new state for the triggers - The first old state to update - The second old state to update - Number of rows updated - - - - Get the names of all of the triggers that have misfired - according to - the given timestamp. - - The DB Connection - The timestamp. - An array of objects - - - - Get the names of all of the triggers in the given state that have - misfired - according to the given timestamp. - - The DB Connection - The state. - The time stamp. - An array of objects - - - - Get the names of all of the triggers in the given group and state that - have misfired - according to the given timestamp. - - The DB Connection - Name of the group. - The state. - The timestamp. - An array of objects - - - - Select all of the triggers for jobs that are requesting recovery. The - returned trigger objects will have unique "recoverXXX" trigger names and - will be in the trigger group. - - - In order to preserve the ordering of the triggers, the fire time will be - set from the ColumnFiredTime column in the TableFiredTriggers - table. The caller is responsible for calling - on each returned trigger. It is also up to the caller to insert the - returned triggers to ensure that they are fired. - - The DB Connection - An array of objects - - - - Delete all fired triggers. - - The DB Connection - The number of rows deleted - - - - Delete all fired triggers of the given instance. - - The DB Connection - The instance id. - The number of rows deleted - - - - Delete all volatile fired triggers. - - The DB Connection - The number of rows deleted - - - - Get the names of all of the triggers that are volatile. - - The DB Connection - An array of see cref="Key" /> objects. - - - - Get the names of all of the jobs that are volatile. - - The DB Connection - An array of objects. - - - - Insert the job detail record. - - The DB Connection - The job to insert. - Number of rows inserted. - - - - Update the job detail record. - - The DB Connection. - The job to update. - Number of rows updated. - - -

- Get the names of all of the triggers associated with the given job. -

- -
- The DB Connection - The job name - The job group -
- - - Delete all job listeners for the given job. - - The DB Connection - The name of the job - The group containing the job - The number of rows deleted - - - - Delete the job detail record for the given job. - - The DB Connection - the name of the job - Name of the group. - the number of rows deleted - - - - Check whether or not the given job is stateful. - - The DB Connection - The name of the job - The group containing the job - true if the job exists and is stateful, false otherwise - - - - Check whether or not the given job exists. - - The DB Connection - Name of the job. - Name of the group. - true if the job exists, false otherwise - - - - Update the job data map for the given job. - - The DB Connection - The job. - the number of rows updated - - - - Associate a listener with a job. - - The DB Connection - The job to associate with the listener. - The listener to insert. - The number of rows inserted. - - -

- Get all of the listeners for a given job. -

- -
- The DB Connection - The job name whose listeners are wanted - The group containing the job - array of listener names -
- - - Select the JobDetail object for a given job name / group name. - - The DB Connection - The job name whose listeners are wanted - The group containing the job - The class load helper. - The populated JobDetail object - - - - Select the total number of jobs stored. - - The DB Connection - the total number of jobs stored - - - - Select all of the job group names that are stored. - - The DB Connection. - an array of group names - - - - Select all of the jobs contained in a given group. - - The DB Connection - The group containing the jobs - an array of job names - - - - Insert the base trigger data. - - The DB Connection - The trigger to insert. - The state that the trigger should be stored in. - The job detail. - The number of rows inserted - - - - Insert the simple trigger data. - - The DB Connection - The trigger to insert - The number of rows inserted - - - - Insert the blob trigger data. - - The DB Connection - The trigger to insert - The number of rows inserted - - - - Insert the cron trigger data. - - the DB Connection - The trigger. - the number of rows inserted - - - - Update the base trigger data. - - the DB Connection - The trigger. - The state. - The job detail. - the number of rows updated - - - - Update the simple trigger data. - - the DB Connection - The trigger. - the number of rows updated - - - - Update the cron trigger data. - - the DB Connection - The trigger. - the number of rows updated - - - - Update the blob trigger data. - - the DB Connection - The trigger. - the number of rows updated - - - - Check whether or not a trigger exists. - - the DB Connection - Name of the trigger. - Name of the group. - the number of rows updated - - - - Update the state for a given trigger. - - The DB Connection - The name of the trigger. - The group containing the trigger. - The new state for the trigger. - the number of rows updated - - - - Update the given trigger to the given new state, if it is in the given - old state. - - The DB connection - The name of the trigger. - The group containing the trigger - The new state for the trigger - The old state the trigger must be in - int the number of rows updated - - - - Update the given trigger to the given new state, if it is one of the - given old states. - - The DB connection - The name of the trigger - The group containing the trigger - The new state for the trigger - One of the old state the trigger must be in - One of the old state the trigger must be in - One of the old state the trigger must be in - - int the number of rows updated - - SQLException - - - - Update the all triggers to the given new state, if they are in one of - the given old states AND its next fire time is before the given time. - - The DB connection - The new state for the trigger - One of the old state the trigger must be in - One of the old state the trigger must be in - The time before which the trigger's next fire time must be - int the number of rows updated - - - - Update all triggers in the given group to the given new state, if they - are in one of the given old states. - - The DB connection - The group containing the trigger - The new state for the trigger - One of the old state the trigger must be in - One of the old state the trigger must be in - One of the old state the trigger must be in - The number of rows updated - - - - Update all of the triggers of the given group to the given new state, if - they are in the given old state. - - The DB connection - The group containing the triggers - The new state for the trigger group - The old state the triggers must be in. - int the number of rows updated - - - - Update the states of all triggers associated with the given job. - - The DB Connection - The name of the job. - The group containing the job. - The new state for the triggers. - The number of rows updated - - - - Update the states of any triggers associated with the given job, that - are the given current state. - - The DB Connection - The name of the job - The group containing the job - The new state for the triggers - The old state of the triggers - the number of rows updated - - - - Delete all of the listeners associated with a given trigger. - - The DB Connection - The name of the trigger whose listeners will be deleted - The name of the group containing the trigger - the number of rows deleted - - - - Associate a listener with the given trigger. - - The DB Connectio - The trigger - The name of the listener to associate with the trigger - the number of rows inserted - - - - Select the listeners associated with a given trigger. - - The DB Connection - The name of the trigger - The group containing the trigger - array of trigger listener names - - - - Delete the simple trigger data for a trigger. - - The DB Connection - The name of the trigger - The group containing the trigger - The number of rows deleted - - - - Delete the BLOB trigger data for a trigger. - - The DB Connection - The name of the trigger - The group containing the trigger - The number of rows deleted - - - - Delete the cron trigger data for a trigger. - - The DB Connection - The name of the trigger - The group containing the trigger - the number of rows deleted - - - - Delete the base trigger data for a trigger. - - The DB Connection - The name of the trigger - The group containing the trigger - the number of rows deleted - - - - Select the number of triggers associated with a given job. - - The DB Connection - The name of the job - The group containing the job - the number of triggers for the given job - - - - Select the job to which the trigger is associated. - - The DB Connection - The name of the trigger - The group containing the trigger - The load helper. - - The object associated with the given trigger - - - - - Select the stateful jobs which are referenced by triggers in the given - trigger group. - - The DB Connection - The trigger group. - a List of Keys to jobs. - - - - Select the triggers for a job> - - The DB Connection - The name of the trigger - The group containing the trigger - an array of objects associated with a given job. - - - - Select the triggers for a calendar - - The DB Connection. - Name of the calendar. - - An array of objects associated with a given job. - - - - - Select a trigger. - - The DB Connection. - The name of the trigger. - The group containing the trigger. - The object. - - - - - Select a trigger's JobDataMap. - - The DB Connection. - The name of the trigger. - The group containing the trigger. - The of the Trigger, never null, but possibly empty. - - - - Select a trigger's state value. - - The DB Connection. - The name of the trigger. - The group containing the trigger. - The object. - - - - Select a triggers status (state and next fire time). - - The DB Connection. - The name of the trigger. - The group containing the trigger. - A object, or null - - - - Select the total number of triggers stored. - - The DB Connection. - The total number of triggers stored. - - - - Select all of the trigger group names that are stored. - - The DB Connection. - An array of group names. - - - - Select all of the triggers contained in a given group. - - The DB Connection. - The group containing the triggers. - An array of trigger names. - - - - Select all of the triggers in a given state. - - The DB Connection. - The state the triggers must be in. - An array of trigger s. - - - - Inserts the paused trigger group. - - The conn. - Name of the group. - - - - - Deletes the paused trigger group. - - The conn. - Name of the group. - - - - - Deletes all paused trigger groups. - - The conn. - - - - - Determines whether the specified trigger group is paused. - - The conn. - Name of the group. - - true if trigger group is paused; otherwise, false. - - - - - Selects the paused trigger groups. - - The DB Connection. - - - - - Determines whether given trigger group already exists. - - The conn. - Name of the group. - - true if trigger group exists; otherwise, false. - - - - - Insert a new calendar. - - The DB Connection. - The name for the new calendar. - The calendar. - The number of rows inserted. - - - - Update a calendar. - - The DB Connection. - The name for the new calendar. - The calendar. - The number of rows updated. - - - - Check whether or not a calendar exists. - - The DB Connection. - The name of the calendar. - true if the trigger exists, false otherwise. - - - - Select a calendar. - - The DB Connection. - The name of the calendar. - The Calendar. - - - - Check whether or not a calendar is referenced by any triggers. - - The DB Connection. - The name of the calendar. - true if any triggers reference the calendar, false otherwise - - - - Delete a calendar. - - The DB Connection - The name of the trigger. - The number of rows deleted. - - - - Select the total number of calendars stored. - - The DB Connection - The total number of calendars stored. - - - - Select all of the stored calendars. - - The DB Connection - An array of calendar names. - - - - Select the trigger that will be fired at the given fire time. - - The DB Connection - The time that the trigger will be fired. - - A representing the - trigger that will be fired at the given fire time, or null if no - trigger will be fired at that time - - - - - Insert a fired trigger. - - The DB Connection - The trigger. - The state that the trigger should be stored in. - The job detail. - The number of rows inserted. - - - - Select the states of all fired-trigger records for a given trigger, or - trigger group if trigger name is . - - The DB Connection - Name of the trigger. - Name of the group. - A list of FiredTriggerRecord objects. - - - - Select the states of all fired-trigger records for a given job, or job - group if job name is . - - The DB Connection - Name of the job. - Name of the group. - A List of FiredTriggerRecord objects. - - - - Select the states of all fired-trigger records for a given scheduler - instance. - - The DB Connection - Name of the instance. - A list of FiredTriggerRecord objects. - - - - Delete a fired trigger. - - The DB Connection - The fired trigger entry to delete. - The number of rows deleted. - - - - Get the number instances of the identified job currently executing. - - The DB Connection - Name of the job. - The job group. - - The number instances of the identified job currently executing. - - - - - Insert a scheduler-instance state record. - - The DB Connection - The instance id. - The check in time. - The interval. - The number of inserted rows. - - - - Delete a scheduler-instance state record. - - The DB Connection - The instance id. - The number of deleted rows. - - - - Update a scheduler-instance state record. - - The DB Connection - The instance id. - The check in time. - The number of updated rows. - - - - A List of all current s. -

- If instanceId is not null, then only the record for the identified - instance will be returned. -

-
- The DB Connection - The instance id. - -
- - - Select the next trigger which will fire to fire between the two given timestamps - in ascending order of fire time, and then descending by priority. - - The conn. - highest value of of the triggers (exclusive) - highest value of of the triggers (inclusive) - A (never null, possibly empty) list of the identifiers (Key objects) of the next triggers to be fired. - - - - Select the distinct instance names of all fired-trigger records. - - - This is useful when trying to identify orphaned fired triggers (a - fired trigger without a scheduler state record.) - - The conn. - - - - - Counts the misfired triggers in states. - - The conn. - The state1. - The state2. - The ts. - - - - - Selects the misfired triggers in states. - - The conn. - The state1. - The state2. - The ts. - The count. - The result list. - - - - - Create new StdAdoDelegate instance. - - the logger to use during execution - the prefix of all table names - The instance id. - The db provider. - - - - Create new StdAdoDelegate instance. - - the logger to use during execution - the prefix of all table names - The instance id. - The db provider. - if set to true [use properties]. - - - - Insert the job detail record. - - the DB Connection - the new state for the triggers - the first old state to update - the second old state to update - number of rows updated - - - - Get the names of all of the triggers that have misfired. - - the DB Connection - The ts. - an array of objects - - - - Select all of the triggers in a given state. - - The DB Connection - The state the triggers must be in - an array of trigger s - - - - Get the names of all of the triggers in the given state that have - misfired - according to the given timestamp. - - The DB Connection - The state. - The time stamp. - An array of objects - - - - Get the names of all of the triggers in the given states that have - misfired - according to the given timestamp. No more than count will - be returned. - - The conn. - The state1. - The state2. - The ts. - The most misfired triggers to return, negative for all - - Output parameter. A List of objects. Must not be null - - Whether there are more misfired triggers left to find beyond the given count. - - - - Get the number of triggers in the given states that have - misfired - according to the given timestamp. - - - - - - - - - - Get the names of all of the triggers in the given group and state that - have misfired. - - The DB Connection - Name of the group. - The state. - The timestamp. - an array of objects - - - - Select all of the triggers for jobs that are requesting recovery. The - returned trigger objects will have unique "recoverXXX" trigger names and - will be in the - trigger group. - - - In order to preserve the ordering of the triggers, the fire time will be - set from the ColumnFiredTime column in the TableFiredTriggers - table. The caller is responsible for calling - on each returned trigger. It is also up to the caller to insert the - returned triggers to ensure that they are fired. - - The DB Connection - an array of objects - - - - Delete all fired triggers. - - The DB Connection. - The number of rows deleted. - - - - Delete all fired triggers of the given instance. - - The DB Connection - The instance id. - The number of rows deleted - - - - Insert the job detail record. - - The DB Connection. - The job to insert. - Number of rows inserted. - - - - Gets the db presentation for boolean value. Subclasses can overwrite this behaviour. - - Value to map to database. - - - - - Update the job detail record. - - The DB Connection. - The job to update. - Number of rows updated. - - - - Get the names of all of the triggers associated with the given job. - - The DB Connection. - The name of the job. - The group containing the job. - An array of objects - - - - Delete all job listeners for the given job. - - The DB Connection. - The name of the job. - The group containing the job. - The number of rows deleted. - - - - Delete the job detail record for the given job. - - the DB Connection - the name of the job - the group containing the job - the number of rows deleted - - - - Check whether or not the given job is stateful. - - the DB Connection - the name of the job - the group containing the job - - true if the job exists and is stateful, false otherwise - - - - - Check whether or not the given job exists. - - the DB Connection - the name of the job - the group containing the job - true if the job exists, false otherwise - - - - Update the job data map for the given job. - - The conn. - the job to update - the number of rows updated - - - - Associate a listener with a job. - - The DB Connection. - The job to associate with the listener. - The listener to insert. - The number of rows inserted. - - - - Get all of the listeners for a given job. - - The DB Connection. - The job name whose listeners are wanted. - The group containing the job. - Array of listener names. - - - - Select the JobDetail object for a given job name / group name. - - The DB Connection. - The job name whose listeners are wanted. - The group containing the job. - The load helper. - The populated JobDetail object. - - - build Map from java.util.Properties encoding. - - - - Select the total number of jobs stored. - - The DB Connection. - The total number of jobs stored. - - - - Select all of the job group names that are stored. - - The DB Connection. - An array of group names. - - - - Select all of the jobs contained in a given group. - - The DB Connection. - The group containing the jobs. - An array of job names. - - - - Insert the base trigger data. - - the DB Connection - the trigger to insert - the state that the trigger should be stored in - The job detail. - the number of rows inserted - - - - Insert the simple trigger data. - - The DB Connection. - The trigger to insert. - The number of rows inserted. - - - - Insert the cron trigger data. - - the DB Connection - the trigger to insert - the number of rows inserted - - - - Insert the blob trigger data. - - The DB Connection. - The trigger to insert. - The number of rows inserted. - - - - Update the base trigger data. - - The DB Connection. - The trigger to insert. - The state that the trigger should be stored in. - The job detail. - The number of rows updated. - - - - Update the simple trigger data. - - The DB Connection. - The trigger to insert. - The number of rows updated. - - - - Update the cron trigger data. - - The DB Connection. - The trigger to insert. - The number of rows updated. - - - - Update the blob trigger data. - - The DB Connection. - The trigger to insert. - The number of rows updated. - - - - Check whether or not a trigger exists. - - The DB Connection. - The name of the trigger. - The group containing the trigger. - true if the trigger exists, false otherwise - - - - Update the state for a given trigger. - - The DB Connection. - The name of the trigger. - The group containing the trigger. - The new state for the trigger. - The number of rows updated. - - - - Update the given trigger to the given new state, if it is one of the - given old states. - - The DB connection. - The name of the trigger. - The group containing the trigger. - The new state for the trigger. - One of the old state the trigger must be in. - One of the old state the trigger must be in. - One of the old state the trigger must be in. - The number of rows updated. - - - - Update the all triggers to the given new state, if they are in one of - the given old states AND its next fire time is before the given time. - - The DB connection - The new state for the trigger - One of the old state the trigger must be in - One of the old state the trigger must be in - The time before which the trigger's next fire time must be - int the number of rows updated - - - - Update all triggers in the given group to the given new state, if they - are in one of the given old states. - - The DB connection. - The group containing the trigger. - The new state for the trigger. - One of the old state the trigger must be in. - One of the old state the trigger must be in. - One of the old state the trigger must be in. - The number of rows updated. - - - - Update the given trigger to the given new state, if it is in the given - old state. - - the DB connection - the name of the trigger - the group containing the trigger - the new state for the trigger - the old state the trigger must be in - int the number of rows updated - - - - Update all of the triggers of the given group to the given new state, if - they are in the given old state. - - the DB connection - the group containing the triggers - the new state for the trigger group - the old state the triggers must be in - int the number of rows updated - - - - Update the states of all triggers associated with the given job. - - the DB Connection - the name of the job - the group containing the job - the new state for the triggers - the number of rows updated - - - - Updates the state of the trigger states for job from other. - - The conn. - Name of the job. - Name of the group. - The state. - The old state. - - - - - Delete all of the listeners associated with a given trigger. - - the DB Connection - the name of the trigger whose listeners will be deleted - the name of the group containing the trigger - the number of rows deleted - - - - Associate a listener with the given trigger. - - the DB Connection - the trigger - the name of the listener to associate with the trigger - the number of rows inserted - - - - Select the listeners associated with a given trigger. - - the DB Connection - the name of the trigger - the group containing the trigger - - array of trigger listener names - - - - - Delete the simple trigger data for a trigger. - - the DB Connection - the name of the trigger - the group containing the trigger - the number of rows deleted - - - - Delete the cron trigger data for a trigger. - - the DB Connection - the name of the trigger - the group containing the trigger - the number of rows deleted - - - - Delete the cron trigger data for a trigger. - - the DB Connection - the name of the trigger - the group containing the trigger - the number of rows deleted - - - - Delete the base trigger data for a trigger. - - the DB Connection - the name of the trigger - the group containing the trigger - the number of rows deleted - - - - Select the number of triggers associated with a given job. - - the DB Connection - the name of the job - the group containing the job - the number of triggers for the given job - - - - Select the job to which the trigger is associated. - - the DB Connection - the name of the trigger - the group containing the trigger - The load helper. - The object associated with the given trigger - - - - Select the triggers for a job - - the DB Connection - the name of the trigger - the group containing the trigger - - an array of objects - associated with a given job. - - - - - Select the triggers for a calendar - - The DB Connection. - Name of the calendar. - - An array of objects associated with a given job. - - - - - Selects the stateful jobs of trigger group. - - The database connection. - Name of the group. - - - - - Select a trigger. - - the DB Connection - the name of the trigger - the group containing the trigger - The object - - - - Select a trigger's JobDataMap. - - the DB Connection - the name of the trigger - the group containing the trigger - The of the Trigger, never null, but possibly empty. - - - - Select a trigger's state value. - - the DB Connection - the name of the trigger - the group containing the trigger - The object - - - - Select a trigger status (state and next fire time). - - the DB Connection - the name of the trigger - the group containing the trigger - - a object, or null - - - - - Select the total number of triggers stored. - - the DB Connection - the total number of triggers stored - - - - Select all of the trigger group names that are stored. - - the DB Connection - - an array of group names - - - - - Select all of the triggers contained in a given group. - - the DB Connection - the group containing the triggers - - an array of trigger names - - - - - Inserts the paused trigger group. - - The conn. - Name of the group. - - - - - Deletes the paused trigger group. - - The conn. - Name of the group. - - - - - Deletes all paused trigger groups. - - The conn. - - - - - Determines whether the specified trigger group is paused. - - The conn. - Name of the group. - - true if trigger group is paused; otherwise, false. - - - - - Determines whether given trigger group already exists. - - The conn. - Name of the group. - - true if trigger group exists; otherwise, false. - - - - - Insert a new calendar. - - the DB Connection - The name for the new calendar. - The calendar. - the number of rows inserted - IOException - - - - Update a calendar. - - the DB Connection - The name for the new calendar. - The calendar. - the number of rows updated - IOException - - - - Check whether or not a calendar exists. - - the DB Connection - The name of the calendar. - - true if the trigger exists, false otherwise - - - - - Select a calendar. - - the DB Connection - The name of the calendar. - the Calendar - ClassNotFoundException - IOException - - - - Check whether or not a calendar is referenced by any triggers. - - the DB Connection - The name of the calendar. - - true if any triggers reference the calendar, false otherwise - - - - - Delete a calendar. - - the DB Connection - The name of the trigger. - the number of rows deleted - - - - Select the total number of calendars stored. - - the DB Connection - the total number of calendars stored - - - - Select all of the stored calendars. - - the DB Connection - - an array of calendar names - - - - - Select the trigger that will be fired at the given fire time. - - the DB Connection - the time that the trigger will be fired - - a representing the - trigger that will be fired at the given fire time, or null if no - trigger will be fired at that time - - - - - Select the next trigger which will fire to fire between the two given timestamps - in ascending order of fire time, and then descending by priority. - - The conn. - highest value of of the triggers (exclusive) - highest value of of the triggers (inclusive) - A (never null, possibly empty) list of the identifiers (Key objects) of the next triggers to be fired. - - - - Gets the select next trigger to acquire SQL clause. - This can be overriden for a more performant, result limiting - SQL. For Example SQL Server, MySQL and SQLite support limiting returned rows. - - - - - - Insert a fired trigger. - - the DB Connection - the trigger - the state that the trigger should be stored in - The job. - the number of rows inserted - - - - Select the states of all fired-trigger records for a given trigger, or - trigger group if trigger name is . - - The DB connection. - Name of the trigger. - Name of the group. - a List of objects. - - - - Select the states of all fired-trigger records for a given job, or job - group if job name is . - - The DB connection. - Name of the job. - Name of the group. - a List of objects. - - - - Select the states of all fired-trigger records for a given scheduler - instance. - - The DB Connection - Name of the instance. - A list of FiredTriggerRecord objects. - - - - Select the distinct instance names of all fired-trigger records. - - The conn. - - - This is useful when trying to identify orphaned fired triggers (a - fired trigger without a scheduler state record.) - - - - - Delete a fired trigger. - - the DB Connection - the fired trigger entry to delete - the number of rows deleted - - - - Selects the job execution count. - - The DB connection. - Name of the job. - The job group. - - - - - Delete all volatile fired triggers. - - The DB Connection - The number of rows deleted - - - - Inserts the state of the scheduler. - - The conn. - The instance id. - The check in time. - The interval. - - - - - Deletes the state of the scheduler. - - The database connection. - The instance id. - - - - - Updates the state of the scheduler. - - The database connection. - The instance id. - The check in time. - - - - - A List of all current s. -

- If instanceId is not null, then only the record for the identified - instance will be returned. -

-
- The DB Connection - The instance id. - -
- - - Replace the table prefix in a query by replacing any occurrences of - "{0}" with the table prefix. - - The unsubstitued query - The query, with proper table prefix substituted - - - - Create a serialized version of an Object. - - the object to serialize - Serialized object as byte array. - - - - Remove the transient data from and then create a serialized - version of a and returns the underlying bytes. - - The data. - the serialized data as byte array - - - - serialize - - The data. - - - - - Convert the JobDataMap into a list of properties. - - - - - Convert the JobDataMap into a list of properties. - - - - - This method should be overridden by any delegate subclasses that need - special handling for BLOBs. The default implementation uses standard - ADO.NET operations. - - The data reader, already queued to the correct row. - The column index for the BLOB. - The deserialized object from the DataReader BLOB. - - - - Get the names of all of the triggers that are volatile. - - The DB Connection - An array of objects. - - - - Get the names of all of the jobs that are volatile. - - The DB Connection - An array of objects. - - - - This method should be overridden by any delegate subclasses that need - special handling for BLOBs for job details. - - The result set, already queued to the correct row. - The column index for the BLOB. - The deserialized Object from the ResultSet BLOB. - - - - Selects the paused trigger groups. - - The DB Connection. - - - - - Gets the triggers to acquire limit. - - The triggers to acquire limit. - - - - Initializes a new instance of the class. - - the logger to use during execution - the prefix of all table names - The instance id. - The db provider. - - - - Initializes a new instance of the class. - - The logger. - The table prefix. - The instance id. - The db provider. - if set to true [use properties]. - - - - Creates the SQL for select next trigger to acquire. - - - - - Gets the select next trigger to acquire SQL clause. - Firebird specific version with FIRST functionality - - - - - - Conveys the state of a fired-trigger record. - - James House - - - - Gets or sets the fire instance id. - - The fire instance id. - - - - Gets or sets the fire timestamp. - - The fire timestamp. - - - - Gets or sets a value indicating whether [job is stateful]. - - true if [job is stateful]; otherwise, false. - - - - Gets or sets the job key. - - The job key. - - - - Gets or sets the scheduler instance id. - - The scheduler instance id. - - - - Gets or sets the trigger key. - - The trigger key. - - - - Gets or sets the state of the fire instance. - - The state of the fire instance. - - - - Gets or sets a value indicating whether [job requests recovery]. - - true if [job requests recovery]; otherwise, false. - - - - Gets or sets a value indicating whether [trigger is volatile]. - - true if [trigger is volatile]; otherwise, false. - - - - Gets or sets the priority. - - The priority. - - - - Exception class for when a driver delegate cannot be found for a given - configuration, or lack thereof. - - Jeffrey Wescott - - - - - Base class for exceptions thrown by the Quartz . - - - SchedulerExceptions may contain a reference to another - , which was the underlying cause of the SchedulerException. - - James House - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The MSG. - - - - Initializes a new instance of the class. - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - The class name is null or is zero (0). - The info parameter is null. - - - - Initializes a new instance of the class. - - The MSG. - The error code. - - - - Initializes a new instance of the class. - - The cause. - - - - Initializes a new instance of the class. - - The MSG. - The cause. - - - - Initializes a new instance of the class. - - The MSG. - The cause. - The error code. - - - - Creates and returns a string representation of the current exception. - - - A string representation of the current exception. - - - - - - Return the exception that is the underlying cause of this exception. - This may be used to find more detail about the cause of the error. - - The underlying exception, or if there is not - one. - - - - - Get the error code associated with this exception. - This may be used to find more detail about the cause of the error. - - - One of the ERR_XXX constants defined in this class. - - - -

- Determine if the specified error code is in the - category of errors. -

-
-
- -

- Determine if the specified error code is in the - category of errors. -

-
-
- - - Determine if the specified error code is in the - category of errors. - - - - - Determine if the specified error code is in the - category of errors. - - - - - Determine if the specified error code is in the - category of errors. - - - - - Determine if the specified error code is in the - category of errors. - - - - - Initializes a new instance of the class. - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - The class name is null or is zero (0). - The info parameter is null. - - - - is meant to be used in an application-server - or other software framework environment that provides - container-managed-transactions. No commit / rollback will be handled by this class. - - - If you need commit / rollback, use - instead. - - Jeffrey Wescott - James House - Srinivas Venkatarangaiah - - - - Contains base functionality for ADO.NET-based JobStore implementations. - - Jeffrey Wescott - James House - Marko Lahma (.NET) - - - - The interface to be implemented by classes that want to provide a - and storage mechanism for the - 's use. - - - Storage of s and s should be keyed - on the combination of their name and group for uniqueness. - - - - - - - - James House - - - - Called by the QuartzScheduler before the is - used, in order to give the it a chance to Initialize. - - - - - Called by the QuartzScheduler to inform the that - the scheduler has started. - - - - - Called by the QuartzScheduler to inform the that - it should free up all of it's resources because the scheduler is - shutting down. - - - - - Store the given and . - - The scheduling context. - The to be stored. - The to be stored. - ObjectAlreadyExistsException - - - - returns true if the given JobGroup - is paused - - - - - - - - returns true if the given TriggerGroup - is paused - - - - - - - - Store the given . - - The context. - The to be stored. - - If , any existing in the - with the same name and group should be - over-written. - - - - - Remove (delete) the with the given - name, and any s that reference - it. - - - If removal of the results in an empty group, the - group should be removed from the 's list of - known group names. - - The context. - The name of the to be removed. - The group name of the to be removed. - - if a with the given name and - group was found and removed from the store. - - - - - Retrieve the for the given - . - - The context. - The name of the to be retrieved. - The group name of the to be retrieved. - - The desired , or null if there is no match. - - - - - Store the given . - - The context. - The to be stored. - If , any existing in - the with the same name and group should - be over-written. - ObjectAlreadyExistsException - - - - Remove (delete) the with the - given name. - - -

- If removal of the results in an empty group, the - group should be removed from the 's list of - known group names. -

-

- If removal of the results in an 'orphaned' - that is not 'durable', then the should be deleted - also. -

-
- The context. - The name of the to be removed. - The group name of the to be removed. - - if a with the given - name and group was found and removed from the store. - -
- - - Remove (delete) the with the - given name, and store the new given one - which must be associated - with the same job. - - The context. - The name of the to be removed. - The group name of the to be removed. - The new to be stored. - - if a with the given - name and group was found and removed from the store. - - - - - Retrieve the given . - - The context. - The name of the to be retrieved. - The group name of the to be retrieved. - - The desired , or null if there is no - match. - - - - - Store the given . - - The context. - The name. - The to be stored. - If , any existing - in the with the same name and group - should be over-written. - If , any s existing - in the that reference an existing - Calendar with the same name with have their next fire time - re-computed with the new . - ObjectAlreadyExistsException - - - - Remove (delete) the with the - given name. - - - If removal of the would result in - s pointing to non-existent calendars, then a - will be thrown. - - The context. - The name of the to be removed. - - if a with the given name - was found and removed from the store. - - - - - Retrieve the given . - - The context. - The name of the to be retrieved. - - The desired , or null if there is no - match. - - - - - Get the number of s that are - stored in the . - - The context. - - - - - Get the number of s that are - stored in the . - - The context. - - - - - Get the number of s that are - stored in the . - - The context. - - - - - Get the names of all of the s that - have the given group name. -

- If there are no jobs in the given group name, the result should be a - zero-length array (not ). -

-
- The CTX. - Name of the group. - -
- - - Get the names of all of the s - that have the given group name. -

- If there are no triggers in the given group name, the result should be a - zero-length array (not ). -

-
-
- - - Get the names of all of the - groups. -

- If there are no known group names, the result should be a zero-length - array (not ). -

-
-
- - - Get the names of all of the - groups. -

- If there are no known group names, the result should be a zero-length - array (not ). -

-
-
- - - Get the names of all of the s - in the . - -

- If there are no Calendars in the given group name, the result should be - a zero-length array (not ). -

-
-
- - - Get all of the Triggers that are associated to the given Job. - - - If there are no matches, a zero-length array should be returned. - - - - - Get the current state of the identified . - - - - - - - - - - Pause the with the given name. - - - - - Pause all of the s in the - given group. - - - The JobStore should "remember" that the group is paused, and impose the - pause on any new triggers that are added to the group while the group is - paused. - - - - - Pause the with the given name - by - pausing all of its current s. - - - - - Pause all of the s in the given - group - by pausing all of their s. -

- The JobStore should "remember" that the group is paused, and impose the - pause on any new jobs that are added to the group while the group is - paused. -

-
- - -
- - - Resume (un-pause) the with the - given name. - -

- If the missed one or more fire-times, then the - 's misfire instruction will be applied. -

-
- - -
- - - Resume (un-pause) all of the s - in the given group. -

- If any missed one or more fire-times, then the - 's misfire instruction will be applied. -

-
-
- - - Gets the paused trigger groups. - - The context. - - - - - Resume (un-pause) the with the - given name. -

- If any of the 's s missed one - or more fire-times, then the 's misfire - instruction will be applied. -

-
-
- - - Resume (un-pause) all of the s in - the given group. -

- If any of the s had s that - missed one or more fire-times, then the 's - misfire instruction will be applied. -

-
-
- - - Pause all triggers - equivalent of calling - on every group. -

- When is called (to un-pause), trigger misfire - instructions WILL be applied. -

-
- -
- - - Resume (un-pause) all triggers - equivalent of calling - on every group. -

- If any missed one or more fire-times, then the - 's misfire instruction will be applied. -

- -
- -
- - - Get a handle to the next trigger to be fired, and mark it as 'reserved' - by the calling scheduler. - - The context. - If > 0, the JobStore should only return a Trigger - that will fire no later than the time represented in this value as - milliseconds. - - - - - - - Inform the that the scheduler no longer plans to - fire the given , that it had previously acquired - (reserved). - - - - - Inform the that the scheduler is now firing the - given (executing its associated ), - that it had previously acquired (reserved). - - null if the trigger or it's job or calendar no longer exist, or - if the trigger was not successfully put into the 'executing' - state. - - - - - Inform the that the scheduler has completed the - firing of the given (and the execution its - associated ), and that the - in the given should be updated if the - is stateful. - - - - - Supports the persistence. - - - - - - Initializes a new instance of the class. - - - - - Gets the connection and starts a new transaction. - - - - - - Called by the QuartzScheduler before the is - used, in order to give it a chance to Initialize. - - - - - - - - Called by the QuartzScheduler to inform the that - it should free up all of it's resources because the scheduler is - shutting down. - - - - - Removes all volatile data. - - - - - Removes all volatile data. - - - - - Will recover any failed or misfired jobs and clean up the data store as - appropriate. - - - - - Will recover any failed or misfired jobs and clean up the data store as - appropriate. - - - - - Store the given and . - - SchedulingContext - Job to be stored. - Trigger to be stored. - - - - returns true if the given JobGroup - is paused - - - - - - - - returns true if the given TriggerGroup - is paused - - - - - - - - Stores the given . - - - The to be stored. - - If , any existing in the - with the same name & group should be over-written. - - - -

- Insert or update a job. -

-
-
- - - Check existence of a given job. - - - - - Store the given . - - - The to be stored. - - If , any existing in - the with the same name & group should - be over-written. - - - if a with the same name/group already - exists, and replaceExisting is set to false. - - - - - Insert or update a trigger. - - - - - Check existence of a given trigger. - - - - - Remove (delete) the with the given - name, and any s that reference - it. - - - - If removal of the results in an empty group, the - group should be removed from the 's list of - known group names. - - - The name of the to be removed. - The group name of the to be removed. - - if a with the given name & - group was found and removed from the store. - - - - - Delete a job and its listeners. - - - - - - - Delete a trigger, its listeners, and its Simple/Cron/BLOB sub-table entry. - - - - - - - - Retrieve the for the given - . - - The name of the to be retrieved. - The group name of the to be retrieved. - The desired , or null if there is no match. - - - - Remove (delete) the with the - given name. - - - -

- If removal of the results in an empty group, the - group should be removed from the 's list of - known group names. -

- -

- If removal of the results in an 'orphaned' - that is not 'durable', then the should be deleted - also. -

-
- The name of the to be removed. - The group name of the to be removed. - - if a with the given - name & group was found and removed from the store. - -
- - - - - - Retrieve the given . - - The name of the to be retrieved. - The group name of the to be retrieved. - The desired , or null if there is no match. - - - - Get the current state of the identified . - - - - - - - - - - Gets the state of the trigger. - - The conn. - The CTXT. - Name of the trigger. - Name of the group. - - - - - Store the given . - - The name of the calendar. - The to be stored. - - If , any existing - in the with the same name & group - should be over-written. - - - if a with the same name already - exists, and replaceExisting is set to false. - - - - - Remove (delete) the with the given name. - - - If removal of the would result in - s pointing to non-existent calendars, then a - will be thrown. - - The name of the to be removed. - - if a with the given name - was found and removed from the store. - - - - - Retrieve the given . - - The name of the to be retrieved. - The desired , or null if there is no match. - - - - Get the number of s that are - stored in the . - - - - - Get the number of s that are - stored in the . - - - - - Get the number of s that are - stored in the . - - - - - Get the names of all of the s that - have the given group name. - - - If there are no jobs in the given group name, the result should be a - zero-length array (not ). - - - - - Get the names of all of the s - that have the given group name. - - - If there are no triggers in the given group name, the result should be a - zero-length array (not ). - - - - - Get the names of all of the - groups. - - - - If there are no known group names, the result should be a zero-length - array (not ). - - - - - Get the names of all of the - groups. - - - - If there are no known group names, the result should be a zero-length - array (not ). - - - - - Get the names of all of the s - in the . - - - If there are no Calendars in the given group name, the result should be - a zero-length array (not ). - - - - - Get all of the Triggers that are associated to the given Job. - - - If there are no matches, a zero-length array should be returned. - - - - - Pause the with the given name. - - - - - - Pause the with the given name. - - - - - - Pause the with the given name - by - pausing all of its current s. - - - - - - Pause all of the s in the given - group - by pausing all of their s. - - - - - - Determines if a Trigger for the given job should be blocked. - State can only transition to StatePausedBlocked/StateBlocked from - StatePaused/StateWaiting respectively. - - StatePausedBlocked, StateBlocked, or the currentState. - - - - Resume (un-pause) the with the - given name. - - - If the missed one or more fire-times, then the - 's misfire instruction will be applied. - - - - - - Resume (un-pause) the with the - given name. - - - If any of the 's s missed one - or more fire-times, then the 's misfire - instruction will be applied. - - - - - - Resume (un-pause) all of the s in - the given group. - - - If any of the s had s that - missed one or more fire-times, then the 's - misfire instruction will be applied. - - - - - - Pause all of the s in the given group. - - - - - - Pause all of the s in the given group. - - - - - - Pause all of the s in the - given group. - - - - - - Resume (un-pause) all of the s - in the given group. -

- If any missed one or more fire-times, then the - 's misfire instruction will be applied. -

-
- -
- - - Pause all triggers - equivalent of calling - on every group. -

- When is called (to un-pause), trigger misfire - instructions WILL be applied. -

-
- - -
- - - Resume (un-pause) all triggers - equivalent of calling - on every group. - - - If any missed one or more fire-times, then the - 's misfire instruction will be applied. - - - - - - Resume (un-pause) all triggers - equivalent of calling - on every group. -

- If any missed one or more fire-times, then the - 's misfire instruction will be applied. -

-
- -
- - - Get a handle to the next N triggers to be fired, and mark them as 'reserved' - by the calling scheduler. - - - - - - Inform the that the scheduler no longer plans to - fire the given , that it had previously acquired - (reserved). - - - - - Inform the that the scheduler has completed the - firing of the given (and the execution its - associated ), and that the - in the given should be updated if the - is stateful. - - - - - Get a list of all scheduler instances in the cluster that may have failed. - This includes this scheduler if it is checking in for the first time. - - - - - Create dummy objects for fired triggers - that have no scheduler state record. Checkin timestamp and interval are - left as zero on these dummy objects. - - List of all current s - - - - Cleanup the given database connection. This means restoring - any modified auto commit or transaction isolation connection - attributes, and then closing the underlying connection. - - - - This is separate from closeConnection() because the Spring - integration relies on being able to overload closeConnection() and - expects the same connection back that it originally returned - from the datasource. - - - - - - Closes the supplied connection. - - (Optional) - - - - Rollback the supplied connection. - - (Optional) - - JobPersistenceException thrown if a SQLException occurs when the - connection is rolled back - - - - - Commit the supplied connection. - - The CTH. - if set to true opens a new transaction. - JobPersistenceException thrown if a SQLException occurs when the - - - - Execute the given callback in a transaction. Depending on the JobStore, - the surrounding transaction may be assumed to be already present - (managed). - - - This method just forwards to ExecuteInLock() with a null lockName. - - - - - - Execute the given callback having aquired the given lock. - Depending on the JobStore, the surrounding transaction may be - assumed to be already present (managed). This version is just a - handy wrapper around executeInLock that doesn't require a return - value. - - - The name of the lock to aquire, for example - "TRIGGER_ACCESS". If null, then no lock is aquired, but the - lockCallback is still executed in a transaction. - - - - - - Execute the given callback having aquired the given lock. - Depending on the JobStore, the surrounding transaction may be - assumed to be already present (managed). - - - The name of the lock to aquire, for example - "TRIGGER_ACCESS". If null, then no lock is aquired, but the - lockCallback is still executed in a transaction. - - - - - Execute the given callback having optionally aquired the given lock. - This uses the non-managed transaction connection. This version is just a - handy wrapper around executeInNonManagedTXLock that doesn't require a return - value. - - - The name of the lock to aquire, for example - "TRIGGER_ACCESS". If null, then no lock is aquired, but the - lockCallback is still executed in a non-managed transaction. - - - - - - Execute the given callback having optionally aquired the given lock. - This uses the non-managed transaction connection. - - - The name of the lock to aquire, for example - "TRIGGER_ACCESS". If null, then no lock is aquired, but the - lockCallback is still executed in a non-managed transaction. - - - - - Get or set the datasource name. - - - - - Gets the log. - - The log. - - - - Get or sets the prefix that should be pre-pended to all table names. - - - - - Set whether string-only properties will be handled in JobDataMaps. - - - - - Get or set the instance Id of the Scheduler (must be unique within a cluster). - - - - - Get or set the instance Id of the Scheduler (must be unique within this server instance). - - - - - Get or set whether this instance is part of a cluster. - - - - - Get or set the frequency at which this instance "checks-in" - with the other instances of the cluster. -- Affects the rate of - detecting failed instances. - - - - - Get or set the maximum number of misfired triggers that the misfire handling - thread will try to recover at one time (within one transaction). The - default is 20. - - - - - Gets or sets the database retry interval. - - The db retry interval. - - - - Get or set whether this instance should use database-based thread - synchronization. - - - - - Whether or not to obtain locks when inserting new jobs/triggers. - Defaults to , which is safest - some db's (such as - MS SQLServer) seem to require this to avoid deadlocks under high load, - while others seem to do fine without. - - - Setting this property to will provide a - significant performance increase during the addition of new jobs - and triggers. - - - - - The time span by which a trigger must have missed its - next-fire-time, in order for it to be considered "misfired" and thus - have its misfire instruction applied. - - - - - Don't call set autocommit(false) on connections obtained from the - DataSource. This can be helpfull in a few situations, such as if you - have a driver that complains if it is called when it is already off. - - - - - Set the transaction isolation level of DB connections to sequential. - - - - - Whether or not the query and update to acquire a Trigger for firing - should be performed after obtaining an explicit DB lock (to avoid - possible race conditions on the trigger's db row). This is - is considered unnecessary for most databases (due to the nature of - the SQL update that is performed), and therefore a superfluous performance hit. - - - - - Get or set the ADO.NET driver delegate class name. - - - - - set the SQL statement to use to select and lock a row in the "locks" - table. - - - - - - Get whether the threads spawned by this JobStore should be - marked as daemon. Possible threads include the - and the . - - - - - - Get whether to check to see if there are Triggers that have misfired - before actually acquiring the lock to recover them. This should be - set to false if the majority of the time, there are are misfired - Triggers. - - - - - - Get the driver delegate for DB operations. - - - - - Get whether String-only properties will be handled in JobDataMaps. - - - - - Indicates whether this job store supports persistence. - - - - - - - Implement this interface to provide the code to execute within - the a transaction template that has no return value. - - - - - - Implement this interface to provide the code to execute within - the a transaction template. If no return value is required, execute - should just return null. - - - - - - - - An interface for classes wishing to provide the service of loading classes - and resources within the scheduler... - - James House - - - - Called to give the ClassLoadHelper a chance to Initialize itself, - including the oportunity to "steal" the class loader off of the calling - thread, which is the thread that is initializing Quartz. - - - - - Return the class with the given name. - - - - - Finds a resource with a given name. This method returns null if no - resource with this name is found. - - name of the desired resource - - a java.net.URL object - - - - - Finds a resource with a given name. This method returns null if no - resource with this name is found. - - name of the desired resource - - a java.io.InputStream object - - - - - Helper class for returning the composite result of trying - to recover misfired jobs. - - - - - Initializes a new instance of the class. - - if set to true [has more misfired triggers]. - The processed misfired trigger count. - - - - - Gets a value indicating whether this instance has more misfired triggers. - - - true if this instance has more misfired triggers; otherwise, false. - - - - - Gets the processed misfired trigger count. - - The processed misfired trigger count. - - - - Called by the QuartzScheduler before the is - used, in order to give the it a chance to Initialize. - - - - - - - Called by the QuartzScheduler to inform the that - it should free up all of it's resources because the scheduler is - shutting down. - - - - - Gets the non managed TX connection. - - - - - - Execute the given callback having optionally aquired the given lock. - Because CMT assumes that the connection is already part of a managed - transaction, it does not attempt to commit or rollback the - enclosing transaction. - - - - - - - The name of the lock to aquire, for example - "TRIGGER_ACCESS". If null, then no lock is aquired, but the - txCallback is still executed in a transaction. - - Callback to execute. - - - - Utility class to keep track of both active transaction - and connection. - - - - - Initializes a new instance of the class. - - The connection. - The transaction. - - - - Gets or sets the connection. - - The connection. - - - - Gets or sets the transaction. - - The transaction. - - - - is meant to be used in a standalone environment. - Both commit and rollback will be handled by this class. - - Jeffrey Wescott - James House - - - - Called by the QuartzScheduler before the is - used, in order to give the it a chance to Initialize. - - - - - - - For , the non-managed TX connection is just - the normal connection because it is not CMT. - - - - - - Execute the given callback having optionally aquired the given lock. - For , because it manages its own transactions - and only has the one datasource, this is the same behavior as - . - - - The name of the lock to aquire, for example "TRIGGER_ACCESS". - If null, then no lock is aquired, but the lockCallback is still - executed in a transaction. - - Callback to execute. - - - - - - - - - Exception class for when there is a failure obtaining or releasing a - resource lock. - - - James House - - - - An exception that is thrown to indicate that there has been a failure in the - scheduler's underlying persistence mechanism. - - James House - - - -

- Create a with the given message. -

-
-
- - - Initializes a new instance of the class. - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - The class name is null or is zero (0). - The info parameter is null. - - -

- Create a with the given message - and error code. -

-
-
- -

- Create a with the given message - and cause. -

-
-
- -

- Create a with the given message, - cause and error code. -

-
-
- - - Initializes a new instance of the class. - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - The class name is null or is zero (0). - The info parameter is null. - - - - This is a driver delegate for the MySQL ADO.NET driver. - - Marko Lahma - - - - Initializes a new instance of the class. - - the logger to use during execution - the prefix of all table names - The instance id. - The db provider. - - - - Initializes a new instance of the class. - - The logger. - The table prefix. - The instance id. - The db provider. - if set to true [use properties]. - - - - Gets the select next trigger to acquire SQL clause. - MySQL version with LIMIT support. - - - - - - Exception class for when a driver delegate cannot be found for a given - configuration, or lack thereof. - - Jeffrey Wescott - - - - Initializes a new instance of the class. - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - The class name is null or is zero (0). - The info parameter is null. - - - - This is a driver delegate for the Oracle database. - - Marko Lahma - - - - Initializes a new instance of the class. - - the logger to use during execution - the prefix of all table names - The instance id. - The db provider. - - - - Initializes a new instance of the class. - - The logger. - The table prefix. - The instance id. - The db provider. - if set to true [use properties]. - - - - Creates the SQL for select next trigger to acquire. - - - - - Gets the select next trigger to acquire SQL clause. - Oracle version with rownum support. - - - - - - This is a driver delegate for the PostgreSQL ADO.NET driver. - - Marko Lahma - - - - Initializes a new instance of the class. - - The log. - The table prefix. - The instance id. - The db provider. - - - - Initializes a new instance of the class. - - The log. - The table prefix. - The instance id. - The db provider. - if set to true [use properties]. - - - - Gets the select next trigger to acquire SQL clause. - PostgreSQL version with LIMIT support. - - - - - - Conveys a scheduler-instance state record. - - James House - - - - Gets or sets the checkin interval. - - The checkin interval. - - - - Gets or sets the checkin timestamp. - - The checkin timestamp. - - - - Gets or sets the scheduler instance id. - - The scheduler instance id. - - - - Internal in-memory lock handler for providing thread/resource locking in - order to protect resources from being altered by multiple threads at the - same time. - - James House - - - - Grants a lock on the identified resource to the calling thread (blocking - until it is available). - - True if the lock was obtained. - - - Release the lock on the identified resource if it is held by the calling - thread. - - - - - Determine whether the calling thread owns a lock on the identified - resource. - - - - - Gets the thread locks. - - The thread locks. - - - - Whether this Semaphore implementation requires a database connection for - its lock management operations. - - - - - - - - - This is a driver delegate for the SQLiteDelegate ADO.NET driver. - - Marko Lahma - - - - Initializes a new instance of the class. - - the logger to use during execution - the prefix of all table names - The instance id. - The db provider. - - - - Initializes a new instance of the class. - - The logger. - The table prefix. - The instance id. - The db provider. - if set to true [use properties]. - - - - Gets the select next trigger to acquire SQL clause. - SQLite version with LIMIT support. - - - - - - A SQL Server specific driver delegate. - - Marko Lahma - - - - Initializes a new instance of the class. - - the logger to use during execution - the prefix of all table names - The instance id. - The db provider. - - - - Initializes a new instance of the class. - - The logger. - The table prefix. - The instance id. - The db provider. - if set to true [use properties]. - - - - Creates the SQL for select next trigger to acquire. - - - - - Gets the select next trigger to acquire SQL clause. - SQL Server specific version with TOP functionality - - - - - - Internal database based lock handler for providing thread/resource locking - in order to protect resources from being altered by multiple threads at the - same time. - - James House - - - - Initializes a new instance of the class. - - The table prefix. - The select with lock SQL. - - - - Execute the SQL select for update that will lock the proper database row. - - - - Provide thread/resource locking in order to protect - resources from being altered by multiple threads at the same time using - a db row update. - - - Note: This Semaphore implementation is useful for databases that do - not support row locking via "SELECT FOR UPDATE" type syntax, for example - Microsoft SQLServer (MSSQL). - - - - - Initializes a new instance of the class. - - - - - Execute the SQL that will lock the proper database row. - - - - - - - - This implementation of the Calendar excludes a set of days of the year. You - may use it to exclude bank holidays which are on the same date every year. - - - - Juergen Donnerstag - - - - This implementation of the Calendar may be used (you don't have to) as a - base class for more sophisticated one's. It merely implements the base - functionality required by each Calendar. - - - Regarded as base functionality is the treatment of base calendars. Base - calendar allow you to chain (stack) as much calendars as you may need. For - example to exclude weekends you may use WeeklyCalendar. In order to exclude - holidays as well you may define a WeeklyCalendar instance to be the base - calendar for HolidayCalendar instance. - - - Juergen Donnerstag - James House - - - - An interface to be implemented by objects that define spaces of time during - which an associated may fire. - - - Calendars do not define actual fire times, but rather are used to limit a - from firing on its normal schedule if necessary. Most - Calendars include all times by default and allow the user to specify times to - exclude. As such, it is often useful to think of Calendars as being used to - exclude a block of time, as opposed to include - a block of time. (i.e. the schedule "fire every five minutes except on Sundays" could be - implemented with a and a which excludes Sundays) - - James House - Juergen Donnerstag - - - - Determine whether the given UTC time is 'included' by the - Calendar. - - - - - Determine the next UTC time that is 'included' by the - Calendar after the given UTC time. - - - - - Gets or sets a description for the instance - may be - useful for remembering/displaying the purpose of the calendar, though - the description has no meaning to Quartz. - - - - - Set a new base calendar or remove the existing one. - Get the base calendar. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The base calendar. - - - - Initializes a new instance of the class. - - The time zone. - - - - Initializes a new instance of the class. - - The base calendar. - The time zone. - - - - checks whether two arrays have - the same length and - for any given place there are equal elements - in both arrays - - - - - - Get the base calendar. Will be null, if not set. - - - - - Check if date/time represented by timeStamp is included. If included - return true. The implementation of BaseCalendar simply calls the base - calendars IsTimeIncluded() method if base calendar is set. - - - - - - Determine the next UTC time (in milliseconds) that is 'included' by the - Calendar after the given time. Return the original value if timeStamp is - included. Return 0 if all days are excluded. - - - - - - Gets or sets the time zone. - - The time zone. - - - - Gets or sets the description given to the instance by - its creator (if any). - - - - - Set a new base calendar or remove the existing one - - - - - - Constructor - - - - - Constructor - - The base calendar. - - - - Return true, if day is defined to be exluded. - - - - - Redefine a certain day to be excluded (true) or included (false). - - - - - Determine whether the given UTC time (in milliseconds) is 'included' by the - Calendar. -

- Note that this Calendar is only has full-day precision. -

-
-
- - - Determine the next UTC time (in milliseconds) that is 'included' by the - Calendar after the given time. Return the original value if timeStampUtc is - included. Return 0 if all days are excluded. -

- Note that this Calendar is only has full-day precision. -

-
-
- - - Get or the array which defines the exclude-value of each day of month. - Setting will redefine the array of days excluded. The array must of size greater or - equal 31. - - - - - This implementation of the Calendar excludes the set of times expressed by a - given CronExpression. - - - For example, you could use this calendar to exclude all but business hours (8AM - 5PM) every - day using the expression "* * 0-7,18-23 ? * *". -

- It is important to remember that the cron expression here describes a set of - times to be excluded from firing. Whereas the cron expression in - CronTrigger describes a set of times that can - be included for firing. Thus, if a has a - given cron expression and is associated with a with - the same expression, the calendar will exclude all the times the - trigger includes, and they will cancel each other out. -

-
- Aaron Craven -
- - - Initializes a new instance of the class. - - a String representation of the desired cron expression - - - - Create a with the given cron expression and - . - - - the base calendar for this calendar instance - see BaseCalendar for more information on base - calendar functionality - - a String representation of the desired cron expression - - - - Create a with the given cron expression and - . - - - the base calendar for this calendar instance - see BaseCalendar for more information on base - calendar functionality - - a String representation of the desired cron expression - - - - - Determine whether the given time is 'included' by the - Calendar. - - the time to test - a boolean indicating whether the specified time is 'included' by the CronCalendar - - - - Determine the next time that is 'included' by the - Calendar after the given time. Return the original value if timeStamp is - included. Return 0 if all days are excluded. - - - - - - - Returns a that represents the current . - - - A that represents the current . - - - - - Sets the cron expression for the calendar to a new value. - - The expression. - - - - Returns the object representation of the cron expression that defines the - dates and times this calendar excludes. - - - - - This implementation of the Calendar excludes (or includes - see below) a - specified time range each day. - - - For example, you could use this calendar to - exclude business hours (8AM - 5PM) every day. Each - only allows a single time range to be specified, and that time range may not - * cross daily boundaries (i.e. you cannot specify a time range from 8PM - 5AM). - If the property is (default), - the time range defines a range of times in which triggers are not allowed to - * fire. If is , the time range - is inverted: that is, all times outside the defined time range - are excluded. -

- Note when using , it behaves on the same principals - as, for example, WeeklyCalendar defines a set of days that are - excluded every week. Likewise, defines a - set of times that are excluded every day. -

-
- Mike Funk - Aaron Craven -
- - - Create a with a time range defined by the - specified strings and no baseCalendar. - and - must be in the format "HH:MM[:SS[:mmm]]" where: -
    -
  • - HH is the hour of the specified time. The hour should be - specified using military (24-hour) time and must be in the range - 0 to 23. -
  • -
  • - MM is the minute of the specified time and must be in the range - 0 to 59. -
  • -
  • - SS is the second of the specified time and must be in the range - 0 to 59. -
  • -
  • - mmm is the millisecond of the specified time and must be in the - range 0 to 999. -
  • -
  • items enclosed in brackets ('[', ']') are optional.
  • -
  • - The time range starting time must be before the time range ending - time. Note this means that a time range may not cross daily - boundaries (10PM - 2AM) -
  • -
-
-
- - - Create a with a time range defined by the - specified strings and the specified baseCalendar. - and - must be in the format "HH:MM[:SS[:mmm]]" where: -
    -
  • - HH is the hour of the specified time. The hour should be - specified using military (24-hour) time and must be in the range - 0 to 23. -
  • -
  • - MM is the minute of the specified time and must be in the range - 0 to 59. -
  • -
  • - SS is the second of the specified time and must be in the range - 0 to 59. -
  • -
  • - mmm is the millisecond of the specified time and must be in the - range 0 to 999. -
  • -
  • - items enclosed in brackets ('[', ']') are optional. -
  • -
  • - The time range starting time must be before the time range ending - time. Note this means that a time range may not cross daily - boundaries (10PM - 2AM) -
  • -
-
- The base calendar for this calendar instance see BaseCalendar for more - information on base calendar functionality. -
- - - Create a with a time range defined by the - specified values and no baseCalendar. Values are subject to - the following validations: -
    -
  • - Hours must be in the range 0-23 and are expressed using military - (24-hour) time. -
  • -
  • Minutes must be in the range 0-59
  • -
  • Seconds must be in the range 0-59
  • -
  • Milliseconds must be in the range 0-999
  • -
  • - The time range starting time must be before the time range ending - time. Note this means that a time range may not cross daily - boundaries (10PM - 2AM) -
  • -
-
- The range starting hour of day. - The range starting minute. - The range starting second. - The range starting millis. - The range ending hour of day. - The range ending minute. - The range ending second. - The range ending millis. -
- - - Create a with a time range defined by the - specified values and the specified . Values are - subject to the following validations: -
    -
  • - Hours must be in the range 0-23 and are expressed using military - (24-hour) time. -
  • -
  • Minutes must be in the range 0-59
  • -
  • Seconds must be in the range 0-59
  • -
  • Milliseconds must be in the range 0-999
  • -
  • - The time range starting time must be before the time range ending - time. Note this means that a time range may not cross daily - boundaries (10PM - 2AM) -
  • -
-
- The range starting hour of day. - The range starting minute. - The range starting second. - The range starting millis. - The range ending hour of day. - The range ending minute. - The range ending second. - The range ending millis. -
- - - Create a with a time range defined by the - specified s and no - baseCalendar. The Calendars are subject to the following - considerations: -
    -
  • - Only the time-of-day fields of the specified Calendars will be - used (the date fields will be ignored) -
  • -
  • - The starting time must be before the ending time of the defined - time range. Note this means that a time range may not cross - daily boundaries (10PM - 2AM). (because only time fields are - are used, it is possible for two Calendars to represent a valid - time range and - rangeStartingCalendar.after(rangeEndingCalendar) == true) - -
  • -
-
- The range starting calendar. - The range ending calendar. -
- - - Create a with a time range defined by the - specified s and the specified - . The Calendars are subject to the following - considerations: -
    -
  • - Only the time-of-day fields of the specified Calendars will be - used (the date fields will be ignored) -
  • -
  • - The starting time must be before the ending time of the defined - time range. Note this means that a time range may not cross - daily boundaries (10PM - 2AM). (because only time fields are - are used, it is possible for two Calendars to represent a valid - time range and - rangeStartingCalendarUtc > rangeEndingCalendarUtc == true) -
  • -
-
- The range starting calendar. - The range ending calendar. -
- - - Create a with a time range defined by the - specified values and no baseCalendar. The values are - subject to the following considerations: -
    -
  • - Only the time-of-day portion of the specified values will be - used -
  • -
  • - The starting time must be before the ending time of the defined - time range. Note this means that a time range may not cross - daily boundaries (10PM - 2AM). (because only time value are - are used, it is possible for the two values to represent a valid - time range and rangeStartingTime > rangeEndingTime) -
  • -
-
- The range starting time in millis. - The range ending time in millis. -
- - - Create a with a time range defined by the - specified values and the specified . The values - are subject to the following considerations: -
    -
  • - Only the time-of-day portion of the specified values will be - used -
  • -
  • - The starting time must be before the ending time of the defined - time range. Note this means that a time range may not cross - daily boundaries (10PM - 2AM). (because only time value are - are used, it is possible for the two values to represent a valid - time range and rangeStartingTime > rangeEndingTime) -
  • -
-
- The range starting time in millis. - The range ending time in millis. -
- - - Determine whether the given time is 'included' by the - Calendar. - - - - - - - Determine the next time (in milliseconds) that is 'included' by the - Calendar after the given time. Return the original value if timeStamp is - included. Return 0 if all days are excluded. - - - - - - - - Returns the start time of the time range of the day - specified in . - - - a DateTime representing the start time of the - time range for the specified date. - - - - - Returns the end time of the time range of the day - specified in - - - A DateTime representing the end time of the - time range for the specified date. - - - - - Returns a that represents the current . - - - A that represents the current . - - - - - Sets the time range for the to the times - represented in the specified Strings. - - The range starting time string. - The range ending time string. - - - - Sets the time range for the to the times - represented in the specified values. - - The range starting hour of day. - The range starting minute. - The range starting second. - The range starting millis. - The range ending hour of day. - The range ending minute. - The range ending second. - The range ending millis. - - - - Sets the time range for the to the times - represented in the specified s. - - The range starting calendar. - The range ending calendar. - - - - Sets the time range for the to the times - represented in the specified values. - - The range starting time. - The range ending time. - - - - Gets the start of day, practically zeroes time part. - - The time. - - - - - Gets the end of day, pratically sets time parts to maximum allowed values. - - The time. - - - - - Checks the specified values for validity as a set of time values. - - The hour of day. - The minute. - The second. - The millis. - - - - Indicates whether the time range represents an inverted time range (see - class description). - - true if invert time range; otherwise, false. - - - - This implementation of the Calendar stores a list of holidays (full days - that are excluded from scheduling). - - - The implementation DOES take the year into consideration, so if you want to - exclude July 4th for the next 10 years, you need to add 10 entries to the - exclude list. - - Sharada Jambula - Juergen Donnerstag - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The base calendar. - - - - Determine whether the given time (in milliseconds) is 'included' by the - Calendar. -

- Note that this Calendar is only has full-day precision. -

-
-
- - - Determine the next time (in milliseconds) that is 'included' by the - Calendar after the given time. -

- Note that this Calendar is only has full-day precision. -

-
-
- - - Add the given Date to the list of excluded days. Only the month, day and - year of the returned dates are significant. - - - - - Removes the excluded date. - - The date to remove. - - - - Returns a of Dates representing the excluded - days. Only the month, day and year of the returned dates are - significant. - - - - - This implementation of the Calendar excludes a set of days of the month. You - may use it to exclude every 1. of each month for example. But you may define - any day of a month. - - - - Juergen Donnerstag - - - - Initializes a new instance of the class. - - - - - Constructor - - The base calendar. - - - - Initialize internal variables - - - - - Return true, if mday is defined to be exluded. - - - - - Redefine a certain day of the month to be excluded (true) or included - (false). - - - - - Check if all days are excluded. That is no day is included. - - boolean - - - - - Determine whether the given time (in milliseconds) is 'included' by the - Calendar. -

- Note that this Calendar is only has full-day precision. -

-
-
- - - Determine the next time (in milliseconds) that is 'included' by the - Calendar after the given time. Return the original value if timeStamp is - included. Return DateTime.MinValue if all days are excluded. -

- Note that this Calendar is only has full-day precision. -

-
-
- - - Get or set the array which defines the exclude-value of each day of month - Setting will redefine the array of days excluded. The array must of size greater or - equal 31. - - - - - This implementation of the Calendar excludes a set of days of the week. You - may use it to exclude weekends for example. But you may define any day of - the week. - - - - Juergen Donnerstag - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The base calendar. - - - - Initialize internal variables - - - - - Return true, if wday is defined to be exluded. E. g. - saturday and sunday. - - - - - Redefine a certain day of the week to be excluded (true) or included - (false). Use java.util.Calendar's constants like MONDAY to determine the - wday. - - - - - Check if all week ays are excluded. That is no day is included. - - - - - Determine whether the given time (in milliseconds) is 'included' by the - Calendar. -

- Note that this Calendar is only has full-day precision. -

-
-
- - - Determine the next time (in milliseconds) that is 'included' by the - Calendar after the given time. Return the original value if timeStamp is - included. Return DateTime.MinValue if all days are excluded. -

- Note that this Calendar is only has full-day precision. -

-
-
- - - Get the array with the week days. - Setting will redefine the array of days excluded. The array must of size greater or - equal 8. java.util.Calendar's constants like MONDAY should be used as - index. A value of true is regarded as: exclude it. - - - - - A singleton implementation of . - - - Here are some examples of using this class: -

- To create a scheduler that does not write anything to the database (is not - persistent), you can call : -

-
-            DirectSchedulerFactory.Instance.CreateVolatileScheduler(10); // 10 threads 
-            // don't forget to start the scheduler: 
-            DirectSchedulerFactory.Instance.GetScheduler().Start();
-            
-

- Several create methods are provided for convenience. All create methods - eventually end up calling the create method with all the parameters: -

-
-            public void createScheduler(String schedulerName, string schedulerInstanceId, ThreadPool threadPool, JobStore jobStore, string rmiRegistryHost, int rmiRegistryPort)
-            
-

- Here is an example of using this method: -

-
-            // create the thread pool 
-            SimpleThreadPool threadPool = new SimpleThreadPool(maxThreads, Thread.NORM_PRIORITY); 
-            threadPool.Initialize(); 
-            // create the job store 
-            JobStore jobStore = new RAMJobStore(); 
-            jobStore.Initialize();
-            
-            DirectSchedulerFactory.Instance.CreateScheduler("My Quartz Scheduler", "My Instance", threadPool, jobStore, "localhost", 1099); 
-            // don't forget to start the scheduler: 
-            DirectSchedulerFactory.Instance.GetScheduler("My Quartz Scheduler", "My Instance").start();
-            
-
> - Mohammad Rezaei - James House - - -
- - - Provides a mechanism for obtaining client-usable handles to - instances. - - - - James House - - - - Returns a client-usable handle to a . - - - - - Returns a handle to the Scheduler with the given name, if it exists. - - - - - Returns handles to all known Schedulers (made by any SchedulerFactory - within this app domain.). - - - - - Initializes a new instance of the class. - - - - - Creates an in memory job store () - The thread priority is set to Thread.NORM_PRIORITY - - The number of threads in the thread pool - - - - Creates a proxy to a remote scheduler. This scheduler can be retrieved - via . - - SchedulerException - - - - Same as , - with the addition of specifying the scheduler name and instance ID. This - scheduler can only be retrieved via . - - The name for the scheduler. - The instance ID for the scheduler. - - SchedulerException - - - - Creates a scheduler using the specified thread pool and job store. This - scheduler can be retrieved via DirectSchedulerFactory#GetScheduler() - - - The thread pool for executing jobs - - - The type of job store - - SchedulerException - if initialization failed - - - - - Same as DirectSchedulerFactory#createScheduler(ThreadPool threadPool, JobStore jobStore), - with the addition of specifying the scheduler name and instance ID. This - scheduler can only be retrieved via DirectSchedulerFactory#getScheduler(String) - - The name for the scheduler. - The instance ID for the scheduler. - The thread pool for executing jobs - The type of job store - - - - Creates a scheduler using the specified thread pool and job store and - binds it to RMI. - - The name for the scheduler. - The instance ID for the scheduler. - The thread pool for executing jobs - The type of job store - The idle wait time. You can specify "-1" for - the default value, which is currently 30000 ms. - The db failure retry interval. - - - - Creates a scheduler using the specified thread pool and job store and - binds it to RMI. - - The name for the scheduler. - The instance ID for the scheduler. - The thread pool for executing jobs - The type of job store - - The idle wait time. You can specify TimeSpan.Zero for - the default value, which is currently 30000 ms. - The db failure retry interval. - - - - Returns a handle to the Scheduler produced by this factory. -

- you must call createRemoteScheduler or createScheduler methods before - calling getScheduler() -

-
- - SchedulerException -
- - - Returns a handle to the Scheduler with the given name, if it exists. - - - - - Gets the log. - - The log. - - - - Gets the instance. - - The instance. - - -

- Returns a handle to all known Schedulers (made by any - StdSchedulerFactory instance.). -

-
-
- - - An implementation of the interface that remotely - proxies all method calls to the equivalent call on a given - instance, via remoting or similar technology. - - - - - James House - - - - This is the main interface of a Quartz Scheduler. - - - - A maintains a registry of - s and s. Once - registered, the is responsible for executing - s when their associated s - fire (when their scheduled time arrives). - - - instances are produced by a - . A scheduler that has already been - created/initialized can be found and used through the same factory that - produced it. After a has been created, it is in - "stand-by" mode, and must have its method - called before it will fire any s. - - - s are to be created by the 'client program', by - defining a class that implements the interface. - objects are then created (also by the client) to - define a individual instances of the . - instances can then be registered with the - via the %IScheduler.ScheduleJob(JobDetail, - Trigger)% or %IScheduler.AddJob(JobDetail, bool)% method. - - - s can then be defined to fire individual - instances based on given schedules. - s are most useful for one-time firings, or - firing at an exact moment in time, with N repeats with a given delay between - them. s allow scheduling based on time of day, - day of week, day of month, and month of year. - - - s and s have a name and - group associated with them, which should uniquely identify them within a single - . The 'group' feature may be useful for creating - logical groupings or categorizations of s and - s. If you don't have need for assigning a group to a - given s of s, then you can use - the constant defined on - this interface. - - - Stored s can also be 'manually' triggered through the - use of the %IScheduler.TriggerJob(string, string)% function. - - - Client programs may also be interested in the 'listener' interfaces that are - available from Quartz. The interface provides - notifications of executions. The - interface provides notifications of - firings. The - interface provides notifications of events and - errors. - - - The setup/configuration of a instance is very - customizable. Please consult the documentation distributed with Quartz. - - - - - - - - - - - - returns true if the given JobGroup - is paused - - - - - - - returns true if the given TriggerGroup - is paused - - - - - - - Get a object describiing the settings - and capabilities of the scheduler instance. - - - Note that the data returned is an 'instantaneous' snap-shot, and that as - soon as it's returned, the meta data values may be different. - - - - - Return a list of objects that - represent all currently executing Jobs in this Scheduler instance. - - -

- This method is not cluster aware. That is, it will only return Jobs - currently executing in this Scheduler instance, not across the entire - cluster. -

-

- Note that the list returned is an 'instantaneous' snap-shot, and that as - soon as it's returned, the true list of executing jobs may be different. - Also please read the doc associated with - - especially if you're using remoting. -

-
- -
- - - Get the names of all groups that are paused. - - - - - Get the global that has - the given name. - - Global job listener's name - - - - - Get the global that - has the given name. - - Global trigger listener's name - - - - - Starts the 's threads that fire s. - When a scheduler is first created it is in "stand-by" mode, and will not - fire triggers. The scheduler can also be put into stand-by mode by - calling the method. - - - The misfire/recovery process will be started, if it is the initial call - to this method on this scheduler instance. - - - - - - - - Calls after the indicated delay. - (This call does not block). This can be useful within applications that - have initializers that create the scheduler immediately, before the - resources needed by the executing jobs have been fully initialized. - - - - - - - - Temporarily halts the 's firing of s. - - -

- When is called (to bring the scheduler out of - stand-by mode), trigger misfire instructions will NOT be applied - during the execution of the method - any misfires - will be detected immediately afterward (by the 's - normal process). -

-

- The scheduler is not destroyed, and can be re-started at any time. -

-
- - -
- - - Halts the 's firing of s, - and cleans up all resources associated with the Scheduler. Equivalent to - . - - - The scheduler cannot be re-started. - - - - - - Halts the 's firing of s, - and cleans up all resources associated with the Scheduler. - - - The scheduler cannot be re-started. - - - if the scheduler will not allow this method - to return until all currently executing jobs have completed. - - - - - - Add the given to the - Scheduler, and associate the given with - it. - - - If the given Trigger does not reference any , then it - will be set to reference the Job passed with it into this method. - - - - - Schedule the given with the - identified by the 's settings. - - - - - Remove the indicated from the scheduler. - - - - - Remove (delete) the with the - given name, and store the new given one - which must be associated - with the same job (the new trigger must have the job name & group specified) - - however, the new trigger need not have the same name as the old trigger. - - - The name of the to be replaced. - - - The group name of the to be replaced. - - - The new to be stored. - - - if a with the given - name and group was not found and removed from the store, otherwise - the first fire time of the newly scheduled trigger. - - - - - Add the given to the Scheduler - with no associated - . The will be 'dormant' until - it is scheduled with a , or - is called for it. - - - The must by definition be 'durable', if it is not, - SchedulerException will be thrown. - - - - - Delete the identified from the Scheduler - and any - associated s. - - true if the Job was found and deleted. - - - - Trigger the identified - (Execute it now) - the generated trigger will be non-volatile. - - - - - Trigger the identified - (Execute it now) - the generated trigger will be volatile. - - - - - Trigger the identified - (Execute it now) - the generated trigger will be non-volatile. - - the name of the Job to trigger - the group name of the Job to trigger - - the (possibly ) JobDataMap to be - associated with the trigger that fires the job immediately. - - - - - Trigger the identified - (Execute it now) - the generated trigger will be volatile. - - the name of the Job to trigger - the group name of the Job to trigger - - the (possibly ) JobDataMap to be - associated with the trigger that fires the job immediately. - - - - - Pause the with the given - name - by pausing all of its current s. - - - - - Pause all of the s in the - given group - by pausing all of their s. - - - The Scheduler will "remember" that the group is paused, and impose the - pause on any new jobs that are added to the group while the group is - paused. - - - - - - Pause the with the given name. - - - - - Pause all of the s in the given group. - - - The Scheduler will "remember" that the group is paused, and impose the - pause on any new triggers that are added to the group while the group is - paused. - - - - - - Resume (un-pause) the with - the given name. - - - If any of the 's s missed one - or more fire-times, then the 's misfire - instruction will be applied. - - - - - Resume (un-pause) all of the s - in the given group. - - - If any of the s had s that - missed one or more fire-times, then the 's - misfire instruction will be applied. - - - - - - Resume (un-pause) the with the given - name. - - - If the missed one or more fire-times, then the - 's misfire instruction will be applied. - - - - - Resume (un-pause) all of the s in the - given group. - - - If any missed one or more fire-times, then the - 's misfire instruction will be applied. - - - - - - Pause all triggers - similar to calling - on every group, however, after using this method - must be called to clear the scheduler's state of 'remembering' that all - new triggers will be paused as they are added. - - - When is called (to un-pause), trigger misfire - instructions WILL be applied. - - - - - - - - Resume (un-pause) all triggers - similar to calling - on every group. - - - If any missed one or more fire-times, then the - 's misfire instruction will be applied. - - - - - - Get the names of all the s in the given group. - - - - - Get all s that are associated with the - identified . - - - - - Get the names of all the s in the given - group. - - - - - Get the for the - instance with the given name and group. - - - - - Get the instance with the given name and - group. - - - - - Get the current state of the identified . - - - - - - - - - - - Add (register) the given to the Scheduler. - - Name of the calendar. - The calendar. - if set to true [replace]. - whether or not to update existing triggers that - referenced the already existing calendar so that they are 'correct' - based on the new trigger. - - - - Delete the identified from the Scheduler. - - Name of the calendar. - - true if the Calendar was found and deleted. - - - - - Get the instance with the given name. - - - - - Get the names of all registered . - - An array of calendar names. - - - - Request the interruption, within this Scheduler instance, of all - currently executing instances of the identified , which - must be an implementor of the interface. - - -

- If more than one instance of the identified job is currently executing, - the method will be called on - each instance. However, there is a limitation that in the case that - on one instances throws an exception, all - remaining instances (that have not yet been interrupted) will not have - their method called. -

- -

- If you wish to interrupt a specific instance of a job (when more than - one is executing) you can do so by calling - to obtain a handle - to the job instance, and then invoke on it - yourself. -

-

- This method is not cluster aware. That is, it will only interrupt - instances of the identified InterruptableJob currently executing in this - Scheduler instance, not across the entire cluster. -

-
- - - - true is at least one instance of the identified job was found and interrupted. - - - -
- - - Add the given to the 's - global list. - - - Listeners in the 'global' list receive notification of execution events - for ALL s. - - - - - Add the given to the 's - list, of registered s. - - - - - Remove the given from the 's - list of global listeners. - - - true if the identifed listener was found in the list, and removed. - - - - - Remove the identifed from the 's - list of global listeners. - - Global job listener's name - true if the identifed listener was found in the list, and removed - - - - Remove the identifed from the 's - list of registered listeners. - - - true if the identifed listener was found in the list, and removed. - - - - - Get the non-global that has - the given name. - - - - - Add the given to the 's - global list. - - - Listeners in the 'global' list receive notification of execution events - for ALL s. - - - - - Add the given to the 's - list, of registered s. - - - - - Remove the given from the 's - list of global listeners. - - - true if the identifed listener was found in the list, and removed. - - - - - Remove the identifed from the 's - list of global listeners. - - The name. - true if the identifed listener was found in the list, and removed. - - - - Remove the identifed from the - 's list of registered listeners. - - - true if the identifed listener was found in the list, and removed. - - - - - Get the non-global that - has the given name. - - - - - Register the given with the - - - - - Remove the given from the - . - - true if the identifed listener was found in the list, and - removed. - - - - - Returns the name of the . - - - - - Returns the instance Id of the . - - - - - Returns the of the . - - - - - Reports whether the is in stand-by mode. - - - - - - - Reports whether the has been Shutdown. - - - - - Set the that will be responsible for producing - instances of classes. - - - JobFactories may be of use to those wishing to have their application - produce instances via some special mechanism, such as to - give the opertunity for dependency injection. - - - - - - Get the names of all known groups. - - - - - Get the names of all known groups. - - - - - Get the names of all registered s. - - - - - Get a List containing all of the s in - the 'sglobal list. - - - - - Get a Set containing the names of all the non-global - s registered with the . - - - - - Get a List containing all of the - s in the 'sglobal list. - - - - - Get a Set containing the names of all the non-global - s registered with the . - - - - - Get a List containing all of the - s registered with the . - - - - - Whether the scheduler has been started. - - - Note: This only reflects whether has ever - been called on this Scheduler, so it will return even - if the is currently in standby mode or has been - since shutdown. - - - - - - - - Construct a instance to proxy the given - RemoteableQuartzScheduler instance, and with the given - . - - - - - returns true if the given JobGroup - is paused - - - - - - - returns true if the given TriggerGroup - is paused - - - - - - - Get a object describiing the settings - and capabilities of the scheduler instance. -

- Note that the data returned is an 'instantaneous' snap-shot, and that as - soon as it's returned, the meta data values may be different. -

-
- -
- - - Calls the equivalent method on the 'proxied' . - - - - - Get the global that has - the given name. - - - - - - - Get the global that - has the given name. - - - - - - - Get the names of all groups that are paused. - - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Get the names of all registered . - - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Remove the identifed from the 's - list of global listeners. - - - - true if the identifed listener was found in the list, and removed - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Remove the identifed from the 's - list of global listeners. - - The name. - - true if the identifed listener was found in the list, and removed. - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Returns the name of the . - - - - - Returns the instance Id of the . - - - - - Gets or sets the remote scheduler address. - - The remote scheduler address. - - - - Returns the of the . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Gets a value indicating whether this instance is paused. - - true if this instance is paused; otherwise, false. - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equialent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Set the that will be responsible for producing - instances of classes. -

- JobFactories may be of use to those wishing to have their application - produce instances via some special mechanism, such as to - give the opertunity for dependency injection. -

-
- - - SchedulerException -
- - - Whether the scheduler has been started. - - - - Note: This only reflects whether has ever - been called on this Scheduler, so it will return even - if the is currently in standby mode or has been - since shutdown. - - - - - - - - Holds references to Scheduler instances - ensuring uniqueness, and - preventing garbage collection, and allowing 'global' lookups. - - James House - Marko Lahma (.NET) - - - - Binds the specified sched. - - The sched. - - - - Removes the specified sched name. - - Name of the sched. - - - - - Lookups the specified sched name. - - Name of the sched. - - - - - Lookups all. - - - - - - Gets the singleton instance. - - The instance. - - - - Responsible for creating the instances of - to be used within the instance. -

- This implementation does not re-use any objects, it simply makes a new - JobRunShell each time is called. -

-
- James House -
- - - Initialize the factory, providing a handle to the - that should be made available within the and - the s within it, and a handle to the - that the shell will use in its own - operations with the . - - - - - Called by the to obtain instances of - . - - - - - Called by the to return instances of - . - - - - - An implementation of the interface that directly - proxies all method calls to the equivalent call on a given - instance. - - - - - James House - - - - returns true if the given JobGroup - is paused - - - - - - - returns true if the given TriggerGroup - is paused - - - - - - - Get a object describiing the settings - and capabilities of the scheduler instance. -

- Note that the data returned is an 'instantaneous' snap-shot, and that as - soon as it's returned, the meta data values may be different. -

-
- -
- - - Calls the equivalent method on the 'proxied' . - - - - - - - - - Get the global that has - the given name. - - - - - - - Get the global that - has the given name. - - - - - - - Construct a instance to proxy the given - instance, and with the given . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Get the names of all registered . - - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Remove the identifed from the 's - list of global listeners. - - - - true if the identifed listener was found in the list, and removed - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Remove the identifed from the 's - list of global listeners. - - The name. - - true if the identifed listener was found in the list, and removed. - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Request the interruption, within this Scheduler instance, of all - currently executing instances of the identified , which - must be an implementor of the interface. - - -

- If more than one instance of the identified job is currently executing, - the method will be called on - each instance. However, there is a limitation that in the case that - on one instances throws an exception, all - remaining instances (that have not yet been interrupted) will not have - their method called. -

-

- If you wish to interrupt a specific instance of a job (when more than - one is executing) you can do so by calling - to obtain a handle - to the job instance, and then invoke on it - yourself. -

-

- This method is not cluster aware. That is, it will only interrupt - instances of the identified InterruptableJob currently executing in this - Scheduler instance, not across the entire cluster. -

-
- - - true is at least one instance of the identified job was found and interrupted. - UnableToInterruptJobException if the job does not implement - - -
- - - Returns the name of the . - - - - - Returns the instance Id of the . - - - - - Returns the of the . - - - - - Whether the scheduler has been started. - - - - Note: This only reflects whether has ever - been called on this Scheduler, so it will return even - if the is currently in standby mode or has been - since shutdown. - - - - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - - - - - An implementation of that - does all of it's work of creating a instance - based on the contenents of a properties file. - - -

- By default a properties are loaded from App.config's quartz section. - If that fails, then the "quartz.properties" - file located (as a embedded resource) in Quartz.dll is loaded. If you - wish to use a file other than these defaults, you must define the system - property 'quartz.properties' to point to the file you want. -

- -

- See the sample properties that are distributed with Quartz for - information about the various settings available within the file. -

- -

- Alternativly, you can explicitly Initialize the factory by calling one of - the methods before calling . -

- -

- Instances of the specified , - , classes will be created - by name, and then any additional properties specified for them in the config - file will be set on the instance by calling an equivalent 'set' method. For - example if the properties file contains the property 'quartz.jobStore. - myProp = 10' then after the JobStore class has been instantiated, the property - 'MyProp' will be set with the value. Type conversion to primitive CLR types - (int, long, float, double, boolean, enum and string) are performed before calling - the property's setter method. -

-
- James House - Anthony Eden - Mohammad Rezaei - Marko Lahma (.NET) -
- - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The props. - - - - Initialize the with - the contenents of a Properties file. - -

- By default a properties file named "quartz.properties" is loaded from - the 'current working directory'. If that fails, then the - "quartz.properties" file located (as a resource) in the org/quartz - package is loaded. If you wish to use a file other than these defaults, - you must define the system property 'quartz.properties' to point to - the file you want. -

-
-
- - - Creates a new name value collection and overrides its values - with system values (environment variables). - - The base properties to override. - A new NameValueCollection instance. - - - - Initialize the with - the contenents of the given Properties object. - - - - - - - - Returns a handle to the Scheduler produced by this factory. - - - - If one of the methods has not be previously - called, then the default (no-arg) method - will be called by this method. - - - -

- Returns a handle to the Scheduler with the given name, if it exists (if - it has already been instantiated). -

-
-
- - - Returns a handle to the default Scheduler, creating it if it does not - yet exist. - - - - - -

- Returns a handle to all known Schedulers (made by any - StdSchedulerFactory instance.). -

-
-
- - - Inspects a file and compares whether it's "last modified date" has changed - since the last time it was inspected. If the file has been updated, the - job invokes a "call-back" method on an identified - that can be found in the - . - - James House - - - - - A marker interface for s that - wish to have their state maintained between executions. - - - instances follow slightly different rules from - regular instances. The key difference is that their - associated is re-persisted after every - execution of the job, thus preserving state for the next execution. The - other difference is that stateful jobs are not allowed to Execute - concurrently, which means new triggers that occur before the completion of - the method will be delayed. - - - - - - James House - Marko Lahma (.NET) - - - - The interface to be implemented by classes which represent a 'job' to be - performed. - - - Instances of this interface must have a - no-argument constructor. provides a mechanism for 'instance member data' - that may be required by some implementations of this interface. - - - - - - James House - Marko Lahma (.NET) - - - - Called by the when a - fires that is associated with the . - - - The implementation may wish to set a result object on the - JobExecutionContext before this method exits. The result itself - is meaningless to Quartz, but may be informative to - s or - s that are watching the job's - execution. - - The execution context. - - - - Initializes a new instance of the class. - - - - - Called by the when a - fires that is associated with the . -

- The implementation may wish to set a result object on the - JobExecutionContext before this method exits. The result itself - is meaningless to Quartz, but may be informative to - s or - s that are watching the job's - execution. -

-
- The execution context. - - -
- - - Gets the last modified date. - - Name of the file. - - - - - Gets the log. - - The log. - - - - Interface for objects wishing to receive a 'call-back' from a - . - - James House - - - - - Ãnforms that certain file has been updated. - - Name of the file. - - - - Built in job for executing native executables in a separate process. - - Matthew Payne - James House - Steinar Overbeck Cook - - - - Required parameter that specifies the name of the command (executable) - to be ran. - - - - - Optional parameter that specifies the parameters to be passed to the - executed command. - - - - - Optional parameter (value should be 'true' or 'false') that specifies - whether the job should wait for the execution of the native process to - complete before it completes. - -

Defaults to .

-
-
- - - Optional parameter (value should be 'true' or 'false') that specifies - whether the spawned process's stdout and stderr streams should be - consumed. If the process creates output, it is possible that it might - 'hang' if the streams are not consumed. - -

Defaults to .

-
-
- - - Optional parameter that specifies the workling directory to be used by - the executed command. - - - - - Initializes a new instance of the class. - - - - - Called by the when a - fires that is associated with the . -

- The implementation may wish to set a result object on the - JobExecutionContext before this method exits. The result itself - is meaningless to Quartz, but may be informative to - s or - s that are watching the job's - execution. -

-
- -
- - - Gets the log. - - The log. - - - - Consumes data from the given input stream until EOF and prints the data to stdout - - cooste - James House - - - - Initializes a new instance of the class. - - The enclosing instance. - The input stream. - The type. - - - - Runs this object as a separate thread, printing the contents of the input stream - supplied during instantiation, to either Console. or stderr - - - - - An implementation of Job, that does absolutely nothing - useful for system - which only wish to use s - and s, rather than writing - Jobs that perform work. - - James House - - - - Do nothing. - - - - - A Job which sends an e-mail with the configured content to the configured - recipient. - - James House - Marko Lahma (.NET) - - - The host name of the smtp server. REQUIRED. - - - The e-mail address to send the mail to. REQUIRED. - - - The e-mail address to cc the mail to. Optional. - - - The e-mail address to claim the mail is from. REQUIRED. - - - The e-mail address the message should say to reply to. Optional. - - - The subject to place on the e-mail. REQUIRED. - - - The e-mail message body. REQUIRED. - - - - Executes the job. - - The job execution context. - - - - Holds a List of references to SchedulerListener instances and broadcasts all - events to them (in order). - - - This may be more convenient than registering all of the listeners - directly with the Scheduler, and provides the flexibility of easily changing - which listeners get notified. - - - - James House - - - - Construct an instance with the given List of listeners. - - The initial List of SchedulerListeners to broadcast to. - - - - Holds a List of references to JobListener instances and broadcasts all - events to them (in order) - if the event is not excluded via filtering - (read on). - - -

- The broadcasting behavior of this listener to delegate listeners may be - more convenient than registering all of the listeners directly with the - Trigger, and provides the flexibility of easily changing which listeners - get notified. -

- -

- You may also register a number of Regular Expression patterns to match - the events against. If one or more patterns are registered, the broadcast - will only take place if the event applies to a job who's name/group - matches one or more of the patterns. -

-
- - - - - - James House -
- - Construct an instance with the given name. - - (Remember to add some delegate listeners!) - - @param name the name of this instance - - - Construct an instance with the given name, and List of listeners. - - @param name the name of this instance - @param listeners the initial List of JobListeners to broadcast to. - - - - If one or more name patterns are specified, only events relating to - jobs who's name matches the given regular expression pattern - will be dispatched to the delegate listeners. - - - - - - If one or more group patterns are specified, only events relating to - jobs who's group matches the given regular expression pattern - will be dispatched to the delegate listeners. - - - - - - Holds a List of references to TriggerListener instances and broadcasts all - events to them (in order) - if the event is not excluded via filtering - (read on). - - -

- The broadcasting behavior of this listener to delegate listeners may be - more convenient than registering all of the listeners directly with the - Trigger, and provides the flexibility of easily changing which listeners - get notified. -

- -

- You may also register a number of Regular Expression patterns to match - the events against. If one or more patterns are registered, the broadcast - will only take place if the event applies to a trigger who's name/group - matches one or more of the patterns. -

-
- - - - - - James House -
- - - The interface to be implemented by classes that want to be informed when a - fires. In general, applications that use a - will not have use for this mechanism. - - - - - - James House - - - - Called by the when a - has fired, and it's associated - is about to be executed. -

- It is called before the method of this - interface. -

-
- The that has fired. - - The that will be passed to the 's method. - -
- - - Called by the when a - has fired, and it's associated - is about to be executed. -

- It is called after the method of this - interface. -

-
- The that has fired. - The that will be passed to - the 's method. - Returns true if job execution should be vetoed, false otherwise. -
- - - Called by the when a - has misfired. -

- Consideration should be given to how much time is spent in this method, - as it will affect all triggers that are misfiring. If you have lots - of triggers misfiring at once, it could be an issue it this method - does a lot. -

-
- The that has misfired. -
- - - Called by the when a - has fired, it's associated - has been executed, and it's method has been - called. - - The that was fired. - - The that was passed to the - 's method. - - - The result of the call on the 's method. - - - - - Get the name of the . - - - - - Construct an instance with the given name. - - (Remember to add some delegate listeners!) - - the name of this instance - - - - Construct an instance with the given name, and List of listeners. - - the name of this instance - the initial List of TriggerListeners to broadcast to - - - - If one or more name patterns are specified, only events relating to - triggers who's name matches the given regular expression pattern - will be dispatched to the delegate listeners. - - - - - - If one or more group patterns are specified, only events relating to - triggers who's group matches the given regular expression pattern - will be dispatched to the delegate listeners. - - - - - - Keeps a collection of mappings of which Job to trigger after the completion - of a given job. If this listener is notified of a job completing that has a - mapping, then it will then attempt to trigger the follow-up job. This - achieves "job chaining", or a "poor man's workflow". - - -

- Generally an instance of this listener would be registered as a global - job listener, rather than being registered directly to a given job. -

-

- If for some reason there is a failure creating the trigger for the - follow-up job (which would generally only be caused by a rare serious - failure in the system, or the non-existence of the follow-up job), an error - messsage is logged, but no other action is taken. If you need more rigorous - handling of the error, consider scheduling the triggering of the flow-up - job within your job itself. -

-
- James House -
- - - A helpful abstract base class for implementors of . - - -

- The methods in this class are empty so you only need to override the - subset for the events you care about. -

- -

- You are required to implement - to return the unique name of your . -

-
- -
- - - Initializes a new instance of the class. - - - - - Called by the when a - is about to be executed (an associated - has occured). -

- This method will not be invoked if the execution of the Job was vetoed - by a . -

-
- - -
- - - Called by the when a - was about to be executed (an associated - has occured), but a vetoed it's - execution. - - - - - - - Called by the after a - has been executed, and be for the associated 's - method has been called. - - - - - - - Get the for this class's category. - This should be used by subclasses for logging. - - - - - Get the name of the . - - - - - - Construct an instance with the given name. - - The name of this instance. - - - - Add a chain mapping - when the Job identified by the first key completes - the job identified by the second key will be triggered. - - a Key with the name and group of the first job - a Key with the name and group of the follow-up job - - - - A helpful abstract base class for implementors of - . - - -

- The methods in this class are empty so you only need to override the - subset for the events - you care about. -

- -

- You are required to implement - to return the unique name of your . -

-
- -
- - - Get the for this - class's category. This should be used by subclasses for logging. - - - - - Get the name of the . - - - - - - Logs a history of all job executions (and execution vetos) via common - logging. - - -

- The logged message is customizable by setting one of the following message - properties to a string that conforms to the syntax of . -

-

- JobToBeFiredMessage - available message data are: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ElementData TypeDescription
0StringThe Job's Name.
1StringThe Job's Group.
2DateThe current time.
3StringThe Trigger's name.
4StringThe Triggers's group.
5DateThe scheduled fire time.
6DateThe next scheduled fire time.
7IntegerThe re-fire count from the JobExecutionContext.
- The default message text is "Job {1}.{0} fired (by trigger {4}.{3}) at: - {2, date, HH:mm:ss MM/dd/yyyy" -

-

- JobSuccessMessage - available message data are: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ElementData TypeDescription
0StringThe Job's Name.
1StringThe Job's Group.
2DateThe current time.
3StringThe Trigger's name.
4StringThe Triggers's group.
5DateThe scheduled fire time.
6DateThe next scheduled fire time.
7IntegerThe re-fire count from the JobExecutionContext.
8ObjectThe string value (toString() having been called) of the result (if any) - that the Job set on the JobExecutionContext, with on it. "NULL" if no - result was set.
- The default message text is "Job {1}.{0} execution complete at {2, date, - HH:mm:ss MM/dd/yyyy} and reports: {8" -

-

- JobFailedMessage - available message data are: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ElementData TypeDescription
0StringThe Job's Name.
1StringThe Job's Group.
2DateThe current time.
3StringThe Trigger's name.
4StringThe Triggers's group.
5DateThe scheduled fire time.
6DateThe next scheduled fire time.
7IntegerThe re-fire count from the JobExecutionContext.
8StringThe message from the thrown JobExecution Exception. -
- The default message text is "Job {1}.{0} execution failed at {2, date, - HH:mm:ss MM/dd/yyyy} and reports: {8" -

-

- JobWasVetoedMessage - available message data are: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ElementData TypeDescription
0StringThe Job's Name.
1StringThe Job's Group.
2DateThe current time.
3StringThe Trigger's name.
4StringThe Triggers's group.
5DateThe scheduled fire time.
6DateThe next scheduled fire time.
7IntegerThe re-fire count from the JobExecutionContext.
- The default message text is "Job {1}.{0} was vetoed. It was to be fired - (by trigger {4}.{3}) at: {2, date, HH:mm:ss MM/dd/yyyy" -

-
-
- - - Provides an interface for a class to become a "plugin" to Quartz. - - - Plugins can do virtually anything you wish, though the most interesting ones - will obviously interact with the scheduler in some way - either actively: by - invoking actions on the scheduler, or passively: by being a , - , and/or . -

- If you use to - Initialize your Scheduler, it can also create and Initialize your plugins - - look at the configuration docs for details. -

-

- If you need direct access your plugin, you can have it explicitly put a - reference to itself in the 's - as part of its - method. -

-
- James House -
- - - Called during creation of the in order to give - the a chance to Initialize. - - - At this point, the Scheduler's is not yet -

- If you need direct access your plugin, you can have it explicitly put a - reference to itself in the 's - as part of its - method. -

-
- - The name by which the plugin is identified. - - - The scheduler to which the plugin is registered. - -
- - - Called when the associated is started, in order - to let the plug-in know it can now make calls into the scheduler if it - needs to. - - - - - Called in order to inform the that it - should free up all of it's resources because the scheduler is shutting - down. - - - - - Called during creation of the in order to give - the a chance to Initialize. - - - - - Called when the associated is started, in order - to let the plug-in know it can now make calls into the scheduler if it - needs to. - - - - - Called in order to inform the that it - should free up all of it's resources because the scheduler is shutting - down. - - - - - Called by the when a is - about to be executed (an associated has occurred). - - This method will not be invoked if the execution of the Job was vetoed by a - . - - - - - - - Called by the after a - has been executed, and be for the associated 's - method has been called. - - - - - - - Called by the when a - was about to be executed (an associated - has occured), but a vetoed it's - execution. - - - - - - - Logger instance to use. Defaults to common logging. - - - - - Get or sets the message that is logged when a Job successfully completes its - execution. - - - - - Get or sets the message that is logged when a Job fails its - execution. - - - - - Gets or sets the message that is logged when a Job is about to Execute. - - - - - Gets or sets the message that is logged when a Job execution is vetoed by a - trigger listener. - - - - - Get the name of the . - - - - - - Logs a history of all trigger firings via the Jakarta Commons-Logging - framework. - - -

- The logged message is customizable by setting one of the following message - properties to a string that conforms to the syntax of . -

- -

- TriggerFiredMessage - available message data are: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ElementData TypeDescription
0StringThe Trigger's Name.
1StringThe Trigger's Group.
2DateThe scheduled fire time.
3DateThe next scheduled fire time.
4DateThe actual fire time.
5StringThe Job's name.
6StringThe Job's group.
7IntegerThe re-fire count from the JobExecutionContext.
- - The default message text is "Trigger {1}.{0} fired job {6}.{5} at: {4, - date, HH:mm:ss MM/dd/yyyy" -

- -

- TriggerMisfiredMessage - available message data are: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ElementData TypeDescription
0StringThe Trigger's Name.
1StringThe Trigger's Group.
2DateThe scheduled fire time.
3DateThe next scheduled fire time.
4DateThe actual fire time. (the time the misfire was detected/handled)
5StringThe Job's name.
6StringThe Job's group.
- - The default message text is "Trigger {1}.{0} misfired job {6}.{5} at: - {4, date, HH:mm:ss MM/dd/yyyy}. Should have fired at: {3, date, HH:mm:ss - MM/dd/yyyy" -

- -

- TriggerCompleteMessage - available message data are: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ElementData TypeDescription
0StringThe Trigger's Name.
1StringThe Trigger's Group.
2DateThe scheduled fire time.
3DateThe next scheduled fire time.
4DateThe job completion time.
5StringThe Job's name.
6StringThe Job's group.
7IntegerThe re-fire count from the JobExecutionContext.
8IntegerThe trigger's resulting instruction code.
9StringA human-readable translation of the trigger's resulting instruction - code.
- - The default message text is "Trigger {1}.{0} completed firing job - {6}.{5} at {4, date, HH:mm:ss MM/dd/yyyy} with resulting trigger instruction - code: {9" -

-
- James House -
- - - Called during creation of the in order to give - the a chance to Initialize. - - - - - Called when the associated is started, in order - to let the plug-in know it can now make calls into the scheduler if it - needs to. - - - - - Called in order to inform the that it - should free up all of it's resources because the scheduler is shutting - down. - - - - - Called by the when a - has fired, and it's associated - is about to be executed. -

- It is called before the method of this - interface. -

-
- The that has fired. - The that will be passed to the 's method. -
- - - Called by the when a - has misfired. -

- Consideration should be given to how much time is spent in this method, - as it will affect all triggers that are misfiring. If you have lots - of triggers misfiring at once, it could be an issue it this method - does a lot. -

-
- The that has misfired. -
- - - Called by the when a - has fired, it's associated - has been executed, and it's method has been - called. - - The that was fired. - The that was passed to the - 's method. - The result of the call on the 's method. - - - - Called by the when a - has fired, and it's associated - is about to be executed. -

- It is called after the method of this - interface. -

-
- The that has fired. - The that will be passed to - the 's method. - -
- - - Logger instance to use. Defaults to common logging. - - - - - Get or set the message that is printed upon the completion of a trigger's - firing. - - - - - Get or set the message that is printed upon a trigger's firing. - - - - - Get or set the message that is printed upon a trigger's mis-firing. - - - - - Get the name of the . - - - - - - This plugin catches the event of the VM terminating (such as upon a CRTL-C) - and tells the scheuler to Shutdown. - - - James House - - - - Called during creation of the in order to give - the a chance to Initialize. - - - - - Called when the associated is started, in order - to let the plug-in know it can now make calls into the scheduler if it - needs to. - - - - - Called in order to inform the that it - should free up all of it's resources because the scheduler is shutting - down. - - - - - Determine whether or not the plug-in is configured to cause a clean - Shutdown of the scheduler. -

- The default value is . -

-
- -
- - - Attribute to use with public properties that - can be set with Quartz configuration. Attribute can be used to advice - parsing to use correct type of time span (milliseconds, seconds, minutes, hours) - as it may depend on property. - - - - - - Initializes a new instance of the class. - - The rule. - - - - Gets the rule. - - The rule. - - - - Possible parse rules for s. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - This plugin loads XML file(s) to add jobs and schedule them with triggers - as the scheduler is initialized, and can optionally periodically scan the - file for changes. - - - The periodically scanning of files for changes is not currently supported in a - clustered environment. - - James House - Pierre Awaragi - - - - Initializes a new instance of the class. - - - - - - - - - - - Called during creation of the in order to give - the a chance to initialize. - - The name. - The scheduler. - SchedulerConfigException - - - - Called when the associated is started, in order - to let the plug-in know it can now make calls into the scheduler if it - needs to. - - - - Helper method for generating unique job/trigger name for the - file scanning jobs (one per FileJob). The unique names are saved - in jobTriggerNameSet. - - - - Called in order to inform the that it - should free up all of it's resources because the scheduler is shutting - down. - - - - - Gets the log. - - The log. - - - - Comma separated list of file names (with paths) to the XML files that should be read. - - - - - Whether or not jobs defined in the XML file should be overwrite existing - jobs with the same name. - - - - - The interval at which to scan for changes to the file. - If the file has been changed, it is re-loaded and parsed. The default - value for the interval is 0, which disables scanning. - - - - - Whether or not initialization of the plugin should fail (throw an - exception) if the file cannot be found. Default is . - - - - - Whether or not the XML should be validated. Default is . - - - - - Whether or not the XML schema should be validated. Default is . - - - - - A uses all of the - types that are found in this package in its attempts to load a class, when - one scheme is found to work, it is promoted to the scheme that will be used - first the next time a class is loaded (in order to improve perfomance). - - - This approach is used because of the wide variance in class loader behavior - between the various environments in which Quartz runs (e.g. disparate - application servers, stand-alone, mobile devices, etc.). Because of this - disparity, Quartz ran into difficulty with a one class-load style fits-all - design. Thus, this class loader finds the approach that works, then - 'remembers' it. - - James House - - - - Called to give the ClassLoadHelper a chance to Initialize itself, - including the oportunity to "steal" the class loader off of the calling - thread, which is the thread that is initializing Quartz. - - - - - Return the class with the given name. - - - - Finds a resource with a given name. This method returns null if no - resource with this name is found. - - name of the desired resource - - a java.net.URL object - - - - Finds a resource with a given name. This method returns null if no - resource with this name is found. - - name of the desired resource - - a java.io.InputStream object - - - - - that names the scheduler instance using - just the machine hostname. -

- This class is useful when you know that your scheduler instance will be the - only one running on a particular machine. Each time the scheduler is - restarted, it will get the same instance id as long as the machine is not - renamed. -

- -
- - -
- - - An IInstanceIdGenerator is responsible for generating the clusterwide unique - instance id for a nodde. -

- This interface may be of use to those wishing to have specific control over - the mechanism by which the instances in their - application are named. -

- -
- -
- - Generate the instance id for a - - - The clusterwide unique instance id. - - - - - Generate the instance id for a - - The clusterwide unique instance id. - - - - A that uses either the loader of it's own - class. - - - - - James House - - - - Called to give the ClassLoadHelper a chance to Initialize itself, - including the oportunity to "steal" the class loader off of the calling - thread, which is the thread that is initializing Quartz. - - - - Return the class with the given name. - - - Finds a resource with a given name. This method returns null if no - resource with this name is found. - - name of the desired resource - - a java.net.URL object - - - - Finds a resource with a given name. This method returns null if no - resource with this name is found. - - name of the desired resource - - a java.io.InputStream object - - - - - A JobFactory that instantiates the Job instance (using the default no-arg - constructor, or more specifically: ), and - then attempts to set all values in the 's - onto bean properties of the . - - - - - - - James Houser - Marko Lahma (.NET) - - - - The default JobFactory used by Quartz - simply calls - on the job class. - - - - James House - Marko Lahma (.NET) - - - - A JobFactory is responsible for producing instances of - classes. - - - This interface may be of use to those wishing to have their application - produce instances via some special mechanism, such as to - give the opertunity for dependency injection. - - - - - James House - - - - Called by the scheduler at the time of the trigger firing, in order to - produce a instance on which to call Execute. - - -

- It should be extremely rare for this method to throw an exception - - basically only the the case where there is no way at all to instantiate - and prepare the Job for execution. When the exception is thrown, the - Scheduler will move all triggers associated with the Job into the - state, which will require human - intervention (e.g. an application restart after fixing whatever - configuration problem led to the issue wih instantiating the Job. -

- -
- - The TriggerFiredBundle from which the - and other info relating to the trigger firing can be obtained. - - SchedulerException if there is a problem instantiating the Job. - the newly instantiated Job - -
- - - Called by the scheduler at the time of the trigger firing, in order to - produce a instance on which to call Execute. - - - It should be extremely rare for this method to throw an exception - - basically only the the case where there is no way at all to instantiate - and prepare the Job for execution. When the exception is thrown, the - Scheduler will move all triggers associated with the Job into the - state, which will require human - intervention (e.g. an application restart after fixing whatever - configuration problem led to the issue wih instantiating the Job. - - The TriggerFiredBundle from which the - and other info relating to the trigger firing can be obtained. - the newly instantiated Job - SchedulerException if there is a problem instantiating the Job. - - - - Called by the scheduler at the time of the trigger firing, in order to - produce a instance on which to call Execute. - - -

- It should be extremely rare for this method to throw an exception - - basically only the the case where there is no way at all to instantiate - and prepare the Job for execution. When the exception is thrown, the - Scheduler will move all triggers associated with the Job into the - state, which will require human - intervention (e.g. an application restart after fixing whatever - configuration problem led to the issue wih instantiating the Job. -

-
- The TriggerFiredBundle from which the - and other info relating to the trigger firing can be obtained. - the newly instantiated Job - SchedulerException if there is a problem instantiating the Job. -
- - - Sets the object properties. - - The object to set properties to. - The data to set. - - - - Whether the JobInstantiation should fail and throw and exception if - a key (name) and value (type) found in the JobDataMap does not - correspond to a proptery setter on the Job class. - - - - - Get or set whether a warning should be logged if - a key (name) and value (type) found in the JobDataMap does not - correspond to a proptery setter on the Job class. - - - - - This class implements a that - utilizes RAM as its storage device. -

- As you should know, the ramification of this is that access is extrememly - fast, but the data is completely volatile - therefore this - should not be used if true persistence between program shutdowns is - required. -

-
- James House - Sharada Jambula - Marko Lahma (.NET) -
- - - Initializes a new instance of the class. - - - - - Called by the QuartzScheduler before the is - used, in order to give the it a chance to Initialize. - - - - - Called by the QuartzScheduler to inform the that - the scheduler has started. - - - - - Called by the QuartzScheduler to inform the that - it should free up all of it's resources because the scheduler is - shutting down. - - - - - Store the given and . - - The scheduling context. - The to be stored. - The to be stored. - - - - Returns true if the given job group is paused. - - - Job group name - - - - - returns true if the given TriggerGroup is paused. - - - - - - - - Store the given . - - The scheduling context. - The to be stored. - If , any existing in the - with the same name and group should be - over-written. - - - - Remove (delete) the with the given - name, and any s that reference - it. - - The scheduling context. - The name of the to be removed. - The group name of the to be removed. - - if a with the given name and - group was found and removed from the store. - - - - - Remove (delete) the with the - given name. - - The scheduling context. - The name of the to be removed. - The group name of the to be removed. - - if a with the given - name and group was found and removed from the store. - - - - - Store the given . - - The scheduling context. - The to be stored. - If , any existing in - the with the same name and group should - be over-written. - - - - Remove (delete) the with the - given name. - - The scheduling context. - The name of the to be removed. - The group name of the to be removed. - - if a with the given - name and group was found and removed from the store. - - Whether to delete orpahaned job details from scheduler if job becomes orphaned from removing the trigger. - - - - Replaces the trigger. - - The scheduling context. - Name of the trigger. - Name of the group. - The new trigger. - - - - - Retrieve the for the given - . - - The scheduling context. - The name of the to be retrieved. - The group name of the to be retrieved. - - The desired , or null if there is no match. - - - - - Retrieve the given . - - The scheduling context. - The name of the to be retrieved. - The group name of the to be retrieved. - - The desired , or null if there is no match. - - - - - Get the current state of the identified . - - - - - - - - - - - Store the given . - - The scheduling context. - The name. - The to be stored. - If , any existing - in the with the same name and group - should be over-written. - If , any s existing - in the that reference an existing - Calendar with the same name with have their next fire time - re-computed with the new . - - - - Remove (delete) the with the - given name. -

- If removal of the would result in - s pointing to non-existent calendars, then a - will be thrown.

-
- The scheduling context. - The name of the to be removed. - - if a with the given name - was found and removed from the store. - -
- - - Retrieve the given . - - The scheduling context. - The name of the to be retrieved. - - The desired , or null if there is no match. - - - - - Get the number of s that are - stored in the . - - - - - Get the number of s that are - stored in the . - - - - - Get the number of s that are - stored in the . - - - - - Get the names of all of the s that - have the given group name. - - - - - Get the names of all of the s - in the . -

- If there are no ICalendars in the given group name, the result should be - a zero-length array (not ). -

-
-
- - - Get the names of all of the s - that have the given group name. - - - - - Get the names of all of the - groups. - - - - - Get the names of all of the groups. - - - - - Get all of the Triggers that are associated to the given Job. -

- If there are no matches, a zero-length array should be returned. -

-
-
- - - Gets the trigger wrappers for job. - - Name of the job. - Name of the group. - - - - - Gets the trigger wrappers for calendar. - - Name of the cal. - - - - - Pause the with the given name. - - - - - Pause all of the s in the given group. -

- The JobStore should "remember" that the group is paused, and impose the - pause on any new triggers that are added to the group while the group is - paused. -

-
-
- - - Pause the with the given - name - by pausing all of its current s. - - - - - Pause all of the s in the - given group - by pausing all of their s. -

- The JobStore should "remember" that the group is paused, and impose the - pause on any new jobs that are added to the group while the group is - paused. -

-
-
- - - Resume (un-pause) the with the given name. - - - If the missed one or more fire-times, then the - 's misfire instruction will be applied. - - - - - Resume (un-pause) all of the s in the - given group. -

- If any missed one or more fire-times, then the - 's misfire instruction will be applied. -

-
-
- - - Resume (un-pause) the with - the given name. -

- If any of the 's s missed one - or more fire-times, then the 's misfire - instruction will be applied. -

-
-
- - - Resume (un-pause) all of the s - in the given group. -

- If any of the s had s that - missed one or more fire-times, then the 's - misfire instruction will be applied. -

-
-
- - - Pause all triggers - equivalent of calling - on every group. -

- When is called (to un-pause), trigger misfire - instructions WILL be applied. -

-
- -
- - - Resume (un-pause) all triggers - equivalent of calling - on every trigger group and setting all job groups unpaused />. -

- If any missed one or more fire-times, then the - 's misfire instruction will be applied. -

-
- -
- - - Applies the misfire. - - The trigger wrapper. - - - - - Get a handle to the next trigger to be fired, and mark it as 'reserved' - by the calling scheduler. - - - - - - Inform the that the scheduler no longer plans to - fire the given , that it had previously acquired - (reserved). - - - - - Inform the that the scheduler is now firing the - given (executing its associated ), - that it had previously acquired (reserved). - - - - - Inform the that the scheduler has completed the - firing of the given (and the execution its - associated ), and that the - in the given should be updated if the - is stateful. - - - - - Sets the state of all triggers of job to specified state. - - Name of the job. - The job group. - The internal state to set. - - - - Peeks the triggers. - - - - - - - - - The time span by which a trigger must have missed its - next-fire-time, in order for it to be considered "misfired" and thus - have its misfire instruction applied. - - - - - Gets the fired trigger record id. - - The fired trigger record id. - - - - Returns whether this instance supports persistence. - - - - - - - Comparer for triggers. - - - - - Possible internal trigger states - in RAMJobStore - - - - - Waiting - - - - - Acquired - - - - - Executing - - - - - Complete - - - - - Paused - - - - - Blocked - - - - - Paused and Blocked - - - - - Error - - - - - Helper wrapper class - - - - - The key used - - - - - Job's key - - - - - The trigger - - - - - Current state - - - - - Determines whether the specified is equal to the current . - - The to compare with the current . - - true if the specified is equal to the current ; otherwise, false. - - - - - Serves as a hash function for a particular type. is suitable for use in hashing algorithms and data structures like a hash table. - - - A hash code for the current . - - - - - Gets the trigger - - The trigger - - - - Scheduler exporter that exports scheduler to remoting context. - - Marko Lahma - - - - Service interface for scheduler exporters. - - Marko Lahma - - - - Binds (exports) scheduler to external context. - - - - - - Unbinds scheduler from external context. - - - - - - Registers remoting channel if needed. This is determined - by checking whether there is a positive value for port. - - - - - Gets or sets the port used for remoting. - - - - - Gets or sets the name to use when exporting - scheduler to remoting context. - - - - - Sets the channel type when registering remoting. - - - - - - Sets the used when - exporting to remoting context. Defaults to - . - - - - - A that simply calls . - - - - James House - - - - Called to give the ClassLoadHelper a chance to Initialize itself, - including the oportunity to "steal" the class loader off of the calling - thread, which is the thread that is initializing Quartz. - - - - Return the class with the given name. - - - - Finds a resource with a given name. This method returns null if no - resource with this name is found. - - name of the desired resource - - a Uri object - - - - Finds a resource with a given name. This method returns null if no - resource with this name is found. - - name of the desired resource - - a Stream object - - - - - The default InstanceIdGenerator used by Quartz when instance id is to be - automatically generated. Instance id is of the form HOSTNAME + CURRENT_TIME. - - - - - - - - - Generate the instance id for a - - The clusterwide unique instance id. - - - - This is class is a simple implementation of a thread pool, based on the - interface. -

- objects are sent to the pool with the - method, which blocks until a becomes available. -

- -

- The pool has a fixed number of s, and does not grow or - shrink based on demand. -

-
- James House - Juergen Donnerstag -
- - - The interface to be implemented by classes that want to provide a thread - pool for the 's use. - - - implementation instances should ideally be made - for the sole use of Quartz. Most importantly, when the method - returns a value of 1 or greater, - there must still be at least one available thread in the pool when the - method is called a few moments (or - many moments) later. If this assumption does not hold true, it may - result in extra JobStore queries and updates, and if clustering features - are being used, it may result in greater imballance of load. - - - James House - - - - Execute the given in the next - available . - - - The implementation of this interface should not throw exceptions unless - there is a serious problem (i.e. a serious misconfiguration). If there - are no available threads, rather it should either queue the Runnable, or - block until a thread is available, depending on the desired strategy. - - - - - Determines the number of threads that are currently available in in - the pool. Useful for determining the number of times - can be called before returning - false. - - - The implementation of this method should block until there is at - least one available thread. - - the number of currently available threads - - - - Called by the QuartzScheduler before the is - used, in order to give the it a chance to Initialize. - - - - - Called by the QuartzScheduler to inform the - that it should free up all of it's resources because the scheduler is - shutting down. - - - - - Gets the size of the pool. - - The size of the pool. - - - - Create a new (unconfigured) . - - - - - Create a new with the specified number - of s that have the given priority. - - - the number of worker s in the pool, must - be > 0. - - - the thread priority for the worker threads. - - - - - - Called by the QuartzScheduler before the is - used, in order to give the it a chance to Initialize. - - - - - Terminate any worker threads in this thread group. - Jobs currently in progress will complete. - - - - - Run the given object in the next available - . If while waiting the thread pool is asked to - shut down, the Runnable is executed immediately within a new additional - thread. - - The to be added. - - - - Creates the worker threads. - - The thread count. - - - - - Terminate any worker threads in this thread group. - Jobs currently in progress will complete. - - - - - Gets or sets the number of worker threads in the pool. - Set has no effect after has been called. - - - - - Get or set the thread priority of worker threads in the pool. - Set operation has no effect after has been called. - - - - - Gets or sets the thread name prefix. - - The thread name prefix. - - - - Gets or sets the value of makeThreadsDaemons. - - - - - Gets the size of the pool. - - The size of the pool. - - - - A Worker loops, waiting to Execute tasks. - - - - - Create a worker thread and start it. Waiting for the next Runnable, - executing it, and waiting for the next Runnable, until the Shutdown - flag is set. - - - - - Create a worker thread, start it, Execute the runnable and terminate - the thread (one time execution). - - - - - Signal the thread that it should terminate. - - - - - Loop, executing targets as they are received. - - - - - This is class is a simple implementation of a zero size thread pool, based on the - {@link org.quartz.spi.ThreadPool} interface. - - - The pool has zero s and does not grow or shrink based on demand. - Which means it is obviously not useful for most scenarios. When it may be useful - is to prevent creating any worker threads at all - which may be desirable for - the sole purpose of preserving system resources in the case where the scheduler - instance only exists in order to schedule jobs, but which will never execute - jobs (e.g. will never have Start() called on it). - - Wayne Fay - - - - Initializes a new instance of the class. - - - - - Called by the QuartzScheduler before the is - used, in order to give the it a chance to Initialize. - - - - - Shutdowns this instance. - - - - - Called by the QuartzScheduler to inform the - that it should free up all of it's resources because the scheduler is - shutting down. - - - - - - Execute the given in the next - available . - - - - - The implementation of this interface should not throw exceptions unless - there is a serious problem (i.e. a serious misconfiguration). If there - are no available threads, rather it should either queue the Runnable, or - block until a thread is available, depending on the desired strategy. - - - - - Determines the number of threads that are currently available in in - the pool. Useful for determining the number of times - can be called before returning - false. - - - the number of currently available threads - - - The implementation of this method should block until there is at - least one available thread. - - - - - Gets the log. - - The log. - - - - Gets the size of the pool. - - The size of the pool. - - - - A simple class (structure) used for returning execution-time data from the - JobStore to the . - - - James House - - - - Initializes a new instance of the class. - - The job. - The trigger. - The calendar. - if set to true [job is recovering]. - The fire time. - The scheduled fire time. - The previous fire time. - The next fire time. - - - - Gets the job detail. - - The job detail. - - - - Gets the trigger. - - The trigger. - - - - Gets the calendar. - - The calendar. - - - - Gets a value indicating whether this is recovering. - - true if recovering; otherwise, false. - - - - Returns the UTC fire time. - - - - - Gets the next UTC fire time. - - The next fire time. - Returns the nextFireTimeUtc. - - - - Gets the previous UTC fire time. - - The previous fire time. - Returns the previous fire time. - - - - Returns the scheduled UTC fire time. - - - - - DateTime related utility methods. - - - - - Assumes that given input is in UTC and sets the kind to be UTC. - Just a precaution if somebody does not set it explicitly. - This only works in .NET Framework 2.0 onwards. - - The datetime to check. - DateTime with kind set to UTC. - - - - Assumes that given input is in UTC and sets the kind to be UTC. - Just a precaution if somebody does not set it explicitly. - - The datetime to check. - DateTime with kind set to UTC. - - - - Manages a collection of IDbProviders, and provides transparent access - to their database. - - - James House - Sharada Jambula - Mohammad Rezaei - - - - Private constructor - - - - - Adds the connection provider. - - Name of the data source. - The provider. - - - - Get a database connection from the DataSource with the given name. - - a database connection - - - - Shuts down database connections from the DataSource with the given name, - if applicable for the underlying provider. - - a database connection - - - - Gets the db provider. - - Name of the ds. - - - - - Get the class instance. - - an instance of this class - - - - - An implementation of that wraps another - and flags itself 'dirty' when it is modified. - - James House - - - - Create a DirtyFlagMap that 'wraps' a . - - - - - Create a DirtyFlagMap that 'wraps' a that has the - given initial capacity. - - - - - Create a DirtyFlagMap that 'wraps' a that has the - given initial capacity and load factor. - - - - - Creates a new object that is a copy of the current instance. - - - A new object that is a copy of this instance. - - - - - When implemented by a class, removes all elements from the . - - - The is read-only. - - - - - When implemented by a class, determines whether the contains an element with the specified key. - - The key to locate in the . - - if the contains an element with the key; otherwise, . - - - is . - - - - When implemented by a class, removes the element with the - specified key from the . - - The key of the element to remove. - - is . - - The is read-only. - -or- - The has a fixed size. - - - - - When implemented by a class, returns an - for the . - - - An for the . - - - - - When implemented by a class, adds an element with the provided key and value to the . - - The to use as the key of the element to add. - The to use as the value of the element to add. - is . - - An element with the same key already exists in the . - - - The is read-only. - -or- - The has a fixed size. - - - - - When implemented by a class, copies the elements of - the to an , starting at a particular index. - - The one-dimensional that is the destination of the elements copied from . The must have zero-based indexing. - The zero-based index in at which copying begins. - - is . - - is less than zero. - - - is multidimensional. - -or- - - is equal to or greater than the length of . - -or- - The number of elements in the source is greater than the available space from to the end of the destination . - - The type of the source cannot be cast automatically to the type of the destination . - - - - Clear the 'dirty' flag (set dirty flag to ). - - - - - Determines whether the specified obj contains value. - - The obj. - - true if the specified obj contains value; otherwise, false. - - - - - Gets the entries as a set. - - - - - - Determines whether the specified is equal to the current . - - The to compare with the current . - - if the specified is equal to the - current ; otherwise, . - - - - - Serves as a hash function for a particular type, suitable - for use in hashing algorithms and data structures like a hash table. - - - A hash code for the current . - - - - - Gets keyset for this map. - - - - - - Puts the value behind a specified key. - - The key. - The val. - - - - - Puts all. - - The t. - - - - Determine whether the is flagged dirty. - - - - - Get a direct handle to the underlying Map. - - - - - Gets a value indicating whether this instance is empty. - - true if this instance is empty; otherwise, false. - - - - Gets or sets the with the specified key. - - - - - - When implemented by a class, gets the number of - elements contained in the . - - - - - - When implemented by a class, gets an containing the values in the . - - - - - - When implemented by a class, gets an containing the keys of the . - - - - - - When implemented by a class, gets a value indicating whether the - is read-only. - - - - - - When implemented by a class, gets a value indicating whether the - has a fixed size. - - - - - - When implemented by a class, gets an object that - can be used to synchronize access to the . - - - - - - When implemented by a class, gets a value - indicating whether access to the is synchronized - (thread-safe). - - - - - - Utility class for file handling related things. - - - - - Resolves file to actual file if for example relative '~' used. - - File name to check - Expanded file name or actual no resolving was done. - - - - object representing a job or trigger key. - - Jeffrey Wescott - - - - - Utility class for storing two pieces of information together. - - Jeffrey Wescott - - - - Test equality of this object with that. - - object to compare - true if objects are equal, false otherwise - - - - Serves as a hash function for a particular type. is suitable for use in hashing algorithms and data structures like a hash table. - - - A hash code for the current . - - - - - Get or sets the first object in the pair. - - - - - Get or sets the second object in the pair. - - - - Construct a new key with the given name and group. - - - - the name - - - the group - - - -

- Return the string representation of the key. The format will be: - <group>.<name>. -

- -
- the string representation of the key - -
- - - Get the name portion of the key. - - the name - - - -

- Get the group portion of the key. -

- -
- the group - -
- - - Wrapper class to access thread local data. - Data is either accessed from thread or HTTP Context's - data if HTTP Context is avaiable. - - Marko Lahma (.NET) - - - - Retrieves an object with the specified name. - - The name of the item. - The object in the call context associated with the specified name or null if no object has been stored previously - - - - Stores a given object and associates it with the specified name. - - The name with which to associate the new item. - The object to store in the call context. - - - - Empties a data slot with the specified name. - - The name of the data slot to empty. - - - - Utility methods that are used to convert objects from one type into another. - - Aleksandar Seovic - - - - Convert the value to the required (if necessary from a string). - - The proposed change value. - - The we must convert to. - - The new value, possibly the result of type conversion. - - - - Determines whether value is assignable to required type. - - The value to check. - Type of the required. - - true if value can be assigned as given type; otherwise, false. - - - - - Instantiates an instance of the type specified. - - The type to instantiate. - - - - - Sets the object properties using reflection. - - The object to set values to. - The properties to set to object. - - - - This is an utility class used to parse the properties. - - James House - - - - Initializes a new instance of the class. - - The props. - - - - Gets the string property. - - The name. - - - - - Gets the string property. - - The name. - The default value. - - - - - Gets the string array property. - - The name. - - - - - Gets the string array property. - - The name. - The default value. - - - - - Gets the boolean property. - - The name. - - - - - Gets the boolean property. - - The name. - if set to true [defaultValue]. - - - - - Gets the byte property. - - The name. - - - - - Gets the byte property. - - The name. - The default value. - - - - - Gets the char property. - - The name. - - - - - Gets the char property. - - The name. - The default value. - - - - - Gets the double property. - - The name. - - - - - Gets the double property. - - The name. - The default value. - - - - - Gets the float property. - - The name. - - - - - Gets the float property. - - The name. - The default value. - - - - - Gets the int property. - - The name. - - - - - Gets the int property. - - The name. - The default value. - - - - - Gets the int array property. - - The name. - - - - - Gets the int array property. - - The name. - The default value. - - - - - Gets the long property. - - The name. - - - - - Gets the long property. - - The name. - The def. - - - - - Gets the TimeSpan property. - - The name. - The def. - - - - - Gets the short property. - - The name. - - - - - Gets the short property. - - The name. - The default value. - - - - - Gets the property groups. - - The prefix. - - - - - Gets the property group. - - The prefix. - - - - - Gets the property group. - - The prefix. - if set to true [strip prefix]. - - - - - Get all properties that start with the given prefix. - - The prefix for which to search. If it does not end in a "." then one will be added to it for search purposes. - Whether to strip off the given in the result's keys. - Optional array of fully qualified prefixes to exclude. For example if is "a.b.c", then might be "a.b.c.ignore". - Group of that start with the given prefix, optionally have that prefix removed, and do not include properties that start with one of the given excluded prefixes. - - - - Reads the properties from assembly (embedded resource). - - The file name to read resources from. - - - - - Reads the properties from file system. - - The file name to read resources from. - - - - - Gets the underlying properties. - - The underlying properties. - - - - An implementation of that wraps another - and flags itself 'dirty' when it is modified, enforces that all keys are - strings. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The initial capacity. - - - - Initializes a new instance of the class. - - The initial capacity. - The load factor. - - - - Gets the keys. - - - - - - Adds the name-value pairs in the given to the . -

- All keys must be s, and all values must be serializable. -

-
-
- - - Adds the given value to the 's - data map. - - - - - Adds the given value to the 's - data map. - - - - - Adds the given value to the 's - data map. - - - - - Adds the given value to the 's - data map. - - - - - Adds the given value to the 's - data map. - - - - - Adds the given value to the 's - data map. - - - - - Adds the given value to the 's - data map. - - - - - Adds the given serializable object value to the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Object representing a job or trigger key. - - James House - - - - Construct a new TriggerStatus with the status name and nextFireTime. - - The trigger's status - The next UTC time the trigger will fire - - - - Return the string representation of the TriggerStatus. - - - - - Gets or sets the job key. - - The job key. - - - - Gets or sets the key. - - The key. - - - - Get the name portion of the key. - - the name - - - - Get the group portion of the key. - - the group - - - - Wraps a . - - Chris Bonham - - - - Gets or sets the name of the calendar. - - The name of the calendar. - - - - Gets or sets the name of the class. - - The name of the class. - - - - Gets or sets the calendar. - - The calendar. - - - - Gets or sets a description for the instance - may be - useful for remembering/displaying the purpose of the calendar, though - the description has no meaning to Quartz. - - - - - - Set a new base calendar or remove the existing one. - - - - - - Wraps a and . - - Chris Bonham - James House - - - - Adds a trigger to this bundle. - - The trigger. - - - - Removes the given trigger from this bundle. - - The trigger. - - - - Gets or sets the job detail. - - The job detail. - - - - Gets or sets the triggers associated with this bundle. - - The triggers. - - - - Gets the name of the bundle. - - The name. - - - - Gets the full name. - - The full name. - - - - Gets a value indicating whether this is valid. - - true if valid; otherwise, false. - - - - Parses an XML file that declares Jobs and their schedules (Triggers). - - -

- The xml document must conform to the format defined in - "job_scheduling_data.xsd" -

- -

- After creating an instance of this class, you should call one of the - functions, after which you may call the - function to get a handle to the defined Jobs and Triggers, which can then be - scheduled with the . Alternatively, you could call - the function to do all of this - in one step. -

- -

- The same instance can be used again and again, with the list of defined Jobs - being cleared each time you call a method, - however a single instance is not thread-safe. -

-
- Chris Bonham - James House - Marko Lahma (.NET) -
- - - XML Schema dateTime datatype format. -

- See - http://www.w3.org/TR/2001/REC-xmlschema-2-20010502/#dateTime -

-
-
- - - Constructor for JobSchedulingDataProcessor. - - - - - Constructor for JobSchedulingDataProcessor. - - whether or not to validate XML. - whether or not to validate XML schema. - - - - Process the xml file in the default location (a file named - "quartz_jobs.xml" in the current working directory). - - - - - Process the xml file named . - - meta data file name. - - - - Process the xmlfile named with the given system - ID. - - Name of the file. - The system id. - - - - Process the xmlfile named with the given system - ID. - - The stream. - The system id. - - - - Process the xml file in the default location, and schedule all of the - jobs defined within it. - - - - - Process the xml file in the given location, and schedule all of the - jobs defined within it. - - meta data file name. - The scheduler. - if set to true overwrite existing jobs. - - - - Process the xml file in the given location, and schedule all of the - jobs defined within it. - - Name of the file. - The system id. - The sched. - if set to true [over write existing jobs]. - - - - Add the Jobs and Triggers defined in the given map of - s to the given scheduler. - - The job bundles. - The sched. - if set to true [over write existing jobs]. - - - - Returns a for the job name. - - The name. - - a for the job name. - - - - - Returns an from the fileName as a resource. - - Name of the file. - - an from the fileName as a resource. - - - - - Schedules a given job and trigger (both wrapped by a ). - - job wrapper. - - if the Job or Trigger cannot be added to the Scheduler, or - there is an internal Scheduler error. - - - - - Schedules a given job and trigger (both wrapped by a ). - - The job. - The sched. - if set to true [local over write existing jobs]. - - if the Job or Trigger cannot be added to the Scheduler, or - there is an internal Scheduler error. - - - - - Adds a scheduled job. - - The job. - - - - Adds a calendar. - - The sched. - calendar bundle. - SchedulerException if the Calendar cannot be added to the Scheduler, or - - - - Adds a detected validation exception. - - The exception. - - - - Resets the the number of detected validation exceptions. - - - - - Throws a ValidationException if the number of validationExceptions - detected is greater than zero. - - - DTD validation exception. - - - - - Gets or sets whether to overwrite existing jobs. - - - - - Gets the log. - - The log. - - - - Returns a of scheduled jobs. -

- The key is the job name and the value is a - containing the and . -

-
- a of scheduled jobs. - -
- - - Helper class to map constant names to their values. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Reports JobSchedulingDataProcessor validation exceptions. - - Chris Bonham - - - - Constructor for ValidationException. - - - - - Constructor for ValidationException. - - exception message. - - - - Constructor for ValidationException. - - collection of validation exceptions. - - - - Gets the validation exceptions. - - The validation exceptions. - - - - Returns the detail message string. - - - - - An exception that is thrown to indicate that there has been a critical - failure within the scheduler's core services (such as loss of database - connectivity). - - James House - - - - Create a with the given message. - - - - - Initializes a new instance of the class. - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - The class name is null or is zero (0). - The info parameter is null. - - - - Provides a parser and evaluator for unix-like cron expressions. Cron - expressions provide the ability to specify complex time combinations such as - "At 8:00am every Monday through Friday" or "At 1:30am every - last Friday of the month". - - -

- Cron expressions are comprised of 6 required fields and one optional field - separated by white space. The fields respectively are described as follows: -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Field Name Allowed Values Allowed Special Characters
Seconds 0-59 , - /// /
Minutes 0-59 , - /// /
Hours 0-23 , - /// /
Day-of-month 1-31 , - /// ? / L W C
Month 1-12 or JAN-DEC , - /// /
Day-of-Week 1-7 or SUN-SAT , - /// ? / L #
Year (Optional) empty, 1970-2099 , - /// /
-

- The '*' character is used to specify all values. For example, "*" - in the minute field means "every minute". -

-

- The '?' character is allowed for the day-of-month and day-of-week fields. It - is used to specify 'no specific value'. This is useful when you need to - specify something in one of the two fields, but not the other. -

-

- The '-' character is used to specify ranges For example "10-12" in - the hour field means "the hours 10, 11 and 12". -

-

- The ',' character is used to specify additional values. For example - "MON,WED,FRI" in the day-of-week field means "the days Monday, - Wednesday, and Friday". -

-

- The '/' character is used to specify increments. For example "0/15" - in the seconds field means "the seconds 0, 15, 30, and 45". And - "5/15" in the seconds field means "the seconds 5, 20, 35, and - 50". Specifying '*' before the '/' is equivalent to specifying 0 is - the value to start with. Essentially, for each field in the expression, there - is a set of numbers that can be turned on or off. For seconds and minutes, - the numbers range from 0 to 59. For hours 0 to 23, for days of the month 0 to - 31, and for months 1 to 12. The "/" character simply helps you turn - on every "nth" value in the given set. Thus "7/6" in the - month field only turns on month "7", it does NOT mean every 6th - month, please note that subtlety. -

-

- The 'L' character is allowed for the day-of-month and day-of-week fields. - This character is short-hand for "last", but it has different - meaning in each of the two fields. For example, the value "L" in - the day-of-month field means "the last day of the month" - day 31 - for January, day 28 for February on non-leap years. If used in the - day-of-week field by itself, it simply means "7" or - "SAT". But if used in the day-of-week field after another value, it - means "the last xxx day of the month" - for example "6L" - means "the last friday of the month". When using the 'L' option, it - is important not to specify lists, or ranges of values, as you'll get - confusing results. -

-

- The 'W' character is allowed for the day-of-month field. This character - is used to specify the weekday (Monday-Friday) nearest the given day. As an - example, if you were to specify "15W" as the value for the - day-of-month field, the meaning is: "the nearest weekday to the 15th of - the month". So if the 15th is a Saturday, the trigger will fire on - Friday the 14th. If the 15th is a Sunday, the trigger will fire on Monday the - 16th. If the 15th is a Tuesday, then it will fire on Tuesday the 15th. - However if you specify "1W" as the value for day-of-month, and the - 1st is a Saturday, the trigger will fire on Monday the 3rd, as it will not - 'jump' over the boundary of a month's days. The 'W' character can only be - specified when the day-of-month is a single day, not a range or list of days. -

-

- The 'L' and 'W' characters can also be combined for the day-of-month - expression to yield 'LW', which translates to "last weekday of the - month". -

-

- The '#' character is allowed for the day-of-week field. This character is - used to specify "the nth" XXX day of the month. For example, the - value of "6#3" in the day-of-week field means the third Friday of - the month (day 6 = Friday and "#3" = the 3rd one in the month). - Other examples: "2#1" = the first Monday of the month and - "4#5" = the fifth Wednesday of the month. Note that if you specify - "#5" and there is not 5 of the given day-of-week in the month, then - no firing will occur that month. If the '#' character is used, there can - only be one expression in the day-of-week field ("3#1,6#3" is - not valid, since there are two expressions). -

-

- -

-

- The legal characters and the names of months and days of the week are not - case sensitive. -

-

- NOTES: -

    -
  • Support for specifying both a day-of-week and a day-of-month value is - not complete (you'll need to use the '?' character in one of these fields). -
  • -
  • Overflowing ranges is supported - that is, having a larger number on - the left hand side than the right. You might do 22-2 to catch 10 o'clock - at night until 2 o'clock in the morning, or you might have NOV-FEB. It is - very important to note that overuse of overflowing ranges creates ranges - that don't make sense and no effort has been made to determine which - interpretation CronExpression chooses. An example would be - "0 0 14-6 ? * FRI-MON".
  • -
-

-
- Sharada Jambula - James House - Contributions from Mads Henderson - Refactoring from CronTrigger to CronExpression by Aaron Craven -
- - - Field specification for second. - - - - - Field specification for minute. - - - - - Field specification for hour. - - - - - Field specification for day of month. - - - - - Field specification for month. - - - - - Field specification for day of week. - - - - - Field specification for year. - - - - - Field specification for all wildcard value '*'. - - - - - Field specification for not specified value '?'. - - - - - Field specification for wildcard '*'. - - - - - Field specification for no specification at all '?'. - - - - - Seconds. - - - - - minutes. - - - - - Hours. - - - - - Days of month. - - - - - Months. - - - - - Days of week. - - - - - Years. - - - - - Last day of week. - - - - - Nth day of week. - - - - - Last day of month. - - - - - Nearest weekday. - - - - - Calendar day of week. - - - - - Calendar day of month. - - - - - Expression parsed. - - - - - Constructs a new based on the specified - parameter. - - - String representation of the cron expression the new object should represent - - - - - - Indicates whether the given date satisfies the cron expression. - - - Note that milliseconds are ignored, so two Dates falling on different milliseconds - of the same second will always have the same result here. - - The date to evaluate. - a boolean indicating whether the given date satisfies the cron expression - - - - Returns the next date/time after the given date/time which - satisfies the cron expression. - - the date/time at which to begin the search for the next valid date/time - the next valid date/time - - - - Returns the next date/time after the given date/time which does - not satisfy the expression. - - the date/time at which to begin the search for the next invalid date/time - the next valid date/time - - - - Returns the string representation of the - - The string representation of the - - - - Indicates whether the specified cron expression can be parsed into a - valid cron expression - - the expression to evaluate - a boolean indicating whether the given expression is a valid cron - expression - - - - Builds the expression. - - The expression. - - - - Stores the expression values. - - The position. - The string to traverse. - The type of value. - - - - - Checks the next value. - - The position. - The string to check. - The value. - The type to search. - - - - - Gets the expression summary. - - - - - - Gets the expression set summary. - - The data. - - - - - Skips the white space. - - The i. - The s. - - - - - Finds the next white space. - - The i. - The s. - - - - - Adds to set. - - The val. - The end. - The incr. - The type. - - - - Gets the set of given type. - - The type of set to get. - - - - - Gets the value. - - The v. - The s. - The i. - - - - - Gets the numeric value from string. - - The string to parse from. - The i. - - - - - Gets the month number. - - The string to map with. - - - - - Gets the day of week number. - - The s. - - - - - Gets the time from given time parts. - - The seconds. - The minutes. - The hours. - The day of month. - The month. - - - - - Gets the next fire time after the given time. - - The UTC time to start searching from. - - - - - Creates the date time without milliseconds. - - The time. - - - - - Advance the calendar to the particular hour paying particular attention - to daylight saving problems. - - The date. - The hour. - - - - - Gets the time before. - - The end time. - - - - - NOT YET IMPLEMENTED: Returns the final time that the - will match. - - - - - - Determines whether given year is a leap year. - - The year. - - true if the specified year is a leap year; otherwise, false. - - - - - Gets the last day of month. - - The month num. - The year. - - - - - Creates a new object that is a copy of the current instance. - - - A new object that is a copy of this instance. - - - - - Sets or gets the time zone for which the of this - will be resolved. - - - - - Gets the cron expression string. - - The cron expression string. - - - - Helper class for cron expression handling. - - - - - The value. - - - - - The position. - - - - - A concrete that is used to fire a - at given moments in time, defined with Unix 'cron-like' definitions. - - -

- For those unfamiliar with "cron", this means being able to create a firing - schedule such as: "At 8:00am every Monday through Friday" or "At 1:30am - every last Friday of the month". -

- -

- The format of a "Cron-Expression" string is documented on the - class. -

- -

- Here are some full examples:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Expression Meaning
"0 0 12 * * ?"" /> Fire at 12pm (noon) every day" />
"0 15 10 ? * *"" /> Fire at 10:15am every day" />
"0 15 10 * * ?"" /> Fire at 10:15am every day" />
"0 15 10 * * ? *"" /> Fire at 10:15am every day" />
"0 15 10 * * ? 2005"" /> Fire at 10:15am every day during the year 2005" /> -
"0 * 14 * * ?"" /> Fire every minute starting at 2pm and ending at 2:59pm, every day" /> -
"0 0/5 14 * * ?"" /> Fire every 5 minutes starting at 2pm and ending at 2:55pm, every day" /> -
"0 0/5 14,18 * * ?"" /> Fire every 5 minutes starting at 2pm and ending at 2:55pm, AND fire every 5 minutes starting at 6pm and ending at 6:55pm, every day" /> -
"0 0-5 14 * * ?"" /> Fire every minute starting at 2pm and ending at 2:05pm, every day" /> -
"0 10,44 14 ? 3 WED"" /> Fire at 2:10pm and at 2:44pm every Wednesday in the month of March." /> -
"0 15 10 ? * MON-FRI"" /> Fire at 10:15am every Monday, Tuesday, Wednesday, Thursday and Friday" /> -
"0 15 10 15 * ?"" /> Fire at 10:15am on the 15th day of every month" /> -
"0 15 10 L * ?"" /> Fire at 10:15am on the last day of every month" /> -
"0 15 10 ? * 6L"" /> Fire at 10:15am on the last Friday of every month" /> -
"0 15 10 ? * 6L"" /> Fire at 10:15am on the last Friday of every month" /> -
"0 15 10 ? * 6L 2002-2005"" /> Fire at 10:15am on every last friday of every month during the years 2002, 2003, 2004 and 2005" /> -
"0 15 10 ? * 6#3"" /> Fire at 10:15am on the third Friday of every month" /> -
-

- -

- Pay attention to the effects of '?' and '*' in the day-of-week and - day-of-month fields! -

- -

- NOTES: -

    -
  • Support for specifying both a day-of-week and a day-of-month value is - not complete (you'll need to use the '?' character in on of these fields). -
  • -
  • Be careful when setting fire times between mid-night and 1:00 AM - - "daylight savings" can cause a skip or a repeat depending on whether the - time moves back or jumps forward.
  • -
-

-
- - - - Sharada Jambula - James House - Contributions from Mads Henderson -
- - - The base abstract class to be extended by all triggers. - - -

- s have a name and group associated with them, which - should uniquely identify them within a single . -

- -

- s are the 'mechanism' by which s - are scheduled. Many s can point to the same , - but a single can only point to one . -

- -

- Triggers can 'send' parameters/data to s by placing contents - into the on the . -

-
- - - - - - - James House - Sharada Jambula -
- - - The default value for priority. - - - - - Remove all s from the . - - - - - Create a with no specified name, group, or . - - - Note that the , and - the and properties - must be set before the can be placed into a - . - - - - - Create a with the given name, and default group. - - - Note that the and - properties must be set before the - can be placed into a . - - The name. - - - - Create a with the given name, and group. - - - Note that the and - properties must be set before the - can be placed into a . - - The name. - if , Scheduler.DefaultGroup will be used. - - - - Create a with the given name, and group. - - The name. - if , Scheduler.DefaultGroup will be used. - Name of the job. - The job group. - ArgumentException - if name is null or empty, or the group is an empty string. - - - - - Add the specified name of a to - the end of the 's list of listeners. - - Name of the listener. - - - - Remove the specified name of a - from the 's list of listeners. - - true if the given name was found in the list, and removed - - - - - This method should not be used by the Quartz client. -

- Called when the has decided to 'fire' - the trigger (Execute the associated ), in order to - give the a chance to update itself for its next - triggering (if any). -

- -
- - -
- - - This method should not be used by the Quartz client. - - -

- Called by the scheduler at the time a is first - added to the scheduler, in order to have the - compute its first fire time, based on any associated calendar. -

- -

- After this method has been called, - should return a valid answer. -

-
- - The first time at which the will be fired - by the scheduler, which is also the same value - will return (until after the first firing of the ). - -
- - - This method should not be used by the Quartz client. - - - Called after the has executed the - associated with the - in order to get the final instruction code from the trigger. - - - is the that was used by the - 's method. - is the thrown by the - , if any (may be null). - - - One of the members. - - - - - - - - - - Used by the to determine whether or not - it is possible for this to fire again. -

- If the returned value is then the - may remove the from the . -

-
-
- - - Returns the next time at which the is scheduled to fire. If - the trigger will not fire again, will be returned. Note that - the time returned can possibly be in the past, if the time that was computed - for the trigger to next fire has already arrived, but the scheduler has not yet - been able to fire the trigger (which would likely be due to lack of resources - e.g. threads). - - - The value returned is not guaranteed to be valid until after the - has been added to the scheduler. - - - - - - - Returns the previous time at which the fired. - If the trigger has not yet fired, will be returned. - - - - - Returns the next time at which the will fire, - after the given time. If the trigger will not fire after the given time, - will be returned. - - - - - Validates the misfire instruction. - - The misfire instruction. - - - - - This method should not be used by the Quartz client. -

- To be implemented by the concrete classes that extend this class. -

-

- The implementation should update the 's state - based on the MISFIRE_INSTRUCTION_XXX that was selected when the - was created. -

-
-
- - - This method should not be used by the Quartz client. -

- The implementation should update the 's state - based on the given new version of the associated - (the state should be updated so that it's next fire time is appropriate - given the Calendar's new settings). -

-
- - -
- - - Validates whether the properties of the are - valid for submission into a . - - - - - Return a simple string representation of this object. - - - - - Compare the next fire time of this to that of - another. - - - - - Determines whether the specified is equal to the current . - - The to compare with the current . - - true if the specified is equal to the current ; otherwise, false. - - - - - Serves as a hash function for a particular type. is suitable for use in hashing algorithms and data structures like a hash table. - - - A hash code for the current . - - - - - Creates a new object that is a copy of the current instance. - - - A new object that is a copy of this instance. - - - - - Get or sets the name of this . - - If name is null or empty. - - - - Get the group of this . If , Scheduler.DefaultGroup will be used. - - - if group is an empty string. - - - - - Get or set the name of the associated . - - - if jobName is null or empty. - - - - - Gets or sets the name of the associated 's - group. If set with , Scheduler.DefaultGroup will be used. - - ArgumentException - if group is an empty string. - - - - - Returns the 'full name' of the in the format - "group.name". - - - - - Gets the key. - - The key. - - - - Returns the 'full name' of the that the - points to, in the format "group.name". - - - - - Get or set the description given to the instance by - its creator (if any). - - - - - Get or set the with the given name with - this Trigger. Use when setting to dis-associate a Calendar. - - - - - Get or set the that is associated with the - . -

- Changes made to this map during job execution are not re-persisted, and - in fact typically result in an illegal state. -

-
-
- - - Whether or not the should be persisted in the - for re-use after program restarts. -

- If not explicitly set, the default value is . -

-
-
- - - Returns an array of s containing the names of all - s assigned to the , - in the order in which they should be notified. - - - - - Returns the last UTC time at which the will fire, if - the Trigger will repeat indefinitely, null will be returned. -

- Note that the return time *may* be in the past. -

-
-
- - - Get or set the instruction the should be given for - handling misfire situations for this - the - concrete type that you are using will have - defined a set of additional MISFIRE_INSTRUCTION_XXX - constants that may be passed to this method. -

- If not explicitly set, the default value is . -

-
- - - - -
- - - This method should not be used by the Quartz client. -

- Usable by - implementations, in order to facilitate 'recognizing' instances of fired - s as their jobs complete execution. -

-
-
- - - Returns the date/time on which the trigger must stop firing. This - defines the final boundary for trigger firings 舒 the trigger will - not fire after to this date and time. If this value is null, no end time - boundary is assumed, and the trigger can continue indefinitely. - - Sets the date/time on which the trigger must stop firing. This defines - the final boundary for trigger firings 舒 the trigger will not - fire after to this date and time. If this value is null, no end time - boundary is assumed, and the trigger can continue indefinitely. - - - - - The time at which the trigger's scheduling should start. May or may not - be the first actual fire time of the trigger, depending upon the type of - trigger and the settings of the other properties of the trigger. However - the first actual first time will not be before this date. - - - Setting a value in the past may cause a new trigger to compute a first - fire time that is in the past, which may cause an immediate misfire - of the trigger. - - - - - Tells whether this Trigger instance can handle events - in millisecond precision. - - - - - The priority of a acts as a tie breaker such that if - two s have the same scheduled fire time, then Quartz - will do its best to give the one with the higher priority first access - to a worker thread. - - - If not explicitly set, the default value is 5. - - - - - - - Gets a value indicating whether this instance has additional properties - that should be considered when for example saving to database. - - - If trigger implementation has additional properties that need to be saved - with base properties you need to make your class override this property with value true. - Returning true will effectively mean that ADOJobStore needs to serialize - this trigger instance to make sure additional properties are also saved. - - - true if this instance has additional properties; otherwise, false. - - - - - Create a with no settings. - - - The start-time will also be set to the current time, and the time zone - will be set the the system's default time zone. - - - - - Create a with the given name and default group. - - - The start-time will also be set to the current time, and the time zone - will be set the the system's default time zone. - - The name. - - - - Create a with the given name and group. - - - The start-time will also be set to the current time, and the time zone - will be set the the system's default time zone. - - The name. - The group. - - - - Create a with the given name, group and - expression. - - - The start-time will also be set to the current time, and the time zone - will be set the the system's default time zone. - - The name. - The group. - The cron expression. - - - - Create a with the given name and group, and - associated with the identified . - - - The start-time will also be set to the current time, and the time zone - will be set the the system's default time zone. - - The name. - The group. - Name of the job. - The job group. - - - - Create a with the given name and group, - associated with the identified , - and with the given "cron" expression. - - - The start-time will also be set to the current time, and the time zone - will be set the the system's default time zone. - - The name. - The group. - Name of the job. - The job group. - The cron expression. - - - - Create a with the given name and group, - associated with the identified , - and with the given "cron" expression resolved with respect to the . - - The name. - The group. - Name of the job. - The job group. - The cron expression. - The time zone. - - - - Create a that will occur at the given time, - until the given end time. -

- If null, the start-time will also be set to the current time, the time - zone will be set the the system's default. -

-
- The name. - The group. - Name of the job. - The job group. - The start time. - The end time. - The cron expression. -
- - - Create a with fire time dictated by the - resolved with respect to the specified - occuring from the until - the given . - - The name. - The group. - Name of the job. - The job group. - The start time. - The end time. - - - - Clones this instance. - - - - - - Returns the next time at which the is scheduled to fire. If - the trigger will not fire again, will be returned. Note that - the time returned can possibly be in the past, if the time that was computed - for the trigger to next fire has already arrived, but the scheduler has not yet - been able to fire the trigger (which would likely be due to lack of resources - e.g. threads). - - - The value returned is not guaranteed to be valid until after the - has been added to the scheduler. - - - - - - - Returns the previous time at which the fired. - If the trigger has not yet fired, will be returned. - - - - - - Sets the next fire time. -

- This method should not be invoked by client code. -

-
- The fire time. -
- - - Sets the previous fire time. -

- This method should not be invoked by client code. -

-
- The fire time. -
- - - Returns the next time at which the will fire, - after the given time. If the trigger will not fire after the given time, - will be returned. - - - - - - - Used by the to determine whether or not - it is possible for this to fire again. -

- If the returned value is then the - may remove the from the . -

-
- -
- - - Validates the misfire instruction. - - The misfire instruction. - - - - - This method should not be used by the Quartz client. -

- To be implemented by the concrete classes that extend this class. -

-

- The implementation should update the 's state - based on the MISFIRE_INSTRUCTION_XXX that was selected when the - was created. -

-
- -
- - -

- Determines whether the date and (optionally) time of the given Calendar - instance falls on a scheduled fire-time of this trigger. -

- -

- Equivalent to calling . -

-
- The date to compare. - -
- - - Determines whether the date and (optionally) time of the given Calendar - instance falls on a scheduled fire-time of this trigger. -

- Note that the value returned is NOT validated against the related - ICalendar (if any). -

-
- The date to compare - If set to true, the method will only determine if the - trigger will fire during the day represented by the given Calendar - (hours, minutes and seconds will be ignored). - -
- - - Called when the has decided to 'fire' - the trigger (Execute the associated ), in order to - give the a chance to update itself for its next - triggering (if any). - - - - - - - Updates the trigger with new calendar. - - The calendar to update with. - The misfire threshold. - - - - Called by the scheduler at the time a is first - added to the scheduler, in order to have the - compute its first fire time, based on any associated calendar. -

- After this method has been called, - should return a valid answer. -

-
- - - the first time at which the will be fired - by the scheduler, which is also the same value - will return (until after the first firing of the ). - -
- - - Gets the expression summary. - - - - - - Gets the next time to fire after the given time. - - The time to compute from. - - - - - NOT YET IMPLEMENTED: Returns the time before the given time - that this will fire. - - The date. - - - - - Gets or sets the cron expression string. - - The cron expression string. - - - - Set the CronExpression to the given one. The TimeZone on the passed-in - CronExpression over-rides any that was already set on the Trigger. - - The cron expression. - - - - Returns the date/time on which the trigger may begin firing. This - defines the initial boundary for trigger firings the trigger - will not fire prior to this date and time. - - - - - - Get or sets the time at which the CronTrigger should quit - repeating - even if repeastCount isn't yet satisfied. - - - - - Sets the time zone for which the of this - will be resolved. - - - If is set after this - property, the TimeZone setting on the CronExpression will "win". However - if is set after this property, the - time zone applied by this method will remain in effect, since the - string cron expression does not carry a time zone! - - The time zone. - - - - Returns the last UTC time at which the will fire, if - the Trigger will repeat indefinitely, null will be returned. -

- Note that the return time *may* be in the past. -

-
-
- - - Tells whether this Trigger instance can handle events - in millisecond precision. - - - - - - The interface to be implemented by s that provide a - mechanism for having their execution interrupted. It is NOT a requirment - for jobs to implement this interface - in fact, for most people, none of - their jobs will. - - -

- The means of actually interrupting the Job must be implemented within the - itself (the method of this - interface is simply a means for the scheduler to inform the - that a request has been made for it to be interrupted). The mechanism that - your jobs use to interrupt themselves might vary between implementations. - However the principle idea in any implementation should be to have the - body of the job's periodically check some flag to - see if an interruption has been requested, and if the flag is set, somehow - abort the performance of the rest of the job's work. An example of - interrupting a job can be found in the java source for the class - Quartz.Examples.Example7.DumbInterruptableJob. It is legal to use - some combination of and - synchronization within and - in order to have the method block until the - signals that it has noticed the set flag. -

- -

- If the Job performs some form of blocking I/O or similar functions, you may - want to consider having the method store a - reference to the calling as a member variable. Then the - impplementation of this interfaces method can call - on that Thread. Before attempting this, make - sure that you fully understand what - does and doesn't do. Also make sure that you clear the Job's member - reference to the Thread when the Execute(..) method exits (preferrably in a - block. -

-
- - - James House -
- - - Called by the when a user - interrupts the . - - void (nothing) if job interrupt is successful. - - - - Scheduler constants. - - - - - A (possibly) usefull constant that can be used for specifying the group - that and instances belong to. - - - - - A constant group name used internally by the - scheduler - clients should not use the value of this constant - ("MANUAL_TRIGGER") for thename of a 's group. - - - - - A constant group name used internally by the - scheduler - clients should not use the value of this constant - ("RECOVERING_JOBS") for thename of a 's group. - - - - - A constant group name used internally by the - scheduler - clients should not use the value of this constant - ("FAILED_OVER_JOBS") for thename of a 's group. - - - - - A constant key that can be used to retrieve the - name of the original from a recovery trigger's - data map in the case of a job recovering after a failed scheduler - instance. - - - - - - A constant key that can be used to retrieve the - group of the original from a recovery trigger's - data map in the case of a job recovering after a failed scheduler - instance. - - - - - - A constant key that can be used to retrieve the - scheduled fire time of the original from a recovery - trigger's data map in the case of a job recovering after a failed scheduler - instance. - - - - - - Holds state information for instances. - - - instances are stored once when the - is added to a scheduler. They are also re-persisted after every execution of - instances. -

- instances can also be stored with a - . This can be useful in the case where you have a Job - that is stored in the scheduler for regular/repeated use by multiple - Triggers, yet with each independent triggering, you want to supply the - Job with different data inputs. -

-

- The passed to a Job at execution time - also contains a convenience that is the result - of merging the contents of the trigger's JobDataMap (if any) over the - Job's JobDataMap (if any). -

-
- - - - - James House -
- - - Create an empty . - - - - - Create a with the given data. - - - - - Adds the given value as a string version to the - 's data map. - - - - - Adds the given value as a string version to the - 's data map. - - - - - Adds the given value as a string version to the - 's data map. - - - - - Adds the given value as a string version to the - 's data map. - - - - - Adds the given value as a string version to the - 's data map. - - - - - Adds the given value as a string version to the - 's data map. - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the - . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Gets the date time. - - The key. - - - - - Gets the value behind the specified key. - - The key. - - - - - Conveys the detail properties of a given instance. - - - Quartz does not store an actual instance of a type, but - instead allows you to define an instance of one, through the use of a . -

- s have a name and group associated with them, which - should uniquely identify them within a single . -

-

- s are the 'mechanism' by which s - are scheduled. Many s can point to the same , - but a single can only point to one . -

-
- - - - - James House - Sharada Jambula -
- - - Create a with no specified name or group, and - the default settings of all the other properties. -

- Note that the , and - properties must be set before the job can be - placed into a . -

-
-
- - - Create a with the given name, default group, and - the default settings of all the other properties. - If , Scheduler.DefaultGroup will be used. - - - If name is null or empty, or the group is an empty string. - - - - - Create a with the given name, and group, and - the default settings of all the other properties. - If , Scheduler.DefaultGroup will be used. - - - If name is null or empty, or the group is an empty string. - - - - - Create a with the given name, and group, and - the given settings of all the other properties. - - The name. - if , Scheduler.DefaultGroup will be used. - Type of the job. - if set to true, job will be volatile. - if set to true, job will be durable. - if set to true, job will request recovery. - - ArgumentException if name is null or empty, or the group is an empty string. - - - - - Validates whether the properties of the are - valid for submission into a . - - - - - Add the specified name of a to the - end of the 's list of listeners. - - - - - Remove the specified name of a from - the 's list of listeners. - - true if the given name was found in the list, and removed - - - - Return a simple string representation of this object. - - - - - Creates a new object that is a copy of the current instance. - - - A new object that is a copy of this instance. - - - - - Determines whether the specified detail is equal to this instance. - - The detail to examine. - - true if the specified detail is equal; otherwise, false. - - - - - Determines whether the specified is equal to the current . - - The to compare with the current . - - if the specified is equal to the - current ; otherwise, . - - - - - Checks equality between given job detail and this instance. - - The detail to compare this instance with. - - - - - Serves as a hash function for a particular type, suitable - for use in hashing algorithms and data structures like a hash table. - - - A hash code for the current . - - - - - Get or sets the name of this . - - - if name is null or empty. - - - - - Get or sets the group of this . - If , will be used. - - - If the group is an empty string. - - - - - Returns the 'full name' of the in the format - "group.name". - - - - - Gets the key. - - The key. - - - - Get or set the description given to the instance by its - creator (if any). - - - May be useful for remembering/displaying the purpose of the job, though the - description has no meaning to Quartz. - - - - - Get or sets the instance of that will be executed. - - - if jobType is null or the class is not a . - - - - - Get or set the that is associated with the . - - - - - Set whether or not the the should re-Execute - the if a 'recovery' or 'fail-over' situation is - encountered. -

- If not explicitly set, the default value is . -

-
- -
- - - Whether or not the should not be persisted in the - for re-use after program - restarts. -

- If not explicitly set, the default value is . -

-
- if the should be garbage - collected along with the . - -
- - - Whether or not the should remain stored after it is - orphaned (no s point to it). -

- If not explicitly set, the default value is . -

-
- - if the Job should remain persisted after - being orphaned. - -
- - - Whether or not the implements the interface . - - - - - Gets or sets an array of s containing the names of all - s assigned to the , - in the order in which they should be notified. Setting the array - clears any listener names that were in the list. - - - - - A context bundle containing handles to various environment information, that - is given to a instance as it is - executed, and to a instance after the - execution completes. - - -

- The found on this object (via the - method) serves as a convenience - - it is a merge of the found on the - and the one found on the , with - the value in the latter overriding any same-named values in the former. - It is thus considered a 'best practice' that the Execute code of a Job - retrieve data from the JobDataMap found on this object NOTE: Do not - expect value 'set' into this JobDataMap to somehow be set back onto a - 's own JobDataMap. -

- -

- s are also returned from the - - method. These are the same instances as those past into the jobs that are - currently executing within the scheduler. The exception to this is when your - application is using Quartz remotely (i.e. via RMI) - in which case you get - a clone of the s, and their references to - the and instances have been lost (a - clone of the is still available - just not a handle - to the job instance that is running). -

-
- - - - - - James House -
- - - Create a JobExcecutionContext with the given context data. - - - - - Increments the refire count. - - - - - Returns a that represents the current . - - - A that represents the current . - - - - - Put the specified value into the context's data map with the given key. - Possibly useful for sharing data between listeners and jobs. -

- NOTE: this data is volatile - it is lost after the job execution - completes, and all TriggerListeners and JobListeners have been - notified. -

-
- - - - -
- - - Get the value with the given key from the context's data map. - - - - - - - Get a handle to the instance that fired the - . - - - - - Get a handle to the instance that fired the - . - - - - - Get a handle to the referenced by the - instance that fired the . - - - - - If the is being re-executed because of a 'recovery' - situation, this method will return . - - - - - Gets the refire count. - - The refire count. - - - - Get the convenience of this execution context. - - -

- The found on this object serves as a convenience - - it is a merge of the found on the - and the one found on the , with - the value in the latter overriding any same-named values in the former. - It is thus considered a 'best practice' that the Execute code of a Job - retrieve data from the JobDataMap found on this object. -

- -

NOTE: Do not expect value 'set' into this JobDataMap to somehow be - set back onto a 's own JobDataMap. -

- -

- Attempts to change the contents of this map typically result in an - illegal state. -

- -
-
- - - Get the associated with the . - - - - - Get the instance of the that was created for this - execution. -

- Note: The Job instance is not available through remote scheduler - interfaces. -

-
-
- - - The actual time the trigger fired. For instance the scheduled time may - have been 10:00:00 but the actual fire time may have been 10:00:03 if - the scheduler was too busy. - - Returns the fireTimeUtc. - - - - - The scheduled time the trigger fired for. For instance the scheduled - time may have been 10:00:00 but the actual fire time may have been - 10:00:03 if the scheduler was too busy. - - Returns the scheduledFireTimeUtc. - - - - - Gets the previous fire time. - - The previous fire time. - - - - Gets the next fire time. - - The next fire time. - - - - Returns the result (if any) that the set before its - execution completed (the type of object set as the result is entirely up - to the particular job). - - -

- The result itself is meaningless to Quartz, but may be informative - to s or - s that are watching the job's - execution. -

- - Set the result (if any) of the 's execution (the type of - object set as the result is entirely up to the particular job). - -

- The result itself is meaningless to Quartz, but may be informative - to s or - s that are watching the job's - execution. -

-
-
- - - The amount of time the job ran for. The returned - value will be until the job has actually completed (or thrown an - exception), and is therefore generally only useful to - s and s. - - - - - An exception that can be thrown by a - to indicate to the Quartz that an error - occured while executing, and whether or not the requests - to be re-fired immediately (using the same , - or whether it wants to be unscheduled. - - - Note that if the flag for 'refire immediately' is set, the flags for - unscheduling the Job are ignored. - - - - - James House - - - - Create a JobExcecutionException, with the 're-fire immediately' flag set - to . - - - - - Create a JobExcecutionException, with the given cause. - - The cause. - - - - Create a JobExcecutionException, with the given message. - - - - - Initializes a new instance of the class. - - The message. - The original cause. - - - - Create a JobExcecutionException with the 're-fire immediately' flag set - to the given value. - - - - - Create a JobExcecutionException with the given underlying exception, and - the 're-fire immediately' flag set to the given value. - - - - - Create a JobExcecutionException with the given message, and underlying - exception, and the 're-fire immediately' flag set to the given value. - - - - - Initializes a new instance of the class. - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - The class name is null or is zero (0). - The info parameter is null. - - - - Creates and returns a string representation of the current exception. - - - A string representation of the current exception. - - - - - - Gets or sets a value indicating whether to unschedule firing trigger. - - - true if firing trigger should be unscheduled; otherwise, false. - - - - - Gets or sets a value indicating whether to unschedule all triggers. - - - true if all triggers should be unscheduled; otherwise, false. - - - - - Gets or sets a value indicating whether to refire immediately. - - true if to refire immediately; otherwise, false. - - - - Misfire instructions. - - - - - Instruction not set (yet). - - - - - Use smart policy. - - - - - Misfire policy settings for SimpleTrigger. - - - - - Instructs the that upon a mis-fire - situation, the wants to be fired - now by . -

- NOTE: This instruction should typically only be used for - 'one-shot' (non-repeating) Triggers. If it is used on a trigger with a - repeat count > 0 then it is equivalent to the instruction - . -

-
-
- - - Instructs the that upon a mis-fire - situation, the wants to be - re-scheduled to 'now' (even if the associated - excludes 'now') with the repeat count left as-is. This does obey the - end-time however, so if 'now' is after the - end-time the will not fire again. - - -

- NOTE: Use of this instruction causes the trigger to 'forget' - the start-time and repeat-count that it was originally setup with (this - is only an issue if you for some reason wanted to be able to tell what - the original values were at some later time). -

-
-
- - - Instructs the that upon a mis-fire - situation, the wants to be - re-scheduled to 'now' (even if the associated - excludes 'now') with the repeat count set to what it would be, if it had - not missed any firings. This does obey the end-time - however, so if 'now' is after the end-time the will - not fire again. - -

- NOTE: Use of this instruction causes the trigger to 'forget' - the start-time and repeat-count that it was originally setup with. - Instead, the repeat count on the trigger will be changed to whatever - the remaining repeat count is (this is only an issue if you for some - reason wanted to be able to tell what the original values were at some - later time). -

- -

- NOTE: This instruction could cause the - to go to the 'COMPLETE' state after firing 'now', if all the - repeat-fire-times where missed. -

-
-
- - - Instructs the that upon a mis-fire - situation, the wants to be - re-scheduled to the next scheduled time after 'now' - taking into - account any associated , and with the - repeat count set to what it would be, if it had not missed any firings. - - - NOTE/WARNING: This instruction could cause the - to go directly to the 'COMPLETE' state if all fire-times where missed. - - - - - Instructs the that upon a mis-fire - situation, the wants to be - re-scheduled to the next scheduled time after 'now' - taking into - account any associated , and with the - repeat count left unchanged. - - -

- NOTE/WARNING: This instruction could cause the - to go directly to the 'COMPLETE' state if all the end-time of the trigger - has arrived. -

-
-
- - - misfire instructions for CronTrigger - - - - - Instructs the that upon a mis-fire - situation, the wants to be fired now - by . - - - - - Instructs the that upon a mis-fire - situation, the wants to have it's - next-fire-time updated to the next time in the schedule after the - current time (taking into account any associated , - but it does not want to be fired now. - - - - - misfire instructions for NthIncludedDayTrigger - - - - - Instructs the that upon a mis-fire situation, the - wants to be fired now by the - - - - - - Instructs the that upon a mis-fire situation, the - wants to have - nextFireTime updated to the next time in the schedule after - the current time, but it does not want to be fired now. - - - - - A trigger which fires on the Nth day of every interval type - , or - that is not excluded by the associated - calendar. - - - When determining what the Nth day of the month or year - is, will skip excluded days on the - associated calendar. This would commonly be used in an Nth - business day situation, in which the user wishes to fire a particular job on - the Nth business day (i.e. the 5th business day of - every month). Each also has an associated - which indicates at what time of day the trigger is - to fire. -

- All s default to a monthly interval type - (fires on the Nth day of every month) with N = 1 (first - non-excluded day) and set to 12:00 PM (noon). These - values can be changed using the , , and - methods. Users may also want to note the - and - methods. -

-

- Take, for example, the following calendar: -

- - July August September - Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa - 1 W 1 2 3 4 5 W 1 2 W - W H 5 6 7 8 W W 8 9 10 11 12 W W H 6 7 8 9 W - W 11 12 13 14 15 W W 15 16 17 18 19 W W 12 13 14 15 16 W - W 18 19 20 21 22 W W 22 23 24 25 26 W W 19 20 21 22 23 W - W 25 26 27 28 29 W W 29 30 31 W 26 27 28 29 30 - W - - Where W's represent weekend days, and H's represent holidays, all of which - are excluded on a calendar associated with an - with n=5 and - intervalType=IntervalTypeMonthly. In this case, the trigger - would fire on the 8th of July (because of the July 4 holiday), - the 5th of August, and the 8th of September (because - of Labor Day). -
- Aaron Craven -
- - - Indicates a monthly trigger type (fires on the Nth included - day of every month). - - - - indicates a yearly trigger type (fires on the Nth included - day of every year). - - - - - Indicates a weekly trigger type (fires on the Nth included - day of every week). When using this interval type, care must be taken - not to think of the value of as an analog to - . Such a comparison can only - be drawn when there are no calendars associated with the trigger. To - illustrate, consider an with - n = 3 which is associated with a Calendar excluding - non-weekdays. The trigger would fire on the 3rd - included day of the week, which would be 4th - actual day of the week. - - - - - Create an with no specified name, - group, or . This will result initially in a - default monthly trigger that fires on the first day of every month at - 12:00 PM (n = 1, - intervalType=, - fireAtTime="12:00"). - - - Note that , , - , and , must be - called before the can be placed into - a . - - - - - Create an with the given name and - default group but no specified . This will result - initially in a default monthly trigger that fires on the first day of - every month at 12:00 PM (=1, - intervalType=, - fireAtTime=12:00"). -

- Note that and must - be called before the can be placed - into a . -

-
- the name for the -
- - - Create an with the given name and - group but no specified . This will result - initially in a default monthly trigger that fires on the first day of - every month at 12:00 PM (=1, - intervalType=, - fireAtTime=12:00"). -

- Note that and must - be called before the can be placed - into a . -

-
- the name for the - - the group for the - -
- - - Create an with the given name and - group and the specified . This will result - initially in a default monthly trigger that fires on the first day of - every month at 12:00 PM (=1, - intervalType=, - fireAtTime="12:00"). - - The name for the . - The group for the . - The name of the job to associate with the . - The group containing the job to associate with the . - - - - Returns the next UTC time at which the - will fire. If the trigger will not fire again, will be - returned. - - -

- Because of the conceptual design of , - it is not always possible to decide with certainty that the trigger - will never fire again. Therefore, it will search for the next - fire time up to a given cutoff. These cutoffs can be changed by using the - property. The default cutoff is 12 - of the intervals specified by intervalType. -

-

- The returned value is not guaranteed to be valid until after - the trigger has been added to the scheduler. -

-
- the next fire time for the trigger - -
- - - Returns the previous UTC time at which the - fired. If the trigger has not yet - fired, will be returned. - - the previous fire time for the trigger - - - - Returns the first time the will fire - after the specified date. - - -

- Because of the conceptual design of , - it is not always possible to decide with certainty that the trigger - will never fire again. Therefore, it will search for the next - fire time up to a given cutoff. These cutoffs can be changed by using the - property. The default cutoff is 12 - of the intervals specified by intervalType. -

-

- Therefore, for triggers with intervalType = - , if the trigger - will not fire within 12 - weeks after the given date/time, will be returned. For - triggers with intervalType = - - , if the trigger will not fire within 12 - months after the given date/time, will be returned. - For triggers with intervalType = - - , if the trigger will not fire within 12 - years after the given date/time, will be returned. In - all cases, if the trigger will not fire before , - will be returned. -

-
- The time after which to find the nearest fire time. - This argument is treated as exclusive 舒 that is, - if afterTime is a valid fire time for the trigger, it - will not be returned as the next fire time. - - - the first time the trigger will fire following the specified date - -
- - - Called when the has decided to 'fire' the trigger - (Execute the associated ), in order to give the - a chance to update itself for its next triggering - (if any). - - - - - Called by the scheduler at the time a is first - added to the scheduler, in order to have the - compute its first fire time, based on any associated calendar. -

- After this method has been called, - should return a valid answer. -

- -
- the first time at which the will be fired - by the scheduler, which is also the same value - will return (until after the first - firing of the ). - -
- - - Called after the has executed the - associated with the in order - to get the final instruction code from the trigger. - - - The that was used by the - 's method. - - - The thrown by the - , if any (may be ) - - one of the Trigger.INSTRUCTION_XXX constants. - - - - - Used by the to determine whether or not it is - possible for this to fire again. - ' - -

- If the returned value is then the - may remove the from the - -

-
- - A boolean indicator of whether the trigger could potentially fire - again. - -
- - - Indicates whether is a valid misfire - instruction for this . - - Whether is valid. - - - Updates the 's state based on the - MisfireInstruction that was selected when the - was created -

- If the misfire instruction is set to MISFIRE_INSTRUCTION_SMART_POLICY, - then the instruction will be interpreted as - . -

-
- a new or updated calendar to use for the trigger - -
- - - Updates the 's state based on the - given new version of the associated . - - A new or updated calendar to use for the trigger - the amount of time that must - be between "now" and the time the next - firing of the trigger is supposed to occur. - - - - - Calculates the first time an with - intervalType = IntervalTypeWeekly will fire - after the specified date. See for more - information. - - The time after which to find the nearest fire time. - This argument is treated as exclusive 舒 that is, - if afterTime is a valid fire time for the trigger, it - will not be returned as the next fire time. - - the first time the trigger will fire following the specified - date - - - - - Calculates the first UTC time an with - intervalType = will fire - after the specified date. See for more - information. - - - The UTC time after which to find the nearest fire time. - This argument is treated as exclusive 舒 that is, - if afterTime is a valid fire time for the trigger, it - will not be returned as the next fire time. - - the first time the trigger will fire following the specified date - - - - Calculates the first time an with - intervalType = will fire - after the specified date. See for more - information. - - - The UTC time after which to find the nearest fire time. - This argument is treated as exclusive 舒 that is, - if afterTime is a valid fire time for the trigger, it - will not be returned as the next fire time. - - the first time the trigger will fire following the specified - date - - - - - Gets or sets the day of the interval on which the - should fire. If the Nth - day of the interval does not exist (i.e. the 32nd of a - month), the trigger simply will never fire. N may not be less than 1. - - - - - Returns the interval type for the . - - - Sets the interval type for the . If - , the trigger will fire on the - Nth included day of every month. If - , the trigger will fire on the - Nth included day of every year. If - , the trigger will fire on the - Nth included day of every week. - - - - - - - - Returns the fire time for the as a - string with the format "HH:MM[:SS]", with HH representing the - 24-hour clock hour of the fire time. Seconds are optional and their - inclusion depends on whether or not they were provided to - . - - - - - Returns the for the - . - - -

- Because of the conceptual design of , - it is not always possible to decide with certainty that the trigger - will never fire again. Therefore, it will search for the next - fire time up to a given cutoff. These cutoffs can be changed by using the - property. The default cutoff is 12 - of the intervals specified by intervalType" />. -

-

- Because of the conceptual design of , - it is not always possible to decide with certainty that the trigger - will never fire again. Therefore, it will search for the next - fire time up to a given cutoff. These cutoffs can be changed by using the - method. The default cutoff is 12 - of the intervals specified by intervalType". -

-

- In most cases, the default value of this setting (12) is sufficient (it - is highly unlikely, for example, that you will need to look at more than - 12 months of dates to ensure that your trigger will never fire again). - However, this setting is included to allow for the rare exceptions where - this might not be true. -

-

- For example, if your trigger is associated with a calendar that excludes - a great many dates in the next 12 months, and hardly any following that, - it is possible (if is large enough) that you could run - into this situation. -

-
-
- - - Returns the last UTC time the will fire. - If the trigger will not fire at any point between - and , will be returned. - - the last time the trigger will fire. - - - - Tells whether this Trigger instance can handle events - in millisecond precision. - - - - - - Sets or gets the time zone in which the will be resolved. - If no time zone is provided, then the default time zone will be used. - - - - - - - Gets or sets the trigger's calendar week rule. - - The trigger calendar week rule. - - - - Gets or sets the trigger's calendar first day of week rule. - - The trigger calendar first day of week. - - - - An exception that is thrown to indicate that an attempt to store a new - object (i.e. , - or ) in a - failed, because one with the same name and group already exists. - - James House - - -

- Create a with the given - message. -

-
-
- - - Initializes a new instance of the class. - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - The class name is null or is zero (0). - The info parameter is null. - - -

- Create a and auto-generate a - message using the name/group from the given . -

- -

- The message will read:
"Unable to store Job with name: '__' and - group: '__', because one already exists with this identification." -

-
-
- -

- Create a and auto-generate a - message using the name/group from the given . -

- -

- The message will read:
"Unable to store Trigger with name: '__' and - group: '__', because one already exists with this identification." -

-
-
- - - An exception that is thrown to indicate that there is a misconfiguration of - the - or one of the components it - configures. - - James House - - - - Create a with the given message. - - - - - Create a with the given message - and cause. - - - - - Initializes a new instance of the class. - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - The class name is null or is zero (0). - The info parameter is null. - - - - Holds context/environment data that can be made available to Jobs as they - are executed. - - - James House - - - - Create an empty . - - - - - Create a with the given data. - - - - - Instructs Scheduler what to do with a trigger and job. - - - - - Instructs the that the - has no further instructions. - - - - - Instructs the that the - wants the to re-Execute - immediately. If not in a 'RECOVERING' or 'FAILED_OVER' situation, the - execution context will be re-used (giving the the - abilitiy to 'see' anything placed in the context by its last execution). - - - - - Instructs the that the - should be put in the state. - - - - - Instructs the that the - wants itself deleted. - - - - - Instructs the that all - s referencing the same as - this one should be put in the state. - - - - - Instructs the that all - s referencing the same as - this one should be put in the state. - - - - - Instructs the that the - should be put in the state. - - - - - Describes the settings and capabilities of a given - instance. - - James House - - - - Initializes a new instance of the class. - - Name of the scheduler. - The scheduler instance. - The scheduler type. - if set to true, scheduler is a remote scheduler. - if set to true, scheduler is started. - if set to true, scheduler is in standby mode. - if set to true, scheduler is shutdown. - The start time. - The number of jobs executed. - The job store type. - if set to true, job store is persistent. - The thread pool type. - Size of the thread pool. - The version string. - - - - Returns a formatted (human readable) string describing all the 's - meta-data values. - - -

- The format of the string looks something like this: -

-            Quartz Scheduler 'SchedulerName' with instanceId 'SchedulerInstanceId' Scheduler class: 'Quartz.Impl.StdScheduler' - running locally. Running since: '11:33am on Jul 19, 2002' Not currently paused. Number of Triggers fired: '123' Using thread pool 'Quartz.Simpl.SimpleThreadPool' - with '8' threads Using job-store 'Quartz.Impl.JobStore' - which supports persistence.
-            
-

-
-
- - - Return a simple string representation of this object. - - - - - Returns the name of the . - - - - - Returns the instance Id of the . - - - - - Returns the class-name of the instance. - - - - - Returns whether the is being used remotely (via remoting). - - - - - Returns whether the scheduler has been started. - - - Note: may return even if - returns . - - - - - Reports whether the is in standby mode. - - - Note: may return even if - returns . - - - - - Reports whether the has been Shutdown. - - - - - Returns the class-name of the instance that is - being used by the . - - - - - Returns the type name of the instance that is - being used by the . - - - - - Returns the number of threads currently in the 's - - - - - Returns the version of Quartz that is running. - - - - - Returns the at which the Scheduler started running. - - null if the scheduler has not been started. - - - - - Returns the number of jobs executed since the - started.. - - - - - Returns whether or not the 's - instance supports persistence. - - - - - A concrete that is used to fire a - at a given moment in time, and optionally repeated at a specified interval. - - - - - - James House - Contributions by Lieven Govaerts of Ebitec Nv, Belgium. - Marko Lahma (.NET) - - - - Used to indicate the 'repeat count' of the trigger is indefinite. Or in - other words, the trigger should repeat continually until the trigger's - ending timestamp. - - - - - Create a with no settings. - - - - - Create a that will occur immediately, and - not repeat. - - - - - Create a that will occur immediately, and - not repeat. - - - - - Create a that will occur immediately, and - repeat at the the given interval the given number of times. - - - - - Create a that will occur immediately, and - repeat at the the given interval the given number of times. - - - - - Create a that will occur at the given time, - and not repeat. - - - - - Create a that will occur at the given time, - and not repeat. - - - - - Create a that will occur at the given time, - and repeat at the the given interval the given number of times, or until - the given end time. - - The name. - A UTC set to the time for the to fire. - A UTC set to the time for the - to quit repeat firing. - The number of times for the to repeat - firing, use for unlimited times. - The time span to pause between the repeat firing. - - - - Create a that will occur at the given time, - and repeat at the the given interval the given number of times, or until - the given end time. - - The name. - The group. - A UTC set to the time for the to fire. - A UTC set to the time for the - to quit repeat firing. - The number of times for the to repeat - firing, use for unlimited times. - The time span to pause between the repeat firing. - - - - Create a that will occur at the given time, - fire the identified and repeat at the the given - interval the given number of times, or until the given end time. - - The name. - The group. - Name of the job. - The job group. - A set to the time for the - to fire. - A set to the time for the - to quit repeat firing. - The number of times for the to repeat - firing, use RepeatIndefinitely for unlimited times. - The time span to pause between the repeat firing. - - - - Validates the misfire instruction. - - The misfire instruction. - - - - - Updates the 's state based on the - MisfireInstruction value that was selected when the - was created. - - - If MisfireSmartPolicyEnabled is set to true, - then the following scheme will be used:
-
    -
  • If the Repeat Count is 0, then the instruction will - be interpreted as .
  • -
  • If the Repeat Count is , then - the instruction will be interpreted as . - WARNING: using MisfirePolicy.SimpleTrigger.RescheduleNowWithRemainingRepeatCount - with a trigger that has a non-null end-time may cause the trigger to - never fire again if the end-time arrived during the misfire time span. -
  • -
  • If the Repeat Count is > 0, then the instruction - will be interpreted as . -
  • -
-
-
- - - Called when the has decided to 'fire' - the trigger (Execute the associated ), in order to - give the a chance to update itself for its next - triggering (if any). - - - - - - Updates the instance with new calendar. - - The calendar. - The misfire threshold. - - - - Called by the scheduler at the time a is first - added to the scheduler, in order to have the - compute its first fire time, based on any associated calendar. -

- After this method has been called, - should return a valid answer. -

-
- - The first time at which the will be fired - by the scheduler, which is also the same value - will return (until after the first firing of the ). - -
- - - Returns the next time at which the will - fire. If the trigger will not fire again, will be - returned. The value returned is not guaranteed to be valid until after - the has been added to the scheduler. - - - - - Returns the previous time at which the fired. - If the trigger has not yet fired, will be - returned. - - - - - Set the next UTC time at which the should fire. - This method should not be invoked by client code. - - - - - Set the previous UTC time at which the fired. - This method should not be invoked by client code. - - - - - Returns the next UTC time at which the will - fire, after the given UTC time. If the trigger will not fire after the given - time, will be returned. - - - - - Returns the last UTC time at which the will - fire, before the given time. If the trigger will not fire before the - given time, will be returned. - - - - - Computes the number of times fired between the two UTC date times. - - The UTC start date and time. - The UTC end date and time. - - - - - Determines whether or not the will occur - again. - - - - - Validates whether the properties of the are - valid for submission into a . - - - - - Get or set thhe number of times the should - repeat, after which it will be automatically deleted. - - - - - - Get or set the the time interval at which the should repeat. - - - - - Get or set the number of times the has already - fired. - - - - - Returns the final UTC time at which the will - fire, if repeatCount is RepeatIndefinitely, null will be returned. -

- Note that the return time may be in the past. -

-
-
- - - Tells whether this Trigger instance can handle events - in millisecond precision. - - - - - - All trigger states known to Scheduler. - - - - - Indicates that the is in the "normal" state. - - - - - Indicates that the is in the "paused" state. - - - - - Indicates that the is in the "complete" state. - - - "Complete" indicates that the trigger has not remaining fire-times in - its schedule. - - - - - Indicates that the is in the "error" state. - - -

- A arrives at the error state when the scheduler - attempts to fire it, but cannot due to an error creating and executing - its related job. Often this is due to the 's - class not existing in the classpath. -

- -

- When the trigger is in the error state, the scheduler will make no - attempts to fire it. -

-
-
- - - Indicates that the is in the "blocked" state. - - - A arrives at the blocked state when the job that - it is associated with is a and it is - currently executing. - - - - - - Indicates that the does not exist. - - - - - Convenience and utility methods for simplifying the construction and - configuration of s. - - - Please submit suggestions for additional convenience methods to either the - Quartz user forum or the developer's mail list at - source forge. - - - - James House - - - - Constant indicating last day of month. - - - - - Milliseconds in minute. - - - - - Milliseconds in hour. - - - - - Seconds in day. - - - - - Milliseconds in day. - - - - - Initializes a new instance of the class. - - - - - Set the given 's name to the given value, and its - group to the default group (). - - the tigger to change name to - the new trigger name - - - - Set the given 's name to the given value, and its - group to the given group. - - the tigger to change name to - the new trigger name - the new trigger group - - - - Make a trigger that will fire every day at the given time. -

- The generated trigger will not have its name, group, - or end-time set. The Start time defaults to 'now'. -

-
- the hour (0-23) upon which to fire - the minute (0-59) upon which to fire - the new trigger -
- - - Make a trigger that will fire every day at the given time. -

- The generated trigger will not have its group or end-time set. - The Start time defaults to 'now'. -

-
- the trigger's name - the hour (0-23) upon which to fire - the minute (0-59) upon which to fire - the newly created trigger -
- - - Make a trigger that will fire every week at the given day and time. -

- The generated trigger will not have its name, group, - or end-time set. The Start time defaults to 'now'. -

-
- (1-7) the day of week upon which to fire - the hour (0-23) upon which to fire - the minute (0-59) upon which to fire - the new trigger -
- - - Make a trigger that will fire every week at the given day and time. -

- The generated trigger will not have its group, - or end-time set. The Start time defaults to 'now'. -

-
- the trigger's name - the day of week upon which to fire - the hour (0-23) upon which to fire - the minute (0-59) upon which to fire - the newly created trigger -
- - - Make a trigger that will fire every month at the given day and time. -

- The generated trigger will not have its name, group, - or end-time set. The Start time defaults to 'now'. -

-

- If the day of the month specified does not occur in a given month, a - firing will not occur that month. (i.e. if dayOfMonth is specified as - 31, no firing will occur in the months of the year with fewer than 31 - days). -

-
- (1-31, or -1) the day of week upon which to fire - the hour (0-23) upon which to fire - the minute (0-59) upon which to fire - the newly created trigger -
- - - Make a trigger that will fire every month at the given day and time. -

- The generated trigger will not have its group, - or end-time set. The Start time defaults to 'now'. -

-

- If the day of the month specified does not occur in a given month, a - firing will not occur that month. (i.e. if dayOfMonth is specified as - 31, no firing will occur in the months of the year with fewer than 31 - days). -

-
- the trigger's name - (1-31, or -1) the day of week upon which to fire - the hour (0-23) upon which to fire - the minute (0-59) upon which to fire - the newly created trigger -
- - - Make a trigger that will fire times, waiting - between each fire. - - - The generated trigger will not have its name, group, - or end-time set. The Start time defaults to 'now'. - - the newly created trigger - - - - Make a trigger that will fire times, waiting - between each fire. -

- The generated trigger will not have its name, group, - or end-time set. The Start time defaults to 'now'. -

-
- the trigger's name - the new trigger -
- - - Make a trigger that will fire every second, indefinitely. -

- The generated trigger will not have its name, group, - or end-time set. The Start time defaults to 'now'. -

-
- the new trigger -
- - - Make a trigger that will fire every second, indefinitely. -

- The generated trigger will not have its group, - or end-time set. The Start time defaults to 'now'. -

-
- the trigger's name - the new trigger -
- - - Make a trigger that will fire every N seconds, indefinitely. -

- The generated trigger will not have its name, group, - or end-time set. The Start time defaults to 'now'. -

-
- the number of seconds between firings - the new trigger -
- - - Make a trigger that will fire every N seconds, with the given number of - repeats. -

- The generated trigger will not have its name, group, - or end-time set. The Start time defaults to 'now'. -

-
- the number of seconds between firings - the number of times to repeat the firing - the new trigger -
- - - Make a trigger that will fire every N seconds, with the given number of - repeats. -

- The generated trigger will not have its group, - or end-time set. The Start time defaults to 'now'. -

-
- the trigger's name - the number of seconds between firings - the number of times to repeat the firing - the new trigger -
- - - Make a trigger that will fire every minute, indefinitely. -

- The generated trigger will not have its name, group, - or end-time set. The Start time defaults to 'now'. -

-
- the new trigger -
- - - Make a trigger that will fire every minute, indefinitely. -

- The generated trigger will not have its group, - or end-time set. The Start time defaults to 'now'. -

-
- the trigger's name - the new trigger -
- - - Make a trigger that will fire every N minutes, indefinitely. -

- The generated trigger will not have its name, group, - or end-time set. The Start time defaults to 'now'. -

-
- the number of minutes between firings - the new trigger -
- - - Make a trigger that will fire every N minutes, with the given number of - repeats. -

- The generated trigger will not have its name, group, - or end-time set. The Start time defaults to 'now'. -

-
- the number of minutes between firings - the number of times to repeat the firing - the new trigger -
- - - Make a trigger that will fire every N minutes, with the given number of - repeats. -

- The generated trigger will not have its group, - or end-time set. The Start time defaults to 'now'. -

-
- the trigger's name - the number of minutes between firings - the number of times to repeat the firing - the new trigger -
- - - Make a trigger that will fire every hour, indefinitely. -

- The generated trigger will not have its name, group, - or end-time set. The Start time defaults to 'now'. -

-
- the new trigger -
- - - Make a trigger that will fire every hour, indefinitely. -

- The generated trigger will not have its group, - or end-time set. The Start time defaults to 'now'. -

-
- the trigger's name - the new trigger -
- - - Make a trigger that will fire every N hours, indefinitely. -

- The generated trigger will not have its name, group, - or end-time set. The Start time defaults to 'now'. -

-
- the number of hours between firings - the new trigger -
- - - Make a trigger that will fire every N hours, with the given number of - repeats. -

- The generated trigger will not have its name, group, - or end-time set. The Start time defaults to 'now'. -

-
- the number of hours between firings - the number of times to repeat the firing - the new trigger -
- - - Make a trigger that will fire every N hours, with the given number of - repeats. -

- The generated trigger will not have its group, - or end-time set. The Start time defaults to 'now'. -

-
- the trigger's name - the number of hours between firings - the number of times to repeat the firing - the new trigger -
- - - Returns a date that is rounded to the next even hour above the given - date. -

- For example an input date with a time of 08:13:54 would result in a date - with the time of 09:00:00. If the date's time is in the 23rd hour, the - date's 'day' will be promoted, and the time will be set to 00:00:00. -

-
- the Date to round, if the current time will - be used - the new rounded date -
- - - Returns a date that is rounded to the previous even hour below the given - date. -

- For example an input date with a time of 08:13:54 would result in a date - with the time of 08:00:00. -

-
- the Date to round, if the current time will - be used - the new rounded date -
- - - Returns a date that is rounded to the next even minute above the given - date. -

- For example an input date with a time of 08:13:54 would result in a date - with the time of 08:14:00. If the date's time is in the 59th minute, - then the hour (and possibly the day) will be promoted. -

-
- The Date to round, if the current time will be used - The new rounded date -
- - - Returns a date that is rounded to the previous even minute below the - given date. -

- For example an input date with a time of 08:13:54 would result in a date - with the time of 08:13:00. -

-
- the Date to round, if the current time will - be used - the new rounded date -
- - - Returns a date that is rounded to the next even second above the given - date. - - the Date to round, if the current time will - be used - the new rounded date - - - - Returns a date that is rounded to the previous even second below the - given date. -

- For example an input date with a time of 08:13:54.341 would result in a - date with the time of 08:13:00.000. -

-
- the Date to round, if the current time will - be used - the new rounded date -
- - - Returns a date that is rounded to the next even multiple of the given - minute. -

- For example an input date with a time of 08:13:54, and an input - minute-base of 5 would result in a date with the time of 08:15:00. The - same input date with an input minute-base of 10 would result in a date - with the time of 08:20:00. But a date with the time 08:53:31 and an - input minute-base of 45 would result in 09:00:00, because the even-hour - is the next 'base' for 45-minute intervals. -

- -

- More examples: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Input TimeMinute-BaseResult Time
11:16:412011:20:00
11:36:412011:40:00
11:46:412012:00:00
11:26:413011:30:00
11:36:413012:00:00
11:16:411711:17:00
11:17:411711:34:00
11:52:411712:00:00
11:52:41511:55:00
11:57:41512:00:00
11:17:41012:00:00
11:17:41111:08:00
-

- -
- - the Date to round, if the current time will - be used - - - the base-minute to set the time on - - the new rounded date -
- - - Returns a date that is rounded to the next even multiple of the given - minute. -

- The rules for calculating the second are the same as those for - calculating the minute in the method - . -

-
- The date. - The second base. - -
- - - Returns a list of Dates that are the next fire times of a - . - The input trigger will be cloned before any work is done, so you need - not worry about its state being altered by this method. - - The trigger upon which to do the work - The calendar to apply to the trigger's schedule - The number of next fire times to produce - List of java.util.Date objects - - - - Returns a list of Dates that are the next fire times of a - that fall within the given date range. The input trigger will be cloned - before any work is done, so you need not worry about its state being - altered by this method. -

- NOTE: if this is a trigger that has previously fired within the given - date range, then firings which have already occured will not be listed - in the output List. -

-
- The trigger upon which to do the work - The calendar to apply to the trigger's schedule - The starting date at which to find fire times - The ending date at which to stop finding fire times - List of java.util.Date objects -
- - - Translate a date and time from a users timezone to the another - (probably server) timezone to assist in creating a simple trigger with - the right date and time. - - the date to translate - the original time-zone - the destination time-zone - the translated UTC date - - - - Gets the offset from UT for the given date in the given timezone, - taking into account daylight savings. - - the date that is the base for the offset - the time-zone to calculate to offset to - the offset - - - - This functions determines if the TimeZone uses daylight saving time - - TimeZone instance to validate - True or false depending if daylight savings time is used - - - - An exception that is thrown to indicate that a call to - failed without interrupting the Job. - - - James House - - - - Create a with the given message. - - - - - Create a with the given cause. - - - - - Initializes a new instance of the class. - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - The class name is null or is zero (0). - The info parameter is null. - -
-
+ + + + Quartz + + + + + Collection manipulation related utility methods. + + + + + Removes the specified item from list of items and returns + whether removal was success. + + The items to remove from. + The item to remove. + + + + + A hash based set. + + + + + Represents a collection ob objects that contains no duplicate elements. + + + + + Adds a new element to the Collection if it is not already present. + + The object to add to the collection. + Returns true if the object was added to the collection, otherwise false. + + + + Adds all the elements of the specified collection to the Set. + + Collection of objects to add. + true + + + + Returns the first item in the set. + + First object. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The whose elements are copied to the new list. + + is . + + + + Initializes a new instance of the class. + + The capacity. + + + + Unmodifiables the hash set. + + The collection. + + + + + Adds a new element to the ArrayList if it is not already present. + + Element to insert to the ArrayList. + Returns true if the new element was inserted, false otherwise. + + + + Adds all the elements of the specified collection that are not present to the list. + + Collection where the new elements will be added + Returns true if at least one element was added, false otherwise. + + + + Returns the first item in the set. + + First object. + + + + Returns a copy of the HashSet instance. + + Returns a shallow copy of the current HashSet. + + + + A sorted set. + + + + + Returns a portion of the list whose elements are greater than the limit object parameter. + + The start element of the portion to extract. + The portion of the collection whose elements are greater than the limit object parameter. + + + + SupportClass for the TreeSet class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The whose elements are copied to the new list. + + is . + + + + Initializes a new instance of the class. + + The c. + + + + Unmodifiables the tree set. + + The collection. + + + + + Adds a new element to the ArrayList if it is not already present and sorts the ArrayList. + + Element to insert to the ArrayList. + TRUE if the new element was inserted, FALSE otherwise. + + + + Adds all the elements of the specified collection that are not present to the list. + + Collection where the new elements will be added + Returns true if at least one element was added to the collection. + + + + Returns the first item in the set. + + First object. + + + + Determines whether an element is in the the current TreeSetSupport collection. The IComparer defined for + the current set will be used to make comparisons between the elements already inserted in the collection and + the item specified. + + The object to be locatet in the current collection. + true if item is found in the collection; otherwise, false. + + + + Returns a portion of the list whose elements are greater than the limit object parameter. + + The start element of the portion to extract. + The portion of the collection whose elements are greater than the limit object parameter. + + + + Gets the IComparator object used to sort this set. + + + + + Responsible for creating the instances of + to be used within the instance. + + + Although this interface looks a lot like an 'object pool', implementations + do not have to support the re-use of instances. If an implementation does + not wish to pool instances, then the + method would simply create a new instance, and the + method would do nothing. + + James House + Marko Lahma (.NET) + + + + Initialize the factory, providing a handle to the + that should be made available within the and + the s within it, and a handle to the + that the shell will use in its own + operations with the . + + + + + Called by the + to obtain instances of . + + + + + Called by the + to return instances of . + + + + + JobRunShell instances are responsible for providing the 'safe' environment + for s to run in, and for performing all of the work of + executing the , catching ANY thrown exceptions, updating + the with the 's completion code, + etc. +

+ A instance is created by a + on behalf of the which then runs the + shell in a thread from the configured when the + scheduler determines that a has been triggered. +

+
+ + + + + James House + Marko Lahma (.NET) +
+ + + This interface should be implemented by any class whose instances are intended + to be executed by a thread. + + + + + This method has to be implemented in order that starting of the thread causes the object's + run method to be called in that separately executing thread. + + + + + Create a JobRunShell instance with the given settings. + + A handle to the that produced + this . + The instance that should be made + available within the . + the that should be used by the + when making updates to the . + + + + Initializes the job execution context with given scheduler and bundle. + + The scheduler. + The bundle offired triggers. + + + + Requests the Shutdown. + + + + + This method has to be implemented in order that starting of the thread causes the object's + run method to be called in that separately executing thread. + + + + + Runs begin procedures on this instance. + + + + + Completes the execution. + + if set to true [successful execution]. + + + + Passivates this instance. + + + + + Completes the trigger retry loop. + + The trigger. + The job detail. + The inst code. + + + + + Vetoeds the job retry loop. + + The trigger. + The job detail. + The inst code. + + + + + This is the heart of Quartz, an indirect implementation of the + interface, containing methods to schedule s, + register instances, etc. + + + + + + James House + Marko Lahma (.NET) + + + + Starts this instance. + + + + + Standbies this instance. + + + + + Shutdowns this instance. + + + + + returns true if the given JobGroup + is paused + + The scheduling context. + + + + + + returns true if the given TriggerGroup + is paused + + + + + + + + Initializes the class. + + + + + Get the global + that has the given name. + + + + + + + Create a with the given configuration + properties. + + + + + + Bind the scheduler to remoting infrastructure. + + + + + Un-bind the scheduler from remoting infrastructure. + + + + + Adds an object that should be kept as reference to prevent + it from being garbage collected. + + The obj. + + + + Removes the object from garbae collection protected list. + + The obj. + + + + + Starts the 's threads that fire s. +

+ All s that have misfired will + be passed to the appropriate TriggerListener(s). +

+
+
+ + + Temporarily halts the 's firing of s. +

+ The scheduler is not destroyed, and can be re-started at any time. +

+
+
+ + + Halts the 's firing of s, + and cleans up all resources associated with the QuartzScheduler. + Equivalent to . +

+ The scheduler cannot be re-started. +

+
+
+ + + Halts the 's firing of s, + and cleans up all resources associated with the QuartzScheduler. +

+ The scheduler cannot be re-started. +

+
+ + if the scheduler will not allow this method + to return until all currently executing jobs have completed. + +
+ + + Validates the state. + + + + + Add the identified by the given + to the Scheduler, and + associate the given with it. +

+ If the given Trigger does not reference any , then it + will be set to reference the Job passed with it into this method. +

+
+
+ + + Schedule the given with the + identified by the 's settings. + + + + + Add the given to the Scheduler - with no associated + . The will be 'dormant' until + it is scheduled with a , or + is called for it. +

+ The must by definition be 'durable', if it is not, + SchedulerException will be thrown. +

+
+
+ + + Delete the identified from the Scheduler - and any + associated s. + + true if the Job was found and deleted. + + + + Remove the indicated from the + scheduler. + + + + + Remove (delete) the with the + given name, and store the new given one - which must be associated + with the same job. + + The scheduling context. + The name of the to be removed. + The group name of the to be removed. + The new to be stored. + + if a with the given + name and group was not found and removed from the store, otherwise + the first fire time of the newly scheduled trigger. + + + + + Creates a new positive random number + + The last random obtained + Returns a new positive random number + + + + Trigger the identified (Execute it now) - with a non-volatile trigger. + + + + + Trigger the identified (Execute it + now) - with a volatile trigger. + + + + + Pause the with the given name. + + + + + Pause all of the s in the given group. + + + + + Pause the with the given + name - by pausing all of its current s. + + + + + Pause all of the s in the + given group - by pausing all of their s. + + + + + Resume (un-pause) the with the given + name. +

+ If the missed one or more fire-times, then the + 's misfire instruction will be applied. +

+
+
+ + + Resume (un-pause) all of the s in the + given group. +

+ If any missed one or more fire-times, then the + 's misfire instruction will be applied. +

+
+
+ + + Gets the paused trigger groups. + + The the job scheduling context. + + + + + Resume (un-pause) the with + the given name. +

+ If any of the 's s missed one + or more fire-times, then the 's misfire + instruction will be applied. +

+
+
+ + + Resume (un-pause) all of the s + in the given group. +

+ If any of the s had s that + missed one or more fire-times, then the 's + misfire instruction will be applied. +

+
+
+ + + Pause all triggers - equivalent of calling + on every group. +

+ When is called (to un-pause), trigger misfire + instructions WILL be applied. +

+
+ + +
+ + + Resume (un-pause) all triggers - equivalent of calling + on every group. +

+ If any missed one or more fire-times, then the + 's misfire instruction will be applied. +

+
+ +
+ + + Get the names of all known groups. + + + + + Get the names of all the s in the + given group. + + + + + Get all s that are associated with the + identified . + + + + + Get the names of all known + groups. + + + + + Get the names of all the s in + the given group. + + + + + Get the for the + instance with the given name and group. + + + + + Get the instance with the given name and + group. + + + + + Get the current state of the identified . + + + + + + + + + Add (register) the given to the Scheduler. + + + + + Delete the identified from the Scheduler. + + true if the Calendar was found and deleted. + + + + Get the instance with the given name. + + + + + Get the names of all registered s. + + + + + Add the given to the + 'sglobal list. +

+ Listeners in the 'global' list receive notification of execution events + for ALL s. +

+
+
+ + + Add the given to the + 's list, of registered s. + + + + + Remove the given from the + 's list of global listeners. + + + true if the identifed listener was found in the list, and removed. + + + + + Remove the identifed from the 's + list of global listeners. + + + true if the identifed listener was found in the list, and removed. + + + + Remove the identifed from + the 's list of registered listeners. + + + true if the identifed listener was found in the list, and removed. + + + + + Get the non-global that has the given name. + + + + + Add the given to the + 'sglobal list. +

+ Listeners in the 'global' list receive notification of execution events + for ALL s. +

+
+
+ + + Add the given to the + 's list, of registered s. + + + + + Remove the given from + the 's list of global listeners. + + + true if the identifed listener was found in the list, and removed. + + + + + Remove the identifed from the 's + list of global listeners. + + + true if the identifed listener was found in the list, and removed + + + + Remove the identifed + from the 's list of registered listeners. + + + true if the identifed listener was found in the list, and removed. + + + + + Get the non-global + that has the given name. + + + + + Get the global that + has the given name. + + + + + + + Register the given with the + . + + + + + Remove the given from the + . + + + true if the identifed listener was found in the list, and removed. + + + + + Notifies the job store job complete. + + The job scheduling context. + The trigger. + The detail. + The instruction code. + + + + Notifies the scheduler thread. + + + + + Notifies the trigger listeners about fired trigger. + + The job execution context. + + + + + Notifies the trigger listeners about misfired trigger. + + The trigger. + + + + Notifies the trigger listeners of completion. + + The job executution context. + The instruction code to report to triggers. + + + + Notifies the job listeners about job to be executed. + + The jec. + + + + Notifies the job listeners that job exucution was vetoed. + + The job execution context. + + + + Notifies the job listeners that job was executed. + + The jec. + The je. + + + + Notifies the scheduler listeners about scheduler error. + + The MSG. + The se. + + + + Notifies the scheduler listeners about job that was scheduled. + + The trigger. + + + + Notifies the scheduler listeners about job that was unscheduled. + + Name of the trigger. + The trigger group. + + + + Notifies the scheduler listeners about finalized trigger. + + The trigger. + + + + Notifies the scheduler listeners about paused trigger. + + The name. + The group. + + + + Notifies the scheduler listeners resumed trigger. + + The name. + The group. + + + + Notifies the scheduler listeners about paused job. + + The name. + The group. + + + + Notifies the scheduler listeners about resumed job. + + The name. + The group. + + + + Notifies the scheduler listeners about scheduler shutdown. + + + + + Interrupt all instances of the identified InterruptableJob. + + + + + Obtains a lifetime service object to control the lifetime policy for this instance. + + + + + Gets the version of the Quartz Scheduler. + + The version. + + + + Gets the version major. + + The version major. + + + + Gets the version minor. + + The version minor. + + + + Gets the version iteration. + + The version iteration. + + + + Gets the scheduler signaler. + + The scheduler signaler. + + + + Returns the name of the . + + + + + Returns the instance Id of the . + + + + + Returns the of the . + + + + + Gets or sets a value indicating whether to signal on scheduling change. + + + true if schduler should signal on scheduling change; otherwise, false. + + + + + Reports whether the is paused. + + + + + Gets the job store class. + + The job store class. + + + + Gets the thread pool class. + + The thread pool class. + + + + Gets the size of the thread pool. + + The size of the thread pool. + + + + Reports whether the has been Shutdown. + + + + + Return a list of objects that + represent all currently executing Jobs in this Scheduler instance. +

+ This method is not cluster aware. That is, it will only return Jobs + currently executing in this Scheduler instance, not across the entire + cluster. +

+

+ Note that the list returned is an 'instantaneous' snap-shot, and that as + soon as it's returned, the true list of executing jobs may be different. +

+
+
+ + + Get a List containing all of the + s in the 'sglobal list. + + + + + Get a Set containing the names of all the non-global + s registered with the . + + + + + Get a list containing all of the + s in the 'sglobal list. + + + + + Get a Set containing the names of all the non-global + s registered with the . + + + + + Get a List containing all of the + s registered with the . + + + + + Gets or sets the job factory. + + The job factory. + + + + Gets the running since. + + The running since. + + + + Gets the number of jobs executed. + + The number of jobs executed. + + + + Gets a value indicating whether this scheduler supports persistence. + + true if supports persistence; otherwise, false. + + + + Helper class to start scheduler in a delayed fashion. + + + + + ErrorLogger - Scheduler Listener Class + + + + + A helpful abstract base class for implementors of + . + + + The methods in this class are empty so you only need to override the + subset for the events you care about. + + + + + + The interface to be implemented by classes that want to be informed of major + events. + + + + + James House + + + + Called by the when a + is scheduled. + + + + + Called by the when a + is unscheduled. + + + + + Called by the when a + has reached the condition in which it will never fire again. + + + + + Called by the when a + or group of s has been paused. +

+ If a group was paused, then the parameter + will be null. +

+
+ Name of the trigger. + The trigger group. +
+ + + Called by the when a + or group of s has been un-paused. +

+ If a group was resumed, then the parameter + will be null. +

+
+ Name of the trigger. + The trigger group. +
+ + + Called by the when a + or group of s has been paused. +

+ If a group was paused, then the parameter will be + null. If all jobs were paused, then both parameters will be null. +

+
+ Name of the job. + The job group. +
+ + + Called by the when a + or group of s has been un-paused. +

+ If a group was resumed, then the parameter will + be null. If all jobs were paused, then both parameters will be null. +

+
+ The job group. +
+ + + Called by the when a serious error has + occured within the scheduler - such as repeated failures in the , + or the inability to instantiate a instance when its + has fired. +

+ The property of the given SchedulerException + can be used to determine more specific information about the type of + error that was encountered. +

+
+
+ + + Called by the to inform the listener + that it has Shutdown. + + + + + Get the for this + type's category. This should be used by subclasses for logging. + + + + + The interface to be implemented by classes that want to be informed when a + executes. In general, applications that use a + will not have use for this mechanism. + + + + + + + James House + + + + Called by the when a + is about to be executed (an associated + has occured). +

+ This method will not be invoked if the execution of the Job was vetoed + by a . +

+
+ +
+ + + Called by the when a + was about to be executed (an associated + has occured), but a vetoed it's + execution. + + + + + + Called by the after a + has been executed, and be for the associated 's + method has been called. + + + + + Get the name of the . + + + + + Contains all of the resources (,, + etc.) necessary to create a instance. + + + James House + Marko Lahma (.NET) + + + + Gets the unique identifier. + + Name of the scheduler. + The scheduler instance id. + + + + + Gets the unique identifier. + + + + + + Add the given for the + to use. This method expects the plugin's + "initialize" method to be invoked externally (either before or after + this method is called). + + + + + + Get or set the name for the . + + + if name is null or empty. + + + + + Get or set the instance Id for the . + + + if name is null or empty. + + + + + Get or set the name for the . + + + if name is null or empty. + + + + + Get or set the for the + to use. + + + if threadPool is null. + + + + + Get or set the for the + to use. + + + if jobStore is null. + + + + + Get or set the for the + to use. + + + if jobRunShellFactory is null. + + + + + Get the of all + s for the + to use. + + + + + + Gets or sets a value indicating whether to make scheduler thread daemon. + + + true if scheduler should be thread daemon; otherwise, false. + + + + + Gets or sets the scheduler exporter. + + The scheduler exporter. + + + + The thread responsible for performing the work of firing + s that are registered with the . + + + + + James House + Marko Lahma (.NET) + + + + Support class used to handle threads + + + + + The instance of System.Threading.Thread + + + + + Initializes a new instance of the QuartzThread class + + + + + Initializes a new instance of the Thread class. + + The name of the thread + + + + Initializes a new instance of the Thread class. + + A ThreadStart delegate that references the methods to be invoked when this thread begins executing + + + + Initializes a new instance of the Thread class. + + A ThreadStart delegate that references the methods to be invoked when this thread begins executing + The name of the thread + + + + This method has no functionality unless the method is overridden + + + + + Causes the operating system to change the state of the current thread instance to ThreadState.Running + + + + + Interrupts a thread that is in the WaitSleepJoin thread state + + + + + Blocks the calling thread until a thread terminates + + + + + Blocks the calling thread until a thread terminates or the specified time elapses + + Time of wait in milliseconds + + + + Blocks the calling thread until a thread terminates or the specified time elapses + + Time of wait in milliseconds + Time of wait in nanoseconds + + + + Resumes a thread that has been suspended + + + + + Raises a ThreadAbortException in the thread on which it is invoked, + to begin the process of terminating the thread. Calling this method + usually terminates the thread + + + + + Raises a ThreadAbortException in the thread on which it is invoked, + to begin the process of terminating the thread while also providing + exception information about the thread termination. + Calling this method usually terminates the thread. + + An object that contains application-specific information, such as state, which can be used by the thread being aborted + + + + Suspends the thread, if the thread is already suspended it has no effect + + + + + Obtain a string that represents the current object + + A string that represents the current object + + + + Gets the currently running thread + + The currently running thread + + + + Gets the current thread instance + + + + + Gets or sets the name of the thread + + + + + Gets or sets a value indicating the scheduling priority of a thread + + + + + Gets a value indicating the execution status of the current thread + + + + + Gets or sets a value indicating whether or not a thread is a background thread. + + + + + Gets the randomized idle wait time. + + The randomized idle wait time. + + + + Construct a new for the given + as a non-daemon + with normal priority. + + + + + Construct a new for the given + as a with the given + attributes. + + + + + Signals the main processing loop to pause at the next possible point. + + + + + Signals the main processing loop to pause at the next possible point. + + + + + Signals the main processing loop that a change in scheduling has been + made - in order to interrupt any sleeping that may be occuring while + waiting for the fire time to arrive. + + + the time when the newly scheduled trigger + will fire. If this method is being called do to some other even (rather + than scheduling a trigger), the caller should pass null. + + + + + The main processing loop of the . + + + + + Trigger retry loop that is executed on error condition. + + The bndle. + + + + Releases the trigger retry loop. + + The trigger. + + + + Gets the log. + + The log. + + + + Sets the idle wait time. + + The idle wait time. + + + + Gets a value indicating whether this is paused. + + true if paused; otherwise, false. + + + + Gets or sets the db failure retry interval. + + The db failure retry interval. + + + + An interface to be used by instances in order to + communicate signals back to the . + + James House + Marko Lahma (.NET) + + + + An interface to be used by instances in order to + communicate signals back to the . + + James House + + + + Notifies the scheduler about misfired trigger. + + The trigger that misfired. + + + + Notifies the scheduler about finalized trigger. + + The trigger that has finalized. + + + + Signals the scheduling change. + + + + + Notifies the scheduler about misfired trigger. + + The trigger that misfired. + + + + Notifies the scheduler about finalized trigger. + + The trigger that has finalized. + + + + Signals the scheduling change. + + + + + An object used to pass information about the 'client' to the . + + + James House + Marko Lahma (.NET) + + + + get the instanceId in the cluster. + +

+ Set the instanceId. +

+
+
+ + + Metadata information about specific ADO.NET driver library. Metadata is used to + create correct types of object instances to interact with the underlying + database. + + + + + Initializes this instance. Parses information and initializes startup + values. + + + + + Gets the name of the parameter which includes the parameter prefix for this + database. + + Name of the parameter. + + + Gets or sets the name of the assembly that holds the connection library. + The name of the assembly. + + + + Gets or sets the name of the product. + + The name of the product. + + + + Gets or sets the type of the connection. + + The type of the connection. + + + + Gets or sets the type of the command. + + The type of the command. + + + + Gets or sets the type of the parameter. + + The type of the parameter. + + + + Gets the type of the command builder. + + The type of the command builder. + + + Gets the command builder's derive parameters method. + The command builder derive parameters method. + + + + Gets or sets the parameter name prefix. + + The parameter name prefix. + + + + Gets or sets the type of the exception that is thrown when using driver + library. + + The type of the exception. + + + + Gets or sets a value indicating whether parameters are bind by name when using + ADO.NET parameters. + + true if parameters are bind by name; otherwise, false. + + + Gets or sets the type of the database parameters. + The type of the parameter db. + + + + Gets the parameter db type property. + + The parameter db type property. + + + + Gets the parameter is nullable property. + + The parameter is nullable property. + + + + Gets or sets the type of the db binary column. This is a string representation of + Enum element because this information is database driver specific. + + The type of the db binary. + + + Gets the type of the db binary. + The type of the db binary. + + + + Sets the name of the parameter db type property. + + The name of the parameter db type property. + + + + Gets or sets a value indicating whether [use parameter name prefix in parameter collection]. + + + true if [use parameter name prefix in parameter collection]; otherwise, false. + + + + + + + + + + + + + + + Returns a new command object for executing SQL statments/Stored Procedures + against the database. + + An new + + + + Returns a new instance of the providers CommandBuilder class. + + In .NET 1.1 there was no common base class or interface + for command builders, hence the return signature is object to + be portable (but more loosely typed) across .NET 1.1/2.0 + A new Command Builder + + + + Returns a new connection object to communicate with the database. + + A new + + + + Returns a new parameter object for binding values to parameter + placeholders in SQL statements or Stored Procedure variables. + + A new + + + + Shutdowns this instance. + + + + + Connection string used to create connections. + + + + + Registers DB metadata information for given provider name. + + + + + + + Initializes a new instance of the class. + + Name of the db provider. + The connection string. + + + + Returns a new command object for executing SQL statments/Stored Procedures + against the database. + + An new + + + + Returns a new instance of the providers CommandBuilder class. + + A new Command Builder + In .NET 1.1 there was no common base class or interface + for command builders, hence the return signature is object to + be portable (but more loosely typed) across .NET 1.1/2.0 + + + + Returns a new connection object to communicate with the database. + + A new + + + + Returns a new parameter object for binding values to parameter + placeholders in SQL statements or Stored Procedure variables. + + A new + + + + Shutdowns this instance. + + + + + Connection string used to create connections. + + + + + + Gets the metadata. + + The metadata. + + + + Summary description for DbProviderFactory. + + + + + This interface can be implemented by any + class that needs to use the constants contained herein. + + Jeffrey Wescott + James House + + + @deprecated Whether a trigger has misfired is no longer a state, but + rather now identified dynamically by whether the trigger's next fire + time is more than the misfire threshold time in the past. + + + + This class contains utility functions for use in all delegate classes. + + Jeffrey Wescott + + + + Replace the table prefix in a query by replacing any occurrences of + "{0}" with the table prefix. + + The unsubstitued query + The table prefix + The query, with proper table prefix substituted + + + + Obtain a unique key for a given job. + + The job name + The group containing the job + + A unique key + + + + Obtain a unique key for a given trigger. + + The trigger name + The group containing the trigger + A unique key + + + + Base class for database based lock handlers for providing thread/resource locking + in order to protect resources from being altered by multiple threads at the + same time. + + + + + This class extends + to include the query string constants in use by the + class. + + Jeffrey Wescott + + + + An interface for providing thread/resource locking in order to protect + resources from being altered by multiple threads at the same time. + + James House + + + + Grants a lock on the identified resource to the calling thread (blocking + until it is available). + + true if the lock was obtained. + + + + Release the lock on the identified resource if it is held by the calling + thread. + + + + + Determine whether the calling thread owns a lock on the identified + resource. + + + + + Whether this Semaphore implementation requires a database connection for + its lock management operations. + + + + + + + + Interface for Quartz objects that need to know what the table prefix of + the tables used by a ADO.NET JobStore is. + + + + + Initializes a new instance of the class. + + The table prefix. + The SQL. + The default SQL. + The db provider. + + + + Execute the SQL that will lock the proper database row. + + + + + + + + Grants a lock on the identified resource to the calling thread (blocking + until it is available). + + + + + true if the lock was obtained. + + + + Release the lock on the identified resource if it is held by the calling + thread. + + + + + + + Determine whether the calling thread owns a lock on the identified + resource. + + + + + + + + Gets or sets the lock owners. + + The lock owners. + + + + Gets the log. + + The log. + + + + This Semaphore implementation does use the database. + + + + + Gets or sets the table prefix. + + The table prefix. + + + + A FirebirdDelegate specific driver delegate. + + Marko Lahma + + + + This is meant to be an abstract base class for most, if not all, + implementations. Subclasses should override only those methods that need + special handling for the DBMS driver in question. + + Jeffrey Wescott + James House + Marko Lahma (.NET) + + + + This is the base interface for all driver delegate classes. + + +

+ This interface is very similar to the + interface except each method has an additional + parameter. +

+

+ Unless a database driver has some extremely-DB-specific + requirements, any IDriverDelegate implementation classes should extend the + class. +

+
+ Jeffrey Wescott + James House + Marko Lahma (.NET) +
+ + + Update all triggers having one of the two given states, to the given new + state. + + The DB Connection + The new state for the triggers + The first old state to update + The second old state to update + Number of rows updated + + + + Get the names of all of the triggers that have misfired - according to + the given timestamp. + + The DB Connection + The timestamp. + An array of objects + + + + Get the names of all of the triggers in the given state that have + misfired - according to the given timestamp. + + The DB Connection + The state. + The time stamp. + An array of objects + + + + Get the names of all of the triggers in the given group and state that + have misfired - according to the given timestamp. + + The DB Connection + Name of the group. + The state. + The timestamp. + An array of objects + + + + Select all of the triggers for jobs that are requesting recovery. The + returned trigger objects will have unique "recoverXXX" trigger names and + will be in the trigger group. + + + In order to preserve the ordering of the triggers, the fire time will be + set from the ColumnFiredTime column in the TableFiredTriggers + table. The caller is responsible for calling + on each returned trigger. It is also up to the caller to insert the + returned triggers to ensure that they are fired. + + The DB Connection + An array of objects + + + + Delete all fired triggers. + + The DB Connection + The number of rows deleted + + + + Delete all fired triggers of the given instance. + + The DB Connection + The instance id. + The number of rows deleted + + + + Delete all volatile fired triggers. + + The DB Connection + The number of rows deleted + + + + Get the names of all of the triggers that are volatile. + + The DB Connection + An array of see cref="Key" /> objects. + + + + Get the names of all of the jobs that are volatile. + + The DB Connection + An array of objects. + + + + Insert the job detail record. + + The DB Connection + The job to insert. + Number of rows inserted. + + + + Update the job detail record. + + The DB Connection. + The job to update. + Number of rows updated. + + +

+ Get the names of all of the triggers associated with the given job. +

+ +
+ The DB Connection + The job name + The job group +
+ + + Delete all job listeners for the given job. + + The DB Connection + The name of the job + The group containing the job + The number of rows deleted + + + + Delete the job detail record for the given job. + + The DB Connection + the name of the job + Name of the group. + the number of rows deleted + + + + Check whether or not the given job is stateful. + + The DB Connection + The name of the job + The group containing the job + true if the job exists and is stateful, false otherwise + + + + Check whether or not the given job exists. + + The DB Connection + Name of the job. + Name of the group. + true if the job exists, false otherwise + + + + Update the job data map for the given job. + + The DB Connection + The job. + the number of rows updated + + + + Associate a listener with a job. + + The DB Connection + The job to associate with the listener. + The listener to insert. + The number of rows inserted. + + +

+ Get all of the listeners for a given job. +

+ +
+ The DB Connection + The job name whose listeners are wanted + The group containing the job + array of listener names +
+ + + Select the JobDetail object for a given job name / group name. + + The DB Connection + The job name whose listeners are wanted + The group containing the job + The class load helper. + The populated JobDetail object + + + + Select the total number of jobs stored. + + The DB Connection + the total number of jobs stored + + + + Select all of the job group names that are stored. + + The DB Connection. + an array of group names + + + + Select all of the jobs contained in a given group. + + The DB Connection + The group containing the jobs + an array of job names + + + + Insert the base trigger data. + + The DB Connection + The trigger to insert. + The state that the trigger should be stored in. + The job detail. + The number of rows inserted + + + + Insert the simple trigger data. + + The DB Connection + The trigger to insert + The number of rows inserted + + + + Insert the blob trigger data. + + The DB Connection + The trigger to insert + The number of rows inserted + + + + Insert the cron trigger data. + + the DB Connection + The trigger. + the number of rows inserted + + + + Update the base trigger data. + + the DB Connection + The trigger. + The state. + The job detail. + the number of rows updated + + + + Update the simple trigger data. + + the DB Connection + The trigger. + the number of rows updated + + + + Update the cron trigger data. + + the DB Connection + The trigger. + the number of rows updated + + + + Update the blob trigger data. + + the DB Connection + The trigger. + the number of rows updated + + + + Check whether or not a trigger exists. + + the DB Connection + Name of the trigger. + Name of the group. + the number of rows updated + + + + Update the state for a given trigger. + + The DB Connection + The name of the trigger. + The group containing the trigger. + The new state for the trigger. + the number of rows updated + + + + Update the given trigger to the given new state, if it is in the given + old state. + + The DB connection + The name of the trigger. + The group containing the trigger + The new state for the trigger + The old state the trigger must be in + int the number of rows updated + + + + Update the given trigger to the given new state, if it is one of the + given old states. + + The DB connection + The name of the trigger + The group containing the trigger + The new state for the trigger + One of the old state the trigger must be in + One of the old state the trigger must be in + One of the old state the trigger must be in + + int the number of rows updated + + SQLException + + + + Update the all triggers to the given new state, if they are in one of + the given old states AND its next fire time is before the given time. + + The DB connection + The new state for the trigger + One of the old state the trigger must be in + One of the old state the trigger must be in + The time before which the trigger's next fire time must be + int the number of rows updated + + + + Update all triggers in the given group to the given new state, if they + are in one of the given old states. + + The DB connection + The group containing the trigger + The new state for the trigger + One of the old state the trigger must be in + One of the old state the trigger must be in + One of the old state the trigger must be in + The number of rows updated + + + + Update all of the triggers of the given group to the given new state, if + they are in the given old state. + + The DB connection + The group containing the triggers + The new state for the trigger group + The old state the triggers must be in. + int the number of rows updated + + + + Update the states of all triggers associated with the given job. + + The DB Connection + The name of the job. + The group containing the job. + The new state for the triggers. + The number of rows updated + + + + Update the states of any triggers associated with the given job, that + are the given current state. + + The DB Connection + The name of the job + The group containing the job + The new state for the triggers + The old state of the triggers + the number of rows updated + + + + Delete all of the listeners associated with a given trigger. + + The DB Connection + The name of the trigger whose listeners will be deleted + The name of the group containing the trigger + the number of rows deleted + + + + Associate a listener with the given trigger. + + The DB Connectio + The trigger + The name of the listener to associate with the trigger + the number of rows inserted + + + + Select the listeners associated with a given trigger. + + The DB Connection + The name of the trigger + The group containing the trigger + array of trigger listener names + + + + Delete the simple trigger data for a trigger. + + The DB Connection + The name of the trigger + The group containing the trigger + The number of rows deleted + + + + Delete the BLOB trigger data for a trigger. + + The DB Connection + The name of the trigger + The group containing the trigger + The number of rows deleted + + + + Delete the cron trigger data for a trigger. + + The DB Connection + The name of the trigger + The group containing the trigger + the number of rows deleted + + + + Delete the base trigger data for a trigger. + + The DB Connection + The name of the trigger + The group containing the trigger + the number of rows deleted + + + + Select the number of triggers associated with a given job. + + The DB Connection + The name of the job + The group containing the job + the number of triggers for the given job + + + + Select the job to which the trigger is associated. + + The DB Connection + The name of the trigger + The group containing the trigger + The load helper. + + The object associated with the given trigger + + + + + Select the stateful jobs which are referenced by triggers in the given + trigger group. + + The DB Connection + The trigger group. + a List of Keys to jobs. + + + + Select the triggers for a job> + + The DB Connection + The name of the trigger + The group containing the trigger + an array of objects associated with a given job. + + + + Select the triggers for a calendar + + The DB Connection. + Name of the calendar. + + An array of objects associated with a given job. + + + + + Select a trigger. + + The DB Connection. + The name of the trigger. + The group containing the trigger. + The object. + + + + + Select a trigger's JobDataMap. + + The DB Connection. + The name of the trigger. + The group containing the trigger. + The of the Trigger, never null, but possibly empty. + + + + Select a trigger's state value. + + The DB Connection. + The name of the trigger. + The group containing the trigger. + The object. + + + + Select a triggers status (state and next fire time). + + The DB Connection. + The name of the trigger. + The group containing the trigger. + A object, or null + + + + Select the total number of triggers stored. + + The DB Connection. + The total number of triggers stored. + + + + Select all of the trigger group names that are stored. + + The DB Connection. + An array of group names. + + + + Select all of the triggers contained in a given group. + + The DB Connection. + The group containing the triggers. + An array of trigger names. + + + + Select all of the triggers in a given state. + + The DB Connection. + The state the triggers must be in. + An array of trigger s. + + + + Inserts the paused trigger group. + + The conn. + Name of the group. + + + + + Deletes the paused trigger group. + + The conn. + Name of the group. + + + + + Deletes all paused trigger groups. + + The conn. + + + + + Determines whether the specified trigger group is paused. + + The conn. + Name of the group. + + true if trigger group is paused; otherwise, false. + + + + + Selects the paused trigger groups. + + The DB Connection. + + + + + Determines whether given trigger group already exists. + + The conn. + Name of the group. + + true if trigger group exists; otherwise, false. + + + + + Insert a new calendar. + + The DB Connection. + The name for the new calendar. + The calendar. + The number of rows inserted. + + + + Update a calendar. + + The DB Connection. + The name for the new calendar. + The calendar. + The number of rows updated. + + + + Check whether or not a calendar exists. + + The DB Connection. + The name of the calendar. + true if the trigger exists, false otherwise. + + + + Select a calendar. + + The DB Connection. + The name of the calendar. + The Calendar. + + + + Check whether or not a calendar is referenced by any triggers. + + The DB Connection. + The name of the calendar. + true if any triggers reference the calendar, false otherwise + + + + Delete a calendar. + + The DB Connection + The name of the trigger. + The number of rows deleted. + + + + Select the total number of calendars stored. + + The DB Connection + The total number of calendars stored. + + + + Select all of the stored calendars. + + The DB Connection + An array of calendar names. + + + + Select the trigger that will be fired at the given fire time. + + The DB Connection + The time that the trigger will be fired. + + A representing the + trigger that will be fired at the given fire time, or null if no + trigger will be fired at that time + + + + + Insert a fired trigger. + + The DB Connection + The trigger. + The state that the trigger should be stored in. + The job detail. + The number of rows inserted. + + + + Select the states of all fired-trigger records for a given trigger, or + trigger group if trigger name is . + + The DB Connection + Name of the trigger. + Name of the group. + A list of FiredTriggerRecord objects. + + + + Select the states of all fired-trigger records for a given job, or job + group if job name is . + + The DB Connection + Name of the job. + Name of the group. + A List of FiredTriggerRecord objects. + + + + Select the states of all fired-trigger records for a given scheduler + instance. + + The DB Connection + Name of the instance. + A list of FiredTriggerRecord objects. + + + + Delete a fired trigger. + + The DB Connection + The fired trigger entry to delete. + The number of rows deleted. + + + + Get the number instances of the identified job currently executing. + + The DB Connection + Name of the job. + The job group. + + The number instances of the identified job currently executing. + + + + + Insert a scheduler-instance state record. + + The DB Connection + The instance id. + The check in time. + The interval. + The number of inserted rows. + + + + Delete a scheduler-instance state record. + + The DB Connection + The instance id. + The number of deleted rows. + + + + Update a scheduler-instance state record. + + The DB Connection + The instance id. + The check in time. + The number of updated rows. + + + + A List of all current s. +

+ If instanceId is not null, then only the record for the identified + instance will be returned. +

+
+ The DB Connection + The instance id. + +
+ + + Select the next trigger which will fire to fire between the two given timestamps + in ascending order of fire time, and then descending by priority. + + The conn. + highest value of of the triggers (exclusive) + highest value of of the triggers (inclusive) + A (never null, possibly empty) list of the identifiers (Key objects) of the next triggers to be fired. + + + + Select the distinct instance names of all fired-trigger records. + + + This is useful when trying to identify orphaned fired triggers (a + fired trigger without a scheduler state record.) + + The conn. + + + + + Counts the misfired triggers in states. + + The conn. + The state1. + The state2. + The ts. + + + + + Selects the misfired triggers in states. + + The conn. + The state1. + The state2. + The ts. + The count. + The result list. + + + + + Create new StdAdoDelegate instance. + + the logger to use during execution + the prefix of all table names + The instance id. + The db provider. + + + + Create new StdAdoDelegate instance. + + the logger to use during execution + the prefix of all table names + The instance id. + The db provider. + if set to true [use properties]. + + + + Insert the job detail record. + + the DB Connection + the new state for the triggers + the first old state to update + the second old state to update + number of rows updated + + + + Get the names of all of the triggers that have misfired. + + the DB Connection + The ts. + an array of objects + + + + Select all of the triggers in a given state. + + The DB Connection + The state the triggers must be in + an array of trigger s + + + + Get the names of all of the triggers in the given state that have + misfired - according to the given timestamp. + + The DB Connection + The state. + The time stamp. + An array of objects + + + + Get the names of all of the triggers in the given states that have + misfired - according to the given timestamp. No more than count will + be returned. + + The conn. + The state1. + The state2. + The ts. + The most misfired triggers to return, negative for all + + Output parameter. A List of objects. Must not be null + + Whether there are more misfired triggers left to find beyond the given count. + + + + Get the number of triggers in the given states that have + misfired - according to the given timestamp. + + + + + + + + + + Get the names of all of the triggers in the given group and state that + have misfired. + + The DB Connection + Name of the group. + The state. + The timestamp. + an array of objects + + + + Select all of the triggers for jobs that are requesting recovery. The + returned trigger objects will have unique "recoverXXX" trigger names and + will be in the + trigger group. + + + In order to preserve the ordering of the triggers, the fire time will be + set from the ColumnFiredTime column in the TableFiredTriggers + table. The caller is responsible for calling + on each returned trigger. It is also up to the caller to insert the + returned triggers to ensure that they are fired. + + The DB Connection + an array of objects + + + + Delete all fired triggers. + + The DB Connection. + The number of rows deleted. + + + + Delete all fired triggers of the given instance. + + The DB Connection + The instance id. + The number of rows deleted + + + + Insert the job detail record. + + The DB Connection. + The job to insert. + Number of rows inserted. + + + + Gets the db presentation for boolean value. Subclasses can overwrite this behaviour. + + Value to map to database. + + + + + Update the job detail record. + + The DB Connection. + The job to update. + Number of rows updated. + + + + Get the names of all of the triggers associated with the given job. + + The DB Connection. + The name of the job. + The group containing the job. + An array of objects + + + + Delete all job listeners for the given job. + + The DB Connection. + The name of the job. + The group containing the job. + The number of rows deleted. + + + + Delete the job detail record for the given job. + + the DB Connection + the name of the job + the group containing the job + the number of rows deleted + + + + Check whether or not the given job is stateful. + + the DB Connection + the name of the job + the group containing the job + + true if the job exists and is stateful, false otherwise + + + + + Check whether or not the given job exists. + + the DB Connection + the name of the job + the group containing the job + true if the job exists, false otherwise + + + + Update the job data map for the given job. + + The conn. + the job to update + the number of rows updated + + + + Associate a listener with a job. + + The DB Connection. + The job to associate with the listener. + The listener to insert. + The number of rows inserted. + + + + Get all of the listeners for a given job. + + The DB Connection. + The job name whose listeners are wanted. + The group containing the job. + Array of listener names. + + + + Select the JobDetail object for a given job name / group name. + + The DB Connection. + The job name whose listeners are wanted. + The group containing the job. + The load helper. + The populated JobDetail object. + + + build Map from java.util.Properties encoding. + + + + Select the total number of jobs stored. + + The DB Connection. + The total number of jobs stored. + + + + Select all of the job group names that are stored. + + The DB Connection. + An array of group names. + + + + Select all of the jobs contained in a given group. + + The DB Connection. + The group containing the jobs. + An array of job names. + + + + Insert the base trigger data. + + the DB Connection + the trigger to insert + the state that the trigger should be stored in + The job detail. + the number of rows inserted + + + + Insert the simple trigger data. + + The DB Connection. + The trigger to insert. + The number of rows inserted. + + + + Insert the cron trigger data. + + the DB Connection + the trigger to insert + the number of rows inserted + + + + Insert the blob trigger data. + + The DB Connection. + The trigger to insert. + The number of rows inserted. + + + + Update the base trigger data. + + The DB Connection. + The trigger to insert. + The state that the trigger should be stored in. + The job detail. + The number of rows updated. + + + + Update the simple trigger data. + + The DB Connection. + The trigger to insert. + The number of rows updated. + + + + Update the cron trigger data. + + The DB Connection. + The trigger to insert. + The number of rows updated. + + + + Update the blob trigger data. + + The DB Connection. + The trigger to insert. + The number of rows updated. + + + + Check whether or not a trigger exists. + + The DB Connection. + The name of the trigger. + The group containing the trigger. + true if the trigger exists, false otherwise + + + + Update the state for a given trigger. + + The DB Connection. + The name of the trigger. + The group containing the trigger. + The new state for the trigger. + The number of rows updated. + + + + Update the given trigger to the given new state, if it is one of the + given old states. + + The DB connection. + The name of the trigger. + The group containing the trigger. + The new state for the trigger. + One of the old state the trigger must be in. + One of the old state the trigger must be in. + One of the old state the trigger must be in. + The number of rows updated. + + + + Update the all triggers to the given new state, if they are in one of + the given old states AND its next fire time is before the given time. + + The DB connection + The new state for the trigger + One of the old state the trigger must be in + One of the old state the trigger must be in + The time before which the trigger's next fire time must be + int the number of rows updated + + + + Update all triggers in the given group to the given new state, if they + are in one of the given old states. + + The DB connection. + The group containing the trigger. + The new state for the trigger. + One of the old state the trigger must be in. + One of the old state the trigger must be in. + One of the old state the trigger must be in. + The number of rows updated. + + + + Update the given trigger to the given new state, if it is in the given + old state. + + the DB connection + the name of the trigger + the group containing the trigger + the new state for the trigger + the old state the trigger must be in + int the number of rows updated + + + + Update all of the triggers of the given group to the given new state, if + they are in the given old state. + + the DB connection + the group containing the triggers + the new state for the trigger group + the old state the triggers must be in + int the number of rows updated + + + + Update the states of all triggers associated with the given job. + + the DB Connection + the name of the job + the group containing the job + the new state for the triggers + the number of rows updated + + + + Updates the state of the trigger states for job from other. + + The conn. + Name of the job. + Name of the group. + The state. + The old state. + + + + + Delete all of the listeners associated with a given trigger. + + the DB Connection + the name of the trigger whose listeners will be deleted + the name of the group containing the trigger + the number of rows deleted + + + + Associate a listener with the given trigger. + + the DB Connection + the trigger + the name of the listener to associate with the trigger + the number of rows inserted + + + + Select the listeners associated with a given trigger. + + the DB Connection + the name of the trigger + the group containing the trigger + + array of trigger listener names + + + + + Delete the simple trigger data for a trigger. + + the DB Connection + the name of the trigger + the group containing the trigger + the number of rows deleted + + + + Delete the cron trigger data for a trigger. + + the DB Connection + the name of the trigger + the group containing the trigger + the number of rows deleted + + + + Delete the cron trigger data for a trigger. + + the DB Connection + the name of the trigger + the group containing the trigger + the number of rows deleted + + + + Delete the base trigger data for a trigger. + + the DB Connection + the name of the trigger + the group containing the trigger + the number of rows deleted + + + + Select the number of triggers associated with a given job. + + the DB Connection + the name of the job + the group containing the job + the number of triggers for the given job + + + + Select the job to which the trigger is associated. + + the DB Connection + the name of the trigger + the group containing the trigger + The load helper. + The object associated with the given trigger + + + + Select the triggers for a job + + the DB Connection + the name of the trigger + the group containing the trigger + + an array of objects + associated with a given job. + + + + + Select the triggers for a calendar + + The DB Connection. + Name of the calendar. + + An array of objects associated with a given job. + + + + + Selects the stateful jobs of trigger group. + + The database connection. + Name of the group. + + + + + Select a trigger. + + the DB Connection + the name of the trigger + the group containing the trigger + The object + + + + Select a trigger's JobDataMap. + + the DB Connection + the name of the trigger + the group containing the trigger + The of the Trigger, never null, but possibly empty. + + + + Select a trigger's state value. + + the DB Connection + the name of the trigger + the group containing the trigger + The object + + + + Select a trigger status (state and next fire time). + + the DB Connection + the name of the trigger + the group containing the trigger + + a object, or null + + + + + Select the total number of triggers stored. + + the DB Connection + the total number of triggers stored + + + + Select all of the trigger group names that are stored. + + the DB Connection + + an array of group names + + + + + Select all of the triggers contained in a given group. + + the DB Connection + the group containing the triggers + + an array of trigger names + + + + + Inserts the paused trigger group. + + The conn. + Name of the group. + + + + + Deletes the paused trigger group. + + The conn. + Name of the group. + + + + + Deletes all paused trigger groups. + + The conn. + + + + + Determines whether the specified trigger group is paused. + + The conn. + Name of the group. + + true if trigger group is paused; otherwise, false. + + + + + Determines whether given trigger group already exists. + + The conn. + Name of the group. + + true if trigger group exists; otherwise, false. + + + + + Insert a new calendar. + + the DB Connection + The name for the new calendar. + The calendar. + the number of rows inserted + IOException + + + + Update a calendar. + + the DB Connection + The name for the new calendar. + The calendar. + the number of rows updated + IOException + + + + Check whether or not a calendar exists. + + the DB Connection + The name of the calendar. + + true if the trigger exists, false otherwise + + + + + Select a calendar. + + the DB Connection + The name of the calendar. + the Calendar + ClassNotFoundException + IOException + + + + Check whether or not a calendar is referenced by any triggers. + + the DB Connection + The name of the calendar. + + true if any triggers reference the calendar, false otherwise + + + + + Delete a calendar. + + the DB Connection + The name of the trigger. + the number of rows deleted + + + + Select the total number of calendars stored. + + the DB Connection + the total number of calendars stored + + + + Select all of the stored calendars. + + the DB Connection + + an array of calendar names + + + + + Select the trigger that will be fired at the given fire time. + + the DB Connection + the time that the trigger will be fired + + a representing the + trigger that will be fired at the given fire time, or null if no + trigger will be fired at that time + + + + + Select the next trigger which will fire to fire between the two given timestamps + in ascending order of fire time, and then descending by priority. + + The conn. + highest value of of the triggers (exclusive) + highest value of of the triggers (inclusive) + A (never null, possibly empty) list of the identifiers (Key objects) of the next triggers to be fired. + + + + Gets the select next trigger to acquire SQL clause. + This can be overriden for a more performant, result limiting + SQL. For Example SQL Server, MySQL and SQLite support limiting returned rows. + + + + + + Insert a fired trigger. + + the DB Connection + the trigger + the state that the trigger should be stored in + The job. + the number of rows inserted + + + + Select the states of all fired-trigger records for a given trigger, or + trigger group if trigger name is . + + The DB connection. + Name of the trigger. + Name of the group. + a List of objects. + + + + Select the states of all fired-trigger records for a given job, or job + group if job name is . + + The DB connection. + Name of the job. + Name of the group. + a List of objects. + + + + Select the states of all fired-trigger records for a given scheduler + instance. + + The DB Connection + Name of the instance. + A list of FiredTriggerRecord objects. + + + + Select the distinct instance names of all fired-trigger records. + + The conn. + + + This is useful when trying to identify orphaned fired triggers (a + fired trigger without a scheduler state record.) + + + + + Delete a fired trigger. + + the DB Connection + the fired trigger entry to delete + the number of rows deleted + + + + Selects the job execution count. + + The DB connection. + Name of the job. + The job group. + + + + + Delete all volatile fired triggers. + + The DB Connection + The number of rows deleted + + + + Inserts the state of the scheduler. + + The conn. + The instance id. + The check in time. + The interval. + + + + + Deletes the state of the scheduler. + + The database connection. + The instance id. + + + + + Updates the state of the scheduler. + + The database connection. + The instance id. + The check in time. + + + + + A List of all current s. +

+ If instanceId is not null, then only the record for the identified + instance will be returned. +

+
+ The DB Connection + The instance id. + +
+ + + Replace the table prefix in a query by replacing any occurrences of + "{0}" with the table prefix. + + The unsubstitued query + The query, with proper table prefix substituted + + + + Create a serialized version of an Object. + + the object to serialize + Serialized object as byte array. + + + + Remove the transient data from and then create a serialized + version of a and returns the underlying bytes. + + The data. + the serialized data as byte array + + + + serialize + + The data. + + + + + Convert the JobDataMap into a list of properties. + + + + + Convert the JobDataMap into a list of properties. + + + + + This method should be overridden by any delegate subclasses that need + special handling for BLOBs. The default implementation uses standard + ADO.NET operations. + + The data reader, already queued to the correct row. + The column index for the BLOB. + The deserialized object from the DataReader BLOB. + + + + Get the names of all of the triggers that are volatile. + + The DB Connection + An array of objects. + + + + Get the names of all of the jobs that are volatile. + + The DB Connection + An array of objects. + + + + This method should be overridden by any delegate subclasses that need + special handling for BLOBs for job details. + + The result set, already queued to the correct row. + The column index for the BLOB. + The deserialized Object from the ResultSet BLOB. + + + + Selects the paused trigger groups. + + The DB Connection. + + + + + Gets the triggers to acquire limit. + + The triggers to acquire limit. + + + + Initializes a new instance of the class. + + the logger to use during execution + the prefix of all table names + The instance id. + The db provider. + + + + Initializes a new instance of the class. + + The logger. + The table prefix. + The instance id. + The db provider. + if set to true [use properties]. + + + + Creates the SQL for select next trigger to acquire. + + + + + Gets the select next trigger to acquire SQL clause. + Firebird specific version with FIRST functionality + + + + + + Conveys the state of a fired-trigger record. + + James House + + + + Gets or sets the fire instance id. + + The fire instance id. + + + + Gets or sets the fire timestamp. + + The fire timestamp. + + + + Gets or sets a value indicating whether [job is stateful]. + + true if [job is stateful]; otherwise, false. + + + + Gets or sets the job key. + + The job key. + + + + Gets or sets the scheduler instance id. + + The scheduler instance id. + + + + Gets or sets the trigger key. + + The trigger key. + + + + Gets or sets the state of the fire instance. + + The state of the fire instance. + + + + Gets or sets a value indicating whether [job requests recovery]. + + true if [job requests recovery]; otherwise, false. + + + + Gets or sets a value indicating whether [trigger is volatile]. + + true if [trigger is volatile]; otherwise, false. + + + + Gets or sets the priority. + + The priority. + + + + Exception class for when a driver delegate cannot be found for a given + configuration, or lack thereof. + + Jeffrey Wescott + + + + + Base class for exceptions thrown by the Quartz . + + + SchedulerExceptions may contain a reference to another + , which was the underlying cause of the SchedulerException. + + James House + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The MSG. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + Initializes a new instance of the class. + + The MSG. + The error code. + + + + Initializes a new instance of the class. + + The cause. + + + + Initializes a new instance of the class. + + The MSG. + The cause. + + + + Initializes a new instance of the class. + + The MSG. + The cause. + The error code. + + + + Creates and returns a string representation of the current exception. + + + A string representation of the current exception. + + + + + + Return the exception that is the underlying cause of this exception. + This may be used to find more detail about the cause of the error. + + The underlying exception, or if there is not + one. + + + + + Get the error code associated with this exception. + This may be used to find more detail about the cause of the error. + + + One of the ERR_XXX constants defined in this class. + + + +

+ Determine if the specified error code is in the + category of errors. +

+
+
+ +

+ Determine if the specified error code is in the + category of errors. +

+
+
+ + + Determine if the specified error code is in the + category of errors. + + + + + Determine if the specified error code is in the + category of errors. + + + + + Determine if the specified error code is in the + category of errors. + + + + + Determine if the specified error code is in the + category of errors. + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + is meant to be used in an application-server + or other software framework environment that provides + container-managed-transactions. No commit / rollback will be handled by this class. + + + If you need commit / rollback, use + instead. + + Jeffrey Wescott + James House + Srinivas Venkatarangaiah + + + + Contains base functionality for ADO.NET-based JobStore implementations. + + Jeffrey Wescott + James House + Marko Lahma (.NET) + + + + The interface to be implemented by classes that want to provide a + and storage mechanism for the + 's use. + + + Storage of s and s should be keyed + on the combination of their name and group for uniqueness. + + + + + + + + James House + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + Called by the QuartzScheduler to inform the that + the scheduler has started. + + + + + Called by the QuartzScheduler to inform the that + it should free up all of it's resources because the scheduler is + shutting down. + + + + + Store the given and . + + The scheduling context. + The to be stored. + The to be stored. + ObjectAlreadyExistsException + + + + returns true if the given JobGroup + is paused + + + + + + + + returns true if the given TriggerGroup + is paused + + + + + + + + Store the given . + + The context. + The to be stored. + + If , any existing in the + with the same name and group should be + over-written. + + + + + Remove (delete) the with the given + name, and any s that reference + it. + + + If removal of the results in an empty group, the + group should be removed from the 's list of + known group names. + + The context. + The name of the to be removed. + The group name of the to be removed. + + if a with the given name and + group was found and removed from the store. + + + + + Retrieve the for the given + . + + The context. + The name of the to be retrieved. + The group name of the to be retrieved. + + The desired , or null if there is no match. + + + + + Store the given . + + The context. + The to be stored. + If , any existing in + the with the same name and group should + be over-written. + ObjectAlreadyExistsException + + + + Remove (delete) the with the + given name. + + +

+ If removal of the results in an empty group, the + group should be removed from the 's list of + known group names. +

+

+ If removal of the results in an 'orphaned' + that is not 'durable', then the should be deleted + also. +

+
+ The context. + The name of the to be removed. + The group name of the to be removed. + + if a with the given + name and group was found and removed from the store. + +
+ + + Remove (delete) the with the + given name, and store the new given one - which must be associated + with the same job. + + The context. + The name of the to be removed. + The group name of the to be removed. + The new to be stored. + + if a with the given + name and group was found and removed from the store. + + + + + Retrieve the given . + + The context. + The name of the to be retrieved. + The group name of the to be retrieved. + + The desired , or null if there is no + match. + + + + + Store the given . + + The context. + The name. + The to be stored. + If , any existing + in the with the same name and group + should be over-written. + If , any s existing + in the that reference an existing + Calendar with the same name with have their next fire time + re-computed with the new . + ObjectAlreadyExistsException + + + + Remove (delete) the with the + given name. + + + If removal of the would result in + s pointing to non-existent calendars, then a + will be thrown. + + The context. + The name of the to be removed. + + if a with the given name + was found and removed from the store. + + + + + Retrieve the given . + + The context. + The name of the to be retrieved. + + The desired , or null if there is no + match. + + + + + Get the number of s that are + stored in the . + + The context. + + + + + Get the number of s that are + stored in the . + + The context. + + + + + Get the number of s that are + stored in the . + + The context. + + + + + Get the names of all of the s that + have the given group name. +

+ If there are no jobs in the given group name, the result should be a + zero-length array (not ). +

+
+ The CTX. + Name of the group. + +
+ + + Get the names of all of the s + that have the given group name. +

+ If there are no triggers in the given group name, the result should be a + zero-length array (not ). +

+
+
+ + + Get the names of all of the + groups. +

+ If there are no known group names, the result should be a zero-length + array (not ). +

+
+
+ + + Get the names of all of the + groups. +

+ If there are no known group names, the result should be a zero-length + array (not ). +

+
+
+ + + Get the names of all of the s + in the . + +

+ If there are no Calendars in the given group name, the result should be + a zero-length array (not ). +

+
+
+ + + Get all of the Triggers that are associated to the given Job. + + + If there are no matches, a zero-length array should be returned. + + + + + Get the current state of the identified . + + + + + + + + + + Pause the with the given name. + + + + + Pause all of the s in the + given group. + + + The JobStore should "remember" that the group is paused, and impose the + pause on any new triggers that are added to the group while the group is + paused. + + + + + Pause the with the given name - by + pausing all of its current s. + + + + + Pause all of the s in the given + group - by pausing all of their s. +

+ The JobStore should "remember" that the group is paused, and impose the + pause on any new jobs that are added to the group while the group is + paused. +

+
+ + +
+ + + Resume (un-pause) the with the + given name. + +

+ If the missed one or more fire-times, then the + 's misfire instruction will be applied. +

+
+ + +
+ + + Resume (un-pause) all of the s + in the given group. +

+ If any missed one or more fire-times, then the + 's misfire instruction will be applied. +

+
+
+ + + Gets the paused trigger groups. + + The context. + + + + + Resume (un-pause) the with the + given name. +

+ If any of the 's s missed one + or more fire-times, then the 's misfire + instruction will be applied. +

+
+
+ + + Resume (un-pause) all of the s in + the given group. +

+ If any of the s had s that + missed one or more fire-times, then the 's + misfire instruction will be applied. +

+
+
+ + + Pause all triggers - equivalent of calling + on every group. +

+ When is called (to un-pause), trigger misfire + instructions WILL be applied. +

+
+ +
+ + + Resume (un-pause) all triggers - equivalent of calling + on every group. +

+ If any missed one or more fire-times, then the + 's misfire instruction will be applied. +

+ +
+ +
+ + + Get a handle to the next trigger to be fired, and mark it as 'reserved' + by the calling scheduler. + + The context. + If > 0, the JobStore should only return a Trigger + that will fire no later than the time represented in this value as + milliseconds. + + + + + + + Inform the that the scheduler no longer plans to + fire the given , that it had previously acquired + (reserved). + + + + + Inform the that the scheduler is now firing the + given (executing its associated ), + that it had previously acquired (reserved). + + null if the trigger or it's job or calendar no longer exist, or + if the trigger was not successfully put into the 'executing' + state. + + + + + Inform the that the scheduler has completed the + firing of the given (and the execution its + associated ), and that the + in the given should be updated if the + is stateful. + + + + + Supports the persistence. + + + + + + Initializes a new instance of the class. + + + + + Gets the connection and starts a new transaction. + + + + + + Called by the QuartzScheduler before the is + used, in order to give it a chance to Initialize. + + + + + + + + Called by the QuartzScheduler to inform the that + it should free up all of it's resources because the scheduler is + shutting down. + + + + + Removes all volatile data. + + + + + Removes all volatile data. + + + + + Will recover any failed or misfired jobs and clean up the data store as + appropriate. + + + + + Will recover any failed or misfired jobs and clean up the data store as + appropriate. + + + + + Store the given and . + + SchedulingContext + Job to be stored. + Trigger to be stored. + + + + returns true if the given JobGroup + is paused + + + + + + + + returns true if the given TriggerGroup + is paused + + + + + + + + Stores the given . + + + The to be stored. + + If , any existing in the + with the same name & group should be over-written. + + + +

+ Insert or update a job. +

+
+
+ + + Check existence of a given job. + + + + + Store the given . + + + The to be stored. + + If , any existing in + the with the same name & group should + be over-written. + + + if a with the same name/group already + exists, and replaceExisting is set to false. + + + + + Insert or update a trigger. + + + + + Check existence of a given trigger. + + + + + Remove (delete) the with the given + name, and any s that reference + it. + + + + If removal of the results in an empty group, the + group should be removed from the 's list of + known group names. + + + The name of the to be removed. + The group name of the to be removed. + + if a with the given name & + group was found and removed from the store. + + + + + Delete a job and its listeners. + + + + + + + Delete a trigger, its listeners, and its Simple/Cron/BLOB sub-table entry. + + + + + + + + Retrieve the for the given + . + + The name of the to be retrieved. + The group name of the to be retrieved. + The desired , or null if there is no match. + + + + Remove (delete) the with the + given name. + + + +

+ If removal of the results in an empty group, the + group should be removed from the 's list of + known group names. +

+ +

+ If removal of the results in an 'orphaned' + that is not 'durable', then the should be deleted + also. +

+
+ The name of the to be removed. + The group name of the to be removed. + + if a with the given + name & group was found and removed from the store. + +
+ + + + + + Retrieve the given . + + The name of the to be retrieved. + The group name of the to be retrieved. + The desired , or null if there is no match. + + + + Get the current state of the identified . + + + + + + + + + + Gets the state of the trigger. + + The conn. + The CTXT. + Name of the trigger. + Name of the group. + + + + + Store the given . + + The name of the calendar. + The to be stored. + + If , any existing + in the with the same name & group + should be over-written. + + + if a with the same name already + exists, and replaceExisting is set to false. + + + + + Remove (delete) the with the given name. + + + If removal of the would result in + s pointing to non-existent calendars, then a + will be thrown. + + The name of the to be removed. + + if a with the given name + was found and removed from the store. + + + + + Retrieve the given . + + The name of the to be retrieved. + The desired , or null if there is no match. + + + + Get the number of s that are + stored in the . + + + + + Get the number of s that are + stored in the . + + + + + Get the number of s that are + stored in the . + + + + + Get the names of all of the s that + have the given group name. + + + If there are no jobs in the given group name, the result should be a + zero-length array (not ). + + + + + Get the names of all of the s + that have the given group name. + + + If there are no triggers in the given group name, the result should be a + zero-length array (not ). + + + + + Get the names of all of the + groups. + + + + If there are no known group names, the result should be a zero-length + array (not ). + + + + + Get the names of all of the + groups. + + + + If there are no known group names, the result should be a zero-length + array (not ). + + + + + Get the names of all of the s + in the . + + + If there are no Calendars in the given group name, the result should be + a zero-length array (not ). + + + + + Get all of the Triggers that are associated to the given Job. + + + If there are no matches, a zero-length array should be returned. + + + + + Pause the with the given name. + + + + + + Pause the with the given name. + + + + + + Pause the with the given name - by + pausing all of its current s. + + + + + + Pause all of the s in the given + group - by pausing all of their s. + + + + + + Determines if a Trigger for the given job should be blocked. + State can only transition to StatePausedBlocked/StateBlocked from + StatePaused/StateWaiting respectively. + + StatePausedBlocked, StateBlocked, or the currentState. + + + + Resume (un-pause) the with the + given name. + + + If the missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Resume (un-pause) the with the + given name. + + + If any of the 's s missed one + or more fire-times, then the 's misfire + instruction will be applied. + + + + + + Resume (un-pause) all of the s in + the given group. + + + If any of the s had s that + missed one or more fire-times, then the 's + misfire instruction will be applied. + + + + + + Pause all of the s in the given group. + + + + + + Pause all of the s in the given group. + + + + + + Pause all of the s in the + given group. + + + + + + Resume (un-pause) all of the s + in the given group. +

+ If any missed one or more fire-times, then the + 's misfire instruction will be applied. +

+
+ +
+ + + Pause all triggers - equivalent of calling + on every group. +

+ When is called (to un-pause), trigger misfire + instructions WILL be applied. +

+
+ + +
+ + + Resume (un-pause) all triggers - equivalent of calling + on every group. + + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Resume (un-pause) all triggers - equivalent of calling + on every group. +

+ If any missed one or more fire-times, then the + 's misfire instruction will be applied. +

+
+ +
+ + + Get a handle to the next N triggers to be fired, and mark them as 'reserved' + by the calling scheduler. + + + + + + Inform the that the scheduler no longer plans to + fire the given , that it had previously acquired + (reserved). + + + + + Inform the that the scheduler has completed the + firing of the given (and the execution its + associated ), and that the + in the given should be updated if the + is stateful. + + + + + Get a list of all scheduler instances in the cluster that may have failed. + This includes this scheduler if it is checking in for the first time. + + + + + Create dummy objects for fired triggers + that have no scheduler state record. Checkin timestamp and interval are + left as zero on these dummy objects. + + List of all current s + + + + Cleanup the given database connection. This means restoring + any modified auto commit or transaction isolation connection + attributes, and then closing the underlying connection. + + + + This is separate from closeConnection() because the Spring + integration relies on being able to overload closeConnection() and + expects the same connection back that it originally returned + from the datasource. + + + + + + Closes the supplied connection. + + (Optional) + + + + Rollback the supplied connection. + + (Optional) + + JobPersistenceException thrown if a SQLException occurs when the + connection is rolled back + + + + + Commit the supplied connection. + + The CTH. + if set to true opens a new transaction. + JobPersistenceException thrown if a SQLException occurs when the + + + + Execute the given callback in a transaction. Depending on the JobStore, + the surrounding transaction may be assumed to be already present + (managed). + + + This method just forwards to ExecuteInLock() with a null lockName. + + + + + + Execute the given callback having aquired the given lock. + Depending on the JobStore, the surrounding transaction may be + assumed to be already present (managed). This version is just a + handy wrapper around executeInLock that doesn't require a return + value. + + + The name of the lock to aquire, for example + "TRIGGER_ACCESS". If null, then no lock is aquired, but the + lockCallback is still executed in a transaction. + + + + + + Execute the given callback having aquired the given lock. + Depending on the JobStore, the surrounding transaction may be + assumed to be already present (managed). + + + The name of the lock to aquire, for example + "TRIGGER_ACCESS". If null, then no lock is aquired, but the + lockCallback is still executed in a transaction. + + + + + Execute the given callback having optionally aquired the given lock. + This uses the non-managed transaction connection. This version is just a + handy wrapper around executeInNonManagedTXLock that doesn't require a return + value. + + + The name of the lock to aquire, for example + "TRIGGER_ACCESS". If null, then no lock is aquired, but the + lockCallback is still executed in a non-managed transaction. + + + + + + Execute the given callback having optionally aquired the given lock. + This uses the non-managed transaction connection. + + + The name of the lock to aquire, for example + "TRIGGER_ACCESS". If null, then no lock is aquired, but the + lockCallback is still executed in a non-managed transaction. + + + + + Get or set the datasource name. + + + + + Gets the log. + + The log. + + + + Get or sets the prefix that should be pre-pended to all table names. + + + + + Set whether string-only properties will be handled in JobDataMaps. + + + + + Get or set the instance Id of the Scheduler (must be unique within a cluster). + + + + + Get or set the instance Id of the Scheduler (must be unique within this server instance). + + + + + Get or set whether this instance is part of a cluster. + + + + + Get or set the frequency at which this instance "checks-in" + with the other instances of the cluster. -- Affects the rate of + detecting failed instances. + + + + + Get or set the maximum number of misfired triggers that the misfire handling + thread will try to recover at one time (within one transaction). The + default is 20. + + + + + Gets or sets the database retry interval. + + The db retry interval. + + + + Get or set whether this instance should use database-based thread + synchronization. + + + + + Whether or not to obtain locks when inserting new jobs/triggers. + Defaults to , which is safest - some db's (such as + MS SQLServer) seem to require this to avoid deadlocks under high load, + while others seem to do fine without. + + + Setting this property to will provide a + significant performance increase during the addition of new jobs + and triggers. + + + + + The time span by which a trigger must have missed its + next-fire-time, in order for it to be considered "misfired" and thus + have its misfire instruction applied. + + + + + Don't call set autocommit(false) on connections obtained from the + DataSource. This can be helpfull in a few situations, such as if you + have a driver that complains if it is called when it is already off. + + + + + Set the transaction isolation level of DB connections to sequential. + + + + + Whether or not the query and update to acquire a Trigger for firing + should be performed after obtaining an explicit DB lock (to avoid + possible race conditions on the trigger's db row). This is + is considered unnecessary for most databases (due to the nature of + the SQL update that is performed), and therefore a superfluous performance hit. + + + + + Get or set the ADO.NET driver delegate class name. + + + + + set the SQL statement to use to select and lock a row in the "locks" + table. + + + + + + Get whether the threads spawned by this JobStore should be + marked as daemon. Possible threads include the + and the . + + + + + + Get whether to check to see if there are Triggers that have misfired + before actually acquiring the lock to recover them. This should be + set to false if the majority of the time, there are are misfired + Triggers. + + + + + + Get the driver delegate for DB operations. + + + + + Get whether String-only properties will be handled in JobDataMaps. + + + + + Indicates whether this job store supports persistence. + + + + + + + Implement this interface to provide the code to execute within + the a transaction template that has no return value. + + + + + + Implement this interface to provide the code to execute within + the a transaction template. If no return value is required, execute + should just return null. + + + + + + + + An interface for classes wishing to provide the service of loading classes + and resources within the scheduler... + + James House + + + + Called to give the ClassLoadHelper a chance to Initialize itself, + including the oportunity to "steal" the class loader off of the calling + thread, which is the thread that is initializing Quartz. + + + + + Return the class with the given name. + + + + + Finds a resource with a given name. This method returns null if no + resource with this name is found. + + name of the desired resource + + a java.net.URL object + + + + + Finds a resource with a given name. This method returns null if no + resource with this name is found. + + name of the desired resource + + a java.io.InputStream object + + + + + Helper class for returning the composite result of trying + to recover misfired jobs. + + + + + Initializes a new instance of the class. + + if set to true [has more misfired triggers]. + The processed misfired trigger count. + + + + + Gets a value indicating whether this instance has more misfired triggers. + + + true if this instance has more misfired triggers; otherwise, false. + + + + + Gets the processed misfired trigger count. + + The processed misfired trigger count. + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + + + Called by the QuartzScheduler to inform the that + it should free up all of it's resources because the scheduler is + shutting down. + + + + + Gets the non managed TX connection. + + + + + + Execute the given callback having optionally aquired the given lock. + Because CMT assumes that the connection is already part of a managed + transaction, it does not attempt to commit or rollback the + enclosing transaction. + + + + + + + The name of the lock to aquire, for example + "TRIGGER_ACCESS". If null, then no lock is aquired, but the + txCallback is still executed in a transaction. + + Callback to execute. + + + + Utility class to keep track of both active transaction + and connection. + + + + + Initializes a new instance of the class. + + The connection. + The transaction. + + + + Gets or sets the connection. + + The connection. + + + + Gets or sets the transaction. + + The transaction. + + + + is meant to be used in a standalone environment. + Both commit and rollback will be handled by this class. + + Jeffrey Wescott + James House + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + + + For , the non-managed TX connection is just + the normal connection because it is not CMT. + + + + + + Execute the given callback having optionally aquired the given lock. + For , because it manages its own transactions + and only has the one datasource, this is the same behavior as + . + + + The name of the lock to aquire, for example "TRIGGER_ACCESS". + If null, then no lock is aquired, but the lockCallback is still + executed in a transaction. + + Callback to execute. + + + + + + + + + Exception class for when there is a failure obtaining or releasing a + resource lock. + + + James House + + + + An exception that is thrown to indicate that there has been a failure in the + scheduler's underlying persistence mechanism. + + James House + + + +

+ Create a with the given message. +

+
+
+ + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + +

+ Create a with the given message + and error code. +

+
+
+ +

+ Create a with the given message + and cause. +

+
+
+ +

+ Create a with the given message, + cause and error code. +

+
+
+ + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + This is a driver delegate for the MySQL ADO.NET driver. + + Marko Lahma + + + + Initializes a new instance of the class. + + the logger to use during execution + the prefix of all table names + The instance id. + The db provider. + + + + Initializes a new instance of the class. + + The logger. + The table prefix. + The instance id. + The db provider. + if set to true [use properties]. + + + + Gets the select next trigger to acquire SQL clause. + MySQL version with LIMIT support. + + + + + + Exception class for when a driver delegate cannot be found for a given + configuration, or lack thereof. + + Jeffrey Wescott + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + This is a driver delegate for the Oracle database. + + Marko Lahma + + + + Initializes a new instance of the class. + + the logger to use during execution + the prefix of all table names + The instance id. + The db provider. + + + + Initializes a new instance of the class. + + The logger. + The table prefix. + The instance id. + The db provider. + if set to true [use properties]. + + + + Creates the SQL for select next trigger to acquire. + + + + + Gets the select next trigger to acquire SQL clause. + Oracle version with rownum support. + + + + + + This is a driver delegate for the PostgreSQL ADO.NET driver. + + Marko Lahma + + + + Initializes a new instance of the class. + + The log. + The table prefix. + The instance id. + The db provider. + + + + Initializes a new instance of the class. + + The log. + The table prefix. + The instance id. + The db provider. + if set to true [use properties]. + + + + Gets the select next trigger to acquire SQL clause. + PostgreSQL version with LIMIT support. + + + + + + Conveys a scheduler-instance state record. + + James House + + + + Gets or sets the checkin interval. + + The checkin interval. + + + + Gets or sets the checkin timestamp. + + The checkin timestamp. + + + + Gets or sets the scheduler instance id. + + The scheduler instance id. + + + + Internal in-memory lock handler for providing thread/resource locking in + order to protect resources from being altered by multiple threads at the + same time. + + James House + + + + Grants a lock on the identified resource to the calling thread (blocking + until it is available). + + True if the lock was obtained. + + + Release the lock on the identified resource if it is held by the calling + thread. + + + + + Determine whether the calling thread owns a lock on the identified + resource. + + + + + Gets the thread locks. + + The thread locks. + + + + Whether this Semaphore implementation requires a database connection for + its lock management operations. + + + + + + + + + This is a driver delegate for the SQLiteDelegate ADO.NET driver. + + Marko Lahma + + + + Initializes a new instance of the class. + + the logger to use during execution + the prefix of all table names + The instance id. + The db provider. + + + + Initializes a new instance of the class. + + The logger. + The table prefix. + The instance id. + The db provider. + if set to true [use properties]. + + + + Gets the select next trigger to acquire SQL clause. + SQLite version with LIMIT support. + + + + + + A SQL Server specific driver delegate. + + Marko Lahma + + + + Initializes a new instance of the class. + + the logger to use during execution + the prefix of all table names + The instance id. + The db provider. + + + + Initializes a new instance of the class. + + The logger. + The table prefix. + The instance id. + The db provider. + if set to true [use properties]. + + + + Creates the SQL for select next trigger to acquire. + + + + + Gets the select next trigger to acquire SQL clause. + SQL Server specific version with TOP functionality + + + + + + Internal database based lock handler for providing thread/resource locking + in order to protect resources from being altered by multiple threads at the + same time. + + James House + + + + Initializes a new instance of the class. + + The table prefix. + The select with lock SQL. + + + + Execute the SQL select for update that will lock the proper database row. + + + + Provide thread/resource locking in order to protect + resources from being altered by multiple threads at the same time using + a db row update. + + + Note: This Semaphore implementation is useful for databases that do + not support row locking via "SELECT FOR UPDATE" type syntax, for example + Microsoft SQLServer (MSSQL). + + + + + Initializes a new instance of the class. + + + + + Execute the SQL that will lock the proper database row. + + + + + + + + This implementation of the Calendar excludes a set of days of the year. You + may use it to exclude bank holidays which are on the same date every year. + + + + Juergen Donnerstag + + + + This implementation of the Calendar may be used (you don't have to) as a + base class for more sophisticated one's. It merely implements the base + functionality required by each Calendar. + + + Regarded as base functionality is the treatment of base calendars. Base + calendar allow you to chain (stack) as much calendars as you may need. For + example to exclude weekends you may use WeeklyCalendar. In order to exclude + holidays as well you may define a WeeklyCalendar instance to be the base + calendar for HolidayCalendar instance. + + + Juergen Donnerstag + James House + + + + An interface to be implemented by objects that define spaces of time during + which an associated may fire. + + + Calendars do not define actual fire times, but rather are used to limit a + from firing on its normal schedule if necessary. Most + Calendars include all times by default and allow the user to specify times to + exclude. As such, it is often useful to think of Calendars as being used to + exclude a block of time, as opposed to include + a block of time. (i.e. the schedule "fire every five minutes except on Sundays" could be + implemented with a and a which excludes Sundays) + + James House + Juergen Donnerstag + + + + Determine whether the given UTC time is 'included' by the + Calendar. + + + + + Determine the next UTC time that is 'included' by the + Calendar after the given UTC time. + + + + + Gets or sets a description for the instance - may be + useful for remembering/displaying the purpose of the calendar, though + the description has no meaning to Quartz. + + + + + Set a new base calendar or remove the existing one. + Get the base calendar. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The base calendar. + + + + Initializes a new instance of the class. + + The time zone. + + + + Initializes a new instance of the class. + + The base calendar. + The time zone. + + + + checks whether two arrays have + the same length and + for any given place there are equal elements + in both arrays + + + + + + Get the base calendar. Will be null, if not set. + + + + + Check if date/time represented by timeStamp is included. If included + return true. The implementation of BaseCalendar simply calls the base + calendars IsTimeIncluded() method if base calendar is set. + + + + + + Determine the next UTC time (in milliseconds) that is 'included' by the + Calendar after the given time. Return the original value if timeStamp is + included. Return 0 if all days are excluded. + + + + + + Gets or sets the time zone. + + The time zone. + + + + Gets or sets the description given to the instance by + its creator (if any). + + + + + Set a new base calendar or remove the existing one + + + + + + Constructor + + + + + Constructor + + The base calendar. + + + + Return true, if day is defined to be exluded. + + + + + Redefine a certain day to be excluded (true) or included (false). + + + + + Determine whether the given UTC time (in milliseconds) is 'included' by the + Calendar. +

+ Note that this Calendar is only has full-day precision. +

+
+
+ + + Determine the next UTC time (in milliseconds) that is 'included' by the + Calendar after the given time. Return the original value if timeStampUtc is + included. Return 0 if all days are excluded. +

+ Note that this Calendar is only has full-day precision. +

+
+
+ + + Get or the array which defines the exclude-value of each day of month. + Setting will redefine the array of days excluded. The array must of size greater or + equal 31. + + + + + This implementation of the Calendar excludes the set of times expressed by a + given CronExpression. + + + For example, you could use this calendar to exclude all but business hours (8AM - 5PM) every + day using the expression "* * 0-7,18-23 ? * *". +

+ It is important to remember that the cron expression here describes a set of + times to be excluded from firing. Whereas the cron expression in + CronTrigger describes a set of times that can + be included for firing. Thus, if a has a + given cron expression and is associated with a with + the same expression, the calendar will exclude all the times the + trigger includes, and they will cancel each other out. +

+
+ Aaron Craven +
+ + + Initializes a new instance of the class. + + a String representation of the desired cron expression + + + + Create a with the given cron expression and + . + + + the base calendar for this calendar instance + see BaseCalendar for more information on base + calendar functionality + + a String representation of the desired cron expression + + + + Create a with the given cron expression and + . + + + the base calendar for this calendar instance + see BaseCalendar for more information on base + calendar functionality + + a String representation of the desired cron expression + + + + + Determine whether the given time is 'included' by the + Calendar. + + the time to test + a boolean indicating whether the specified time is 'included' by the CronCalendar + + + + Determine the next time that is 'included' by the + Calendar after the given time. Return the original value if timeStamp is + included. Return 0 if all days are excluded. + + + + + + + Returns a that represents the current . + + + A that represents the current . + + + + + Sets the cron expression for the calendar to a new value. + + The expression. + + + + Returns the object representation of the cron expression that defines the + dates and times this calendar excludes. + + + + + This implementation of the Calendar excludes (or includes - see below) a + specified time range each day. + + + For example, you could use this calendar to + exclude business hours (8AM - 5PM) every day. Each + only allows a single time range to be specified, and that time range may not + * cross daily boundaries (i.e. you cannot specify a time range from 8PM - 5AM). + If the property is (default), + the time range defines a range of times in which triggers are not allowed to + * fire. If is , the time range + is inverted: that is, all times outside the defined time range + are excluded. +

+ Note when using , it behaves on the same principals + as, for example, WeeklyCalendar defines a set of days that are + excluded every week. Likewise, defines a + set of times that are excluded every day. +

+
+ Mike Funk + Aaron Craven +
+ + + Create a with a time range defined by the + specified strings and no baseCalendar. + and + must be in the format "HH:MM[:SS[:mmm]]" where: +
    +
  • + HH is the hour of the specified time. The hour should be + specified using military (24-hour) time and must be in the range + 0 to 23. +
  • +
  • + MM is the minute of the specified time and must be in the range + 0 to 59. +
  • +
  • + SS is the second of the specified time and must be in the range + 0 to 59. +
  • +
  • + mmm is the millisecond of the specified time and must be in the + range 0 to 999. +
  • +
  • items enclosed in brackets ('[', ']') are optional.
  • +
  • + The time range starting time must be before the time range ending + time. Note this means that a time range may not cross daily + boundaries (10PM - 2AM) +
  • +
+
+
+ + + Create a with a time range defined by the + specified strings and the specified baseCalendar. + and + must be in the format "HH:MM[:SS[:mmm]]" where: +
    +
  • + HH is the hour of the specified time. The hour should be + specified using military (24-hour) time and must be in the range + 0 to 23. +
  • +
  • + MM is the minute of the specified time and must be in the range + 0 to 59. +
  • +
  • + SS is the second of the specified time and must be in the range + 0 to 59. +
  • +
  • + mmm is the millisecond of the specified time and must be in the + range 0 to 999. +
  • +
  • + items enclosed in brackets ('[', ']') are optional. +
  • +
  • + The time range starting time must be before the time range ending + time. Note this means that a time range may not cross daily + boundaries (10PM - 2AM) +
  • +
+
+ The base calendar for this calendar instance see BaseCalendar for more + information on base calendar functionality. +
+ + + Create a with a time range defined by the + specified values and no baseCalendar. Values are subject to + the following validations: +
    +
  • + Hours must be in the range 0-23 and are expressed using military + (24-hour) time. +
  • +
  • Minutes must be in the range 0-59
  • +
  • Seconds must be in the range 0-59
  • +
  • Milliseconds must be in the range 0-999
  • +
  • + The time range starting time must be before the time range ending + time. Note this means that a time range may not cross daily + boundaries (10PM - 2AM) +
  • +
+
+ The range starting hour of day. + The range starting minute. + The range starting second. + The range starting millis. + The range ending hour of day. + The range ending minute. + The range ending second. + The range ending millis. +
+ + + Create a with a time range defined by the + specified values and the specified . Values are + subject to the following validations: +
    +
  • + Hours must be in the range 0-23 and are expressed using military + (24-hour) time. +
  • +
  • Minutes must be in the range 0-59
  • +
  • Seconds must be in the range 0-59
  • +
  • Milliseconds must be in the range 0-999
  • +
  • + The time range starting time must be before the time range ending + time. Note this means that a time range may not cross daily + boundaries (10PM - 2AM) +
  • +
+
+ The range starting hour of day. + The range starting minute. + The range starting second. + The range starting millis. + The range ending hour of day. + The range ending minute. + The range ending second. + The range ending millis. +
+ + + Create a with a time range defined by the + specified s and no + baseCalendar. The Calendars are subject to the following + considerations: +
    +
  • + Only the time-of-day fields of the specified Calendars will be + used (the date fields will be ignored) +
  • +
  • + The starting time must be before the ending time of the defined + time range. Note this means that a time range may not cross + daily boundaries (10PM - 2AM). (because only time fields are + are used, it is possible for two Calendars to represent a valid + time range and + rangeStartingCalendar.after(rangeEndingCalendar) == true) + +
  • +
+
+ The range starting calendar. + The range ending calendar. +
+ + + Create a with a time range defined by the + specified s and the specified + . The Calendars are subject to the following + considerations: +
    +
  • + Only the time-of-day fields of the specified Calendars will be + used (the date fields will be ignored) +
  • +
  • + The starting time must be before the ending time of the defined + time range. Note this means that a time range may not cross + daily boundaries (10PM - 2AM). (because only time fields are + are used, it is possible for two Calendars to represent a valid + time range and + rangeStartingCalendarUtc > rangeEndingCalendarUtc == true) +
  • +
+
+ The range starting calendar. + The range ending calendar. +
+ + + Create a with a time range defined by the + specified values and no baseCalendar. The values are + subject to the following considerations: +
    +
  • + Only the time-of-day portion of the specified values will be + used +
  • +
  • + The starting time must be before the ending time of the defined + time range. Note this means that a time range may not cross + daily boundaries (10PM - 2AM). (because only time value are + are used, it is possible for the two values to represent a valid + time range and rangeStartingTime > rangeEndingTime) +
  • +
+
+ The range starting time in millis. + The range ending time in millis. +
+ + + Create a with a time range defined by the + specified values and the specified . The values + are subject to the following considerations: +
    +
  • + Only the time-of-day portion of the specified values will be + used +
  • +
  • + The starting time must be before the ending time of the defined + time range. Note this means that a time range may not cross + daily boundaries (10PM - 2AM). (because only time value are + are used, it is possible for the two values to represent a valid + time range and rangeStartingTime > rangeEndingTime) +
  • +
+
+ The range starting time in millis. + The range ending time in millis. +
+ + + Determine whether the given time is 'included' by the + Calendar. + + + + + + + Determine the next time (in milliseconds) that is 'included' by the + Calendar after the given time. Return the original value if timeStamp is + included. Return 0 if all days are excluded. + + + + + + + + Returns the start time of the time range of the day + specified in . + + + a DateTime representing the start time of the + time range for the specified date. + + + + + Returns the end time of the time range of the day + specified in + + + A DateTime representing the end time of the + time range for the specified date. + + + + + Returns a that represents the current . + + + A that represents the current . + + + + + Sets the time range for the to the times + represented in the specified Strings. + + The range starting time string. + The range ending time string. + + + + Sets the time range for the to the times + represented in the specified values. + + The range starting hour of day. + The range starting minute. + The range starting second. + The range starting millis. + The range ending hour of day. + The range ending minute. + The range ending second. + The range ending millis. + + + + Sets the time range for the to the times + represented in the specified s. + + The range starting calendar. + The range ending calendar. + + + + Sets the time range for the to the times + represented in the specified values. + + The range starting time. + The range ending time. + + + + Gets the start of day, practically zeroes time part. + + The time. + + + + + Gets the end of day, pratically sets time parts to maximum allowed values. + + The time. + + + + + Checks the specified values for validity as a set of time values. + + The hour of day. + The minute. + The second. + The millis. + + + + Indicates whether the time range represents an inverted time range (see + class description). + + true if invert time range; otherwise, false. + + + + This implementation of the Calendar stores a list of holidays (full days + that are excluded from scheduling). + + + The implementation DOES take the year into consideration, so if you want to + exclude July 4th for the next 10 years, you need to add 10 entries to the + exclude list. + + Sharada Jambula + Juergen Donnerstag + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The base calendar. + + + + Determine whether the given time (in milliseconds) is 'included' by the + Calendar. +

+ Note that this Calendar is only has full-day precision. +

+
+
+ + + Determine the next time (in milliseconds) that is 'included' by the + Calendar after the given time. +

+ Note that this Calendar is only has full-day precision. +

+
+
+ + + Add the given Date to the list of excluded days. Only the month, day and + year of the returned dates are significant. + + + + + Removes the excluded date. + + The date to remove. + + + + Returns a of Dates representing the excluded + days. Only the month, day and year of the returned dates are + significant. + + + + + This implementation of the Calendar excludes a set of days of the month. You + may use it to exclude every 1. of each month for example. But you may define + any day of a month. + + + + Juergen Donnerstag + + + + Initializes a new instance of the class. + + + + + Constructor + + The base calendar. + + + + Initialize internal variables + + + + + Return true, if mday is defined to be exluded. + + + + + Redefine a certain day of the month to be excluded (true) or included + (false). + + + + + Check if all days are excluded. That is no day is included. + + boolean + + + + + Determine whether the given time (in milliseconds) is 'included' by the + Calendar. +

+ Note that this Calendar is only has full-day precision. +

+
+
+ + + Determine the next time (in milliseconds) that is 'included' by the + Calendar after the given time. Return the original value if timeStamp is + included. Return DateTime.MinValue if all days are excluded. +

+ Note that this Calendar is only has full-day precision. +

+
+
+ + + Get or set the array which defines the exclude-value of each day of month + Setting will redefine the array of days excluded. The array must of size greater or + equal 31. + + + + + This implementation of the Calendar excludes a set of days of the week. You + may use it to exclude weekends for example. But you may define any day of + the week. + + + + Juergen Donnerstag + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The base calendar. + + + + Initialize internal variables + + + + + Return true, if wday is defined to be exluded. E. g. + saturday and sunday. + + + + + Redefine a certain day of the week to be excluded (true) or included + (false). Use java.util.Calendar's constants like MONDAY to determine the + wday. + + + + + Check if all week ays are excluded. That is no day is included. + + + + + Determine whether the given time (in milliseconds) is 'included' by the + Calendar. +

+ Note that this Calendar is only has full-day precision. +

+
+
+ + + Determine the next time (in milliseconds) that is 'included' by the + Calendar after the given time. Return the original value if timeStamp is + included. Return DateTime.MinValue if all days are excluded. +

+ Note that this Calendar is only has full-day precision. +

+
+
+ + + Get the array with the week days. + Setting will redefine the array of days excluded. The array must of size greater or + equal 8. java.util.Calendar's constants like MONDAY should be used as + index. A value of true is regarded as: exclude it. + + + + + A singleton implementation of . + + + Here are some examples of using this class: +

+ To create a scheduler that does not write anything to the database (is not + persistent), you can call : +

+
+            DirectSchedulerFactory.Instance.CreateVolatileScheduler(10); // 10 threads 
+            // don't forget to start the scheduler: 
+            DirectSchedulerFactory.Instance.GetScheduler().Start();
+            
+

+ Several create methods are provided for convenience. All create methods + eventually end up calling the create method with all the parameters: +

+
+            public void createScheduler(String schedulerName, string schedulerInstanceId, ThreadPool threadPool, JobStore jobStore, string rmiRegistryHost, int rmiRegistryPort)
+            
+

+ Here is an example of using this method: +

+
+            // create the thread pool 
+            SimpleThreadPool threadPool = new SimpleThreadPool(maxThreads, Thread.NORM_PRIORITY); 
+            threadPool.Initialize(); 
+            // create the job store 
+            JobStore jobStore = new RAMJobStore(); 
+            jobStore.Initialize();
+            
+            DirectSchedulerFactory.Instance.CreateScheduler("My Quartz Scheduler", "My Instance", threadPool, jobStore, "localhost", 1099); 
+            // don't forget to start the scheduler: 
+            DirectSchedulerFactory.Instance.GetScheduler("My Quartz Scheduler", "My Instance").start();
+            
+
> + Mohammad Rezaei + James House + + +
+ + + Provides a mechanism for obtaining client-usable handles to + instances. + + + + James House + + + + Returns a client-usable handle to a . + + + + + Returns a handle to the Scheduler with the given name, if it exists. + + + + + Returns handles to all known Schedulers (made by any SchedulerFactory + within this app domain.). + + + + + Initializes a new instance of the class. + + + + + Creates an in memory job store () + The thread priority is set to Thread.NORM_PRIORITY + + The number of threads in the thread pool + + + + Creates a proxy to a remote scheduler. This scheduler can be retrieved + via . + + SchedulerException + + + + Same as , + with the addition of specifying the scheduler name and instance ID. This + scheduler can only be retrieved via . + + The name for the scheduler. + The instance ID for the scheduler. + + SchedulerException + + + + Creates a scheduler using the specified thread pool and job store. This + scheduler can be retrieved via DirectSchedulerFactory#GetScheduler() + + + The thread pool for executing jobs + + + The type of job store + + SchedulerException + if initialization failed + + + + + Same as DirectSchedulerFactory#createScheduler(ThreadPool threadPool, JobStore jobStore), + with the addition of specifying the scheduler name and instance ID. This + scheduler can only be retrieved via DirectSchedulerFactory#getScheduler(String) + + The name for the scheduler. + The instance ID for the scheduler. + The thread pool for executing jobs + The type of job store + + + + Creates a scheduler using the specified thread pool and job store and + binds it to RMI. + + The name for the scheduler. + The instance ID for the scheduler. + The thread pool for executing jobs + The type of job store + The idle wait time. You can specify "-1" for + the default value, which is currently 30000 ms. + The db failure retry interval. + + + + Creates a scheduler using the specified thread pool and job store and + binds it to RMI. + + The name for the scheduler. + The instance ID for the scheduler. + The thread pool for executing jobs + The type of job store + + The idle wait time. You can specify TimeSpan.Zero for + the default value, which is currently 30000 ms. + The db failure retry interval. + + + + Returns a handle to the Scheduler produced by this factory. +

+ you must call createRemoteScheduler or createScheduler methods before + calling getScheduler() +

+
+ + SchedulerException +
+ + + Returns a handle to the Scheduler with the given name, if it exists. + + + + + Gets the log. + + The log. + + + + Gets the instance. + + The instance. + + +

+ Returns a handle to all known Schedulers (made by any + StdSchedulerFactory instance.). +

+
+
+ + + An implementation of the interface that remotely + proxies all method calls to the equivalent call on a given + instance, via remoting or similar technology. + + + + + James House + + + + This is the main interface of a Quartz Scheduler. + + + + A maintains a registry of + s and s. Once + registered, the is responsible for executing + s when their associated s + fire (when their scheduled time arrives). + + + instances are produced by a + . A scheduler that has already been + created/initialized can be found and used through the same factory that + produced it. After a has been created, it is in + "stand-by" mode, and must have its method + called before it will fire any s. + + + s are to be created by the 'client program', by + defining a class that implements the interface. + objects are then created (also by the client) to + define a individual instances of the . + instances can then be registered with the + via the %IScheduler.ScheduleJob(JobDetail, + Trigger)% or %IScheduler.AddJob(JobDetail, bool)% method. + + + s can then be defined to fire individual + instances based on given schedules. + s are most useful for one-time firings, or + firing at an exact moment in time, with N repeats with a given delay between + them. s allow scheduling based on time of day, + day of week, day of month, and month of year. + + + s and s have a name and + group associated with them, which should uniquely identify them within a single + . The 'group' feature may be useful for creating + logical groupings or categorizations of s and + s. If you don't have need for assigning a group to a + given s of s, then you can use + the constant defined on + this interface. + + + Stored s can also be 'manually' triggered through the + use of the %IScheduler.TriggerJob(string, string)% function. + + + Client programs may also be interested in the 'listener' interfaces that are + available from Quartz. The interface provides + notifications of executions. The + interface provides notifications of + firings. The + interface provides notifications of events and + errors. + + + The setup/configuration of a instance is very + customizable. Please consult the documentation distributed with Quartz. + + + + + + + + + + + + returns true if the given JobGroup + is paused + + + + + + + returns true if the given TriggerGroup + is paused + + + + + + + Get a object describiing the settings + and capabilities of the scheduler instance. + + + Note that the data returned is an 'instantaneous' snap-shot, and that as + soon as it's returned, the meta data values may be different. + + + + + Return a list of objects that + represent all currently executing Jobs in this Scheduler instance. + + +

+ This method is not cluster aware. That is, it will only return Jobs + currently executing in this Scheduler instance, not across the entire + cluster. +

+

+ Note that the list returned is an 'instantaneous' snap-shot, and that as + soon as it's returned, the true list of executing jobs may be different. + Also please read the doc associated with - + especially if you're using remoting. +

+
+ +
+ + + Get the names of all groups that are paused. + + + + + Get the global that has + the given name. + + Global job listener's name + + + + + Get the global that + has the given name. + + Global trigger listener's name + + + + + Starts the 's threads that fire s. + When a scheduler is first created it is in "stand-by" mode, and will not + fire triggers. The scheduler can also be put into stand-by mode by + calling the method. + + + The misfire/recovery process will be started, if it is the initial call + to this method on this scheduler instance. + + + + + + + + Calls after the indicated delay. + (This call does not block). This can be useful within applications that + have initializers that create the scheduler immediately, before the + resources needed by the executing jobs have been fully initialized. + + + + + + + + Temporarily halts the 's firing of s. + + +

+ When is called (to bring the scheduler out of + stand-by mode), trigger misfire instructions will NOT be applied + during the execution of the method - any misfires + will be detected immediately afterward (by the 's + normal process). +

+

+ The scheduler is not destroyed, and can be re-started at any time. +

+
+ + +
+ + + Halts the 's firing of s, + and cleans up all resources associated with the Scheduler. Equivalent to + . + + + The scheduler cannot be re-started. + + + + + + Halts the 's firing of s, + and cleans up all resources associated with the Scheduler. + + + The scheduler cannot be re-started. + + + if the scheduler will not allow this method + to return until all currently executing jobs have completed. + + + + + + Add the given to the + Scheduler, and associate the given with + it. + + + If the given Trigger does not reference any , then it + will be set to reference the Job passed with it into this method. + + + + + Schedule the given with the + identified by the 's settings. + + + + + Remove the indicated from the scheduler. + + + + + Remove (delete) the with the + given name, and store the new given one - which must be associated + with the same job (the new trigger must have the job name & group specified) + - however, the new trigger need not have the same name as the old trigger. + + + The name of the to be replaced. + + + The group name of the to be replaced. + + + The new to be stored. + + + if a with the given + name and group was not found and removed from the store, otherwise + the first fire time of the newly scheduled trigger. + + + + + Add the given to the Scheduler - with no associated + . The will be 'dormant' until + it is scheduled with a , or + is called for it. + + + The must by definition be 'durable', if it is not, + SchedulerException will be thrown. + + + + + Delete the identified from the Scheduler - and any + associated s. + + true if the Job was found and deleted. + + + + Trigger the identified + (Execute it now) - the generated trigger will be non-volatile. + + + + + Trigger the identified + (Execute it now) - the generated trigger will be volatile. + + + + + Trigger the identified + (Execute it now) - the generated trigger will be non-volatile. + + the name of the Job to trigger + the group name of the Job to trigger + + the (possibly ) JobDataMap to be + associated with the trigger that fires the job immediately. + + + + + Trigger the identified + (Execute it now) - the generated trigger will be volatile. + + the name of the Job to trigger + the group name of the Job to trigger + + the (possibly ) JobDataMap to be + associated with the trigger that fires the job immediately. + + + + + Pause the with the given + name - by pausing all of its current s. + + + + + Pause all of the s in the + given group - by pausing all of their s. + + + The Scheduler will "remember" that the group is paused, and impose the + pause on any new jobs that are added to the group while the group is + paused. + + + + + + Pause the with the given name. + + + + + Pause all of the s in the given group. + + + The Scheduler will "remember" that the group is paused, and impose the + pause on any new triggers that are added to the group while the group is + paused. + + + + + + Resume (un-pause) the with + the given name. + + + If any of the 's s missed one + or more fire-times, then the 's misfire + instruction will be applied. + + + + + Resume (un-pause) all of the s + in the given group. + + + If any of the s had s that + missed one or more fire-times, then the 's + misfire instruction will be applied. + + + + + + Resume (un-pause) the with the given + name. + + + If the missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + Resume (un-pause) all of the s in the + given group. + + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Pause all triggers - similar to calling + on every group, however, after using this method + must be called to clear the scheduler's state of 'remembering' that all + new triggers will be paused as they are added. + + + When is called (to un-pause), trigger misfire + instructions WILL be applied. + + + + + + + + Resume (un-pause) all triggers - similar to calling + on every group. + + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Get the names of all the s in the given group. + + + + + Get all s that are associated with the + identified . + + + + + Get the names of all the s in the given + group. + + + + + Get the for the + instance with the given name and group. + + + + + Get the instance with the given name and + group. + + + + + Get the current state of the identified . + + + + + + + + + + + Add (register) the given to the Scheduler. + + Name of the calendar. + The calendar. + if set to true [replace]. + whether or not to update existing triggers that + referenced the already existing calendar so that they are 'correct' + based on the new trigger. + + + + Delete the identified from the Scheduler. + + Name of the calendar. + + true if the Calendar was found and deleted. + + + + + Get the instance with the given name. + + + + + Get the names of all registered . + + An array of calendar names. + + + + Request the interruption, within this Scheduler instance, of all + currently executing instances of the identified , which + must be an implementor of the interface. + + +

+ If more than one instance of the identified job is currently executing, + the method will be called on + each instance. However, there is a limitation that in the case that + on one instances throws an exception, all + remaining instances (that have not yet been interrupted) will not have + their method called. +

+ +

+ If you wish to interrupt a specific instance of a job (when more than + one is executing) you can do so by calling + to obtain a handle + to the job instance, and then invoke on it + yourself. +

+

+ This method is not cluster aware. That is, it will only interrupt + instances of the identified InterruptableJob currently executing in this + Scheduler instance, not across the entire cluster. +

+
+ + + + true is at least one instance of the identified job was found and interrupted. + + + +
+ + + Add the given to the 's + global list. + + + Listeners in the 'global' list receive notification of execution events + for ALL s. + + + + + Add the given to the 's + list, of registered s. + + + + + Remove the given from the 's + list of global listeners. + + + true if the identifed listener was found in the list, and removed. + + + + + Remove the identifed from the 's + list of global listeners. + + Global job listener's name + true if the identifed listener was found in the list, and removed + + + + Remove the identifed from the 's + list of registered listeners. + + + true if the identifed listener was found in the list, and removed. + + + + + Get the non-global that has + the given name. + + + + + Add the given to the 's + global list. + + + Listeners in the 'global' list receive notification of execution events + for ALL s. + + + + + Add the given to the 's + list, of registered s. + + + + + Remove the given from the 's + list of global listeners. + + + true if the identifed listener was found in the list, and removed. + + + + + Remove the identifed from the 's + list of global listeners. + + The name. + true if the identifed listener was found in the list, and removed. + + + + Remove the identifed from the + 's list of registered listeners. + + + true if the identifed listener was found in the list, and removed. + + + + + Get the non-global that + has the given name. + + + + + Register the given with the + + + + + Remove the given from the + . + + true if the identifed listener was found in the list, and + removed. + + + + + Returns the name of the . + + + + + Returns the instance Id of the . + + + + + Returns the of the . + + + + + Reports whether the is in stand-by mode. + + + + + + + Reports whether the has been Shutdown. + + + + + Set the that will be responsible for producing + instances of classes. + + + JobFactories may be of use to those wishing to have their application + produce instances via some special mechanism, such as to + give the opertunity for dependency injection. + + + + + + Get the names of all known groups. + + + + + Get the names of all known groups. + + + + + Get the names of all registered s. + + + + + Get a List containing all of the s in + the 'sglobal list. + + + + + Get a Set containing the names of all the non-global + s registered with the . + + + + + Get a List containing all of the + s in the 'sglobal list. + + + + + Get a Set containing the names of all the non-global + s registered with the . + + + + + Get a List containing all of the + s registered with the . + + + + + Whether the scheduler has been started. + + + Note: This only reflects whether has ever + been called on this Scheduler, so it will return even + if the is currently in standby mode or has been + since shutdown. + + + + + + + + Construct a instance to proxy the given + RemoteableQuartzScheduler instance, and with the given + . + + + + + returns true if the given JobGroup + is paused + + + + + + + returns true if the given TriggerGroup + is paused + + + + + + + Get a object describiing the settings + and capabilities of the scheduler instance. +

+ Note that the data returned is an 'instantaneous' snap-shot, and that as + soon as it's returned, the meta data values may be different. +

+
+ +
+ + + Calls the equivalent method on the 'proxied' . + + + + + Get the global that has + the given name. + + + + + + + Get the global that + has the given name. + + + + + + + Get the names of all groups that are paused. + + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Get the names of all registered . + + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Remove the identifed from the 's + list of global listeners. + + + + true if the identifed listener was found in the list, and removed + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Remove the identifed from the 's + list of global listeners. + + The name. + + true if the identifed listener was found in the list, and removed. + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Returns the name of the . + + + + + Returns the instance Id of the . + + + + + Gets or sets the remote scheduler address. + + The remote scheduler address. + + + + Returns the of the . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Gets a value indicating whether this instance is paused. + + true if this instance is paused; otherwise, false. + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equialent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Set the that will be responsible for producing + instances of classes. +

+ JobFactories may be of use to those wishing to have their application + produce instances via some special mechanism, such as to + give the opertunity for dependency injection. +

+
+ + + SchedulerException +
+ + + Whether the scheduler has been started. + + + + Note: This only reflects whether has ever + been called on this Scheduler, so it will return even + if the is currently in standby mode or has been + since shutdown. + + + + + + + + Holds references to Scheduler instances - ensuring uniqueness, and + preventing garbage collection, and allowing 'global' lookups. + + James House + Marko Lahma (.NET) + + + + Binds the specified sched. + + The sched. + + + + Removes the specified sched name. + + Name of the sched. + + + + + Lookups the specified sched name. + + Name of the sched. + + + + + Lookups all. + + + + + + Gets the singleton instance. + + The instance. + + + + Responsible for creating the instances of + to be used within the instance. +

+ This implementation does not re-use any objects, it simply makes a new + JobRunShell each time is called. +

+
+ James House +
+ + + Initialize the factory, providing a handle to the + that should be made available within the and + the s within it, and a handle to the + that the shell will use in its own + operations with the . + + + + + Called by the to obtain instances of + . + + + + + Called by the to return instances of + . + + + + + An implementation of the interface that directly + proxies all method calls to the equivalent call on a given + instance. + + + + + James House + + + + returns true if the given JobGroup + is paused + + + + + + + returns true if the given TriggerGroup + is paused + + + + + + + Get a object describiing the settings + and capabilities of the scheduler instance. +

+ Note that the data returned is an 'instantaneous' snap-shot, and that as + soon as it's returned, the meta data values may be different. +

+
+ +
+ + + Calls the equivalent method on the 'proxied' . + + + + + + + + + Get the global that has + the given name. + + + + + + + Get the global that + has the given name. + + + + + + + Construct a instance to proxy the given + instance, and with the given . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Get the names of all registered . + + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Remove the identifed from the 's + list of global listeners. + + + + true if the identifed listener was found in the list, and removed + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Remove the identifed from the 's + list of global listeners. + + The name. + + true if the identifed listener was found in the list, and removed. + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Request the interruption, within this Scheduler instance, of all + currently executing instances of the identified , which + must be an implementor of the interface. + + +

+ If more than one instance of the identified job is currently executing, + the method will be called on + each instance. However, there is a limitation that in the case that + on one instances throws an exception, all + remaining instances (that have not yet been interrupted) will not have + their method called. +

+

+ If you wish to interrupt a specific instance of a job (when more than + one is executing) you can do so by calling + to obtain a handle + to the job instance, and then invoke on it + yourself. +

+

+ This method is not cluster aware. That is, it will only interrupt + instances of the identified InterruptableJob currently executing in this + Scheduler instance, not across the entire cluster. +

+
+ + + true is at least one instance of the identified job was found and interrupted. + UnableToInterruptJobException if the job does not implement + + +
+ + + Returns the name of the . + + + + + Returns the instance Id of the . + + + + + Returns the of the . + + + + + Whether the scheduler has been started. + + + + Note: This only reflects whether has ever + been called on this Scheduler, so it will return even + if the is currently in standby mode or has been + since shutdown. + + + + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + + + + + An implementation of that + does all of it's work of creating a instance + based on the contenents of a properties file. + + +

+ By default a properties are loaded from App.config's quartz section. + If that fails, then the "quartz.properties" + file located (as a embedded resource) in Quartz.dll is loaded. If you + wish to use a file other than these defaults, you must define the system + property 'quartz.properties' to point to the file you want. +

+ +

+ See the sample properties that are distributed with Quartz for + information about the various settings available within the file. +

+ +

+ Alternativly, you can explicitly Initialize the factory by calling one of + the methods before calling . +

+ +

+ Instances of the specified , + , classes will be created + by name, and then any additional properties specified for them in the config + file will be set on the instance by calling an equivalent 'set' method. For + example if the properties file contains the property 'quartz.jobStore. + myProp = 10' then after the JobStore class has been instantiated, the property + 'MyProp' will be set with the value. Type conversion to primitive CLR types + (int, long, float, double, boolean, enum and string) are performed before calling + the property's setter method. +

+
+ James House + Anthony Eden + Mohammad Rezaei + Marko Lahma (.NET) +
+ + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The props. + + + + Initialize the with + the contenents of a Properties file. + +

+ By default a properties file named "quartz.properties" is loaded from + the 'current working directory'. If that fails, then the + "quartz.properties" file located (as a resource) in the org/quartz + package is loaded. If you wish to use a file other than these defaults, + you must define the system property 'quartz.properties' to point to + the file you want. +

+
+
+ + + Creates a new name value collection and overrides its values + with system values (environment variables). + + The base properties to override. + A new NameValueCollection instance. + + + + Initialize the with + the contenents of the given Properties object. + + + + + + + + Returns a handle to the Scheduler produced by this factory. + + + + If one of the methods has not be previously + called, then the default (no-arg) method + will be called by this method. + + + +

+ Returns a handle to the Scheduler with the given name, if it exists (if + it has already been instantiated). +

+
+
+ + + Returns a handle to the default Scheduler, creating it if it does not + yet exist. + + + + + +

+ Returns a handle to all known Schedulers (made by any + StdSchedulerFactory instance.). +

+
+
+ + + Inspects a file and compares whether it's "last modified date" has changed + since the last time it was inspected. If the file has been updated, the + job invokes a "call-back" method on an identified + that can be found in the + . + + James House + + + + + A marker interface for s that + wish to have their state maintained between executions. + + + instances follow slightly different rules from + regular instances. The key difference is that their + associated is re-persisted after every + execution of the job, thus preserving state for the next execution. The + other difference is that stateful jobs are not allowed to Execute + concurrently, which means new triggers that occur before the completion of + the method will be delayed. + + + + + + James House + Marko Lahma (.NET) + + + + The interface to be implemented by classes which represent a 'job' to be + performed. + + + Instances of this interface must have a + no-argument constructor. provides a mechanism for 'instance member data' + that may be required by some implementations of this interface. + + + + + + James House + Marko Lahma (.NET) + + + + Called by the when a + fires that is associated with the . + + + The implementation may wish to set a result object on the + JobExecutionContext before this method exits. The result itself + is meaningless to Quartz, but may be informative to + s or + s that are watching the job's + execution. + + The execution context. + + + + Initializes a new instance of the class. + + + + + Called by the when a + fires that is associated with the . +

+ The implementation may wish to set a result object on the + JobExecutionContext before this method exits. The result itself + is meaningless to Quartz, but may be informative to + s or + s that are watching the job's + execution. +

+
+ The execution context. + + +
+ + + Gets the last modified date. + + Name of the file. + + + + + Gets the log. + + The log. + + + + Interface for objects wishing to receive a 'call-back' from a + . + + James House + + + + + Ãnforms that certain file has been updated. + + Name of the file. + + + + Built in job for executing native executables in a separate process. + + Matthew Payne + James House + Steinar Overbeck Cook + + + + Required parameter that specifies the name of the command (executable) + to be ran. + + + + + Optional parameter that specifies the parameters to be passed to the + executed command. + + + + + Optional parameter (value should be 'true' or 'false') that specifies + whether the job should wait for the execution of the native process to + complete before it completes. + +

Defaults to .

+
+
+ + + Optional parameter (value should be 'true' or 'false') that specifies + whether the spawned process's stdout and stderr streams should be + consumed. If the process creates output, it is possible that it might + 'hang' if the streams are not consumed. + +

Defaults to .

+
+
+ + + Optional parameter that specifies the workling directory to be used by + the executed command. + + + + + Initializes a new instance of the class. + + + + + Called by the when a + fires that is associated with the . +

+ The implementation may wish to set a result object on the + JobExecutionContext before this method exits. The result itself + is meaningless to Quartz, but may be informative to + s or + s that are watching the job's + execution. +

+
+ +
+ + + Gets the log. + + The log. + + + + Consumes data from the given input stream until EOF and prints the data to stdout + + cooste + James House + + + + Initializes a new instance of the class. + + The enclosing instance. + The input stream. + The type. + + + + Runs this object as a separate thread, printing the contents of the input stream + supplied during instantiation, to either Console. or stderr + + + + + An implementation of Job, that does absolutely nothing - useful for system + which only wish to use s + and s, rather than writing + Jobs that perform work. + + James House + + + + Do nothing. + + + + + A Job which sends an e-mail with the configured content to the configured + recipient. + + James House + Marko Lahma (.NET) + + + The host name of the smtp server. REQUIRED. + + + The e-mail address to send the mail to. REQUIRED. + + + The e-mail address to cc the mail to. Optional. + + + The e-mail address to claim the mail is from. REQUIRED. + + + The e-mail address the message should say to reply to. Optional. + + + The subject to place on the e-mail. REQUIRED. + + + The e-mail message body. REQUIRED. + + + + Executes the job. + + The job execution context. + + + + Holds a List of references to SchedulerListener instances and broadcasts all + events to them (in order). + + + This may be more convenient than registering all of the listeners + directly with the Scheduler, and provides the flexibility of easily changing + which listeners get notified. + + + + James House + + + + Construct an instance with the given List of listeners. + + The initial List of SchedulerListeners to broadcast to. + + + + Holds a List of references to JobListener instances and broadcasts all + events to them (in order) - if the event is not excluded via filtering + (read on). + + +

+ The broadcasting behavior of this listener to delegate listeners may be + more convenient than registering all of the listeners directly with the + Trigger, and provides the flexibility of easily changing which listeners + get notified. +

+ +

+ You may also register a number of Regular Expression patterns to match + the events against. If one or more patterns are registered, the broadcast + will only take place if the event applies to a job who's name/group + matches one or more of the patterns. +

+
+ + + + + + James House +
+ + Construct an instance with the given name. + + (Remember to add some delegate listeners!) + + @param name the name of this instance + + + Construct an instance with the given name, and List of listeners. + + @param name the name of this instance + @param listeners the initial List of JobListeners to broadcast to. + + + + If one or more name patterns are specified, only events relating to + jobs who's name matches the given regular expression pattern + will be dispatched to the delegate listeners. + + + + + + If one or more group patterns are specified, only events relating to + jobs who's group matches the given regular expression pattern + will be dispatched to the delegate listeners. + + + + + + Holds a List of references to TriggerListener instances and broadcasts all + events to them (in order) - if the event is not excluded via filtering + (read on). + + +

+ The broadcasting behavior of this listener to delegate listeners may be + more convenient than registering all of the listeners directly with the + Trigger, and provides the flexibility of easily changing which listeners + get notified. +

+ +

+ You may also register a number of Regular Expression patterns to match + the events against. If one or more patterns are registered, the broadcast + will only take place if the event applies to a trigger who's name/group + matches one or more of the patterns. +

+
+ + + + + + James House +
+ + + The interface to be implemented by classes that want to be informed when a + fires. In general, applications that use a + will not have use for this mechanism. + + + + + + James House + + + + Called by the when a + has fired, and it's associated + is about to be executed. +

+ It is called before the method of this + interface. +

+
+ The that has fired. + + The that will be passed to the 's method. + +
+ + + Called by the when a + has fired, and it's associated + is about to be executed. +

+ It is called after the method of this + interface. +

+
+ The that has fired. + The that will be passed to + the 's method. + Returns true if job execution should be vetoed, false otherwise. +
+ + + Called by the when a + has misfired. +

+ Consideration should be given to how much time is spent in this method, + as it will affect all triggers that are misfiring. If you have lots + of triggers misfiring at once, it could be an issue it this method + does a lot. +

+
+ The that has misfired. +
+ + + Called by the when a + has fired, it's associated + has been executed, and it's method has been + called. + + The that was fired. + + The that was passed to the + 's method. + + + The result of the call on the 's method. + + + + + Get the name of the . + + + + + Construct an instance with the given name. + + (Remember to add some delegate listeners!) + + the name of this instance + + + + Construct an instance with the given name, and List of listeners. + + the name of this instance + the initial List of TriggerListeners to broadcast to + + + + If one or more name patterns are specified, only events relating to + triggers who's name matches the given regular expression pattern + will be dispatched to the delegate listeners. + + + + + + If one or more group patterns are specified, only events relating to + triggers who's group matches the given regular expression pattern + will be dispatched to the delegate listeners. + + + + + + Keeps a collection of mappings of which Job to trigger after the completion + of a given job. If this listener is notified of a job completing that has a + mapping, then it will then attempt to trigger the follow-up job. This + achieves "job chaining", or a "poor man's workflow". + + +

+ Generally an instance of this listener would be registered as a global + job listener, rather than being registered directly to a given job. +

+

+ If for some reason there is a failure creating the trigger for the + follow-up job (which would generally only be caused by a rare serious + failure in the system, or the non-existence of the follow-up job), an error + messsage is logged, but no other action is taken. If you need more rigorous + handling of the error, consider scheduling the triggering of the flow-up + job within your job itself. +

+
+ James House +
+ + + A helpful abstract base class for implementors of . + + +

+ The methods in this class are empty so you only need to override the + subset for the events you care about. +

+ +

+ You are required to implement + to return the unique name of your . +

+
+ +
+ + + Initializes a new instance of the class. + + + + + Called by the when a + is about to be executed (an associated + has occured). +

+ This method will not be invoked if the execution of the Job was vetoed + by a . +

+
+ + +
+ + + Called by the when a + was about to be executed (an associated + has occured), but a vetoed it's + execution. + + + + + + + Called by the after a + has been executed, and be for the associated 's + method has been called. + + + + + + + Get the for this class's category. + This should be used by subclasses for logging. + + + + + Get the name of the . + + + + + + Construct an instance with the given name. + + The name of this instance. + + + + Add a chain mapping - when the Job identified by the first key completes + the job identified by the second key will be triggered. + + a Key with the name and group of the first job + a Key with the name and group of the follow-up job + + + + A helpful abstract base class for implementors of + . + + +

+ The methods in this class are empty so you only need to override the + subset for the events + you care about. +

+ +

+ You are required to implement + to return the unique name of your . +

+
+ +
+ + + Get the for this + class's category. This should be used by subclasses for logging. + + + + + Get the name of the . + + + + + + Logs a history of all job executions (and execution vetos) via common + logging. + + +

+ The logged message is customizable by setting one of the following message + properties to a string that conforms to the syntax of . +

+

+ JobToBeFiredMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Job's Name.
1StringThe Job's Group.
2DateThe current time.
3StringThe Trigger's name.
4StringThe Triggers's group.
5DateThe scheduled fire time.
6DateThe next scheduled fire time.
7IntegerThe re-fire count from the JobExecutionContext.
+ The default message text is "Job {1}.{0} fired (by trigger {4}.{3}) at: + {2, date, HH:mm:ss MM/dd/yyyy" +

+

+ JobSuccessMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Job's Name.
1StringThe Job's Group.
2DateThe current time.
3StringThe Trigger's name.
4StringThe Triggers's group.
5DateThe scheduled fire time.
6DateThe next scheduled fire time.
7IntegerThe re-fire count from the JobExecutionContext.
8ObjectThe string value (toString() having been called) of the result (if any) + that the Job set on the JobExecutionContext, with on it. "NULL" if no + result was set.
+ The default message text is "Job {1}.{0} execution complete at {2, date, + HH:mm:ss MM/dd/yyyy} and reports: {8" +

+

+ JobFailedMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Job's Name.
1StringThe Job's Group.
2DateThe current time.
3StringThe Trigger's name.
4StringThe Triggers's group.
5DateThe scheduled fire time.
6DateThe next scheduled fire time.
7IntegerThe re-fire count from the JobExecutionContext.
8StringThe message from the thrown JobExecution Exception. +
+ The default message text is "Job {1}.{0} execution failed at {2, date, + HH:mm:ss MM/dd/yyyy} and reports: {8" +

+

+ JobWasVetoedMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Job's Name.
1StringThe Job's Group.
2DateThe current time.
3StringThe Trigger's name.
4StringThe Triggers's group.
5DateThe scheduled fire time.
6DateThe next scheduled fire time.
7IntegerThe re-fire count from the JobExecutionContext.
+ The default message text is "Job {1}.{0} was vetoed. It was to be fired + (by trigger {4}.{3}) at: {2, date, HH:mm:ss MM/dd/yyyy" +

+
+
+ + + Provides an interface for a class to become a "plugin" to Quartz. + + + Plugins can do virtually anything you wish, though the most interesting ones + will obviously interact with the scheduler in some way - either actively: by + invoking actions on the scheduler, or passively: by being a , + , and/or . +

+ If you use to + Initialize your Scheduler, it can also create and Initialize your plugins - + look at the configuration docs for details. +

+

+ If you need direct access your plugin, you can have it explicitly put a + reference to itself in the 's + as part of its + method. +

+
+ James House +
+ + + Called during creation of the in order to give + the a chance to Initialize. + + + At this point, the Scheduler's is not yet +

+ If you need direct access your plugin, you can have it explicitly put a + reference to itself in the 's + as part of its + method. +

+
+ + The name by which the plugin is identified. + + + The scheduler to which the plugin is registered. + +
+ + + Called when the associated is started, in order + to let the plug-in know it can now make calls into the scheduler if it + needs to. + + + + + Called in order to inform the that it + should free up all of it's resources because the scheduler is shutting + down. + + + + + Called during creation of the in order to give + the a chance to Initialize. + + + + + Called when the associated is started, in order + to let the plug-in know it can now make calls into the scheduler if it + needs to. + + + + + Called in order to inform the that it + should free up all of it's resources because the scheduler is shutting + down. + + + + + Called by the when a is + about to be executed (an associated has occurred). + + This method will not be invoked if the execution of the Job was vetoed by a + . + + + + + + + Called by the after a + has been executed, and be for the associated 's + method has been called. + + + + + + + Called by the when a + was about to be executed (an associated + has occured), but a vetoed it's + execution. + + + + + + + Logger instance to use. Defaults to common logging. + + + + + Get or sets the message that is logged when a Job successfully completes its + execution. + + + + + Get or sets the message that is logged when a Job fails its + execution. + + + + + Gets or sets the message that is logged when a Job is about to Execute. + + + + + Gets or sets the message that is logged when a Job execution is vetoed by a + trigger listener. + + + + + Get the name of the . + + + + + + Logs a history of all trigger firings via the Jakarta Commons-Logging + framework. + + +

+ The logged message is customizable by setting one of the following message + properties to a string that conforms to the syntax of . +

+ +

+ TriggerFiredMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Trigger's Name.
1StringThe Trigger's Group.
2DateThe scheduled fire time.
3DateThe next scheduled fire time.
4DateThe actual fire time.
5StringThe Job's name.
6StringThe Job's group.
7IntegerThe re-fire count from the JobExecutionContext.
+ + The default message text is "Trigger {1}.{0} fired job {6}.{5} at: {4, + date, HH:mm:ss MM/dd/yyyy" +

+ +

+ TriggerMisfiredMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Trigger's Name.
1StringThe Trigger's Group.
2DateThe scheduled fire time.
3DateThe next scheduled fire time.
4DateThe actual fire time. (the time the misfire was detected/handled)
5StringThe Job's name.
6StringThe Job's group.
+ + The default message text is "Trigger {1}.{0} misfired job {6}.{5} at: + {4, date, HH:mm:ss MM/dd/yyyy}. Should have fired at: {3, date, HH:mm:ss + MM/dd/yyyy" +

+ +

+ TriggerCompleteMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Trigger's Name.
1StringThe Trigger's Group.
2DateThe scheduled fire time.
3DateThe next scheduled fire time.
4DateThe job completion time.
5StringThe Job's name.
6StringThe Job's group.
7IntegerThe re-fire count from the JobExecutionContext.
8IntegerThe trigger's resulting instruction code.
9StringA human-readable translation of the trigger's resulting instruction + code.
+ + The default message text is "Trigger {1}.{0} completed firing job + {6}.{5} at {4, date, HH:mm:ss MM/dd/yyyy} with resulting trigger instruction + code: {9" +

+
+ James House +
+ + + Called during creation of the in order to give + the a chance to Initialize. + + + + + Called when the associated is started, in order + to let the plug-in know it can now make calls into the scheduler if it + needs to. + + + + + Called in order to inform the that it + should free up all of it's resources because the scheduler is shutting + down. + + + + + Called by the when a + has fired, and it's associated + is about to be executed. +

+ It is called before the method of this + interface. +

+
+ The that has fired. + The that will be passed to the 's method. +
+ + + Called by the when a + has misfired. +

+ Consideration should be given to how much time is spent in this method, + as it will affect all triggers that are misfiring. If you have lots + of triggers misfiring at once, it could be an issue it this method + does a lot. +

+
+ The that has misfired. +
+ + + Called by the when a + has fired, it's associated + has been executed, and it's method has been + called. + + The that was fired. + The that was passed to the + 's method. + The result of the call on the 's method. + + + + Called by the when a + has fired, and it's associated + is about to be executed. +

+ It is called after the method of this + interface. +

+
+ The that has fired. + The that will be passed to + the 's method. + +
+ + + Logger instance to use. Defaults to common logging. + + + + + Get or set the message that is printed upon the completion of a trigger's + firing. + + + + + Get or set the message that is printed upon a trigger's firing. + + + + + Get or set the message that is printed upon a trigger's mis-firing. + + + + + Get the name of the . + + + + + + This plugin catches the event of the VM terminating (such as upon a CRTL-C) + and tells the scheuler to Shutdown. + + + James House + + + + Called during creation of the in order to give + the a chance to Initialize. + + + + + Called when the associated is started, in order + to let the plug-in know it can now make calls into the scheduler if it + needs to. + + + + + Called in order to inform the that it + should free up all of it's resources because the scheduler is shutting + down. + + + + + Determine whether or not the plug-in is configured to cause a clean + Shutdown of the scheduler. +

+ The default value is . +

+
+ +
+ + + Attribute to use with public properties that + can be set with Quartz configuration. Attribute can be used to advice + parsing to use correct type of time span (milliseconds, seconds, minutes, hours) + as it may depend on property. + + + + + + Initializes a new instance of the class. + + The rule. + + + + Gets the rule. + + The rule. + + + + Possible parse rules for s. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This plugin loads XML file(s) to add jobs and schedule them with triggers + as the scheduler is initialized, and can optionally periodically scan the + file for changes. + + + The periodically scanning of files for changes is not currently supported in a + clustered environment. + + James House + Pierre Awaragi + + + + Initializes a new instance of the class. + + + + + + + + + + + Called during creation of the in order to give + the a chance to initialize. + + The name. + The scheduler. + SchedulerConfigException + + + + Called when the associated is started, in order + to let the plug-in know it can now make calls into the scheduler if it + needs to. + + + + Helper method for generating unique job/trigger name for the + file scanning jobs (one per FileJob). The unique names are saved + in jobTriggerNameSet. + + + + Called in order to inform the that it + should free up all of it's resources because the scheduler is shutting + down. + + + + + Gets the log. + + The log. + + + + Comma separated list of file names (with paths) to the XML files that should be read. + + + + + Whether or not jobs defined in the XML file should be overwrite existing + jobs with the same name. + + + + + The interval at which to scan for changes to the file. + If the file has been changed, it is re-loaded and parsed. The default + value for the interval is 0, which disables scanning. + + + + + Whether or not initialization of the plugin should fail (throw an + exception) if the file cannot be found. Default is . + + + + + Whether or not the XML should be validated. Default is . + + + + + Whether or not the XML schema should be validated. Default is . + + + + + A uses all of the + types that are found in this package in its attempts to load a class, when + one scheme is found to work, it is promoted to the scheme that will be used + first the next time a class is loaded (in order to improve perfomance). + + + This approach is used because of the wide variance in class loader behavior + between the various environments in which Quartz runs (e.g. disparate + application servers, stand-alone, mobile devices, etc.). Because of this + disparity, Quartz ran into difficulty with a one class-load style fits-all + design. Thus, this class loader finds the approach that works, then + 'remembers' it. + + James House + + + + Called to give the ClassLoadHelper a chance to Initialize itself, + including the oportunity to "steal" the class loader off of the calling + thread, which is the thread that is initializing Quartz. + + + + + Return the class with the given name. + + + + Finds a resource with a given name. This method returns null if no + resource with this name is found. + + name of the desired resource + + a java.net.URL object + + + + Finds a resource with a given name. This method returns null if no + resource with this name is found. + + name of the desired resource + + a java.io.InputStream object + + + + + that names the scheduler instance using + just the machine hostname. +

+ This class is useful when you know that your scheduler instance will be the + only one running on a particular machine. Each time the scheduler is + restarted, it will get the same instance id as long as the machine is not + renamed. +

+ +
+ + +
+ + + An IInstanceIdGenerator is responsible for generating the clusterwide unique + instance id for a nodde. +

+ This interface may be of use to those wishing to have specific control over + the mechanism by which the instances in their + application are named. +

+ +
+ +
+ + Generate the instance id for a + + + The clusterwide unique instance id. + + + + + Generate the instance id for a + + The clusterwide unique instance id. + + + + A that uses either the loader of it's own + class. + + + + + James House + + + + Called to give the ClassLoadHelper a chance to Initialize itself, + including the oportunity to "steal" the class loader off of the calling + thread, which is the thread that is initializing Quartz. + + + + Return the class with the given name. + + + Finds a resource with a given name. This method returns null if no + resource with this name is found. + + name of the desired resource + + a java.net.URL object + + + + Finds a resource with a given name. This method returns null if no + resource with this name is found. + + name of the desired resource + + a java.io.InputStream object + + + + + A JobFactory that instantiates the Job instance (using the default no-arg + constructor, or more specifically: ), and + then attempts to set all values in the 's + onto bean properties of the . + + + + + + + James Houser + Marko Lahma (.NET) + + + + The default JobFactory used by Quartz - simply calls + on the job class. + + + + James House + Marko Lahma (.NET) + + + + A JobFactory is responsible for producing instances of + classes. + + + This interface may be of use to those wishing to have their application + produce instances via some special mechanism, such as to + give the opertunity for dependency injection. + + + + + James House + + + + Called by the scheduler at the time of the trigger firing, in order to + produce a instance on which to call Execute. + + +

+ It should be extremely rare for this method to throw an exception - + basically only the the case where there is no way at all to instantiate + and prepare the Job for execution. When the exception is thrown, the + Scheduler will move all triggers associated with the Job into the + state, which will require human + intervention (e.g. an application restart after fixing whatever + configuration problem led to the issue wih instantiating the Job. +

+ +
+ + The TriggerFiredBundle from which the + and other info relating to the trigger firing can be obtained. + + SchedulerException if there is a problem instantiating the Job. + the newly instantiated Job + +
+ + + Called by the scheduler at the time of the trigger firing, in order to + produce a instance on which to call Execute. + + + It should be extremely rare for this method to throw an exception - + basically only the the case where there is no way at all to instantiate + and prepare the Job for execution. When the exception is thrown, the + Scheduler will move all triggers associated with the Job into the + state, which will require human + intervention (e.g. an application restart after fixing whatever + configuration problem led to the issue wih instantiating the Job. + + The TriggerFiredBundle from which the + and other info relating to the trigger firing can be obtained. + the newly instantiated Job + SchedulerException if there is a problem instantiating the Job. + + + + Called by the scheduler at the time of the trigger firing, in order to + produce a instance on which to call Execute. + + +

+ It should be extremely rare for this method to throw an exception - + basically only the the case where there is no way at all to instantiate + and prepare the Job for execution. When the exception is thrown, the + Scheduler will move all triggers associated with the Job into the + state, which will require human + intervention (e.g. an application restart after fixing whatever + configuration problem led to the issue wih instantiating the Job. +

+
+ The TriggerFiredBundle from which the + and other info relating to the trigger firing can be obtained. + the newly instantiated Job + SchedulerException if there is a problem instantiating the Job. +
+ + + Sets the object properties. + + The object to set properties to. + The data to set. + + + + Whether the JobInstantiation should fail and throw and exception if + a key (name) and value (type) found in the JobDataMap does not + correspond to a proptery setter on the Job class. + + + + + Get or set whether a warning should be logged if + a key (name) and value (type) found in the JobDataMap does not + correspond to a proptery setter on the Job class. + + + + + This class implements a that + utilizes RAM as its storage device. +

+ As you should know, the ramification of this is that access is extrememly + fast, but the data is completely volatile - therefore this + should not be used if true persistence between program shutdowns is + required. +

+
+ James House + Sharada Jambula + Marko Lahma (.NET) +
+ + + Initializes a new instance of the class. + + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + Called by the QuartzScheduler to inform the that + the scheduler has started. + + + + + Called by the QuartzScheduler to inform the that + it should free up all of it's resources because the scheduler is + shutting down. + + + + + Store the given and . + + The scheduling context. + The to be stored. + The to be stored. + + + + Returns true if the given job group is paused. + + + Job group name + + + + + returns true if the given TriggerGroup is paused. + + + + + + + + Store the given . + + The scheduling context. + The to be stored. + If , any existing in the + with the same name and group should be + over-written. + + + + Remove (delete) the with the given + name, and any s that reference + it. + + The scheduling context. + The name of the to be removed. + The group name of the to be removed. + + if a with the given name and + group was found and removed from the store. + + + + + Remove (delete) the with the + given name. + + The scheduling context. + The name of the to be removed. + The group name of the to be removed. + + if a with the given + name and group was found and removed from the store. + + + + + Store the given . + + The scheduling context. + The to be stored. + If , any existing in + the with the same name and group should + be over-written. + + + + Remove (delete) the with the + given name. + + The scheduling context. + The name of the to be removed. + The group name of the to be removed. + + if a with the given + name and group was found and removed from the store. + + Whether to delete orpahaned job details from scheduler if job becomes orphaned from removing the trigger. + + + + Replaces the trigger. + + The scheduling context. + Name of the trigger. + Name of the group. + The new trigger. + + + + + Retrieve the for the given + . + + The scheduling context. + The name of the to be retrieved. + The group name of the to be retrieved. + + The desired , or null if there is no match. + + + + + Retrieve the given . + + The scheduling context. + The name of the to be retrieved. + The group name of the to be retrieved. + + The desired , or null if there is no match. + + + + + Get the current state of the identified . + + + + + + + + + + + Store the given . + + The scheduling context. + The name. + The to be stored. + If , any existing + in the with the same name and group + should be over-written. + If , any s existing + in the that reference an existing + Calendar with the same name with have their next fire time + re-computed with the new . + + + + Remove (delete) the with the + given name. +

+ If removal of the would result in + s pointing to non-existent calendars, then a + will be thrown.

+
+ The scheduling context. + The name of the to be removed. + + if a with the given name + was found and removed from the store. + +
+ + + Retrieve the given . + + The scheduling context. + The name of the to be retrieved. + + The desired , or null if there is no match. + + + + + Get the number of s that are + stored in the . + + + + + Get the number of s that are + stored in the . + + + + + Get the number of s that are + stored in the . + + + + + Get the names of all of the s that + have the given group name. + + + + + Get the names of all of the s + in the . +

+ If there are no ICalendars in the given group name, the result should be + a zero-length array (not ). +

+
+
+ + + Get the names of all of the s + that have the given group name. + + + + + Get the names of all of the + groups. + + + + + Get the names of all of the groups. + + + + + Get all of the Triggers that are associated to the given Job. +

+ If there are no matches, a zero-length array should be returned. +

+
+
+ + + Gets the trigger wrappers for job. + + Name of the job. + Name of the group. + + + + + Gets the trigger wrappers for calendar. + + Name of the cal. + + + + + Pause the with the given name. + + + + + Pause all of the s in the given group. +

+ The JobStore should "remember" that the group is paused, and impose the + pause on any new triggers that are added to the group while the group is + paused. +

+
+
+ + + Pause the with the given + name - by pausing all of its current s. + + + + + Pause all of the s in the + given group - by pausing all of their s. +

+ The JobStore should "remember" that the group is paused, and impose the + pause on any new jobs that are added to the group while the group is + paused. +

+
+
+ + + Resume (un-pause) the with the given name. + + + If the missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + Resume (un-pause) all of the s in the + given group. +

+ If any missed one or more fire-times, then the + 's misfire instruction will be applied. +

+
+
+ + + Resume (un-pause) the with + the given name. +

+ If any of the 's s missed one + or more fire-times, then the 's misfire + instruction will be applied. +

+
+
+ + + Resume (un-pause) all of the s + in the given group. +

+ If any of the s had s that + missed one or more fire-times, then the 's + misfire instruction will be applied. +

+
+
+ + + Pause all triggers - equivalent of calling + on every group. +

+ When is called (to un-pause), trigger misfire + instructions WILL be applied. +

+
+ +
+ + + Resume (un-pause) all triggers - equivalent of calling + on every trigger group and setting all job groups unpaused />. +

+ If any missed one or more fire-times, then the + 's misfire instruction will be applied. +

+
+ +
+ + + Applies the misfire. + + The trigger wrapper. + + + + + Get a handle to the next trigger to be fired, and mark it as 'reserved' + by the calling scheduler. + + + + + + Inform the that the scheduler no longer plans to + fire the given , that it had previously acquired + (reserved). + + + + + Inform the that the scheduler is now firing the + given (executing its associated ), + that it had previously acquired (reserved). + + + + + Inform the that the scheduler has completed the + firing of the given (and the execution its + associated ), and that the + in the given should be updated if the + is stateful. + + + + + Sets the state of all triggers of job to specified state. + + Name of the job. + The job group. + The internal state to set. + + + + Peeks the triggers. + + + + + + + + + The time span by which a trigger must have missed its + next-fire-time, in order for it to be considered "misfired" and thus + have its misfire instruction applied. + + + + + Gets the fired trigger record id. + + The fired trigger record id. + + + + Returns whether this instance supports persistence. + + + + + + + Comparer for triggers. + + + + + Possible internal trigger states + in RAMJobStore + + + + + Waiting + + + + + Acquired + + + + + Executing + + + + + Complete + + + + + Paused + + + + + Blocked + + + + + Paused and Blocked + + + + + Error + + + + + Helper wrapper class + + + + + The key used + + + + + Job's key + + + + + The trigger + + + + + Current state + + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + + Serves as a hash function for a particular type. is suitable for use in hashing algorithms and data structures like a hash table. + + + A hash code for the current . + + + + + Gets the trigger + + The trigger + + + + Scheduler exporter that exports scheduler to remoting context. + + Marko Lahma + + + + Service interface for scheduler exporters. + + Marko Lahma + + + + Binds (exports) scheduler to external context. + + + + + + Unbinds scheduler from external context. + + + + + + Registers remoting channel if needed. This is determined + by checking whether there is a positive value for port. + + + + + Gets or sets the port used for remoting. + + + + + Gets or sets the name to use when exporting + scheduler to remoting context. + + + + + Sets the channel type when registering remoting. + + + + + + Sets the used when + exporting to remoting context. Defaults to + . + + + + + A that simply calls . + + + + James House + + + + Called to give the ClassLoadHelper a chance to Initialize itself, + including the oportunity to "steal" the class loader off of the calling + thread, which is the thread that is initializing Quartz. + + + + Return the class with the given name. + + + + Finds a resource with a given name. This method returns null if no + resource with this name is found. + + name of the desired resource + + a Uri object + + + + Finds a resource with a given name. This method returns null if no + resource with this name is found. + + name of the desired resource + + a Stream object + + + + + The default InstanceIdGenerator used by Quartz when instance id is to be + automatically generated. Instance id is of the form HOSTNAME + CURRENT_TIME. + + + + + + + + + Generate the instance id for a + + The clusterwide unique instance id. + + + + This is class is a simple implementation of a thread pool, based on the + interface. +

+ objects are sent to the pool with the + method, which blocks until a becomes available. +

+ +

+ The pool has a fixed number of s, and does not grow or + shrink based on demand. +

+
+ James House + Juergen Donnerstag +
+ + + The interface to be implemented by classes that want to provide a thread + pool for the 's use. + + + implementation instances should ideally be made + for the sole use of Quartz. Most importantly, when the method + returns a value of 1 or greater, + there must still be at least one available thread in the pool when the + method is called a few moments (or + many moments) later. If this assumption does not hold true, it may + result in extra JobStore queries and updates, and if clustering features + are being used, it may result in greater imballance of load. + + + James House + + + + Execute the given in the next + available . + + + The implementation of this interface should not throw exceptions unless + there is a serious problem (i.e. a serious misconfiguration). If there + are no available threads, rather it should either queue the Runnable, or + block until a thread is available, depending on the desired strategy. + + + + + Determines the number of threads that are currently available in in + the pool. Useful for determining the number of times + can be called before returning + false. + + + The implementation of this method should block until there is at + least one available thread. + + the number of currently available threads + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + Called by the QuartzScheduler to inform the + that it should free up all of it's resources because the scheduler is + shutting down. + + + + + Gets the size of the pool. + + The size of the pool. + + + + Create a new (unconfigured) . + + + + + Create a new with the specified number + of s that have the given priority. + + + the number of worker s in the pool, must + be > 0. + + + the thread priority for the worker threads. + + + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + Terminate any worker threads in this thread group. + Jobs currently in progress will complete. + + + + + Run the given object in the next available + . If while waiting the thread pool is asked to + shut down, the Runnable is executed immediately within a new additional + thread. + + The to be added. + + + + Creates the worker threads. + + The thread count. + + + + + Terminate any worker threads in this thread group. + Jobs currently in progress will complete. + + + + + Gets or sets the number of worker threads in the pool. + Set has no effect after has been called. + + + + + Get or set the thread priority of worker threads in the pool. + Set operation has no effect after has been called. + + + + + Gets or sets the thread name prefix. + + The thread name prefix. + + + + Gets or sets the value of makeThreadsDaemons. + + + + + Gets the size of the pool. + + The size of the pool. + + + + A Worker loops, waiting to Execute tasks. + + + + + Create a worker thread and start it. Waiting for the next Runnable, + executing it, and waiting for the next Runnable, until the Shutdown + flag is set. + + + + + Create a worker thread, start it, Execute the runnable and terminate + the thread (one time execution). + + + + + Signal the thread that it should terminate. + + + + + Loop, executing targets as they are received. + + + + + This is class is a simple implementation of a zero size thread pool, based on the + {@link org.quartz.spi.ThreadPool} interface. + + + The pool has zero s and does not grow or shrink based on demand. + Which means it is obviously not useful for most scenarios. When it may be useful + is to prevent creating any worker threads at all - which may be desirable for + the sole purpose of preserving system resources in the case where the scheduler + instance only exists in order to schedule jobs, but which will never execute + jobs (e.g. will never have Start() called on it). + + Wayne Fay + + + + Initializes a new instance of the class. + + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + Shutdowns this instance. + + + + + Called by the QuartzScheduler to inform the + that it should free up all of it's resources because the scheduler is + shutting down. + + + + + + Execute the given in the next + available . + + + + + The implementation of this interface should not throw exceptions unless + there is a serious problem (i.e. a serious misconfiguration). If there + are no available threads, rather it should either queue the Runnable, or + block until a thread is available, depending on the desired strategy. + + + + + Determines the number of threads that are currently available in in + the pool. Useful for determining the number of times + can be called before returning + false. + + + the number of currently available threads + + + The implementation of this method should block until there is at + least one available thread. + + + + + Gets the log. + + The log. + + + + Gets the size of the pool. + + The size of the pool. + + + + A simple class (structure) used for returning execution-time data from the + JobStore to the . + + + James House + + + + Initializes a new instance of the class. + + The job. + The trigger. + The calendar. + if set to true [job is recovering]. + The fire time. + The scheduled fire time. + The previous fire time. + The next fire time. + + + + Gets the job detail. + + The job detail. + + + + Gets the trigger. + + The trigger. + + + + Gets the calendar. + + The calendar. + + + + Gets a value indicating whether this is recovering. + + true if recovering; otherwise, false. + + + + Returns the UTC fire time. + + + + + Gets the next UTC fire time. + + The next fire time. + Returns the nextFireTimeUtc. + + + + Gets the previous UTC fire time. + + The previous fire time. + Returns the previous fire time. + + + + Returns the scheduled UTC fire time. + + + + + DateTime related utility methods. + + + + + Assumes that given input is in UTC and sets the kind to be UTC. + Just a precaution if somebody does not set it explicitly. + This only works in .NET Framework 2.0 onwards. + + The datetime to check. + DateTime with kind set to UTC. + + + + Assumes that given input is in UTC and sets the kind to be UTC. + Just a precaution if somebody does not set it explicitly. + + The datetime to check. + DateTime with kind set to UTC. + + + + Manages a collection of IDbProviders, and provides transparent access + to their database. + + + James House + Sharada Jambula + Mohammad Rezaei + + + + Private constructor + + + + + Adds the connection provider. + + Name of the data source. + The provider. + + + + Get a database connection from the DataSource with the given name. + + a database connection + + + + Shuts down database connections from the DataSource with the given name, + if applicable for the underlying provider. + + a database connection + + + + Gets the db provider. + + Name of the ds. + + + + + Get the class instance. + + an instance of this class + + + + + An implementation of that wraps another + and flags itself 'dirty' when it is modified. + + James House + + + + Create a DirtyFlagMap that 'wraps' a . + + + + + Create a DirtyFlagMap that 'wraps' a that has the + given initial capacity. + + + + + Create a DirtyFlagMap that 'wraps' a that has the + given initial capacity and load factor. + + + + + Creates a new object that is a copy of the current instance. + + + A new object that is a copy of this instance. + + + + + When implemented by a class, removes all elements from the . + + + The is read-only. + + + + + When implemented by a class, determines whether the contains an element with the specified key. + + The key to locate in the . + + if the contains an element with the key; otherwise, . + + + is . + + + + When implemented by a class, removes the element with the + specified key from the . + + The key of the element to remove. + + is . + + The is read-only. + -or- + The has a fixed size. + + + + + When implemented by a class, returns an + for the . + + + An for the . + + + + + When implemented by a class, adds an element with the provided key and value to the . + + The to use as the key of the element to add. + The to use as the value of the element to add. + is . + + An element with the same key already exists in the . + + + The is read-only. + -or- + The has a fixed size. + + + + + When implemented by a class, copies the elements of + the to an , starting at a particular index. + + The one-dimensional that is the destination of the elements copied from . The must have zero-based indexing. + The zero-based index in at which copying begins. + + is . + + is less than zero. + + + is multidimensional. + -or- + + is equal to or greater than the length of . + -or- + The number of elements in the source is greater than the available space from to the end of the destination . + + The type of the source cannot be cast automatically to the type of the destination . + + + + Clear the 'dirty' flag (set dirty flag to ). + + + + + Determines whether the specified obj contains value. + + The obj. + + true if the specified obj contains value; otherwise, false. + + + + + Gets the entries as a set. + + + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + if the specified is equal to the + current ; otherwise, . + + + + + Serves as a hash function for a particular type, suitable + for use in hashing algorithms and data structures like a hash table. + + + A hash code for the current . + + + + + Gets keyset for this map. + + + + + + Puts the value behind a specified key. + + The key. + The val. + + + + + Puts all. + + The t. + + + + Determine whether the is flagged dirty. + + + + + Get a direct handle to the underlying Map. + + + + + Gets a value indicating whether this instance is empty. + + true if this instance is empty; otherwise, false. + + + + Gets or sets the with the specified key. + + + + + + When implemented by a class, gets the number of + elements contained in the . + + + + + + When implemented by a class, gets an containing the values in the . + + + + + + When implemented by a class, gets an containing the keys of the . + + + + + + When implemented by a class, gets a value indicating whether the + is read-only. + + + + + + When implemented by a class, gets a value indicating whether the + has a fixed size. + + + + + + When implemented by a class, gets an object that + can be used to synchronize access to the . + + + + + + When implemented by a class, gets a value + indicating whether access to the is synchronized + (thread-safe). + + + + + + Utility class for file handling related things. + + + + + Resolves file to actual file if for example relative '~' used. + + File name to check + Expanded file name or actual no resolving was done. + + + + object representing a job or trigger key. + + Jeffrey Wescott + + + + + Utility class for storing two pieces of information together. + + Jeffrey Wescott + + + + Test equality of this object with that. + + object to compare + true if objects are equal, false otherwise + + + + Serves as a hash function for a particular type. is suitable for use in hashing algorithms and data structures like a hash table. + + + A hash code for the current . + + + + + Get or sets the first object in the pair. + + + + + Get or sets the second object in the pair. + + + + Construct a new key with the given name and group. + + + + the name + + + the group + + + +

+ Return the string representation of the key. The format will be: + <group>.<name>. +

+ +
+ the string representation of the key + +
+ + + Get the name portion of the key. + + the name + + + +

+ Get the group portion of the key. +

+ +
+ the group + +
+ + + Wrapper class to access thread local data. + Data is either accessed from thread or HTTP Context's + data if HTTP Context is avaiable. + + Marko Lahma (.NET) + + + + Retrieves an object with the specified name. + + The name of the item. + The object in the call context associated with the specified name or null if no object has been stored previously + + + + Stores a given object and associates it with the specified name. + + The name with which to associate the new item. + The object to store in the call context. + + + + Empties a data slot with the specified name. + + The name of the data slot to empty. + + + + Utility methods that are used to convert objects from one type into another. + + Aleksandar Seovic + + + + Convert the value to the required (if necessary from a string). + + The proposed change value. + + The we must convert to. + + The new value, possibly the result of type conversion. + + + + Determines whether value is assignable to required type. + + The value to check. + Type of the required. + + true if value can be assigned as given type; otherwise, false. + + + + + Instantiates an instance of the type specified. + + The type to instantiate. + + + + + Sets the object properties using reflection. + + The object to set values to. + The properties to set to object. + + + + This is an utility class used to parse the properties. + + James House + + + + Initializes a new instance of the class. + + The props. + + + + Gets the string property. + + The name. + + + + + Gets the string property. + + The name. + The default value. + + + + + Gets the string array property. + + The name. + + + + + Gets the string array property. + + The name. + The default value. + + + + + Gets the boolean property. + + The name. + + + + + Gets the boolean property. + + The name. + if set to true [defaultValue]. + + + + + Gets the byte property. + + The name. + + + + + Gets the byte property. + + The name. + The default value. + + + + + Gets the char property. + + The name. + + + + + Gets the char property. + + The name. + The default value. + + + + + Gets the double property. + + The name. + + + + + Gets the double property. + + The name. + The default value. + + + + + Gets the float property. + + The name. + + + + + Gets the float property. + + The name. + The default value. + + + + + Gets the int property. + + The name. + + + + + Gets the int property. + + The name. + The default value. + + + + + Gets the int array property. + + The name. + + + + + Gets the int array property. + + The name. + The default value. + + + + + Gets the long property. + + The name. + + + + + Gets the long property. + + The name. + The def. + + + + + Gets the TimeSpan property. + + The name. + The def. + + + + + Gets the short property. + + The name. + + + + + Gets the short property. + + The name. + The default value. + + + + + Gets the property groups. + + The prefix. + + + + + Gets the property group. + + The prefix. + + + + + Gets the property group. + + The prefix. + if set to true [strip prefix]. + + + + + Get all properties that start with the given prefix. + + The prefix for which to search. If it does not end in a "." then one will be added to it for search purposes. + Whether to strip off the given in the result's keys. + Optional array of fully qualified prefixes to exclude. For example if is "a.b.c", then might be "a.b.c.ignore". + Group of that start with the given prefix, optionally have that prefix removed, and do not include properties that start with one of the given excluded prefixes. + + + + Reads the properties from assembly (embedded resource). + + The file name to read resources from. + + + + + Reads the properties from file system. + + The file name to read resources from. + + + + + Gets the underlying properties. + + The underlying properties. + + + + An implementation of that wraps another + and flags itself 'dirty' when it is modified, enforces that all keys are + strings. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The initial capacity. + + + + Initializes a new instance of the class. + + The initial capacity. + The load factor. + + + + Gets the keys. + + + + + + Adds the name-value pairs in the given to the . +

+ All keys must be s, and all values must be serializable. +

+
+
+ + + Adds the given value to the 's + data map. + + + + + Adds the given value to the 's + data map. + + + + + Adds the given value to the 's + data map. + + + + + Adds the given value to the 's + data map. + + + + + Adds the given value to the 's + data map. + + + + + Adds the given value to the 's + data map. + + + + + Adds the given value to the 's + data map. + + + + + Adds the given serializable object value to the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Object representing a job or trigger key. + + James House + + + + Construct a new TriggerStatus with the status name and nextFireTime. + + The trigger's status + The next UTC time the trigger will fire + + + + Return the string representation of the TriggerStatus. + + + + + Gets or sets the job key. + + The job key. + + + + Gets or sets the key. + + The key. + + + + Get the name portion of the key. + + the name + + + + Get the group portion of the key. + + the group + + + + Wraps a . + + Chris Bonham + + + + Gets or sets the name of the calendar. + + The name of the calendar. + + + + Gets or sets the name of the class. + + The name of the class. + + + + Gets or sets the calendar. + + The calendar. + + + + Gets or sets a description for the instance - may be + useful for remembering/displaying the purpose of the calendar, though + the description has no meaning to Quartz. + + + + + + Set a new base calendar or remove the existing one. + + + + + + Wraps a and . + + Chris Bonham + James House + + + + Adds a trigger to this bundle. + + The trigger. + + + + Removes the given trigger from this bundle. + + The trigger. + + + + Gets or sets the job detail. + + The job detail. + + + + Gets or sets the triggers associated with this bundle. + + The triggers. + + + + Gets the name of the bundle. + + The name. + + + + Gets the full name. + + The full name. + + + + Gets a value indicating whether this is valid. + + true if valid; otherwise, false. + + + + Parses an XML file that declares Jobs and their schedules (Triggers). + + +

+ The xml document must conform to the format defined in + "job_scheduling_data.xsd" +

+ +

+ After creating an instance of this class, you should call one of the + functions, after which you may call the + function to get a handle to the defined Jobs and Triggers, which can then be + scheduled with the . Alternatively, you could call + the function to do all of this + in one step. +

+ +

+ The same instance can be used again and again, with the list of defined Jobs + being cleared each time you call a method, + however a single instance is not thread-safe. +

+
+ Chris Bonham + James House + Marko Lahma (.NET) +
+ + + XML Schema dateTime datatype format. +

+ See + http://www.w3.org/TR/2001/REC-xmlschema-2-20010502/#dateTime +

+
+
+ + + Constructor for JobSchedulingDataProcessor. + + + + + Constructor for JobSchedulingDataProcessor. + + whether or not to validate XML. + whether or not to validate XML schema. + + + + Process the xml file in the default location (a file named + "quartz_jobs.xml" in the current working directory). + + + + + Process the xml file named . + + meta data file name. + + + + Process the xmlfile named with the given system + ID. + + Name of the file. + The system id. + + + + Process the xmlfile named with the given system + ID. + + The stream. + The system id. + + + + Process the xml file in the default location, and schedule all of the + jobs defined within it. + + + + + Process the xml file in the given location, and schedule all of the + jobs defined within it. + + meta data file name. + The scheduler. + if set to true overwrite existing jobs. + + + + Process the xml file in the given location, and schedule all of the + jobs defined within it. + + Name of the file. + The system id. + The sched. + if set to true [over write existing jobs]. + + + + Add the Jobs and Triggers defined in the given map of + s to the given scheduler. + + The job bundles. + The sched. + if set to true [over write existing jobs]. + + + + Returns a for the job name. + + The name. + + a for the job name. + + + + + Returns an from the fileName as a resource. + + Name of the file. + + an from the fileName as a resource. + + + + + Schedules a given job and trigger (both wrapped by a ). + + job wrapper. + + if the Job or Trigger cannot be added to the Scheduler, or + there is an internal Scheduler error. + + + + + Schedules a given job and trigger (both wrapped by a ). + + The job. + The sched. + if set to true [local over write existing jobs]. + + if the Job or Trigger cannot be added to the Scheduler, or + there is an internal Scheduler error. + + + + + Adds a scheduled job. + + The job. + + + + Adds a calendar. + + The sched. + calendar bundle. + SchedulerException if the Calendar cannot be added to the Scheduler, or + + + + Adds a detected validation exception. + + The exception. + + + + Resets the the number of detected validation exceptions. + + + + + Throws a ValidationException if the number of validationExceptions + detected is greater than zero. + + + DTD validation exception. + + + + + Gets or sets whether to overwrite existing jobs. + + + + + Gets the log. + + The log. + + + + Returns a of scheduled jobs. +

+ The key is the job name and the value is a + containing the and . +

+
+ a of scheduled jobs. + +
+ + + Helper class to map constant names to their values. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Reports JobSchedulingDataProcessor validation exceptions. + + Chris Bonham + + + + Constructor for ValidationException. + + + + + Constructor for ValidationException. + + exception message. + + + + Constructor for ValidationException. + + collection of validation exceptions. + + + + Gets the validation exceptions. + + The validation exceptions. + + + + Returns the detail message string. + + + + + An exception that is thrown to indicate that there has been a critical + failure within the scheduler's core services (such as loss of database + connectivity). + + James House + + + + Create a with the given message. + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + Provides a parser and evaluator for unix-like cron expressions. Cron + expressions provide the ability to specify complex time combinations such as + "At 8:00am every Monday through Friday" or "At 1:30am every + last Friday of the month". + + +

+ Cron expressions are comprised of 6 required fields and one optional field + separated by white space. The fields respectively are described as follows: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Name Allowed Values Allowed Special Characters
Seconds 0-59 , - /// /
Minutes 0-59 , - /// /
Hours 0-23 , - /// /
Day-of-month 1-31 , - /// ? / L W C
Month 1-12 or JAN-DEC , - /// /
Day-of-Week 1-7 or SUN-SAT , - /// ? / L #
Year (Optional) empty, 1970-2099 , - /// /
+

+ The '*' character is used to specify all values. For example, "*" + in the minute field means "every minute". +

+

+ The '?' character is allowed for the day-of-month and day-of-week fields. It + is used to specify 'no specific value'. This is useful when you need to + specify something in one of the two fields, but not the other. +

+

+ The '-' character is used to specify ranges For example "10-12" in + the hour field means "the hours 10, 11 and 12". +

+

+ The ',' character is used to specify additional values. For example + "MON,WED,FRI" in the day-of-week field means "the days Monday, + Wednesday, and Friday". +

+

+ The '/' character is used to specify increments. For example "0/15" + in the seconds field means "the seconds 0, 15, 30, and 45". And + "5/15" in the seconds field means "the seconds 5, 20, 35, and + 50". Specifying '*' before the '/' is equivalent to specifying 0 is + the value to start with. Essentially, for each field in the expression, there + is a set of numbers that can be turned on or off. For seconds and minutes, + the numbers range from 0 to 59. For hours 0 to 23, for days of the month 0 to + 31, and for months 1 to 12. The "/" character simply helps you turn + on every "nth" value in the given set. Thus "7/6" in the + month field only turns on month "7", it does NOT mean every 6th + month, please note that subtlety. +

+

+ The 'L' character is allowed for the day-of-month and day-of-week fields. + This character is short-hand for "last", but it has different + meaning in each of the two fields. For example, the value "L" in + the day-of-month field means "the last day of the month" - day 31 + for January, day 28 for February on non-leap years. If used in the + day-of-week field by itself, it simply means "7" or + "SAT". But if used in the day-of-week field after another value, it + means "the last xxx day of the month" - for example "6L" + means "the last friday of the month". When using the 'L' option, it + is important not to specify lists, or ranges of values, as you'll get + confusing results. +

+

+ The 'W' character is allowed for the day-of-month field. This character + is used to specify the weekday (Monday-Friday) nearest the given day. As an + example, if you were to specify "15W" as the value for the + day-of-month field, the meaning is: "the nearest weekday to the 15th of + the month". So if the 15th is a Saturday, the trigger will fire on + Friday the 14th. If the 15th is a Sunday, the trigger will fire on Monday the + 16th. If the 15th is a Tuesday, then it will fire on Tuesday the 15th. + However if you specify "1W" as the value for day-of-month, and the + 1st is a Saturday, the trigger will fire on Monday the 3rd, as it will not + 'jump' over the boundary of a month's days. The 'W' character can only be + specified when the day-of-month is a single day, not a range or list of days. +

+

+ The 'L' and 'W' characters can also be combined for the day-of-month + expression to yield 'LW', which translates to "last weekday of the + month". +

+

+ The '#' character is allowed for the day-of-week field. This character is + used to specify "the nth" XXX day of the month. For example, the + value of "6#3" in the day-of-week field means the third Friday of + the month (day 6 = Friday and "#3" = the 3rd one in the month). + Other examples: "2#1" = the first Monday of the month and + "4#5" = the fifth Wednesday of the month. Note that if you specify + "#5" and there is not 5 of the given day-of-week in the month, then + no firing will occur that month. If the '#' character is used, there can + only be one expression in the day-of-week field ("3#1,6#3" is + not valid, since there are two expressions). +

+

+ +

+

+ The legal characters and the names of months and days of the week are not + case sensitive. +

+

+ NOTES: +

    +
  • Support for specifying both a day-of-week and a day-of-month value is + not complete (you'll need to use the '?' character in one of these fields). +
  • +
  • Overflowing ranges is supported - that is, having a larger number on + the left hand side than the right. You might do 22-2 to catch 10 o'clock + at night until 2 o'clock in the morning, or you might have NOV-FEB. It is + very important to note that overuse of overflowing ranges creates ranges + that don't make sense and no effort has been made to determine which + interpretation CronExpression chooses. An example would be + "0 0 14-6 ? * FRI-MON".
  • +
+

+
+ Sharada Jambula + James House + Contributions from Mads Henderson + Refactoring from CronTrigger to CronExpression by Aaron Craven +
+ + + Field specification for second. + + + + + Field specification for minute. + + + + + Field specification for hour. + + + + + Field specification for day of month. + + + + + Field specification for month. + + + + + Field specification for day of week. + + + + + Field specification for year. + + + + + Field specification for all wildcard value '*'. + + + + + Field specification for not specified value '?'. + + + + + Field specification for wildcard '*'. + + + + + Field specification for no specification at all '?'. + + + + + Seconds. + + + + + minutes. + + + + + Hours. + + + + + Days of month. + + + + + Months. + + + + + Days of week. + + + + + Years. + + + + + Last day of week. + + + + + Nth day of week. + + + + + Last day of month. + + + + + Nearest weekday. + + + + + Calendar day of week. + + + + + Calendar day of month. + + + + + Expression parsed. + + + + + Constructs a new based on the specified + parameter. + + + String representation of the cron expression the new object should represent + + + + + + Indicates whether the given date satisfies the cron expression. + + + Note that milliseconds are ignored, so two Dates falling on different milliseconds + of the same second will always have the same result here. + + The date to evaluate. + a boolean indicating whether the given date satisfies the cron expression + + + + Returns the next date/time after the given date/time which + satisfies the cron expression. + + the date/time at which to begin the search for the next valid date/time + the next valid date/time + + + + Returns the next date/time after the given date/time which does + not satisfy the expression. + + the date/time at which to begin the search for the next invalid date/time + the next valid date/time + + + + Returns the string representation of the + + The string representation of the + + + + Indicates whether the specified cron expression can be parsed into a + valid cron expression + + the expression to evaluate + a boolean indicating whether the given expression is a valid cron + expression + + + + Builds the expression. + + The expression. + + + + Stores the expression values. + + The position. + The string to traverse. + The type of value. + + + + + Checks the next value. + + The position. + The string to check. + The value. + The type to search. + + + + + Gets the expression summary. + + + + + + Gets the expression set summary. + + The data. + + + + + Skips the white space. + + The i. + The s. + + + + + Finds the next white space. + + The i. + The s. + + + + + Adds to set. + + The val. + The end. + The incr. + The type. + + + + Gets the set of given type. + + The type of set to get. + + + + + Gets the value. + + The v. + The s. + The i. + + + + + Gets the numeric value from string. + + The string to parse from. + The i. + + + + + Gets the month number. + + The string to map with. + + + + + Gets the day of week number. + + The s. + + + + + Gets the time from given time parts. + + The seconds. + The minutes. + The hours. + The day of month. + The month. + + + + + Gets the next fire time after the given time. + + The UTC time to start searching from. + + + + + Creates the date time without milliseconds. + + The time. + + + + + Advance the calendar to the particular hour paying particular attention + to daylight saving problems. + + The date. + The hour. + + + + + Gets the time before. + + The end time. + + + + + NOT YET IMPLEMENTED: Returns the final time that the + will match. + + + + + + Determines whether given year is a leap year. + + The year. + + true if the specified year is a leap year; otherwise, false. + + + + + Gets the last day of month. + + The month num. + The year. + + + + + Creates a new object that is a copy of the current instance. + + + A new object that is a copy of this instance. + + + + + Sets or gets the time zone for which the of this + will be resolved. + + + + + Gets the cron expression string. + + The cron expression string. + + + + Helper class for cron expression handling. + + + + + The value. + + + + + The position. + + + + + A concrete that is used to fire a + at given moments in time, defined with Unix 'cron-like' definitions. + + +

+ For those unfamiliar with "cron", this means being able to create a firing + schedule such as: "At 8:00am every Monday through Friday" or "At 1:30am + every last Friday of the month". +

+ +

+ The format of a "Cron-Expression" string is documented on the + class. +

+ +

+ Here are some full examples:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Expression Meaning
"0 0 12 * * ?"" /> Fire at 12pm (noon) every day" />
"0 15 10 ? * *"" /> Fire at 10:15am every day" />
"0 15 10 * * ?"" /> Fire at 10:15am every day" />
"0 15 10 * * ? *"" /> Fire at 10:15am every day" />
"0 15 10 * * ? 2005"" /> Fire at 10:15am every day during the year 2005" /> +
"0 * 14 * * ?"" /> Fire every minute starting at 2pm and ending at 2:59pm, every day" /> +
"0 0/5 14 * * ?"" /> Fire every 5 minutes starting at 2pm and ending at 2:55pm, every day" /> +
"0 0/5 14,18 * * ?"" /> Fire every 5 minutes starting at 2pm and ending at 2:55pm, AND fire every 5 minutes starting at 6pm and ending at 6:55pm, every day" /> +
"0 0-5 14 * * ?"" /> Fire every minute starting at 2pm and ending at 2:05pm, every day" /> +
"0 10,44 14 ? 3 WED"" /> Fire at 2:10pm and at 2:44pm every Wednesday in the month of March." /> +
"0 15 10 ? * MON-FRI"" /> Fire at 10:15am every Monday, Tuesday, Wednesday, Thursday and Friday" /> +
"0 15 10 15 * ?"" /> Fire at 10:15am on the 15th day of every month" /> +
"0 15 10 L * ?"" /> Fire at 10:15am on the last day of every month" /> +
"0 15 10 ? * 6L"" /> Fire at 10:15am on the last Friday of every month" /> +
"0 15 10 ? * 6L"" /> Fire at 10:15am on the last Friday of every month" /> +
"0 15 10 ? * 6L 2002-2005"" /> Fire at 10:15am on every last friday of every month during the years 2002, 2003, 2004 and 2005" /> +
"0 15 10 ? * 6#3"" /> Fire at 10:15am on the third Friday of every month" /> +
+

+ +

+ Pay attention to the effects of '?' and '*' in the day-of-week and + day-of-month fields! +

+ +

+ NOTES: +

    +
  • Support for specifying both a day-of-week and a day-of-month value is + not complete (you'll need to use the '?' character in on of these fields). +
  • +
  • Be careful when setting fire times between mid-night and 1:00 AM - + "daylight savings" can cause a skip or a repeat depending on whether the + time moves back or jumps forward.
  • +
+

+
+ + + + Sharada Jambula + James House + Contributions from Mads Henderson +
+ + + The base abstract class to be extended by all triggers. + + +

+ s have a name and group associated with them, which + should uniquely identify them within a single . +

+ +

+ s are the 'mechanism' by which s + are scheduled. Many s can point to the same , + but a single can only point to one . +

+ +

+ Triggers can 'send' parameters/data to s by placing contents + into the on the . +

+
+ + + + + + + James House + Sharada Jambula +
+ + + The default value for priority. + + + + + Remove all s from the . + + + + + Create a with no specified name, group, or . + + + Note that the , and + the and properties + must be set before the can be placed into a + . + + + + + Create a with the given name, and default group. + + + Note that the and + properties must be set before the + can be placed into a . + + The name. + + + + Create a with the given name, and group. + + + Note that the and + properties must be set before the + can be placed into a . + + The name. + if , Scheduler.DefaultGroup will be used. + + + + Create a with the given name, and group. + + The name. + if , Scheduler.DefaultGroup will be used. + Name of the job. + The job group. + ArgumentException + if name is null or empty, or the group is an empty string. + + + + + Add the specified name of a to + the end of the 's list of listeners. + + Name of the listener. + + + + Remove the specified name of a + from the 's list of listeners. + + true if the given name was found in the list, and removed + + + + + This method should not be used by the Quartz client. +

+ Called when the has decided to 'fire' + the trigger (Execute the associated ), in order to + give the a chance to update itself for its next + triggering (if any). +

+ +
+ + +
+ + + This method should not be used by the Quartz client. + + +

+ Called by the scheduler at the time a is first + added to the scheduler, in order to have the + compute its first fire time, based on any associated calendar. +

+ +

+ After this method has been called, + should return a valid answer. +

+
+ + The first time at which the will be fired + by the scheduler, which is also the same value + will return (until after the first firing of the ). + +
+ + + This method should not be used by the Quartz client. + + + Called after the has executed the + associated with the + in order to get the final instruction code from the trigger. + + + is the that was used by the + 's method. + is the thrown by the + , if any (may be null). + + + One of the members. + + + + + + + + + + Used by the to determine whether or not + it is possible for this to fire again. +

+ If the returned value is then the + may remove the from the . +

+
+
+ + + Returns the next time at which the is scheduled to fire. If + the trigger will not fire again, will be returned. Note that + the time returned can possibly be in the past, if the time that was computed + for the trigger to next fire has already arrived, but the scheduler has not yet + been able to fire the trigger (which would likely be due to lack of resources + e.g. threads). + + + The value returned is not guaranteed to be valid until after the + has been added to the scheduler. + + + + + + + Returns the previous time at which the fired. + If the trigger has not yet fired, will be returned. + + + + + Returns the next time at which the will fire, + after the given time. If the trigger will not fire after the given time, + will be returned. + + + + + Validates the misfire instruction. + + The misfire instruction. + + + + + This method should not be used by the Quartz client. +

+ To be implemented by the concrete classes that extend this class. +

+

+ The implementation should update the 's state + based on the MISFIRE_INSTRUCTION_XXX that was selected when the + was created. +

+
+
+ + + This method should not be used by the Quartz client. +

+ The implementation should update the 's state + based on the given new version of the associated + (the state should be updated so that it's next fire time is appropriate + given the Calendar's new settings). +

+
+ + +
+ + + Validates whether the properties of the are + valid for submission into a . + + + + + Return a simple string representation of this object. + + + + + Compare the next fire time of this to that of + another. + + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + + Serves as a hash function for a particular type. is suitable for use in hashing algorithms and data structures like a hash table. + + + A hash code for the current . + + + + + Creates a new object that is a copy of the current instance. + + + A new object that is a copy of this instance. + + + + + Get or sets the name of this . + + If name is null or empty. + + + + Get the group of this . If , Scheduler.DefaultGroup will be used. + + + if group is an empty string. + + + + + Get or set the name of the associated . + + + if jobName is null or empty. + + + + + Gets or sets the name of the associated 's + group. If set with , Scheduler.DefaultGroup will be used. + + ArgumentException + if group is an empty string. + + + + + Returns the 'full name' of the in the format + "group.name". + + + + + Gets the key. + + The key. + + + + Returns the 'full name' of the that the + points to, in the format "group.name". + + + + + Get or set the description given to the instance by + its creator (if any). + + + + + Get or set the with the given name with + this Trigger. Use when setting to dis-associate a Calendar. + + + + + Get or set the that is associated with the + . +

+ Changes made to this map during job execution are not re-persisted, and + in fact typically result in an illegal state. +

+
+
+ + + Whether or not the should be persisted in the + for re-use after program restarts. +

+ If not explicitly set, the default value is . +

+
+
+ + + Returns an array of s containing the names of all + s assigned to the , + in the order in which they should be notified. + + + + + Returns the last UTC time at which the will fire, if + the Trigger will repeat indefinitely, null will be returned. +

+ Note that the return time *may* be in the past. +

+
+
+ + + Get or set the instruction the should be given for + handling misfire situations for this - the + concrete type that you are using will have + defined a set of additional MISFIRE_INSTRUCTION_XXX + constants that may be passed to this method. +

+ If not explicitly set, the default value is . +

+
+ + + + +
+ + + This method should not be used by the Quartz client. +

+ Usable by + implementations, in order to facilitate 'recognizing' instances of fired + s as their jobs complete execution. +

+
+
+ + + Returns the date/time on which the trigger must stop firing. This + defines the final boundary for trigger firings 舒 the trigger will + not fire after to this date and time. If this value is null, no end time + boundary is assumed, and the trigger can continue indefinitely. + + Sets the date/time on which the trigger must stop firing. This defines + the final boundary for trigger firings 舒 the trigger will not + fire after to this date and time. If this value is null, no end time + boundary is assumed, and the trigger can continue indefinitely. + + + + + The time at which the trigger's scheduling should start. May or may not + be the first actual fire time of the trigger, depending upon the type of + trigger and the settings of the other properties of the trigger. However + the first actual first time will not be before this date. + + + Setting a value in the past may cause a new trigger to compute a first + fire time that is in the past, which may cause an immediate misfire + of the trigger. + + + + + Tells whether this Trigger instance can handle events + in millisecond precision. + + + + + The priority of a acts as a tie breaker such that if + two s have the same scheduled fire time, then Quartz + will do its best to give the one with the higher priority first access + to a worker thread. + + + If not explicitly set, the default value is 5. + + + + + + + Gets a value indicating whether this instance has additional properties + that should be considered when for example saving to database. + + + If trigger implementation has additional properties that need to be saved + with base properties you need to make your class override this property with value true. + Returning true will effectively mean that ADOJobStore needs to serialize + this trigger instance to make sure additional properties are also saved. + + + true if this instance has additional properties; otherwise, false. + + + + + Create a with no settings. + + + The start-time will also be set to the current time, and the time zone + will be set the the system's default time zone. + + + + + Create a with the given name and default group. + + + The start-time will also be set to the current time, and the time zone + will be set the the system's default time zone. + + The name. + + + + Create a with the given name and group. + + + The start-time will also be set to the current time, and the time zone + will be set the the system's default time zone. + + The name. + The group. + + + + Create a with the given name, group and + expression. + + + The start-time will also be set to the current time, and the time zone + will be set the the system's default time zone. + + The name. + The group. + The cron expression. + + + + Create a with the given name and group, and + associated with the identified . + + + The start-time will also be set to the current time, and the time zone + will be set the the system's default time zone. + + The name. + The group. + Name of the job. + The job group. + + + + Create a with the given name and group, + associated with the identified , + and with the given "cron" expression. + + + The start-time will also be set to the current time, and the time zone + will be set the the system's default time zone. + + The name. + The group. + Name of the job. + The job group. + The cron expression. + + + + Create a with the given name and group, + associated with the identified , + and with the given "cron" expression resolved with respect to the . + + The name. + The group. + Name of the job. + The job group. + The cron expression. + The time zone. + + + + Create a that will occur at the given time, + until the given end time. +

+ If null, the start-time will also be set to the current time, the time + zone will be set the the system's default. +

+
+ The name. + The group. + Name of the job. + The job group. + The start time. + The end time. + The cron expression. +
+ + + Create a with fire time dictated by the + resolved with respect to the specified + occuring from the until + the given . + + The name. + The group. + Name of the job. + The job group. + The start time. + The end time. + + + + Clones this instance. + + + + + + Returns the next time at which the is scheduled to fire. If + the trigger will not fire again, will be returned. Note that + the time returned can possibly be in the past, if the time that was computed + for the trigger to next fire has already arrived, but the scheduler has not yet + been able to fire the trigger (which would likely be due to lack of resources + e.g. threads). + + + The value returned is not guaranteed to be valid until after the + has been added to the scheduler. + + + + + + + Returns the previous time at which the fired. + If the trigger has not yet fired, will be returned. + + + + + + Sets the next fire time. +

+ This method should not be invoked by client code. +

+
+ The fire time. +
+ + + Sets the previous fire time. +

+ This method should not be invoked by client code. +

+
+ The fire time. +
+ + + Returns the next time at which the will fire, + after the given time. If the trigger will not fire after the given time, + will be returned. + + + + + + + Used by the to determine whether or not + it is possible for this to fire again. +

+ If the returned value is then the + may remove the from the . +

+
+ +
+ + + Validates the misfire instruction. + + The misfire instruction. + + + + + This method should not be used by the Quartz client. +

+ To be implemented by the concrete classes that extend this class. +

+

+ The implementation should update the 's state + based on the MISFIRE_INSTRUCTION_XXX that was selected when the + was created. +

+
+ +
+ + +

+ Determines whether the date and (optionally) time of the given Calendar + instance falls on a scheduled fire-time of this trigger. +

+ +

+ Equivalent to calling . +

+
+ The date to compare. + +
+ + + Determines whether the date and (optionally) time of the given Calendar + instance falls on a scheduled fire-time of this trigger. +

+ Note that the value returned is NOT validated against the related + ICalendar (if any). +

+
+ The date to compare + If set to true, the method will only determine if the + trigger will fire during the day represented by the given Calendar + (hours, minutes and seconds will be ignored). + +
+ + + Called when the has decided to 'fire' + the trigger (Execute the associated ), in order to + give the a chance to update itself for its next + triggering (if any). + + + + + + + Updates the trigger with new calendar. + + The calendar to update with. + The misfire threshold. + + + + Called by the scheduler at the time a is first + added to the scheduler, in order to have the + compute its first fire time, based on any associated calendar. +

+ After this method has been called, + should return a valid answer. +

+
+ + + the first time at which the will be fired + by the scheduler, which is also the same value + will return (until after the first firing of the ). + +
+ + + Gets the expression summary. + + + + + + Gets the next time to fire after the given time. + + The time to compute from. + + + + + NOT YET IMPLEMENTED: Returns the time before the given time + that this will fire. + + The date. + + + + + Gets or sets the cron expression string. + + The cron expression string. + + + + Set the CronExpression to the given one. The TimeZone on the passed-in + CronExpression over-rides any that was already set on the Trigger. + + The cron expression. + + + + Returns the date/time on which the trigger may begin firing. This + defines the initial boundary for trigger firings the trigger + will not fire prior to this date and time. + + + + + + Get or sets the time at which the CronTrigger should quit + repeating - even if repeastCount isn't yet satisfied. + + + + + Sets the time zone for which the of this + will be resolved. + + + If is set after this + property, the TimeZone setting on the CronExpression will "win". However + if is set after this property, the + time zone applied by this method will remain in effect, since the + string cron expression does not carry a time zone! + + The time zone. + + + + Returns the last UTC time at which the will fire, if + the Trigger will repeat indefinitely, null will be returned. +

+ Note that the return time *may* be in the past. +

+
+
+ + + Tells whether this Trigger instance can handle events + in millisecond precision. + + + + + + The interface to be implemented by s that provide a + mechanism for having their execution interrupted. It is NOT a requirment + for jobs to implement this interface - in fact, for most people, none of + their jobs will. + + +

+ The means of actually interrupting the Job must be implemented within the + itself (the method of this + interface is simply a means for the scheduler to inform the + that a request has been made for it to be interrupted). The mechanism that + your jobs use to interrupt themselves might vary between implementations. + However the principle idea in any implementation should be to have the + body of the job's periodically check some flag to + see if an interruption has been requested, and if the flag is set, somehow + abort the performance of the rest of the job's work. An example of + interrupting a job can be found in the java source for the class + Quartz.Examples.Example7.DumbInterruptableJob. It is legal to use + some combination of and + synchronization within and + in order to have the method block until the + signals that it has noticed the set flag. +

+ +

+ If the Job performs some form of blocking I/O or similar functions, you may + want to consider having the method store a + reference to the calling as a member variable. Then the + impplementation of this interfaces method can call + on that Thread. Before attempting this, make + sure that you fully understand what + does and doesn't do. Also make sure that you clear the Job's member + reference to the Thread when the Execute(..) method exits (preferrably in a + block. +

+
+ + + James House +
+ + + Called by the when a user + interrupts the . + + void (nothing) if job interrupt is successful. + + + + Scheduler constants. + + + + + A (possibly) usefull constant that can be used for specifying the group + that and instances belong to. + + + + + A constant group name used internally by the + scheduler - clients should not use the value of this constant + ("MANUAL_TRIGGER") for thename of a 's group. + + + + + A constant group name used internally by the + scheduler - clients should not use the value of this constant + ("RECOVERING_JOBS") for thename of a 's group. + + + + + A constant group name used internally by the + scheduler - clients should not use the value of this constant + ("FAILED_OVER_JOBS") for thename of a 's group. + + + + + A constant key that can be used to retrieve the + name of the original from a recovery trigger's + data map in the case of a job recovering after a failed scheduler + instance. + + + + + + A constant key that can be used to retrieve the + group of the original from a recovery trigger's + data map in the case of a job recovering after a failed scheduler + instance. + + + + + + A constant key that can be used to retrieve the + scheduled fire time of the original from a recovery + trigger's data map in the case of a job recovering after a failed scheduler + instance. + + + + + + Holds state information for instances. + + + instances are stored once when the + is added to a scheduler. They are also re-persisted after every execution of + instances. +

+ instances can also be stored with a + . This can be useful in the case where you have a Job + that is stored in the scheduler for regular/repeated use by multiple + Triggers, yet with each independent triggering, you want to supply the + Job with different data inputs. +

+

+ The passed to a Job at execution time + also contains a convenience that is the result + of merging the contents of the trigger's JobDataMap (if any) over the + Job's JobDataMap (if any). +

+
+ + + + + James House +
+ + + Create an empty . + + + + + Create a with the given data. + + + + + Adds the given value as a string version to the + 's data map. + + + + + Adds the given value as a string version to the + 's data map. + + + + + Adds the given value as a string version to the + 's data map. + + + + + Adds the given value as a string version to the + 's data map. + + + + + Adds the given value as a string version to the + 's data map. + + + + + Adds the given value as a string version to the + 's data map. + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the + . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Gets the date time. + + The key. + + + + + Gets the value behind the specified key. + + The key. + + + + + Conveys the detail properties of a given instance. + + + Quartz does not store an actual instance of a type, but + instead allows you to define an instance of one, through the use of a . +

+ s have a name and group associated with them, which + should uniquely identify them within a single . +

+

+ s are the 'mechanism' by which s + are scheduled. Many s can point to the same , + but a single can only point to one . +

+
+ + + + + James House + Sharada Jambula +
+ + + Create a with no specified name or group, and + the default settings of all the other properties. +

+ Note that the , and + properties must be set before the job can be + placed into a . +

+
+
+ + + Create a with the given name, default group, and + the default settings of all the other properties. + If , Scheduler.DefaultGroup will be used. + + + If name is null or empty, or the group is an empty string. + + + + + Create a with the given name, and group, and + the default settings of all the other properties. + If , Scheduler.DefaultGroup will be used. + + + If name is null or empty, or the group is an empty string. + + + + + Create a with the given name, and group, and + the given settings of all the other properties. + + The name. + if , Scheduler.DefaultGroup will be used. + Type of the job. + if set to true, job will be volatile. + if set to true, job will be durable. + if set to true, job will request recovery. + + ArgumentException if name is null or empty, or the group is an empty string. + + + + + Validates whether the properties of the are + valid for submission into a . + + + + + Add the specified name of a to the + end of the 's list of listeners. + + + + + Remove the specified name of a from + the 's list of listeners. + + true if the given name was found in the list, and removed + + + + Return a simple string representation of this object. + + + + + Creates a new object that is a copy of the current instance. + + + A new object that is a copy of this instance. + + + + + Determines whether the specified detail is equal to this instance. + + The detail to examine. + + true if the specified detail is equal; otherwise, false. + + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + if the specified is equal to the + current ; otherwise, . + + + + + Checks equality between given job detail and this instance. + + The detail to compare this instance with. + + + + + Serves as a hash function for a particular type, suitable + for use in hashing algorithms and data structures like a hash table. + + + A hash code for the current . + + + + + Get or sets the name of this . + + + if name is null or empty. + + + + + Get or sets the group of this . + If , will be used. + + + If the group is an empty string. + + + + + Returns the 'full name' of the in the format + "group.name". + + + + + Gets the key. + + The key. + + + + Get or set the description given to the instance by its + creator (if any). + + + May be useful for remembering/displaying the purpose of the job, though the + description has no meaning to Quartz. + + + + + Get or sets the instance of that will be executed. + + + if jobType is null or the class is not a . + + + + + Get or set the that is associated with the . + + + + + Set whether or not the the should re-Execute + the if a 'recovery' or 'fail-over' situation is + encountered. +

+ If not explicitly set, the default value is . +

+
+ +
+ + + Whether or not the should not be persisted in the + for re-use after program + restarts. +

+ If not explicitly set, the default value is . +

+
+ if the should be garbage + collected along with the . + +
+ + + Whether or not the should remain stored after it is + orphaned (no s point to it). +

+ If not explicitly set, the default value is . +

+
+ + if the Job should remain persisted after + being orphaned. + +
+ + + Whether or not the implements the interface . + + + + + Gets or sets an array of s containing the names of all + s assigned to the , + in the order in which they should be notified. Setting the array + clears any listener names that were in the list. + + + + + A context bundle containing handles to various environment information, that + is given to a instance as it is + executed, and to a instance after the + execution completes. + + +

+ The found on this object (via the + method) serves as a convenience - + it is a merge of the found on the + and the one found on the , with + the value in the latter overriding any same-named values in the former. + It is thus considered a 'best practice' that the Execute code of a Job + retrieve data from the JobDataMap found on this object NOTE: Do not + expect value 'set' into this JobDataMap to somehow be set back onto a + 's own JobDataMap. +

+ +

+ s are also returned from the + + method. These are the same instances as those past into the jobs that are + currently executing within the scheduler. The exception to this is when your + application is using Quartz remotely (i.e. via RMI) - in which case you get + a clone of the s, and their references to + the and instances have been lost (a + clone of the is still available - just not a handle + to the job instance that is running). +

+
+ + + + + + James House +
+ + + Create a JobExcecutionContext with the given context data. + + + + + Increments the refire count. + + + + + Returns a that represents the current . + + + A that represents the current . + + + + + Put the specified value into the context's data map with the given key. + Possibly useful for sharing data between listeners and jobs. +

+ NOTE: this data is volatile - it is lost after the job execution + completes, and all TriggerListeners and JobListeners have been + notified. +

+
+ + + + +
+ + + Get the value with the given key from the context's data map. + + + + + + + Get a handle to the instance that fired the + . + + + + + Get a handle to the instance that fired the + . + + + + + Get a handle to the referenced by the + instance that fired the . + + + + + If the is being re-executed because of a 'recovery' + situation, this method will return . + + + + + Gets the refire count. + + The refire count. + + + + Get the convenience of this execution context. + + +

+ The found on this object serves as a convenience - + it is a merge of the found on the + and the one found on the , with + the value in the latter overriding any same-named values in the former. + It is thus considered a 'best practice' that the Execute code of a Job + retrieve data from the JobDataMap found on this object. +

+ +

NOTE: Do not expect value 'set' into this JobDataMap to somehow be + set back onto a 's own JobDataMap. +

+ +

+ Attempts to change the contents of this map typically result in an + illegal state. +

+ +
+
+ + + Get the associated with the . + + + + + Get the instance of the that was created for this + execution. +

+ Note: The Job instance is not available through remote scheduler + interfaces. +

+
+
+ + + The actual time the trigger fired. For instance the scheduled time may + have been 10:00:00 but the actual fire time may have been 10:00:03 if + the scheduler was too busy. + + Returns the fireTimeUtc. + + + + + The scheduled time the trigger fired for. For instance the scheduled + time may have been 10:00:00 but the actual fire time may have been + 10:00:03 if the scheduler was too busy. + + Returns the scheduledFireTimeUtc. + + + + + Gets the previous fire time. + + The previous fire time. + + + + Gets the next fire time. + + The next fire time. + + + + Returns the result (if any) that the set before its + execution completed (the type of object set as the result is entirely up + to the particular job). + + +

+ The result itself is meaningless to Quartz, but may be informative + to s or + s that are watching the job's + execution. +

+ + Set the result (if any) of the 's execution (the type of + object set as the result is entirely up to the particular job). + +

+ The result itself is meaningless to Quartz, but may be informative + to s or + s that are watching the job's + execution. +

+
+
+ + + The amount of time the job ran for. The returned + value will be until the job has actually completed (or thrown an + exception), and is therefore generally only useful to + s and s. + + + + + An exception that can be thrown by a + to indicate to the Quartz that an error + occured while executing, and whether or not the requests + to be re-fired immediately (using the same , + or whether it wants to be unscheduled. + + + Note that if the flag for 'refire immediately' is set, the flags for + unscheduling the Job are ignored. + + + + + James House + + + + Create a JobExcecutionException, with the 're-fire immediately' flag set + to . + + + + + Create a JobExcecutionException, with the given cause. + + The cause. + + + + Create a JobExcecutionException, with the given message. + + + + + Initializes a new instance of the class. + + The message. + The original cause. + + + + Create a JobExcecutionException with the 're-fire immediately' flag set + to the given value. + + + + + Create a JobExcecutionException with the given underlying exception, and + the 're-fire immediately' flag set to the given value. + + + + + Create a JobExcecutionException with the given message, and underlying + exception, and the 're-fire immediately' flag set to the given value. + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + Creates and returns a string representation of the current exception. + + + A string representation of the current exception. + + + + + + Gets or sets a value indicating whether to unschedule firing trigger. + + + true if firing trigger should be unscheduled; otherwise, false. + + + + + Gets or sets a value indicating whether to unschedule all triggers. + + + true if all triggers should be unscheduled; otherwise, false. + + + + + Gets or sets a value indicating whether to refire immediately. + + true if to refire immediately; otherwise, false. + + + + Misfire instructions. + + + + + Instruction not set (yet). + + + + + Use smart policy. + + + + + Misfire policy settings for SimpleTrigger. + + + + + Instructs the that upon a mis-fire + situation, the wants to be fired + now by . +

+ NOTE: This instruction should typically only be used for + 'one-shot' (non-repeating) Triggers. If it is used on a trigger with a + repeat count > 0 then it is equivalent to the instruction + . +

+
+
+ + + Instructs the that upon a mis-fire + situation, the wants to be + re-scheduled to 'now' (even if the associated + excludes 'now') with the repeat count left as-is. This does obey the + end-time however, so if 'now' is after the + end-time the will not fire again. + + +

+ NOTE: Use of this instruction causes the trigger to 'forget' + the start-time and repeat-count that it was originally setup with (this + is only an issue if you for some reason wanted to be able to tell what + the original values were at some later time). +

+
+
+ + + Instructs the that upon a mis-fire + situation, the wants to be + re-scheduled to 'now' (even if the associated + excludes 'now') with the repeat count set to what it would be, if it had + not missed any firings. This does obey the end-time + however, so if 'now' is after the end-time the will + not fire again. + +

+ NOTE: Use of this instruction causes the trigger to 'forget' + the start-time and repeat-count that it was originally setup with. + Instead, the repeat count on the trigger will be changed to whatever + the remaining repeat count is (this is only an issue if you for some + reason wanted to be able to tell what the original values were at some + later time). +

+ +

+ NOTE: This instruction could cause the + to go to the 'COMPLETE' state after firing 'now', if all the + repeat-fire-times where missed. +

+
+
+ + + Instructs the that upon a mis-fire + situation, the wants to be + re-scheduled to the next scheduled time after 'now' - taking into + account any associated , and with the + repeat count set to what it would be, if it had not missed any firings. + + + NOTE/WARNING: This instruction could cause the + to go directly to the 'COMPLETE' state if all fire-times where missed. + + + + + Instructs the that upon a mis-fire + situation, the wants to be + re-scheduled to the next scheduled time after 'now' - taking into + account any associated , and with the + repeat count left unchanged. + + +

+ NOTE/WARNING: This instruction could cause the + to go directly to the 'COMPLETE' state if all the end-time of the trigger + has arrived. +

+
+
+ + + misfire instructions for CronTrigger + + + + + Instructs the that upon a mis-fire + situation, the wants to be fired now + by . + + + + + Instructs the that upon a mis-fire + situation, the wants to have it's + next-fire-time updated to the next time in the schedule after the + current time (taking into account any associated , + but it does not want to be fired now. + + + + + misfire instructions for NthIncludedDayTrigger + + + + + Instructs the that upon a mis-fire situation, the + wants to be fired now by the + + + + + + Instructs the that upon a mis-fire situation, the + wants to have + nextFireTime updated to the next time in the schedule after + the current time, but it does not want to be fired now. + + + + + A trigger which fires on the Nth day of every interval type + , or + that is not excluded by the associated + calendar. + + + When determining what the Nth day of the month or year + is, will skip excluded days on the + associated calendar. This would commonly be used in an Nth + business day situation, in which the user wishes to fire a particular job on + the Nth business day (i.e. the 5th business day of + every month). Each also has an associated + which indicates at what time of day the trigger is + to fire. +

+ All s default to a monthly interval type + (fires on the Nth day of every month) with N = 1 (first + non-excluded day) and set to 12:00 PM (noon). These + values can be changed using the , , and + methods. Users may also want to note the + and + methods. +

+

+ Take, for example, the following calendar: +

+ + July August September + Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa + 1 W 1 2 3 4 5 W 1 2 W + W H 5 6 7 8 W W 8 9 10 11 12 W W H 6 7 8 9 W + W 11 12 13 14 15 W W 15 16 17 18 19 W W 12 13 14 15 16 W + W 18 19 20 21 22 W W 22 23 24 25 26 W W 19 20 21 22 23 W + W 25 26 27 28 29 W W 29 30 31 W 26 27 28 29 30 + W + + Where W's represent weekend days, and H's represent holidays, all of which + are excluded on a calendar associated with an + with n=5 and + intervalType=IntervalTypeMonthly. In this case, the trigger + would fire on the 8th of July (because of the July 4 holiday), + the 5th of August, and the 8th of September (because + of Labor Day). +
+ Aaron Craven +
+ + + Indicates a monthly trigger type (fires on the Nth included + day of every month). + + + + indicates a yearly trigger type (fires on the Nth included + day of every year). + + + + + Indicates a weekly trigger type (fires on the Nth included + day of every week). When using this interval type, care must be taken + not to think of the value of as an analog to + . Such a comparison can only + be drawn when there are no calendars associated with the trigger. To + illustrate, consider an with + n = 3 which is associated with a Calendar excluding + non-weekdays. The trigger would fire on the 3rd + included day of the week, which would be 4th + actual day of the week. + + + + + Create an with no specified name, + group, or . This will result initially in a + default monthly trigger that fires on the first day of every month at + 12:00 PM (n = 1, + intervalType=, + fireAtTime="12:00"). + + + Note that , , + , and , must be + called before the can be placed into + a . + + + + + Create an with the given name and + default group but no specified . This will result + initially in a default monthly trigger that fires on the first day of + every month at 12:00 PM (=1, + intervalType=, + fireAtTime=12:00"). +

+ Note that and must + be called before the can be placed + into a . +

+
+ the name for the +
+ + + Create an with the given name and + group but no specified . This will result + initially in a default monthly trigger that fires on the first day of + every month at 12:00 PM (=1, + intervalType=, + fireAtTime=12:00"). +

+ Note that and must + be called before the can be placed + into a . +

+
+ the name for the + + the group for the + +
+ + + Create an with the given name and + group and the specified . This will result + initially in a default monthly trigger that fires on the first day of + every month at 12:00 PM (=1, + intervalType=, + fireAtTime="12:00"). + + The name for the . + The group for the . + The name of the job to associate with the . + The group containing the job to associate with the . + + + + Returns the next UTC time at which the + will fire. If the trigger will not fire again, will be + returned. + + +

+ Because of the conceptual design of , + it is not always possible to decide with certainty that the trigger + will never fire again. Therefore, it will search for the next + fire time up to a given cutoff. These cutoffs can be changed by using the + property. The default cutoff is 12 + of the intervals specified by intervalType. +

+

+ The returned value is not guaranteed to be valid until after + the trigger has been added to the scheduler. +

+
+ the next fire time for the trigger + +
+ + + Returns the previous UTC time at which the + fired. If the trigger has not yet + fired, will be returned. + + the previous fire time for the trigger + + + + Returns the first time the will fire + after the specified date. + + +

+ Because of the conceptual design of , + it is not always possible to decide with certainty that the trigger + will never fire again. Therefore, it will search for the next + fire time up to a given cutoff. These cutoffs can be changed by using the + property. The default cutoff is 12 + of the intervals specified by intervalType. +

+

+ Therefore, for triggers with intervalType = + , if the trigger + will not fire within 12 + weeks after the given date/time, will be returned. For + triggers with intervalType = + + , if the trigger will not fire within 12 + months after the given date/time, will be returned. + For triggers with intervalType = + + , if the trigger will not fire within 12 + years after the given date/time, will be returned. In + all cases, if the trigger will not fire before , + will be returned. +

+
+ The time after which to find the nearest fire time. + This argument is treated as exclusive 舒 that is, + if afterTime is a valid fire time for the trigger, it + will not be returned as the next fire time. + + + the first time the trigger will fire following the specified date + +
+ + + Called when the has decided to 'fire' the trigger + (Execute the associated ), in order to give the + a chance to update itself for its next triggering + (if any). + + + + + Called by the scheduler at the time a is first + added to the scheduler, in order to have the + compute its first fire time, based on any associated calendar. +

+ After this method has been called, + should return a valid answer. +

+ +
+ the first time at which the will be fired + by the scheduler, which is also the same value + will return (until after the first + firing of the ). + +
+ + + Called after the has executed the + associated with the in order + to get the final instruction code from the trigger. + + + The that was used by the + 's method. + + + The thrown by the + , if any (may be ) + + one of the Trigger.INSTRUCTION_XXX constants. + + + + + Used by the to determine whether or not it is + possible for this to fire again. + ' + +

+ If the returned value is then the + may remove the from the + +

+
+ + A boolean indicator of whether the trigger could potentially fire + again. + +
+ + + Indicates whether is a valid misfire + instruction for this . + + Whether is valid. + + + Updates the 's state based on the + MisfireInstruction that was selected when the + was created +

+ If the misfire instruction is set to MISFIRE_INSTRUCTION_SMART_POLICY, + then the instruction will be interpreted as + . +

+
+ a new or updated calendar to use for the trigger + +
+ + + Updates the 's state based on the + given new version of the associated . + + A new or updated calendar to use for the trigger + the amount of time that must + be between "now" and the time the next + firing of the trigger is supposed to occur. + + + + + Calculates the first time an with + intervalType = IntervalTypeWeekly will fire + after the specified date. See for more + information. + + The time after which to find the nearest fire time. + This argument is treated as exclusive 舒 that is, + if afterTime is a valid fire time for the trigger, it + will not be returned as the next fire time. + + the first time the trigger will fire following the specified + date + + + + + Calculates the first UTC time an with + intervalType = will fire + after the specified date. See for more + information. + + + The UTC time after which to find the nearest fire time. + This argument is treated as exclusive 舒 that is, + if afterTime is a valid fire time for the trigger, it + will not be returned as the next fire time. + + the first time the trigger will fire following the specified date + + + + Calculates the first time an with + intervalType = will fire + after the specified date. See for more + information. + + + The UTC time after which to find the nearest fire time. + This argument is treated as exclusive 舒 that is, + if afterTime is a valid fire time for the trigger, it + will not be returned as the next fire time. + + the first time the trigger will fire following the specified + date + + + + + Gets or sets the day of the interval on which the + should fire. If the Nth + day of the interval does not exist (i.e. the 32nd of a + month), the trigger simply will never fire. N may not be less than 1. + + + + + Returns the interval type for the . + + + Sets the interval type for the . If + , the trigger will fire on the + Nth included day of every month. If + , the trigger will fire on the + Nth included day of every year. If + , the trigger will fire on the + Nth included day of every week. + + + + + + + + Returns the fire time for the as a + string with the format "HH:MM[:SS]", with HH representing the + 24-hour clock hour of the fire time. Seconds are optional and their + inclusion depends on whether or not they were provided to + . + + + + + Returns the for the + . + + +

+ Because of the conceptual design of , + it is not always possible to decide with certainty that the trigger + will never fire again. Therefore, it will search for the next + fire time up to a given cutoff. These cutoffs can be changed by using the + property. The default cutoff is 12 + of the intervals specified by intervalType" />. +

+

+ Because of the conceptual design of , + it is not always possible to decide with certainty that the trigger + will never fire again. Therefore, it will search for the next + fire time up to a given cutoff. These cutoffs can be changed by using the + method. The default cutoff is 12 + of the intervals specified by intervalType". +

+

+ In most cases, the default value of this setting (12) is sufficient (it + is highly unlikely, for example, that you will need to look at more than + 12 months of dates to ensure that your trigger will never fire again). + However, this setting is included to allow for the rare exceptions where + this might not be true. +

+

+ For example, if your trigger is associated with a calendar that excludes + a great many dates in the next 12 months, and hardly any following that, + it is possible (if is large enough) that you could run + into this situation. +

+
+
+ + + Returns the last UTC time the will fire. + If the trigger will not fire at any point between + and , will be returned. + + the last time the trigger will fire. + + + + Tells whether this Trigger instance can handle events + in millisecond precision. + + + + + + Sets or gets the time zone in which the will be resolved. + If no time zone is provided, then the default time zone will be used. + + + + + + + Gets or sets the trigger's calendar week rule. + + The trigger calendar week rule. + + + + Gets or sets the trigger's calendar first day of week rule. + + The trigger calendar first day of week. + + + + An exception that is thrown to indicate that an attempt to store a new + object (i.e. , + or ) in a + failed, because one with the same name and group already exists. + + James House + + +

+ Create a with the given + message. +

+
+
+ + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + +

+ Create a and auto-generate a + message using the name/group from the given . +

+ +

+ The message will read:
"Unable to store Job with name: '__' and + group: '__', because one already exists with this identification." +

+
+
+ +

+ Create a and auto-generate a + message using the name/group from the given . +

+ +

+ The message will read:
"Unable to store Trigger with name: '__' and + group: '__', because one already exists with this identification." +

+
+
+ + + An exception that is thrown to indicate that there is a misconfiguration of + the - or one of the components it + configures. + + James House + + + + Create a with the given message. + + + + + Create a with the given message + and cause. + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + Holds context/environment data that can be made available to Jobs as they + are executed. + + + James House + + + + Create an empty . + + + + + Create a with the given data. + + + + + Instructs Scheduler what to do with a trigger and job. + + + + + Instructs the that the + has no further instructions. + + + + + Instructs the that the + wants the to re-Execute + immediately. If not in a 'RECOVERING' or 'FAILED_OVER' situation, the + execution context will be re-used (giving the the + abilitiy to 'see' anything placed in the context by its last execution). + + + + + Instructs the that the + should be put in the state. + + + + + Instructs the that the + wants itself deleted. + + + + + Instructs the that all + s referencing the same as + this one should be put in the state. + + + + + Instructs the that all + s referencing the same as + this one should be put in the state. + + + + + Instructs the that the + should be put in the state. + + + + + Describes the settings and capabilities of a given + instance. + + James House + + + + Initializes a new instance of the class. + + Name of the scheduler. + The scheduler instance. + The scheduler type. + if set to true, scheduler is a remote scheduler. + if set to true, scheduler is started. + if set to true, scheduler is in standby mode. + if set to true, scheduler is shutdown. + The start time. + The number of jobs executed. + The job store type. + if set to true, job store is persistent. + The thread pool type. + Size of the thread pool. + The version string. + + + + Returns a formatted (human readable) string describing all the 's + meta-data values. + + +

+ The format of the string looks something like this: +

+            Quartz Scheduler 'SchedulerName' with instanceId 'SchedulerInstanceId' Scheduler class: 'Quartz.Impl.StdScheduler' - running locally. Running since: '11:33am on Jul 19, 2002' Not currently paused. Number of Triggers fired: '123' Using thread pool 'Quartz.Simpl.SimpleThreadPool' - with '8' threads Using job-store 'Quartz.Impl.JobStore' - which supports persistence.
+            
+

+
+
+ + + Return a simple string representation of this object. + + + + + Returns the name of the . + + + + + Returns the instance Id of the . + + + + + Returns the class-name of the instance. + + + + + Returns whether the is being used remotely (via remoting). + + + + + Returns whether the scheduler has been started. + + + Note: may return even if + returns . + + + + + Reports whether the is in standby mode. + + + Note: may return even if + returns . + + + + + Reports whether the has been Shutdown. + + + + + Returns the class-name of the instance that is + being used by the . + + + + + Returns the type name of the instance that is + being used by the . + + + + + Returns the number of threads currently in the 's + + + + + Returns the version of Quartz that is running. + + + + + Returns the at which the Scheduler started running. + + null if the scheduler has not been started. + + + + + Returns the number of jobs executed since the + started.. + + + + + Returns whether or not the 's + instance supports persistence. + + + + + A concrete that is used to fire a + at a given moment in time, and optionally repeated at a specified interval. + + + + + + James House + Contributions by Lieven Govaerts of Ebitec Nv, Belgium. + Marko Lahma (.NET) + + + + Used to indicate the 'repeat count' of the trigger is indefinite. Or in + other words, the trigger should repeat continually until the trigger's + ending timestamp. + + + + + Create a with no settings. + + + + + Create a that will occur immediately, and + not repeat. + + + + + Create a that will occur immediately, and + not repeat. + + + + + Create a that will occur immediately, and + repeat at the the given interval the given number of times. + + + + + Create a that will occur immediately, and + repeat at the the given interval the given number of times. + + + + + Create a that will occur at the given time, + and not repeat. + + + + + Create a that will occur at the given time, + and not repeat. + + + + + Create a that will occur at the given time, + and repeat at the the given interval the given number of times, or until + the given end time. + + The name. + A UTC set to the time for the to fire. + A UTC set to the time for the + to quit repeat firing. + The number of times for the to repeat + firing, use for unlimited times. + The time span to pause between the repeat firing. + + + + Create a that will occur at the given time, + and repeat at the the given interval the given number of times, or until + the given end time. + + The name. + The group. + A UTC set to the time for the to fire. + A UTC set to the time for the + to quit repeat firing. + The number of times for the to repeat + firing, use for unlimited times. + The time span to pause between the repeat firing. + + + + Create a that will occur at the given time, + fire the identified and repeat at the the given + interval the given number of times, or until the given end time. + + The name. + The group. + Name of the job. + The job group. + A set to the time for the + to fire. + A set to the time for the + to quit repeat firing. + The number of times for the to repeat + firing, use RepeatIndefinitely for unlimited times. + The time span to pause between the repeat firing. + + + + Validates the misfire instruction. + + The misfire instruction. + + + + + Updates the 's state based on the + MisfireInstruction value that was selected when the + was created. + + + If MisfireSmartPolicyEnabled is set to true, + then the following scheme will be used:
+
    +
  • If the Repeat Count is 0, then the instruction will + be interpreted as .
  • +
  • If the Repeat Count is , then + the instruction will be interpreted as . + WARNING: using MisfirePolicy.SimpleTrigger.RescheduleNowWithRemainingRepeatCount + with a trigger that has a non-null end-time may cause the trigger to + never fire again if the end-time arrived during the misfire time span. +
  • +
  • If the Repeat Count is > 0, then the instruction + will be interpreted as . +
  • +
+
+
+ + + Called when the has decided to 'fire' + the trigger (Execute the associated ), in order to + give the a chance to update itself for its next + triggering (if any). + + + + + + Updates the instance with new calendar. + + The calendar. + The misfire threshold. + + + + Called by the scheduler at the time a is first + added to the scheduler, in order to have the + compute its first fire time, based on any associated calendar. +

+ After this method has been called, + should return a valid answer. +

+
+ + The first time at which the will be fired + by the scheduler, which is also the same value + will return (until after the first firing of the ). + +
+ + + Returns the next time at which the will + fire. If the trigger will not fire again, will be + returned. The value returned is not guaranteed to be valid until after + the has been added to the scheduler. + + + + + Returns the previous time at which the fired. + If the trigger has not yet fired, will be + returned. + + + + + Set the next UTC time at which the should fire. + This method should not be invoked by client code. + + + + + Set the previous UTC time at which the fired. + This method should not be invoked by client code. + + + + + Returns the next UTC time at which the will + fire, after the given UTC time. If the trigger will not fire after the given + time, will be returned. + + + + + Returns the last UTC time at which the will + fire, before the given time. If the trigger will not fire before the + given time, will be returned. + + + + + Computes the number of times fired between the two UTC date times. + + The UTC start date and time. + The UTC end date and time. + + + + + Determines whether or not the will occur + again. + + + + + Validates whether the properties of the are + valid for submission into a . + + + + + Get or set thhe number of times the should + repeat, after which it will be automatically deleted. + + + + + + Get or set the the time interval at which the should repeat. + + + + + Get or set the number of times the has already + fired. + + + + + Returns the final UTC time at which the will + fire, if repeatCount is RepeatIndefinitely, null will be returned. +

+ Note that the return time may be in the past. +

+
+
+ + + Tells whether this Trigger instance can handle events + in millisecond precision. + + + + + + All trigger states known to Scheduler. + + + + + Indicates that the is in the "normal" state. + + + + + Indicates that the is in the "paused" state. + + + + + Indicates that the is in the "complete" state. + + + "Complete" indicates that the trigger has not remaining fire-times in + its schedule. + + + + + Indicates that the is in the "error" state. + + +

+ A arrives at the error state when the scheduler + attempts to fire it, but cannot due to an error creating and executing + its related job. Often this is due to the 's + class not existing in the classpath. +

+ +

+ When the trigger is in the error state, the scheduler will make no + attempts to fire it. +

+
+
+ + + Indicates that the is in the "blocked" state. + + + A arrives at the blocked state when the job that + it is associated with is a and it is + currently executing. + + + + + + Indicates that the does not exist. + + + + + Convenience and utility methods for simplifying the construction and + configuration of s. + + + Please submit suggestions for additional convenience methods to either the + Quartz user forum or the developer's mail list at + source forge. + + + + James House + + + + Constant indicating last day of month. + + + + + Milliseconds in minute. + + + + + Milliseconds in hour. + + + + + Seconds in day. + + + + + Milliseconds in day. + + + + + Initializes a new instance of the class. + + + + + Set the given 's name to the given value, and its + group to the default group (). + + the tigger to change name to + the new trigger name + + + + Set the given 's name to the given value, and its + group to the given group. + + the tigger to change name to + the new trigger name + the new trigger group + + + + Make a trigger that will fire every day at the given time. +

+ The generated trigger will not have its name, group, + or end-time set. The Start time defaults to 'now'. +

+
+ the hour (0-23) upon which to fire + the minute (0-59) upon which to fire + the new trigger +
+ + + Make a trigger that will fire every day at the given time. +

+ The generated trigger will not have its group or end-time set. + The Start time defaults to 'now'. +

+
+ the trigger's name + the hour (0-23) upon which to fire + the minute (0-59) upon which to fire + the newly created trigger +
+ + + Make a trigger that will fire every week at the given day and time. +

+ The generated trigger will not have its name, group, + or end-time set. The Start time defaults to 'now'. +

+
+ (1-7) the day of week upon which to fire + the hour (0-23) upon which to fire + the minute (0-59) upon which to fire + the new trigger +
+ + + Make a trigger that will fire every week at the given day and time. +

+ The generated trigger will not have its group, + or end-time set. The Start time defaults to 'now'. +

+
+ the trigger's name + the day of week upon which to fire + the hour (0-23) upon which to fire + the minute (0-59) upon which to fire + the newly created trigger +
+ + + Make a trigger that will fire every month at the given day and time. +

+ The generated trigger will not have its name, group, + or end-time set. The Start time defaults to 'now'. +

+

+ If the day of the month specified does not occur in a given month, a + firing will not occur that month. (i.e. if dayOfMonth is specified as + 31, no firing will occur in the months of the year with fewer than 31 + days). +

+
+ (1-31, or -1) the day of week upon which to fire + the hour (0-23) upon which to fire + the minute (0-59) upon which to fire + the newly created trigger +
+ + + Make a trigger that will fire every month at the given day and time. +

+ The generated trigger will not have its group, + or end-time set. The Start time defaults to 'now'. +

+

+ If the day of the month specified does not occur in a given month, a + firing will not occur that month. (i.e. if dayOfMonth is specified as + 31, no firing will occur in the months of the year with fewer than 31 + days). +

+
+ the trigger's name + (1-31, or -1) the day of week upon which to fire + the hour (0-23) upon which to fire + the minute (0-59) upon which to fire + the newly created trigger +
+ + + Make a trigger that will fire times, waiting + between each fire. + + + The generated trigger will not have its name, group, + or end-time set. The Start time defaults to 'now'. + + the newly created trigger + + + + Make a trigger that will fire times, waiting + between each fire. +

+ The generated trigger will not have its name, group, + or end-time set. The Start time defaults to 'now'. +

+
+ the trigger's name + the new trigger +
+ + + Make a trigger that will fire every second, indefinitely. +

+ The generated trigger will not have its name, group, + or end-time set. The Start time defaults to 'now'. +

+
+ the new trigger +
+ + + Make a trigger that will fire every second, indefinitely. +

+ The generated trigger will not have its group, + or end-time set. The Start time defaults to 'now'. +

+
+ the trigger's name + the new trigger +
+ + + Make a trigger that will fire every N seconds, indefinitely. +

+ The generated trigger will not have its name, group, + or end-time set. The Start time defaults to 'now'. +

+
+ the number of seconds between firings + the new trigger +
+ + + Make a trigger that will fire every N seconds, with the given number of + repeats. +

+ The generated trigger will not have its name, group, + or end-time set. The Start time defaults to 'now'. +

+
+ the number of seconds between firings + the number of times to repeat the firing + the new trigger +
+ + + Make a trigger that will fire every N seconds, with the given number of + repeats. +

+ The generated trigger will not have its group, + or end-time set. The Start time defaults to 'now'. +

+
+ the trigger's name + the number of seconds between firings + the number of times to repeat the firing + the new trigger +
+ + + Make a trigger that will fire every minute, indefinitely. +

+ The generated trigger will not have its name, group, + or end-time set. The Start time defaults to 'now'. +

+
+ the new trigger +
+ + + Make a trigger that will fire every minute, indefinitely. +

+ The generated trigger will not have its group, + or end-time set. The Start time defaults to 'now'. +

+
+ the trigger's name + the new trigger +
+ + + Make a trigger that will fire every N minutes, indefinitely. +

+ The generated trigger will not have its name, group, + or end-time set. The Start time defaults to 'now'. +

+
+ the number of minutes between firings + the new trigger +
+ + + Make a trigger that will fire every N minutes, with the given number of + repeats. +

+ The generated trigger will not have its name, group, + or end-time set. The Start time defaults to 'now'. +

+
+ the number of minutes between firings + the number of times to repeat the firing + the new trigger +
+ + + Make a trigger that will fire every N minutes, with the given number of + repeats. +

+ The generated trigger will not have its group, + or end-time set. The Start time defaults to 'now'. +

+
+ the trigger's name + the number of minutes between firings + the number of times to repeat the firing + the new trigger +
+ + + Make a trigger that will fire every hour, indefinitely. +

+ The generated trigger will not have its name, group, + or end-time set. The Start time defaults to 'now'. +

+
+ the new trigger +
+ + + Make a trigger that will fire every hour, indefinitely. +

+ The generated trigger will not have its group, + or end-time set. The Start time defaults to 'now'. +

+
+ the trigger's name + the new trigger +
+ + + Make a trigger that will fire every N hours, indefinitely. +

+ The generated trigger will not have its name, group, + or end-time set. The Start time defaults to 'now'. +

+
+ the number of hours between firings + the new trigger +
+ + + Make a trigger that will fire every N hours, with the given number of + repeats. +

+ The generated trigger will not have its name, group, + or end-time set. The Start time defaults to 'now'. +

+
+ the number of hours between firings + the number of times to repeat the firing + the new trigger +
+ + + Make a trigger that will fire every N hours, with the given number of + repeats. +

+ The generated trigger will not have its group, + or end-time set. The Start time defaults to 'now'. +

+
+ the trigger's name + the number of hours between firings + the number of times to repeat the firing + the new trigger +
+ + + Returns a date that is rounded to the next even hour above the given + date. +

+ For example an input date with a time of 08:13:54 would result in a date + with the time of 09:00:00. If the date's time is in the 23rd hour, the + date's 'day' will be promoted, and the time will be set to 00:00:00. +

+
+ the Date to round, if the current time will + be used + the new rounded date +
+ + + Returns a date that is rounded to the previous even hour below the given + date. +

+ For example an input date with a time of 08:13:54 would result in a date + with the time of 08:00:00. +

+
+ the Date to round, if the current time will + be used + the new rounded date +
+ + + Returns a date that is rounded to the next even minute above the given + date. +

+ For example an input date with a time of 08:13:54 would result in a date + with the time of 08:14:00. If the date's time is in the 59th minute, + then the hour (and possibly the day) will be promoted. +

+
+ The Date to round, if the current time will be used + The new rounded date +
+ + + Returns a date that is rounded to the previous even minute below the + given date. +

+ For example an input date with a time of 08:13:54 would result in a date + with the time of 08:13:00. +

+
+ the Date to round, if the current time will + be used + the new rounded date +
+ + + Returns a date that is rounded to the next even second above the given + date. + + the Date to round, if the current time will + be used + the new rounded date + + + + Returns a date that is rounded to the previous even second below the + given date. +

+ For example an input date with a time of 08:13:54.341 would result in a + date with the time of 08:13:00.000. +

+
+ the Date to round, if the current time will + be used + the new rounded date +
+ + + Returns a date that is rounded to the next even multiple of the given + minute. +

+ For example an input date with a time of 08:13:54, and an input + minute-base of 5 would result in a date with the time of 08:15:00. The + same input date with an input minute-base of 10 would result in a date + with the time of 08:20:00. But a date with the time 08:53:31 and an + input minute-base of 45 would result in 09:00:00, because the even-hour + is the next 'base' for 45-minute intervals. +

+ +

+ More examples: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Input TimeMinute-BaseResult Time
11:16:412011:20:00
11:36:412011:40:00
11:46:412012:00:00
11:26:413011:30:00
11:36:413012:00:00
11:16:411711:17:00
11:17:411711:34:00
11:52:411712:00:00
11:52:41511:55:00
11:57:41512:00:00
11:17:41012:00:00
11:17:41111:08:00
+

+ +
+ + the Date to round, if the current time will + be used + + + the base-minute to set the time on + + the new rounded date +
+ + + Returns a date that is rounded to the next even multiple of the given + minute. +

+ The rules for calculating the second are the same as those for + calculating the minute in the method + . +

+
+ The date. + The second base. + +
+ + + Returns a list of Dates that are the next fire times of a + . + The input trigger will be cloned before any work is done, so you need + not worry about its state being altered by this method. + + The trigger upon which to do the work + The calendar to apply to the trigger's schedule + The number of next fire times to produce + List of java.util.Date objects + + + + Returns a list of Dates that are the next fire times of a + that fall within the given date range. The input trigger will be cloned + before any work is done, so you need not worry about its state being + altered by this method. +

+ NOTE: if this is a trigger that has previously fired within the given + date range, then firings which have already occured will not be listed + in the output List. +

+
+ The trigger upon which to do the work + The calendar to apply to the trigger's schedule + The starting date at which to find fire times + The ending date at which to stop finding fire times + List of java.util.Date objects +
+ + + Translate a date and time from a users timezone to the another + (probably server) timezone to assist in creating a simple trigger with + the right date and time. + + the date to translate + the original time-zone + the destination time-zone + the translated UTC date + + + + Gets the offset from UT for the given date in the given timezone, + taking into account daylight savings. + + the date that is the base for the offset + the time-zone to calculate to offset to + the offset + + + + This functions determines if the TimeZone uses daylight saving time + + TimeZone instance to validate + True or false depending if daylight savings time is used + + + + An exception that is thrown to indicate that a call to + failed without interrupting the Job. + + + James House + + + + Create a with the given message. + + + + + Create a with the given cause. + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + +
+
diff --git a/lib/Quartz10/net/4.0/Common.Logging.pdb b/lib/Quartz10/net/4.0/Common.Logging.pdb new file mode 100644 index 0000000000000000000000000000000000000000..117b5bccc4c1ebbd26199f62b1a9d6b850fb3fff GIT binary patch literal 52736 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�|Q`N)Uv27i1=VwlT1C*VIpzQn{ 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 - - - Quartz - - - - - Collection manipulation related utility methods. - - - - - Removes the specified item from list of items and returns - whether removal was success. - - The items to remove from. - The item to remove. - - - - - A hash based set. - - - - - Represents a collection ob objects that contains no duplicate elements. - - - - - Adds a new element to the Collection if it is not already present. - - The object to add to the collection. - Returns true if the object was added to the collection, otherwise false. - - - - Adds all the elements of the specified collection to the Set. - - Collection of objects to add. - true - - - - Returns the first item in the set. - - First object. - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The whose elements are copied to the new list. - - is . - - - - Initializes a new instance of the class. - - The capacity. - - - - Unmodifiables the hash set. - - The collection. - - - - - Adds a new element to the ArrayList if it is not already present. - - Element to insert to the ArrayList. - Returns true if the new element was inserted, false otherwise. - - - - Adds all the elements of the specified collection that are not present to the list. - - Collection where the new elements will be added - Returns true if at least one element was added, false otherwise. - - - - Returns the first item in the set. - - First object. - - - - Returns a copy of the HashSet instance. - - Returns a shallow copy of the current HashSet. - - - - A sorted set. - - - - - Returns a portion of the list whose elements are greater than the limit object parameter. - - The start element of the portion to extract. - The portion of the collection whose elements are greater than the limit object parameter. - - - - SupportClass for the TreeSet class. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The whose elements are copied to the new list. - - is . - - - - Initializes a new instance of the class. - - The c. - - - - Unmodifiables the tree set. - - The collection. - - - - - Adds a new element to the ArrayList if it is not already present and sorts the ArrayList. - - Element to insert to the ArrayList. - TRUE if the new element was inserted, FALSE otherwise. - - - - Adds all the elements of the specified collection that are not present to the list. - - Collection where the new elements will be added - Returns true if at least one element was added to the collection. - - - - Returns the first item in the set. - - First object. - - - - Determines whether an element is in the the current TreeSetSupport collection. The IComparer defined for - the current set will be used to make comparisons between the elements already inserted in the collection and - the item specified. - - The object to be locatet in the current collection. - true if item is found in the collection; otherwise, false. - - - - Returns a portion of the list whose elements are greater than the limit object parameter. - - The start element of the portion to extract. - The portion of the collection whose elements are greater than the limit object parameter. - - - - Gets the IComparator object used to sort this set. - - - - - Responsible for creating the instances of - to be used within the instance. - - - Although this interface looks a lot like an 'object pool', implementations - do not have to support the re-use of instances. If an implementation does - not wish to pool instances, then the - method would simply create a new instance, and the - method would do nothing. - - James House - Marko Lahma (.NET) - - - - Initialize the factory, providing a handle to the - that should be made available within the and - the s within it, and a handle to the - that the shell will use in its own - operations with the . - - - - - Called by the - to obtain instances of . - - - - - Called by the - to return instances of . - - - - - JobRunShell instances are responsible for providing the 'safe' environment - for s to run in, and for performing all of the work of - executing the , catching ANY thrown exceptions, updating - the with the 's completion code, - etc. -

- A instance is created by a - on behalf of the which then runs the - shell in a thread from the configured when the - scheduler determines that a has been triggered. -

-
- - - - - James House - Marko Lahma (.NET) -
- - - This interface should be implemented by any class whose instances are intended - to be executed by a thread. - - - - - This method has to be implemented in order that starting of the thread causes the object's - run method to be called in that separately executing thread. - - - - - Create a JobRunShell instance with the given settings. - - A handle to the that produced - this . - The instance that should be made - available within the . - the that should be used by the - when making updates to the . - - - - Initializes the job execution context with given scheduler and bundle. - - The scheduler. - The bundle offired triggers. - - - - Requests the Shutdown. - - - - - This method has to be implemented in order that starting of the thread causes the object's - run method to be called in that separately executing thread. - - - - - Runs begin procedures on this instance. - - - - - Completes the execution. - - if set to true [successful execution]. - - - - Passivates this instance. - - - - - Completes the trigger retry loop. - - The trigger. - The job detail. - The inst code. - - - - - Vetoeds the job retry loop. - - The trigger. - The job detail. - The inst code. - - - - - This is the heart of Quartz, an indirect implementation of the - interface, containing methods to schedule s, - register instances, etc. - - - - - - James House - Marko Lahma (.NET) - - - - Starts this instance. - - - - - Standbies this instance. - - - - - Shutdowns this instance. - - - - - returns true if the given JobGroup - is paused - - The scheduling context. - - - - - - returns true if the given TriggerGroup - is paused - - - - - - - - Initializes the class. - - - - - Get the global - that has the given name. - - - - - - - Create a with the given configuration - properties. - - - - - - Bind the scheduler to remoting infrastructure. - - - - - Un-bind the scheduler from remoting infrastructure. - - - - - Adds an object that should be kept as reference to prevent - it from being garbage collected. - - The obj. - - - - Removes the object from garbae collection protected list. - - The obj. - - - - - Starts the 's threads that fire s. -

- All s that have misfired will - be passed to the appropriate TriggerListener(s). -

-
-
- - - Temporarily halts the 's firing of s. -

- The scheduler is not destroyed, and can be re-started at any time. -

-
-
- - - Halts the 's firing of s, - and cleans up all resources associated with the QuartzScheduler. - Equivalent to . -

- The scheduler cannot be re-started. -

-
-
- - - Halts the 's firing of s, - and cleans up all resources associated with the QuartzScheduler. -

- The scheduler cannot be re-started. -

-
- - if the scheduler will not allow this method - to return until all currently executing jobs have completed. - -
- - - Validates the state. - - - - - Add the identified by the given - to the Scheduler, and - associate the given with it. -

- If the given Trigger does not reference any , then it - will be set to reference the Job passed with it into this method. -

-
-
- - - Schedule the given with the - identified by the 's settings. - - - - - Add the given to the Scheduler - with no associated - . The will be 'dormant' until - it is scheduled with a , or - is called for it. -

- The must by definition be 'durable', if it is not, - SchedulerException will be thrown. -

-
-
- - - Delete the identified from the Scheduler - and any - associated s. - - true if the Job was found and deleted. - - - - Remove the indicated from the - scheduler. - - - - - Remove (delete) the with the - given name, and store the new given one - which must be associated - with the same job. - - The scheduling context. - The name of the to be removed. - The group name of the to be removed. - The new to be stored. - - if a with the given - name and group was not found and removed from the store, otherwise - the first fire time of the newly scheduled trigger. - - - - - Creates a new positive random number - - The last random obtained - Returns a new positive random number - - - - Trigger the identified (Execute it now) - with a non-volatile trigger. - - - - - Trigger the identified (Execute it - now) - with a volatile trigger. - - - - - Pause the with the given name. - - - - - Pause all of the s in the given group. - - - - - Pause the with the given - name - by pausing all of its current s. - - - - - Pause all of the s in the - given group - by pausing all of their s. - - - - - Resume (un-pause) the with the given - name. -

- If the missed one or more fire-times, then the - 's misfire instruction will be applied. -

-
-
- - - Resume (un-pause) all of the s in the - given group. -

- If any missed one or more fire-times, then the - 's misfire instruction will be applied. -

-
-
- - - Gets the paused trigger groups. - - The the job scheduling context. - - - - - Resume (un-pause) the with - the given name. -

- If any of the 's s missed one - or more fire-times, then the 's misfire - instruction will be applied. -

-
-
- - - Resume (un-pause) all of the s - in the given group. -

- If any of the s had s that - missed one or more fire-times, then the 's - misfire instruction will be applied. -

-
-
- - - Pause all triggers - equivalent of calling - on every group. -

- When is called (to un-pause), trigger misfire - instructions WILL be applied. -

-
- - -
- - - Resume (un-pause) all triggers - equivalent of calling - on every group. -

- If any missed one or more fire-times, then the - 's misfire instruction will be applied. -

-
- -
- - - Get the names of all known groups. - - - - - Get the names of all the s in the - given group. - - - - - Get all s that are associated with the - identified . - - - - - Get the names of all known - groups. - - - - - Get the names of all the s in - the given group. - - - - - Get the for the - instance with the given name and group. - - - - - Get the instance with the given name and - group. - - - - - Get the current state of the identified . - - - - - - - - - Add (register) the given to the Scheduler. - - - - - Delete the identified from the Scheduler. - - true if the Calendar was found and deleted. - - - - Get the instance with the given name. - - - - - Get the names of all registered s. - - - - - Add the given to the - 'sglobal list. -

- Listeners in the 'global' list receive notification of execution events - for ALL s. -

-
-
- - - Add the given to the - 's list, of registered s. - - - - - Remove the given from the - 's list of global listeners. - - - true if the identifed listener was found in the list, and removed. - - - - - Remove the identifed from the 's - list of global listeners. - - - true if the identifed listener was found in the list, and removed. - - - - Remove the identifed from - the 's list of registered listeners. - - - true if the identifed listener was found in the list, and removed. - - - - - Get the non-global that has the given name. - - - - - Add the given to the - 'sglobal list. -

- Listeners in the 'global' list receive notification of execution events - for ALL s. -

-
-
- - - Add the given to the - 's list, of registered s. - - - - - Remove the given from - the 's list of global listeners. - - - true if the identifed listener was found in the list, and removed. - - - - - Remove the identifed from the 's - list of global listeners. - - - true if the identifed listener was found in the list, and removed - - - - Remove the identifed - from the 's list of registered listeners. - - - true if the identifed listener was found in the list, and removed. - - - - - Get the non-global - that has the given name. - - - - - Get the global that - has the given name. - - - - - - - Register the given with the - . - - - - - Remove the given from the - . - - - true if the identifed listener was found in the list, and removed. - - - - - Notifies the job store job complete. - - The job scheduling context. - The trigger. - The detail. - The instruction code. - - - - Notifies the scheduler thread. - - - - - Notifies the trigger listeners about fired trigger. - - The job execution context. - - - - - Notifies the trigger listeners about misfired trigger. - - The trigger. - - - - Notifies the trigger listeners of completion. - - The job executution context. - The instruction code to report to triggers. - - - - Notifies the job listeners about job to be executed. - - The jec. - - - - Notifies the job listeners that job exucution was vetoed. - - The job execution context. - - - - Notifies the job listeners that job was executed. - - The jec. - The je. - - - - Notifies the scheduler listeners about scheduler error. - - The MSG. - The se. - - - - Notifies the scheduler listeners about job that was scheduled. - - The trigger. - - - - Notifies the scheduler listeners about job that was unscheduled. - - Name of the trigger. - The trigger group. - - - - Notifies the scheduler listeners about finalized trigger. - - The trigger. - - - - Notifies the scheduler listeners about paused trigger. - - The name. - The group. - - - - Notifies the scheduler listeners resumed trigger. - - The name. - The group. - - - - Notifies the scheduler listeners about paused job. - - The name. - The group. - - - - Notifies the scheduler listeners about resumed job. - - The name. - The group. - - - - Notifies the scheduler listeners about scheduler shutdown. - - - - - Interrupt all instances of the identified InterruptableJob. - - - - - Obtains a lifetime service object to control the lifetime policy for this instance. - - - - - Gets the version of the Quartz Scheduler. - - The version. - - - - Gets the version major. - - The version major. - - - - Gets the version minor. - - The version minor. - - - - Gets the version iteration. - - The version iteration. - - - - Gets the scheduler signaler. - - The scheduler signaler. - - - - Returns the name of the . - - - - - Returns the instance Id of the . - - - - - Returns the of the . - - - - - Gets or sets a value indicating whether to signal on scheduling change. - - - true if schduler should signal on scheduling change; otherwise, false. - - - - - Reports whether the is paused. - - - - - Gets the job store class. - - The job store class. - - - - Gets the thread pool class. - - The thread pool class. - - - - Gets the size of the thread pool. - - The size of the thread pool. - - - - Reports whether the has been Shutdown. - - - - - Return a list of objects that - represent all currently executing Jobs in this Scheduler instance. -

- This method is not cluster aware. That is, it will only return Jobs - currently executing in this Scheduler instance, not across the entire - cluster. -

-

- Note that the list returned is an 'instantaneous' snap-shot, and that as - soon as it's returned, the true list of executing jobs may be different. -

-
-
- - - Get a List containing all of the - s in the 'sglobal list. - - - - - Get a Set containing the names of all the non-global - s registered with the . - - - - - Get a list containing all of the - s in the 'sglobal list. - - - - - Get a Set containing the names of all the non-global - s registered with the . - - - - - Get a List containing all of the - s registered with the . - - - - - Gets or sets the job factory. - - The job factory. - - - - Gets the running since. - - The running since. - - - - Gets the number of jobs executed. - - The number of jobs executed. - - - - Gets a value indicating whether this scheduler supports persistence. - - true if supports persistence; otherwise, false. - - - - Helper class to start scheduler in a delayed fashion. - - - - - ErrorLogger - Scheduler Listener Class - - - - - A helpful abstract base class for implementors of - . - - - The methods in this class are empty so you only need to override the - subset for the events you care about. - - - - - - The interface to be implemented by classes that want to be informed of major - events. - - - - - James House - - - - Called by the when a - is scheduled. - - - - - Called by the when a - is unscheduled. - - - - - Called by the when a - has reached the condition in which it will never fire again. - - - - - Called by the when a - or group of s has been paused. -

- If a group was paused, then the parameter - will be null. -

-
- Name of the trigger. - The trigger group. -
- - - Called by the when a - or group of s has been un-paused. -

- If a group was resumed, then the parameter - will be null. -

-
- Name of the trigger. - The trigger group. -
- - - Called by the when a - or group of s has been paused. -

- If a group was paused, then the parameter will be - null. If all jobs were paused, then both parameters will be null. -

-
- Name of the job. - The job group. -
- - - Called by the when a - or group of s has been un-paused. -

- If a group was resumed, then the parameter will - be null. If all jobs were paused, then both parameters will be null. -

-
- The job group. -
- - - Called by the when a serious error has - occured within the scheduler - such as repeated failures in the , - or the inability to instantiate a instance when its - has fired. -

- The property of the given SchedulerException - can be used to determine more specific information about the type of - error that was encountered. -

-
-
- - - Called by the to inform the listener - that it has Shutdown. - - - - - Get the for this - type's category. This should be used by subclasses for logging. - - - - - The interface to be implemented by classes that want to be informed when a - executes. In general, applications that use a - will not have use for this mechanism. - - - - - - - James House - - - - Called by the when a - is about to be executed (an associated - has occured). -

- This method will not be invoked if the execution of the Job was vetoed - by a . -

-
- -
- - - Called by the when a - was about to be executed (an associated - has occured), but a vetoed it's - execution. - - - - - - Called by the after a - has been executed, and be for the associated 's - method has been called. - - - - - Get the name of the . - - - - - Contains all of the resources (,, - etc.) necessary to create a instance. - - - James House - Marko Lahma (.NET) - - - - Gets the unique identifier. - - Name of the scheduler. - The scheduler instance id. - - - - - Gets the unique identifier. - - - - - - Add the given for the - to use. This method expects the plugin's - "initialize" method to be invoked externally (either before or after - this method is called). - - - - - - Get or set the name for the . - - - if name is null or empty. - - - - - Get or set the instance Id for the . - - - if name is null or empty. - - - - - Get or set the name for the . - - - if name is null or empty. - - - - - Get or set the for the - to use. - - - if threadPool is null. - - - - - Get or set the for the - to use. - - - if jobStore is null. - - - - - Get or set the for the - to use. - - - if jobRunShellFactory is null. - - - - - Get the of all - s for the - to use. - - - - - - Gets or sets a value indicating whether to make scheduler thread daemon. - - - true if scheduler should be thread daemon; otherwise, false. - - - - - Gets or sets the scheduler exporter. - - The scheduler exporter. - - - - The thread responsible for performing the work of firing - s that are registered with the . - - - - - James House - Marko Lahma (.NET) - - - - Support class used to handle threads - - - - - The instance of System.Threading.Thread - - - - - Initializes a new instance of the QuartzThread class - - - - - Initializes a new instance of the Thread class. - - The name of the thread - - - - Initializes a new instance of the Thread class. - - A ThreadStart delegate that references the methods to be invoked when this thread begins executing - - - - Initializes a new instance of the Thread class. - - A ThreadStart delegate that references the methods to be invoked when this thread begins executing - The name of the thread - - - - This method has no functionality unless the method is overridden - - - - - Causes the operating system to change the state of the current thread instance to ThreadState.Running - - - - - Interrupts a thread that is in the WaitSleepJoin thread state - - - - - Blocks the calling thread until a thread terminates - - - - - Blocks the calling thread until a thread terminates or the specified time elapses - - Time of wait in milliseconds - - - - Blocks the calling thread until a thread terminates or the specified time elapses - - Time of wait in milliseconds - Time of wait in nanoseconds - - - - Resumes a thread that has been suspended - - - - - Raises a ThreadAbortException in the thread on which it is invoked, - to begin the process of terminating the thread. Calling this method - usually terminates the thread - - - - - Raises a ThreadAbortException in the thread on which it is invoked, - to begin the process of terminating the thread while also providing - exception information about the thread termination. - Calling this method usually terminates the thread. - - An object that contains application-specific information, such as state, which can be used by the thread being aborted - - - - Suspends the thread, if the thread is already suspended it has no effect - - - - - Obtain a string that represents the current object - - A string that represents the current object - - - - Gets the currently running thread - - The currently running thread - - - - Gets the current thread instance - - - - - Gets or sets the name of the thread - - - - - Gets or sets a value indicating the scheduling priority of a thread - - - - - Gets a value indicating the execution status of the current thread - - - - - Gets or sets a value indicating whether or not a thread is a background thread. - - - - - Gets the randomized idle wait time. - - The randomized idle wait time. - - - - Construct a new for the given - as a non-daemon - with normal priority. - - - - - Construct a new for the given - as a with the given - attributes. - - - - - Signals the main processing loop to pause at the next possible point. - - - - - Signals the main processing loop to pause at the next possible point. - - - - - Signals the main processing loop that a change in scheduling has been - made - in order to interrupt any sleeping that may be occuring while - waiting for the fire time to arrive. - - - the time when the newly scheduled trigger - will fire. If this method is being called do to some other even (rather - than scheduling a trigger), the caller should pass null. - - - - - The main processing loop of the . - - - - - Trigger retry loop that is executed on error condition. - - The bndle. - - - - Releases the trigger retry loop. - - The trigger. - - - - Gets the log. - - The log. - - - - Sets the idle wait time. - - The idle wait time. - - - - Gets a value indicating whether this is paused. - - true if paused; otherwise, false. - - - - Gets or sets the db failure retry interval. - - The db failure retry interval. - - - - An interface to be used by instances in order to - communicate signals back to the . - - James House - Marko Lahma (.NET) - - - - An interface to be used by instances in order to - communicate signals back to the . - - James House - - - - Notifies the scheduler about misfired trigger. - - The trigger that misfired. - - - - Notifies the scheduler about finalized trigger. - - The trigger that has finalized. - - - - Signals the scheduling change. - - - - - Notifies the scheduler about misfired trigger. - - The trigger that misfired. - - - - Notifies the scheduler about finalized trigger. - - The trigger that has finalized. - - - - Signals the scheduling change. - - - - - An object used to pass information about the 'client' to the . - - - James House - Marko Lahma (.NET) - - - - get the instanceId in the cluster. - -

- Set the instanceId. -

-
-
- - - Metadata information about specific ADO.NET driver library. Metadata is used to - create correct types of object instances to interact with the underlying - database. - - - - - Initializes this instance. Parses information and initializes startup - values. - - - - - Gets the name of the parameter which includes the parameter prefix for this - database. - - Name of the parameter. - - - Gets or sets the name of the assembly that holds the connection library. - The name of the assembly. - - - - Gets or sets the name of the product. - - The name of the product. - - - - Gets or sets the type of the connection. - - The type of the connection. - - - - Gets or sets the type of the command. - - The type of the command. - - - - Gets or sets the type of the parameter. - - The type of the parameter. - - - - Gets the type of the command builder. - - The type of the command builder. - - - Gets the command builder's derive parameters method. - The command builder derive parameters method. - - - - Gets or sets the parameter name prefix. - - The parameter name prefix. - - - - Gets or sets the type of the exception that is thrown when using driver - library. - - The type of the exception. - - - - Gets or sets a value indicating whether parameters are bind by name when using - ADO.NET parameters. - - true if parameters are bind by name; otherwise, false. - - - Gets or sets the type of the database parameters. - The type of the parameter db. - - - - Gets the parameter db type property. - - The parameter db type property. - - - - Gets the parameter is nullable property. - - The parameter is nullable property. - - - - Gets or sets the type of the db binary column. This is a string representation of - Enum element because this information is database driver specific. - - The type of the db binary. - - - Gets the type of the db binary. - The type of the db binary. - - - - Sets the name of the parameter db type property. - - The name of the parameter db type property. - - - - Gets or sets a value indicating whether [use parameter name prefix in parameter collection]. - - - true if [use parameter name prefix in parameter collection]; otherwise, false. - - - - - - - - - - - - - - - Returns a new command object for executing SQL statments/Stored Procedures - against the database. - - An new - - - - Returns a new instance of the providers CommandBuilder class. - - In .NET 1.1 there was no common base class or interface - for command builders, hence the return signature is object to - be portable (but more loosely typed) across .NET 1.1/2.0 - A new Command Builder - - - - Returns a new connection object to communicate with the database. - - A new - - - - Returns a new parameter object for binding values to parameter - placeholders in SQL statements or Stored Procedure variables. - - A new - - - - Shutdowns this instance. - - - - - Connection string used to create connections. - - - - - Registers DB metadata information for given provider name. - - - - - - - Initializes a new instance of the class. - - Name of the db provider. - The connection string. - - - - Returns a new command object for executing SQL statments/Stored Procedures - against the database. - - An new - - - - Returns a new instance of the providers CommandBuilder class. - - A new Command Builder - In .NET 1.1 there was no common base class or interface - for command builders, hence the return signature is object to - be portable (but more loosely typed) across .NET 1.1/2.0 - - - - Returns a new connection object to communicate with the database. - - A new - - - - Returns a new parameter object for binding values to parameter - placeholders in SQL statements or Stored Procedure variables. - - A new - - - - Shutdowns this instance. - - - - - Connection string used to create connections. - - - - - - Gets the metadata. - - The metadata. - - - - Summary description for DbProviderFactory. - - - - - This interface can be implemented by any - class that needs to use the constants contained herein. - - Jeffrey Wescott - James House - - - @deprecated Whether a trigger has misfired is no longer a state, but - rather now identified dynamically by whether the trigger's next fire - time is more than the misfire threshold time in the past. - - - - This class contains utility functions for use in all delegate classes. - - Jeffrey Wescott - - - - Replace the table prefix in a query by replacing any occurrences of - "{0}" with the table prefix. - - The unsubstitued query - The table prefix - The query, with proper table prefix substituted - - - - Obtain a unique key for a given job. - - The job name - The group containing the job - - A unique key - - - - Obtain a unique key for a given trigger. - - The trigger name - The group containing the trigger - A unique key - - - - Base class for database based lock handlers for providing thread/resource locking - in order to protect resources from being altered by multiple threads at the - same time. - - - - - This class extends - to include the query string constants in use by the - class. - - Jeffrey Wescott - - - - An interface for providing thread/resource locking in order to protect - resources from being altered by multiple threads at the same time. - - James House - - - - Grants a lock on the identified resource to the calling thread (blocking - until it is available). - - true if the lock was obtained. - - - - Release the lock on the identified resource if it is held by the calling - thread. - - - - - Determine whether the calling thread owns a lock on the identified - resource. - - - - - Whether this Semaphore implementation requires a database connection for - its lock management operations. - - - - - - - - Interface for Quartz objects that need to know what the table prefix of - the tables used by a ADO.NET JobStore is. - - - - - Initializes a new instance of the class. - - The table prefix. - The SQL. - The default SQL. - The db provider. - - - - Execute the SQL that will lock the proper database row. - - - - - - - - Grants a lock on the identified resource to the calling thread (blocking - until it is available). - - - - - true if the lock was obtained. - - - - Release the lock on the identified resource if it is held by the calling - thread. - - - - - - - Determine whether the calling thread owns a lock on the identified - resource. - - - - - - - - Gets or sets the lock owners. - - The lock owners. - - - - Gets the log. - - The log. - - - - This Semaphore implementation does use the database. - - - - - Gets or sets the table prefix. - - The table prefix. - - - - A FirebirdDelegate specific driver delegate. - - Marko Lahma - - - - This is meant to be an abstract base class for most, if not all, - implementations. Subclasses should override only those methods that need - special handling for the DBMS driver in question. - - Jeffrey Wescott - James House - Marko Lahma (.NET) - - - - This is the base interface for all driver delegate classes. - - -

- This interface is very similar to the - interface except each method has an additional - parameter. -

-

- Unless a database driver has some extremely-DB-specific - requirements, any IDriverDelegate implementation classes should extend the - class. -

-
- Jeffrey Wescott - James House - Marko Lahma (.NET) -
- - - Update all triggers having one of the two given states, to the given new - state. - - The DB Connection - The new state for the triggers - The first old state to update - The second old state to update - Number of rows updated - - - - Get the names of all of the triggers that have misfired - according to - the given timestamp. - - The DB Connection - The timestamp. - An array of objects - - - - Get the names of all of the triggers in the given state that have - misfired - according to the given timestamp. - - The DB Connection - The state. - The time stamp. - An array of objects - - - - Get the names of all of the triggers in the given group and state that - have misfired - according to the given timestamp. - - The DB Connection - Name of the group. - The state. - The timestamp. - An array of objects - - - - Select all of the triggers for jobs that are requesting recovery. The - returned trigger objects will have unique "recoverXXX" trigger names and - will be in the trigger group. - - - In order to preserve the ordering of the triggers, the fire time will be - set from the ColumnFiredTime column in the TableFiredTriggers - table. The caller is responsible for calling - on each returned trigger. It is also up to the caller to insert the - returned triggers to ensure that they are fired. - - The DB Connection - An array of objects - - - - Delete all fired triggers. - - The DB Connection - The number of rows deleted - - - - Delete all fired triggers of the given instance. - - The DB Connection - The instance id. - The number of rows deleted - - - - Delete all volatile fired triggers. - - The DB Connection - The number of rows deleted - - - - Get the names of all of the triggers that are volatile. - - The DB Connection - An array of see cref="Key" /> objects. - - - - Get the names of all of the jobs that are volatile. - - The DB Connection - An array of objects. - - - - Insert the job detail record. - - The DB Connection - The job to insert. - Number of rows inserted. - - - - Update the job detail record. - - The DB Connection. - The job to update. - Number of rows updated. - - -

- Get the names of all of the triggers associated with the given job. -

- -
- The DB Connection - The job name - The job group -
- - - Delete all job listeners for the given job. - - The DB Connection - The name of the job - The group containing the job - The number of rows deleted - - - - Delete the job detail record for the given job. - - The DB Connection - the name of the job - Name of the group. - the number of rows deleted - - - - Check whether or not the given job is stateful. - - The DB Connection - The name of the job - The group containing the job - true if the job exists and is stateful, false otherwise - - - - Check whether or not the given job exists. - - The DB Connection - Name of the job. - Name of the group. - true if the job exists, false otherwise - - - - Update the job data map for the given job. - - The DB Connection - The job. - the number of rows updated - - - - Associate a listener with a job. - - The DB Connection - The job to associate with the listener. - The listener to insert. - The number of rows inserted. - - -

- Get all of the listeners for a given job. -

- -
- The DB Connection - The job name whose listeners are wanted - The group containing the job - array of listener names -
- - - Select the JobDetail object for a given job name / group name. - - The DB Connection - The job name whose listeners are wanted - The group containing the job - The class load helper. - The populated JobDetail object - - - - Select the total number of jobs stored. - - The DB Connection - the total number of jobs stored - - - - Select all of the job group names that are stored. - - The DB Connection. - an array of group names - - - - Select all of the jobs contained in a given group. - - The DB Connection - The group containing the jobs - an array of job names - - - - Insert the base trigger data. - - The DB Connection - The trigger to insert. - The state that the trigger should be stored in. - The job detail. - The number of rows inserted - - - - Insert the simple trigger data. - - The DB Connection - The trigger to insert - The number of rows inserted - - - - Insert the blob trigger data. - - The DB Connection - The trigger to insert - The number of rows inserted - - - - Insert the cron trigger data. - - the DB Connection - The trigger. - the number of rows inserted - - - - Update the base trigger data. - - the DB Connection - The trigger. - The state. - The job detail. - the number of rows updated - - - - Update the simple trigger data. - - the DB Connection - The trigger. - the number of rows updated - - - - Update the cron trigger data. - - the DB Connection - The trigger. - the number of rows updated - - - - Update the blob trigger data. - - the DB Connection - The trigger. - the number of rows updated - - - - Check whether or not a trigger exists. - - the DB Connection - Name of the trigger. - Name of the group. - the number of rows updated - - - - Update the state for a given trigger. - - The DB Connection - The name of the trigger. - The group containing the trigger. - The new state for the trigger. - the number of rows updated - - - - Update the given trigger to the given new state, if it is in the given - old state. - - The DB connection - The name of the trigger. - The group containing the trigger - The new state for the trigger - The old state the trigger must be in - int the number of rows updated - - - - Update the given trigger to the given new state, if it is one of the - given old states. - - The DB connection - The name of the trigger - The group containing the trigger - The new state for the trigger - One of the old state the trigger must be in - One of the old state the trigger must be in - One of the old state the trigger must be in - - int the number of rows updated - - SQLException - - - - Update the all triggers to the given new state, if they are in one of - the given old states AND its next fire time is before the given time. - - The DB connection - The new state for the trigger - One of the old state the trigger must be in - One of the old state the trigger must be in - The time before which the trigger's next fire time must be - int the number of rows updated - - - - Update all triggers in the given group to the given new state, if they - are in one of the given old states. - - The DB connection - The group containing the trigger - The new state for the trigger - One of the old state the trigger must be in - One of the old state the trigger must be in - One of the old state the trigger must be in - The number of rows updated - - - - Update all of the triggers of the given group to the given new state, if - they are in the given old state. - - The DB connection - The group containing the triggers - The new state for the trigger group - The old state the triggers must be in. - int the number of rows updated - - - - Update the states of all triggers associated with the given job. - - The DB Connection - The name of the job. - The group containing the job. - The new state for the triggers. - The number of rows updated - - - - Update the states of any triggers associated with the given job, that - are the given current state. - - The DB Connection - The name of the job - The group containing the job - The new state for the triggers - The old state of the triggers - the number of rows updated - - - - Delete all of the listeners associated with a given trigger. - - The DB Connection - The name of the trigger whose listeners will be deleted - The name of the group containing the trigger - the number of rows deleted - - - - Associate a listener with the given trigger. - - The DB Connectio - The trigger - The name of the listener to associate with the trigger - the number of rows inserted - - - - Select the listeners associated with a given trigger. - - The DB Connection - The name of the trigger - The group containing the trigger - array of trigger listener names - - - - Delete the simple trigger data for a trigger. - - The DB Connection - The name of the trigger - The group containing the trigger - The number of rows deleted - - - - Delete the BLOB trigger data for a trigger. - - The DB Connection - The name of the trigger - The group containing the trigger - The number of rows deleted - - - - Delete the cron trigger data for a trigger. - - The DB Connection - The name of the trigger - The group containing the trigger - the number of rows deleted - - - - Delete the base trigger data for a trigger. - - The DB Connection - The name of the trigger - The group containing the trigger - the number of rows deleted - - - - Select the number of triggers associated with a given job. - - The DB Connection - The name of the job - The group containing the job - the number of triggers for the given job - - - - Select the job to which the trigger is associated. - - The DB Connection - The name of the trigger - The group containing the trigger - The load helper. - - The object associated with the given trigger - - - - - Select the stateful jobs which are referenced by triggers in the given - trigger group. - - The DB Connection - The trigger group. - a List of Keys to jobs. - - - - Select the triggers for a job> - - The DB Connection - The name of the trigger - The group containing the trigger - an array of objects associated with a given job. - - - - Select the triggers for a calendar - - The DB Connection. - Name of the calendar. - - An array of objects associated with a given job. - - - - - Select a trigger. - - The DB Connection. - The name of the trigger. - The group containing the trigger. - The object. - - - - - Select a trigger's JobDataMap. - - The DB Connection. - The name of the trigger. - The group containing the trigger. - The of the Trigger, never null, but possibly empty. - - - - Select a trigger's state value. - - The DB Connection. - The name of the trigger. - The group containing the trigger. - The object. - - - - Select a triggers status (state and next fire time). - - The DB Connection. - The name of the trigger. - The group containing the trigger. - A object, or null - - - - Select the total number of triggers stored. - - The DB Connection. - The total number of triggers stored. - - - - Select all of the trigger group names that are stored. - - The DB Connection. - An array of group names. - - - - Select all of the triggers contained in a given group. - - The DB Connection. - The group containing the triggers. - An array of trigger names. - - - - Select all of the triggers in a given state. - - The DB Connection. - The state the triggers must be in. - An array of trigger s. - - - - Inserts the paused trigger group. - - The conn. - Name of the group. - - - - - Deletes the paused trigger group. - - The conn. - Name of the group. - - - - - Deletes all paused trigger groups. - - The conn. - - - - - Determines whether the specified trigger group is paused. - - The conn. - Name of the group. - - true if trigger group is paused; otherwise, false. - - - - - Selects the paused trigger groups. - - The DB Connection. - - - - - Determines whether given trigger group already exists. - - The conn. - Name of the group. - - true if trigger group exists; otherwise, false. - - - - - Insert a new calendar. - - The DB Connection. - The name for the new calendar. - The calendar. - The number of rows inserted. - - - - Update a calendar. - - The DB Connection. - The name for the new calendar. - The calendar. - The number of rows updated. - - - - Check whether or not a calendar exists. - - The DB Connection. - The name of the calendar. - true if the trigger exists, false otherwise. - - - - Select a calendar. - - The DB Connection. - The name of the calendar. - The Calendar. - - - - Check whether or not a calendar is referenced by any triggers. - - The DB Connection. - The name of the calendar. - true if any triggers reference the calendar, false otherwise - - - - Delete a calendar. - - The DB Connection - The name of the trigger. - The number of rows deleted. - - - - Select the total number of calendars stored. - - The DB Connection - The total number of calendars stored. - - - - Select all of the stored calendars. - - The DB Connection - An array of calendar names. - - - - Select the trigger that will be fired at the given fire time. - - The DB Connection - The time that the trigger will be fired. - - A representing the - trigger that will be fired at the given fire time, or null if no - trigger will be fired at that time - - - - - Insert a fired trigger. - - The DB Connection - The trigger. - The state that the trigger should be stored in. - The job detail. - The number of rows inserted. - - - - Select the states of all fired-trigger records for a given trigger, or - trigger group if trigger name is . - - The DB Connection - Name of the trigger. - Name of the group. - A list of FiredTriggerRecord objects. - - - - Select the states of all fired-trigger records for a given job, or job - group if job name is . - - The DB Connection - Name of the job. - Name of the group. - A List of FiredTriggerRecord objects. - - - - Select the states of all fired-trigger records for a given scheduler - instance. - - The DB Connection - Name of the instance. - A list of FiredTriggerRecord objects. - - - - Delete a fired trigger. - - The DB Connection - The fired trigger entry to delete. - The number of rows deleted. - - - - Get the number instances of the identified job currently executing. - - The DB Connection - Name of the job. - The job group. - - The number instances of the identified job currently executing. - - - - - Insert a scheduler-instance state record. - - The DB Connection - The instance id. - The check in time. - The interval. - The number of inserted rows. - - - - Delete a scheduler-instance state record. - - The DB Connection - The instance id. - The number of deleted rows. - - - - Update a scheduler-instance state record. - - The DB Connection - The instance id. - The check in time. - The number of updated rows. - - - - A List of all current s. -

- If instanceId is not null, then only the record for the identified - instance will be returned. -

-
- The DB Connection - The instance id. - -
- - - Select the next trigger which will fire to fire between the two given timestamps - in ascending order of fire time, and then descending by priority. - - The conn. - highest value of of the triggers (exclusive) - highest value of of the triggers (inclusive) - A (never null, possibly empty) list of the identifiers (Key objects) of the next triggers to be fired. - - - - Select the distinct instance names of all fired-trigger records. - - - This is useful when trying to identify orphaned fired triggers (a - fired trigger without a scheduler state record.) - - The conn. - - - - - Counts the misfired triggers in states. - - The conn. - The state1. - The state2. - The ts. - - - - - Selects the misfired triggers in states. - - The conn. - The state1. - The state2. - The ts. - The count. - The result list. - - - - - Create new StdAdoDelegate instance. - - the logger to use during execution - the prefix of all table names - The instance id. - The db provider. - - - - Create new StdAdoDelegate instance. - - the logger to use during execution - the prefix of all table names - The instance id. - The db provider. - if set to true [use properties]. - - - - Insert the job detail record. - - the DB Connection - the new state for the triggers - the first old state to update - the second old state to update - number of rows updated - - - - Get the names of all of the triggers that have misfired. - - the DB Connection - The ts. - an array of objects - - - - Select all of the triggers in a given state. - - The DB Connection - The state the triggers must be in - an array of trigger s - - - - Get the names of all of the triggers in the given state that have - misfired - according to the given timestamp. - - The DB Connection - The state. - The time stamp. - An array of objects - - - - Get the names of all of the triggers in the given states that have - misfired - according to the given timestamp. No more than count will - be returned. - - The conn. - The state1. - The state2. - The ts. - The most misfired triggers to return, negative for all - - Output parameter. A List of objects. Must not be null - - Whether there are more misfired triggers left to find beyond the given count. - - - - Get the number of triggers in the given states that have - misfired - according to the given timestamp. - - - - - - - - - - Get the names of all of the triggers in the given group and state that - have misfired. - - The DB Connection - Name of the group. - The state. - The timestamp. - an array of objects - - - - Select all of the triggers for jobs that are requesting recovery. The - returned trigger objects will have unique "recoverXXX" trigger names and - will be in the - trigger group. - - - In order to preserve the ordering of the triggers, the fire time will be - set from the ColumnFiredTime column in the TableFiredTriggers - table. The caller is responsible for calling - on each returned trigger. It is also up to the caller to insert the - returned triggers to ensure that they are fired. - - The DB Connection - an array of objects - - - - Delete all fired triggers. - - The DB Connection. - The number of rows deleted. - - - - Delete all fired triggers of the given instance. - - The DB Connection - The instance id. - The number of rows deleted - - - - Insert the job detail record. - - The DB Connection. - The job to insert. - Number of rows inserted. - - - - Gets the db presentation for boolean value. Subclasses can overwrite this behaviour. - - Value to map to database. - - - - - Update the job detail record. - - The DB Connection. - The job to update. - Number of rows updated. - - - - Get the names of all of the triggers associated with the given job. - - The DB Connection. - The name of the job. - The group containing the job. - An array of objects - - - - Delete all job listeners for the given job. - - The DB Connection. - The name of the job. - The group containing the job. - The number of rows deleted. - - - - Delete the job detail record for the given job. - - the DB Connection - the name of the job - the group containing the job - the number of rows deleted - - - - Check whether or not the given job is stateful. - - the DB Connection - the name of the job - the group containing the job - - true if the job exists and is stateful, false otherwise - - - - - Check whether or not the given job exists. - - the DB Connection - the name of the job - the group containing the job - true if the job exists, false otherwise - - - - Update the job data map for the given job. - - The conn. - the job to update - the number of rows updated - - - - Associate a listener with a job. - - The DB Connection. - The job to associate with the listener. - The listener to insert. - The number of rows inserted. - - - - Get all of the listeners for a given job. - - The DB Connection. - The job name whose listeners are wanted. - The group containing the job. - Array of listener names. - - - - Select the JobDetail object for a given job name / group name. - - The DB Connection. - The job name whose listeners are wanted. - The group containing the job. - The load helper. - The populated JobDetail object. - - - build Map from java.util.Properties encoding. - - - - Select the total number of jobs stored. - - The DB Connection. - The total number of jobs stored. - - - - Select all of the job group names that are stored. - - The DB Connection. - An array of group names. - - - - Select all of the jobs contained in a given group. - - The DB Connection. - The group containing the jobs. - An array of job names. - - - - Insert the base trigger data. - - the DB Connection - the trigger to insert - the state that the trigger should be stored in - The job detail. - the number of rows inserted - - - - Insert the simple trigger data. - - The DB Connection. - The trigger to insert. - The number of rows inserted. - - - - Insert the cron trigger data. - - the DB Connection - the trigger to insert - the number of rows inserted - - - - Insert the blob trigger data. - - The DB Connection. - The trigger to insert. - The number of rows inserted. - - - - Update the base trigger data. - - The DB Connection. - The trigger to insert. - The state that the trigger should be stored in. - The job detail. - The number of rows updated. - - - - Update the simple trigger data. - - The DB Connection. - The trigger to insert. - The number of rows updated. - - - - Update the cron trigger data. - - The DB Connection. - The trigger to insert. - The number of rows updated. - - - - Update the blob trigger data. - - The DB Connection. - The trigger to insert. - The number of rows updated. - - - - Check whether or not a trigger exists. - - The DB Connection. - The name of the trigger. - The group containing the trigger. - true if the trigger exists, false otherwise - - - - Update the state for a given trigger. - - The DB Connection. - The name of the trigger. - The group containing the trigger. - The new state for the trigger. - The number of rows updated. - - - - Update the given trigger to the given new state, if it is one of the - given old states. - - The DB connection. - The name of the trigger. - The group containing the trigger. - The new state for the trigger. - One of the old state the trigger must be in. - One of the old state the trigger must be in. - One of the old state the trigger must be in. - The number of rows updated. - - - - Update the all triggers to the given new state, if they are in one of - the given old states AND its next fire time is before the given time. - - The DB connection - The new state for the trigger - One of the old state the trigger must be in - One of the old state the trigger must be in - The time before which the trigger's next fire time must be - int the number of rows updated - - - - Update all triggers in the given group to the given new state, if they - are in one of the given old states. - - The DB connection. - The group containing the trigger. - The new state for the trigger. - One of the old state the trigger must be in. - One of the old state the trigger must be in. - One of the old state the trigger must be in. - The number of rows updated. - - - - Update the given trigger to the given new state, if it is in the given - old state. - - the DB connection - the name of the trigger - the group containing the trigger - the new state for the trigger - the old state the trigger must be in - int the number of rows updated - - - - Update all of the triggers of the given group to the given new state, if - they are in the given old state. - - the DB connection - the group containing the triggers - the new state for the trigger group - the old state the triggers must be in - int the number of rows updated - - - - Update the states of all triggers associated with the given job. - - the DB Connection - the name of the job - the group containing the job - the new state for the triggers - the number of rows updated - - - - Updates the state of the trigger states for job from other. - - The conn. - Name of the job. - Name of the group. - The state. - The old state. - - - - - Delete all of the listeners associated with a given trigger. - - the DB Connection - the name of the trigger whose listeners will be deleted - the name of the group containing the trigger - the number of rows deleted - - - - Associate a listener with the given trigger. - - the DB Connection - the trigger - the name of the listener to associate with the trigger - the number of rows inserted - - - - Select the listeners associated with a given trigger. - - the DB Connection - the name of the trigger - the group containing the trigger - - array of trigger listener names - - - - - Delete the simple trigger data for a trigger. - - the DB Connection - the name of the trigger - the group containing the trigger - the number of rows deleted - - - - Delete the cron trigger data for a trigger. - - the DB Connection - the name of the trigger - the group containing the trigger - the number of rows deleted - - - - Delete the cron trigger data for a trigger. - - the DB Connection - the name of the trigger - the group containing the trigger - the number of rows deleted - - - - Delete the base trigger data for a trigger. - - the DB Connection - the name of the trigger - the group containing the trigger - the number of rows deleted - - - - Select the number of triggers associated with a given job. - - the DB Connection - the name of the job - the group containing the job - the number of triggers for the given job - - - - Select the job to which the trigger is associated. - - the DB Connection - the name of the trigger - the group containing the trigger - The load helper. - The object associated with the given trigger - - - - Select the triggers for a job - - the DB Connection - the name of the trigger - the group containing the trigger - - an array of objects - associated with a given job. - - - - - Select the triggers for a calendar - - The DB Connection. - Name of the calendar. - - An array of objects associated with a given job. - - - - - Selects the stateful jobs of trigger group. - - The database connection. - Name of the group. - - - - - Select a trigger. - - the DB Connection - the name of the trigger - the group containing the trigger - The object - - - - Select a trigger's JobDataMap. - - the DB Connection - the name of the trigger - the group containing the trigger - The of the Trigger, never null, but possibly empty. - - - - Select a trigger's state value. - - the DB Connection - the name of the trigger - the group containing the trigger - The object - - - - Select a trigger status (state and next fire time). - - the DB Connection - the name of the trigger - the group containing the trigger - - a object, or null - - - - - Select the total number of triggers stored. - - the DB Connection - the total number of triggers stored - - - - Select all of the trigger group names that are stored. - - the DB Connection - - an array of group names - - - - - Select all of the triggers contained in a given group. - - the DB Connection - the group containing the triggers - - an array of trigger names - - - - - Inserts the paused trigger group. - - The conn. - Name of the group. - - - - - Deletes the paused trigger group. - - The conn. - Name of the group. - - - - - Deletes all paused trigger groups. - - The conn. - - - - - Determines whether the specified trigger group is paused. - - The conn. - Name of the group. - - true if trigger group is paused; otherwise, false. - - - - - Determines whether given trigger group already exists. - - The conn. - Name of the group. - - true if trigger group exists; otherwise, false. - - - - - Insert a new calendar. - - the DB Connection - The name for the new calendar. - The calendar. - the number of rows inserted - IOException - - - - Update a calendar. - - the DB Connection - The name for the new calendar. - The calendar. - the number of rows updated - IOException - - - - Check whether or not a calendar exists. - - the DB Connection - The name of the calendar. - - true if the trigger exists, false otherwise - - - - - Select a calendar. - - the DB Connection - The name of the calendar. - the Calendar - ClassNotFoundException - IOException - - - - Check whether or not a calendar is referenced by any triggers. - - the DB Connection - The name of the calendar. - - true if any triggers reference the calendar, false otherwise - - - - - Delete a calendar. - - the DB Connection - The name of the trigger. - the number of rows deleted - - - - Select the total number of calendars stored. - - the DB Connection - the total number of calendars stored - - - - Select all of the stored calendars. - - the DB Connection - - an array of calendar names - - - - - Select the trigger that will be fired at the given fire time. - - the DB Connection - the time that the trigger will be fired - - a representing the - trigger that will be fired at the given fire time, or null if no - trigger will be fired at that time - - - - - Select the next trigger which will fire to fire between the two given timestamps - in ascending order of fire time, and then descending by priority. - - The conn. - highest value of of the triggers (exclusive) - highest value of of the triggers (inclusive) - A (never null, possibly empty) list of the identifiers (Key objects) of the next triggers to be fired. - - - - Gets the select next trigger to acquire SQL clause. - This can be overriden for a more performant, result limiting - SQL. For Example SQL Server, MySQL and SQLite support limiting returned rows. - - - - - - Insert a fired trigger. - - the DB Connection - the trigger - the state that the trigger should be stored in - The job. - the number of rows inserted - - - - Select the states of all fired-trigger records for a given trigger, or - trigger group if trigger name is . - - The DB connection. - Name of the trigger. - Name of the group. - a List of objects. - - - - Select the states of all fired-trigger records for a given job, or job - group if job name is . - - The DB connection. - Name of the job. - Name of the group. - a List of objects. - - - - Select the states of all fired-trigger records for a given scheduler - instance. - - The DB Connection - Name of the instance. - A list of FiredTriggerRecord objects. - - - - Select the distinct instance names of all fired-trigger records. - - The conn. - - - This is useful when trying to identify orphaned fired triggers (a - fired trigger without a scheduler state record.) - - - - - Delete a fired trigger. - - the DB Connection - the fired trigger entry to delete - the number of rows deleted - - - - Selects the job execution count. - - The DB connection. - Name of the job. - The job group. - - - - - Delete all volatile fired triggers. - - The DB Connection - The number of rows deleted - - - - Inserts the state of the scheduler. - - The conn. - The instance id. - The check in time. - The interval. - - - - - Deletes the state of the scheduler. - - The database connection. - The instance id. - - - - - Updates the state of the scheduler. - - The database connection. - The instance id. - The check in time. - - - - - A List of all current s. -

- If instanceId is not null, then only the record for the identified - instance will be returned. -

-
- The DB Connection - The instance id. - -
- - - Replace the table prefix in a query by replacing any occurrences of - "{0}" with the table prefix. - - The unsubstitued query - The query, with proper table prefix substituted - - - - Create a serialized version of an Object. - - the object to serialize - Serialized object as byte array. - - - - Remove the transient data from and then create a serialized - version of a and returns the underlying bytes. - - The data. - the serialized data as byte array - - - - serialize - - The data. - - - - - Convert the JobDataMap into a list of properties. - - - - - Convert the JobDataMap into a list of properties. - - - - - This method should be overridden by any delegate subclasses that need - special handling for BLOBs. The default implementation uses standard - ADO.NET operations. - - The data reader, already queued to the correct row. - The column index for the BLOB. - The deserialized object from the DataReader BLOB. - - - - Get the names of all of the triggers that are volatile. - - The DB Connection - An array of objects. - - - - Get the names of all of the jobs that are volatile. - - The DB Connection - An array of objects. - - - - This method should be overridden by any delegate subclasses that need - special handling for BLOBs for job details. - - The result set, already queued to the correct row. - The column index for the BLOB. - The deserialized Object from the ResultSet BLOB. - - - - Selects the paused trigger groups. - - The DB Connection. - - - - - Gets the triggers to acquire limit. - - The triggers to acquire limit. - - - - Initializes a new instance of the class. - - the logger to use during execution - the prefix of all table names - The instance id. - The db provider. - - - - Initializes a new instance of the class. - - The logger. - The table prefix. - The instance id. - The db provider. - if set to true [use properties]. - - - - Creates the SQL for select next trigger to acquire. - - - - - Gets the select next trigger to acquire SQL clause. - Firebird specific version with FIRST functionality - - - - - - Conveys the state of a fired-trigger record. - - James House - - - - Gets or sets the fire instance id. - - The fire instance id. - - - - Gets or sets the fire timestamp. - - The fire timestamp. - - - - Gets or sets a value indicating whether [job is stateful]. - - true if [job is stateful]; otherwise, false. - - - - Gets or sets the job key. - - The job key. - - - - Gets or sets the scheduler instance id. - - The scheduler instance id. - - - - Gets or sets the trigger key. - - The trigger key. - - - - Gets or sets the state of the fire instance. - - The state of the fire instance. - - - - Gets or sets a value indicating whether [job requests recovery]. - - true if [job requests recovery]; otherwise, false. - - - - Gets or sets a value indicating whether [trigger is volatile]. - - true if [trigger is volatile]; otherwise, false. - - - - Gets or sets the priority. - - The priority. - - - - Exception class for when a driver delegate cannot be found for a given - configuration, or lack thereof. - - Jeffrey Wescott - - - - - Base class for exceptions thrown by the Quartz . - - - SchedulerExceptions may contain a reference to another - , which was the underlying cause of the SchedulerException. - - James House - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The MSG. - - - - Initializes a new instance of the class. - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - The class name is null or is zero (0). - The info parameter is null. - - - - Initializes a new instance of the class. - - The MSG. - The error code. - - - - Initializes a new instance of the class. - - The cause. - - - - Initializes a new instance of the class. - - The MSG. - The cause. - - - - Initializes a new instance of the class. - - The MSG. - The cause. - The error code. - - - - Creates and returns a string representation of the current exception. - - - A string representation of the current exception. - - - - - - Return the exception that is the underlying cause of this exception. - This may be used to find more detail about the cause of the error. - - The underlying exception, or if there is not - one. - - - - - Get the error code associated with this exception. - This may be used to find more detail about the cause of the error. - - - One of the ERR_XXX constants defined in this class. - - - -

- Determine if the specified error code is in the - category of errors. -

-
-
- -

- Determine if the specified error code is in the - category of errors. -

-
-
- - - Determine if the specified error code is in the - category of errors. - - - - - Determine if the specified error code is in the - category of errors. - - - - - Determine if the specified error code is in the - category of errors. - - - - - Determine if the specified error code is in the - category of errors. - - - - - Initializes a new instance of the class. - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - The class name is null or is zero (0). - The info parameter is null. - - - - is meant to be used in an application-server - or other software framework environment that provides - container-managed-transactions. No commit / rollback will be handled by this class. - - - If you need commit / rollback, use - instead. - - Jeffrey Wescott - James House - Srinivas Venkatarangaiah - - - - Contains base functionality for ADO.NET-based JobStore implementations. - - Jeffrey Wescott - James House - Marko Lahma (.NET) - - - - The interface to be implemented by classes that want to provide a - and storage mechanism for the - 's use. - - - Storage of s and s should be keyed - on the combination of their name and group for uniqueness. - - - - - - - - James House - - - - Called by the QuartzScheduler before the is - used, in order to give the it a chance to Initialize. - - - - - Called by the QuartzScheduler to inform the that - the scheduler has started. - - - - - Called by the QuartzScheduler to inform the that - it should free up all of it's resources because the scheduler is - shutting down. - - - - - Store the given and . - - The scheduling context. - The to be stored. - The to be stored. - ObjectAlreadyExistsException - - - - returns true if the given JobGroup - is paused - - - - - - - - returns true if the given TriggerGroup - is paused - - - - - - - - Store the given . - - The context. - The to be stored. - - If , any existing in the - with the same name and group should be - over-written. - - - - - Remove (delete) the with the given - name, and any s that reference - it. - - - If removal of the results in an empty group, the - group should be removed from the 's list of - known group names. - - The context. - The name of the to be removed. - The group name of the to be removed. - - if a with the given name and - group was found and removed from the store. - - - - - Retrieve the for the given - . - - The context. - The name of the to be retrieved. - The group name of the to be retrieved. - - The desired , or null if there is no match. - - - - - Store the given . - - The context. - The to be stored. - If , any existing in - the with the same name and group should - be over-written. - ObjectAlreadyExistsException - - - - Remove (delete) the with the - given name. - - -

- If removal of the results in an empty group, the - group should be removed from the 's list of - known group names. -

-

- If removal of the results in an 'orphaned' - that is not 'durable', then the should be deleted - also. -

-
- The context. - The name of the to be removed. - The group name of the to be removed. - - if a with the given - name and group was found and removed from the store. - -
- - - Remove (delete) the with the - given name, and store the new given one - which must be associated - with the same job. - - The context. - The name of the to be removed. - The group name of the to be removed. - The new to be stored. - - if a with the given - name and group was found and removed from the store. - - - - - Retrieve the given . - - The context. - The name of the to be retrieved. - The group name of the to be retrieved. - - The desired , or null if there is no - match. - - - - - Store the given . - - The context. - The name. - The to be stored. - If , any existing - in the with the same name and group - should be over-written. - If , any s existing - in the that reference an existing - Calendar with the same name with have their next fire time - re-computed with the new . - ObjectAlreadyExistsException - - - - Remove (delete) the with the - given name. - - - If removal of the would result in - s pointing to non-existent calendars, then a - will be thrown. - - The context. - The name of the to be removed. - - if a with the given name - was found and removed from the store. - - - - - Retrieve the given . - - The context. - The name of the to be retrieved. - - The desired , or null if there is no - match. - - - - - Get the number of s that are - stored in the . - - The context. - - - - - Get the number of s that are - stored in the . - - The context. - - - - - Get the number of s that are - stored in the . - - The context. - - - - - Get the names of all of the s that - have the given group name. -

- If there are no jobs in the given group name, the result should be a - zero-length array (not ). -

-
- The CTX. - Name of the group. - -
- - - Get the names of all of the s - that have the given group name. -

- If there are no triggers in the given group name, the result should be a - zero-length array (not ). -

-
-
- - - Get the names of all of the - groups. -

- If there are no known group names, the result should be a zero-length - array (not ). -

-
-
- - - Get the names of all of the - groups. -

- If there are no known group names, the result should be a zero-length - array (not ). -

-
-
- - - Get the names of all of the s - in the . - -

- If there are no Calendars in the given group name, the result should be - a zero-length array (not ). -

-
-
- - - Get all of the Triggers that are associated to the given Job. - - - If there are no matches, a zero-length array should be returned. - - - - - Get the current state of the identified . - - - - - - - - - - Pause the with the given name. - - - - - Pause all of the s in the - given group. - - - The JobStore should "remember" that the group is paused, and impose the - pause on any new triggers that are added to the group while the group is - paused. - - - - - Pause the with the given name - by - pausing all of its current s. - - - - - Pause all of the s in the given - group - by pausing all of their s. -

- The JobStore should "remember" that the group is paused, and impose the - pause on any new jobs that are added to the group while the group is - paused. -

-
- - -
- - - Resume (un-pause) the with the - given name. - -

- If the missed one or more fire-times, then the - 's misfire instruction will be applied. -

-
- - -
- - - Resume (un-pause) all of the s - in the given group. -

- If any missed one or more fire-times, then the - 's misfire instruction will be applied. -

-
-
- - - Gets the paused trigger groups. - - The context. - - - - - Resume (un-pause) the with the - given name. -

- If any of the 's s missed one - or more fire-times, then the 's misfire - instruction will be applied. -

-
-
- - - Resume (un-pause) all of the s in - the given group. -

- If any of the s had s that - missed one or more fire-times, then the 's - misfire instruction will be applied. -

-
-
- - - Pause all triggers - equivalent of calling - on every group. -

- When is called (to un-pause), trigger misfire - instructions WILL be applied. -

-
- -
- - - Resume (un-pause) all triggers - equivalent of calling - on every group. -

- If any missed one or more fire-times, then the - 's misfire instruction will be applied. -

- -
- -
- - - Get a handle to the next trigger to be fired, and mark it as 'reserved' - by the calling scheduler. - - The context. - If > 0, the JobStore should only return a Trigger - that will fire no later than the time represented in this value as - milliseconds. - - - - - - - Inform the that the scheduler no longer plans to - fire the given , that it had previously acquired - (reserved). - - - - - Inform the that the scheduler is now firing the - given (executing its associated ), - that it had previously acquired (reserved). - - null if the trigger or it's job or calendar no longer exist, or - if the trigger was not successfully put into the 'executing' - state. - - - - - Inform the that the scheduler has completed the - firing of the given (and the execution its - associated ), and that the - in the given should be updated if the - is stateful. - - - - - Supports the persistence. - - - - - - Initializes a new instance of the class. - - - - - Gets the connection and starts a new transaction. - - - - - - Called by the QuartzScheduler before the is - used, in order to give it a chance to Initialize. - - - - - - - - Called by the QuartzScheduler to inform the that - it should free up all of it's resources because the scheduler is - shutting down. - - - - - Removes all volatile data. - - - - - Removes all volatile data. - - - - - Will recover any failed or misfired jobs and clean up the data store as - appropriate. - - - - - Will recover any failed or misfired jobs and clean up the data store as - appropriate. - - - - - Store the given and . - - SchedulingContext - Job to be stored. - Trigger to be stored. - - - - returns true if the given JobGroup - is paused - - - - - - - - returns true if the given TriggerGroup - is paused - - - - - - - - Stores the given . - - - The to be stored. - - If , any existing in the - with the same name & group should be over-written. - - - -

- Insert or update a job. -

-
-
- - - Check existence of a given job. - - - - - Store the given . - - - The to be stored. - - If , any existing in - the with the same name & group should - be over-written. - - - if a with the same name/group already - exists, and replaceExisting is set to false. - - - - - Insert or update a trigger. - - - - - Check existence of a given trigger. - - - - - Remove (delete) the with the given - name, and any s that reference - it. - - - - If removal of the results in an empty group, the - group should be removed from the 's list of - known group names. - - - The name of the to be removed. - The group name of the to be removed. - - if a with the given name & - group was found and removed from the store. - - - - - Delete a job and its listeners. - - - - - - - Delete a trigger, its listeners, and its Simple/Cron/BLOB sub-table entry. - - - - - - - - Retrieve the for the given - . - - The name of the to be retrieved. - The group name of the to be retrieved. - The desired , or null if there is no match. - - - - Remove (delete) the with the - given name. - - - -

- If removal of the results in an empty group, the - group should be removed from the 's list of - known group names. -

- -

- If removal of the results in an 'orphaned' - that is not 'durable', then the should be deleted - also. -

-
- The name of the to be removed. - The group name of the to be removed. - - if a with the given - name & group was found and removed from the store. - -
- - - - - - Retrieve the given . - - The name of the to be retrieved. - The group name of the to be retrieved. - The desired , or null if there is no match. - - - - Get the current state of the identified . - - - - - - - - - - Gets the state of the trigger. - - The conn. - The CTXT. - Name of the trigger. - Name of the group. - - - - - Store the given . - - The name of the calendar. - The to be stored. - - If , any existing - in the with the same name & group - should be over-written. - - - if a with the same name already - exists, and replaceExisting is set to false. - - - - - Remove (delete) the with the given name. - - - If removal of the would result in - s pointing to non-existent calendars, then a - will be thrown. - - The name of the to be removed. - - if a with the given name - was found and removed from the store. - - - - - Retrieve the given . - - The name of the to be retrieved. - The desired , or null if there is no match. - - - - Get the number of s that are - stored in the . - - - - - Get the number of s that are - stored in the . - - - - - Get the number of s that are - stored in the . - - - - - Get the names of all of the s that - have the given group name. - - - If there are no jobs in the given group name, the result should be a - zero-length array (not ). - - - - - Get the names of all of the s - that have the given group name. - - - If there are no triggers in the given group name, the result should be a - zero-length array (not ). - - - - - Get the names of all of the - groups. - - - - If there are no known group names, the result should be a zero-length - array (not ). - - - - - Get the names of all of the - groups. - - - - If there are no known group names, the result should be a zero-length - array (not ). - - - - - Get the names of all of the s - in the . - - - If there are no Calendars in the given group name, the result should be - a zero-length array (not ). - - - - - Get all of the Triggers that are associated to the given Job. - - - If there are no matches, a zero-length array should be returned. - - - - - Pause the with the given name. - - - - - - Pause the with the given name. - - - - - - Pause the with the given name - by - pausing all of its current s. - - - - - - Pause all of the s in the given - group - by pausing all of their s. - - - - - - Determines if a Trigger for the given job should be blocked. - State can only transition to StatePausedBlocked/StateBlocked from - StatePaused/StateWaiting respectively. - - StatePausedBlocked, StateBlocked, or the currentState. - - - - Resume (un-pause) the with the - given name. - - - If the missed one or more fire-times, then the - 's misfire instruction will be applied. - - - - - - Resume (un-pause) the with the - given name. - - - If any of the 's s missed one - or more fire-times, then the 's misfire - instruction will be applied. - - - - - - Resume (un-pause) all of the s in - the given group. - - - If any of the s had s that - missed one or more fire-times, then the 's - misfire instruction will be applied. - - - - - - Pause all of the s in the given group. - - - - - - Pause all of the s in the given group. - - - - - - Pause all of the s in the - given group. - - - - - - Resume (un-pause) all of the s - in the given group. -

- If any missed one or more fire-times, then the - 's misfire instruction will be applied. -

-
- -
- - - Pause all triggers - equivalent of calling - on every group. -

- When is called (to un-pause), trigger misfire - instructions WILL be applied. -

-
- - -
- - - Resume (un-pause) all triggers - equivalent of calling - on every group. - - - If any missed one or more fire-times, then the - 's misfire instruction will be applied. - - - - - - Resume (un-pause) all triggers - equivalent of calling - on every group. -

- If any missed one or more fire-times, then the - 's misfire instruction will be applied. -

-
- -
- - - Get a handle to the next N triggers to be fired, and mark them as 'reserved' - by the calling scheduler. - - - - - - Inform the that the scheduler no longer plans to - fire the given , that it had previously acquired - (reserved). - - - - - Inform the that the scheduler has completed the - firing of the given (and the execution its - associated ), and that the - in the given should be updated if the - is stateful. - - - - - Get a list of all scheduler instances in the cluster that may have failed. - This includes this scheduler if it is checking in for the first time. - - - - - Create dummy objects for fired triggers - that have no scheduler state record. Checkin timestamp and interval are - left as zero on these dummy objects. - - List of all current s - - - - Cleanup the given database connection. This means restoring - any modified auto commit or transaction isolation connection - attributes, and then closing the underlying connection. - - - - This is separate from closeConnection() because the Spring - integration relies on being able to overload closeConnection() and - expects the same connection back that it originally returned - from the datasource. - - - - - - Closes the supplied connection. - - (Optional) - - - - Rollback the supplied connection. - - (Optional) - - JobPersistenceException thrown if a SQLException occurs when the - connection is rolled back - - - - - Commit the supplied connection. - - The CTH. - if set to true opens a new transaction. - JobPersistenceException thrown if a SQLException occurs when the - - - - Execute the given callback in a transaction. Depending on the JobStore, - the surrounding transaction may be assumed to be already present - (managed). - - - This method just forwards to ExecuteInLock() with a null lockName. - - - - - - Execute the given callback having aquired the given lock. - Depending on the JobStore, the surrounding transaction may be - assumed to be already present (managed). This version is just a - handy wrapper around executeInLock that doesn't require a return - value. - - - The name of the lock to aquire, for example - "TRIGGER_ACCESS". If null, then no lock is aquired, but the - lockCallback is still executed in a transaction. - - - - - - Execute the given callback having aquired the given lock. - Depending on the JobStore, the surrounding transaction may be - assumed to be already present (managed). - - - The name of the lock to aquire, for example - "TRIGGER_ACCESS". If null, then no lock is aquired, but the - lockCallback is still executed in a transaction. - - - - - Execute the given callback having optionally aquired the given lock. - This uses the non-managed transaction connection. This version is just a - handy wrapper around executeInNonManagedTXLock that doesn't require a return - value. - - - The name of the lock to aquire, for example - "TRIGGER_ACCESS". If null, then no lock is aquired, but the - lockCallback is still executed in a non-managed transaction. - - - - - - Execute the given callback having optionally aquired the given lock. - This uses the non-managed transaction connection. - - - The name of the lock to aquire, for example - "TRIGGER_ACCESS". If null, then no lock is aquired, but the - lockCallback is still executed in a non-managed transaction. - - - - - Get or set the datasource name. - - - - - Gets the log. - - The log. - - - - Get or sets the prefix that should be pre-pended to all table names. - - - - - Set whether string-only properties will be handled in JobDataMaps. - - - - - Get or set the instance Id of the Scheduler (must be unique within a cluster). - - - - - Get or set the instance Id of the Scheduler (must be unique within this server instance). - - - - - Get or set whether this instance is part of a cluster. - - - - - Get or set the frequency at which this instance "checks-in" - with the other instances of the cluster. -- Affects the rate of - detecting failed instances. - - - - - Get or set the maximum number of misfired triggers that the misfire handling - thread will try to recover at one time (within one transaction). The - default is 20. - - - - - Gets or sets the database retry interval. - - The db retry interval. - - - - Get or set whether this instance should use database-based thread - synchronization. - - - - - Whether or not to obtain locks when inserting new jobs/triggers. - Defaults to , which is safest - some db's (such as - MS SQLServer) seem to require this to avoid deadlocks under high load, - while others seem to do fine without. - - - Setting this property to will provide a - significant performance increase during the addition of new jobs - and triggers. - - - - - The time span by which a trigger must have missed its - next-fire-time, in order for it to be considered "misfired" and thus - have its misfire instruction applied. - - - - - Don't call set autocommit(false) on connections obtained from the - DataSource. This can be helpfull in a few situations, such as if you - have a driver that complains if it is called when it is already off. - - - - - Set the transaction isolation level of DB connections to sequential. - - - - - Whether or not the query and update to acquire a Trigger for firing - should be performed after obtaining an explicit DB lock (to avoid - possible race conditions on the trigger's db row). This is - is considered unnecessary for most databases (due to the nature of - the SQL update that is performed), and therefore a superfluous performance hit. - - - - - Get or set the ADO.NET driver delegate class name. - - - - - set the SQL statement to use to select and lock a row in the "locks" - table. - - - - - - Get whether the threads spawned by this JobStore should be - marked as daemon. Possible threads include the - and the . - - - - - - Get whether to check to see if there are Triggers that have misfired - before actually acquiring the lock to recover them. This should be - set to false if the majority of the time, there are are misfired - Triggers. - - - - - - Get the driver delegate for DB operations. - - - - - Get whether String-only properties will be handled in JobDataMaps. - - - - - Indicates whether this job store supports persistence. - - - - - - - Implement this interface to provide the code to execute within - the a transaction template that has no return value. - - - - - - Implement this interface to provide the code to execute within - the a transaction template. If no return value is required, execute - should just return null. - - - - - - - - An interface for classes wishing to provide the service of loading classes - and resources within the scheduler... - - James House - - - - Called to give the ClassLoadHelper a chance to Initialize itself, - including the oportunity to "steal" the class loader off of the calling - thread, which is the thread that is initializing Quartz. - - - - - Return the class with the given name. - - - - - Finds a resource with a given name. This method returns null if no - resource with this name is found. - - name of the desired resource - - a java.net.URL object - - - - - Finds a resource with a given name. This method returns null if no - resource with this name is found. - - name of the desired resource - - a java.io.InputStream object - - - - - Helper class for returning the composite result of trying - to recover misfired jobs. - - - - - Initializes a new instance of the class. - - if set to true [has more misfired triggers]. - The processed misfired trigger count. - - - - - Gets a value indicating whether this instance has more misfired triggers. - - - true if this instance has more misfired triggers; otherwise, false. - - - - - Gets the processed misfired trigger count. - - The processed misfired trigger count. - - - - Called by the QuartzScheduler before the is - used, in order to give the it a chance to Initialize. - - - - - - - Called by the QuartzScheduler to inform the that - it should free up all of it's resources because the scheduler is - shutting down. - - - - - Gets the non managed TX connection. - - - - - - Execute the given callback having optionally aquired the given lock. - Because CMT assumes that the connection is already part of a managed - transaction, it does not attempt to commit or rollback the - enclosing transaction. - - - - - - - The name of the lock to aquire, for example - "TRIGGER_ACCESS". If null, then no lock is aquired, but the - txCallback is still executed in a transaction. - - Callback to execute. - - - - Utility class to keep track of both active transaction - and connection. - - - - - Initializes a new instance of the class. - - The connection. - The transaction. - - - - Gets or sets the connection. - - The connection. - - - - Gets or sets the transaction. - - The transaction. - - - - is meant to be used in a standalone environment. - Both commit and rollback will be handled by this class. - - Jeffrey Wescott - James House - - - - Called by the QuartzScheduler before the is - used, in order to give the it a chance to Initialize. - - - - - - - For , the non-managed TX connection is just - the normal connection because it is not CMT. - - - - - - Execute the given callback having optionally aquired the given lock. - For , because it manages its own transactions - and only has the one datasource, this is the same behavior as - . - - - The name of the lock to aquire, for example "TRIGGER_ACCESS". - If null, then no lock is aquired, but the lockCallback is still - executed in a transaction. - - Callback to execute. - - - - - - - - - Exception class for when there is a failure obtaining or releasing a - resource lock. - - - James House - - - - An exception that is thrown to indicate that there has been a failure in the - scheduler's underlying persistence mechanism. - - James House - - - -

- Create a with the given message. -

-
-
- - - Initializes a new instance of the class. - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - The class name is null or is zero (0). - The info parameter is null. - - -

- Create a with the given message - and error code. -

-
-
- -

- Create a with the given message - and cause. -

-
-
- -

- Create a with the given message, - cause and error code. -

-
-
- - - Initializes a new instance of the class. - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - The class name is null or is zero (0). - The info parameter is null. - - - - This is a driver delegate for the MySQL ADO.NET driver. - - Marko Lahma - - - - Initializes a new instance of the class. - - the logger to use during execution - the prefix of all table names - The instance id. - The db provider. - - - - Initializes a new instance of the class. - - The logger. - The table prefix. - The instance id. - The db provider. - if set to true [use properties]. - - - - Gets the select next trigger to acquire SQL clause. - MySQL version with LIMIT support. - - - - - - Exception class for when a driver delegate cannot be found for a given - configuration, or lack thereof. - - Jeffrey Wescott - - - - Initializes a new instance of the class. - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - The class name is null or is zero (0). - The info parameter is null. - - - - This is a driver delegate for the Oracle database. - - Marko Lahma - - - - Initializes a new instance of the class. - - the logger to use during execution - the prefix of all table names - The instance id. - The db provider. - - - - Initializes a new instance of the class. - - The logger. - The table prefix. - The instance id. - The db provider. - if set to true [use properties]. - - - - Creates the SQL for select next trigger to acquire. - - - - - Gets the select next trigger to acquire SQL clause. - Oracle version with rownum support. - - - - - - This is a driver delegate for the PostgreSQL ADO.NET driver. - - Marko Lahma - - - - Initializes a new instance of the class. - - The log. - The table prefix. - The instance id. - The db provider. - - - - Initializes a new instance of the class. - - The log. - The table prefix. - The instance id. - The db provider. - if set to true [use properties]. - - - - Gets the select next trigger to acquire SQL clause. - PostgreSQL version with LIMIT support. - - - - - - Conveys a scheduler-instance state record. - - James House - - - - Gets or sets the checkin interval. - - The checkin interval. - - - - Gets or sets the checkin timestamp. - - The checkin timestamp. - - - - Gets or sets the scheduler instance id. - - The scheduler instance id. - - - - Internal in-memory lock handler for providing thread/resource locking in - order to protect resources from being altered by multiple threads at the - same time. - - James House - - - - Grants a lock on the identified resource to the calling thread (blocking - until it is available). - - True if the lock was obtained. - - - Release the lock on the identified resource if it is held by the calling - thread. - - - - - Determine whether the calling thread owns a lock on the identified - resource. - - - - - Gets the thread locks. - - The thread locks. - - - - Whether this Semaphore implementation requires a database connection for - its lock management operations. - - - - - - - - - This is a driver delegate for the SQLiteDelegate ADO.NET driver. - - Marko Lahma - - - - Initializes a new instance of the class. - - the logger to use during execution - the prefix of all table names - The instance id. - The db provider. - - - - Initializes a new instance of the class. - - The logger. - The table prefix. - The instance id. - The db provider. - if set to true [use properties]. - - - - Gets the select next trigger to acquire SQL clause. - SQLite version with LIMIT support. - - - - - - A SQL Server specific driver delegate. - - Marko Lahma - - - - Initializes a new instance of the class. - - the logger to use during execution - the prefix of all table names - The instance id. - The db provider. - - - - Initializes a new instance of the class. - - The logger. - The table prefix. - The instance id. - The db provider. - if set to true [use properties]. - - - - Creates the SQL for select next trigger to acquire. - - - - - Gets the select next trigger to acquire SQL clause. - SQL Server specific version with TOP functionality - - - - - - Internal database based lock handler for providing thread/resource locking - in order to protect resources from being altered by multiple threads at the - same time. - - James House - - - - Initializes a new instance of the class. - - The table prefix. - The select with lock SQL. - - - - Execute the SQL select for update that will lock the proper database row. - - - - Provide thread/resource locking in order to protect - resources from being altered by multiple threads at the same time using - a db row update. - - - Note: This Semaphore implementation is useful for databases that do - not support row locking via "SELECT FOR UPDATE" type syntax, for example - Microsoft SQLServer (MSSQL). - - - - - Initializes a new instance of the class. - - - - - Execute the SQL that will lock the proper database row. - - - - - - - - This implementation of the Calendar excludes a set of days of the year. You - may use it to exclude bank holidays which are on the same date every year. - - - - Juergen Donnerstag - - - - This implementation of the Calendar may be used (you don't have to) as a - base class for more sophisticated one's. It merely implements the base - functionality required by each Calendar. - - - Regarded as base functionality is the treatment of base calendars. Base - calendar allow you to chain (stack) as much calendars as you may need. For - example to exclude weekends you may use WeeklyCalendar. In order to exclude - holidays as well you may define a WeeklyCalendar instance to be the base - calendar for HolidayCalendar instance. - - - Juergen Donnerstag - James House - - - - An interface to be implemented by objects that define spaces of time during - which an associated may fire. - - - Calendars do not define actual fire times, but rather are used to limit a - from firing on its normal schedule if necessary. Most - Calendars include all times by default and allow the user to specify times to - exclude. As such, it is often useful to think of Calendars as being used to - exclude a block of time, as opposed to include - a block of time. (i.e. the schedule "fire every five minutes except on Sundays" could be - implemented with a and a which excludes Sundays) - - James House - Juergen Donnerstag - - - - Determine whether the given UTC time is 'included' by the - Calendar. - - - - - Determine the next UTC time that is 'included' by the - Calendar after the given UTC time. - - - - - Gets or sets a description for the instance - may be - useful for remembering/displaying the purpose of the calendar, though - the description has no meaning to Quartz. - - - - - Set a new base calendar or remove the existing one. - Get the base calendar. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The base calendar. - - - - Initializes a new instance of the class. - - The time zone. - - - - Initializes a new instance of the class. - - The base calendar. - The time zone. - - - - checks whether two arrays have - the same length and - for any given place there are equal elements - in both arrays - - - - - - Get the base calendar. Will be null, if not set. - - - - - Check if date/time represented by timeStamp is included. If included - return true. The implementation of BaseCalendar simply calls the base - calendars IsTimeIncluded() method if base calendar is set. - - - - - - Determine the next UTC time (in milliseconds) that is 'included' by the - Calendar after the given time. Return the original value if timeStamp is - included. Return 0 if all days are excluded. - - - - - - Gets or sets the time zone. - - The time zone. - - - - Gets or sets the description given to the instance by - its creator (if any). - - - - - Set a new base calendar or remove the existing one - - - - - - Constructor - - - - - Constructor - - The base calendar. - - - - Return true, if day is defined to be exluded. - - - - - Redefine a certain day to be excluded (true) or included (false). - - - - - Determine whether the given UTC time (in milliseconds) is 'included' by the - Calendar. -

- Note that this Calendar is only has full-day precision. -

-
-
- - - Determine the next UTC time (in milliseconds) that is 'included' by the - Calendar after the given time. Return the original value if timeStampUtc is - included. Return 0 if all days are excluded. -

- Note that this Calendar is only has full-day precision. -

-
-
- - - Get or the array which defines the exclude-value of each day of month. - Setting will redefine the array of days excluded. The array must of size greater or - equal 31. - - - - - This implementation of the Calendar excludes the set of times expressed by a - given CronExpression. - - - For example, you could use this calendar to exclude all but business hours (8AM - 5PM) every - day using the expression "* * 0-7,18-23 ? * *". -

- It is important to remember that the cron expression here describes a set of - times to be excluded from firing. Whereas the cron expression in - CronTrigger describes a set of times that can - be included for firing. Thus, if a has a - given cron expression and is associated with a with - the same expression, the calendar will exclude all the times the - trigger includes, and they will cancel each other out. -

-
- Aaron Craven -
- - - Initializes a new instance of the class. - - a String representation of the desired cron expression - - - - Create a with the given cron expression and - . - - - the base calendar for this calendar instance - see BaseCalendar for more information on base - calendar functionality - - a String representation of the desired cron expression - - - - Create a with the given cron expression and - . - - - the base calendar for this calendar instance - see BaseCalendar for more information on base - calendar functionality - - a String representation of the desired cron expression - - - - - Determine whether the given time is 'included' by the - Calendar. - - the time to test - a boolean indicating whether the specified time is 'included' by the CronCalendar - - - - Determine the next time that is 'included' by the - Calendar after the given time. Return the original value if timeStamp is - included. Return 0 if all days are excluded. - - - - - - - Returns a that represents the current . - - - A that represents the current . - - - - - Sets the cron expression for the calendar to a new value. - - The expression. - - - - Returns the object representation of the cron expression that defines the - dates and times this calendar excludes. - - - - - This implementation of the Calendar excludes (or includes - see below) a - specified time range each day. - - - For example, you could use this calendar to - exclude business hours (8AM - 5PM) every day. Each - only allows a single time range to be specified, and that time range may not - * cross daily boundaries (i.e. you cannot specify a time range from 8PM - 5AM). - If the property is (default), - the time range defines a range of times in which triggers are not allowed to - * fire. If is , the time range - is inverted: that is, all times outside the defined time range - are excluded. -

- Note when using , it behaves on the same principals - as, for example, WeeklyCalendar defines a set of days that are - excluded every week. Likewise, defines a - set of times that are excluded every day. -

-
- Mike Funk - Aaron Craven -
- - - Create a with a time range defined by the - specified strings and no baseCalendar. - and - must be in the format "HH:MM[:SS[:mmm]]" where: -
    -
  • - HH is the hour of the specified time. The hour should be - specified using military (24-hour) time and must be in the range - 0 to 23. -
  • -
  • - MM is the minute of the specified time and must be in the range - 0 to 59. -
  • -
  • - SS is the second of the specified time and must be in the range - 0 to 59. -
  • -
  • - mmm is the millisecond of the specified time and must be in the - range 0 to 999. -
  • -
  • items enclosed in brackets ('[', ']') are optional.
  • -
  • - The time range starting time must be before the time range ending - time. Note this means that a time range may not cross daily - boundaries (10PM - 2AM) -
  • -
-
-
- - - Create a with a time range defined by the - specified strings and the specified baseCalendar. - and - must be in the format "HH:MM[:SS[:mmm]]" where: -
    -
  • - HH is the hour of the specified time. The hour should be - specified using military (24-hour) time and must be in the range - 0 to 23. -
  • -
  • - MM is the minute of the specified time and must be in the range - 0 to 59. -
  • -
  • - SS is the second of the specified time and must be in the range - 0 to 59. -
  • -
  • - mmm is the millisecond of the specified time and must be in the - range 0 to 999. -
  • -
  • - items enclosed in brackets ('[', ']') are optional. -
  • -
  • - The time range starting time must be before the time range ending - time. Note this means that a time range may not cross daily - boundaries (10PM - 2AM) -
  • -
-
- The base calendar for this calendar instance see BaseCalendar for more - information on base calendar functionality. -
- - - Create a with a time range defined by the - specified values and no baseCalendar. Values are subject to - the following validations: -
    -
  • - Hours must be in the range 0-23 and are expressed using military - (24-hour) time. -
  • -
  • Minutes must be in the range 0-59
  • -
  • Seconds must be in the range 0-59
  • -
  • Milliseconds must be in the range 0-999
  • -
  • - The time range starting time must be before the time range ending - time. Note this means that a time range may not cross daily - boundaries (10PM - 2AM) -
  • -
-
- The range starting hour of day. - The range starting minute. - The range starting second. - The range starting millis. - The range ending hour of day. - The range ending minute. - The range ending second. - The range ending millis. -
- - - Create a with a time range defined by the - specified values and the specified . Values are - subject to the following validations: -
    -
  • - Hours must be in the range 0-23 and are expressed using military - (24-hour) time. -
  • -
  • Minutes must be in the range 0-59
  • -
  • Seconds must be in the range 0-59
  • -
  • Milliseconds must be in the range 0-999
  • -
  • - The time range starting time must be before the time range ending - time. Note this means that a time range may not cross daily - boundaries (10PM - 2AM) -
  • -
-
- The range starting hour of day. - The range starting minute. - The range starting second. - The range starting millis. - The range ending hour of day. - The range ending minute. - The range ending second. - The range ending millis. -
- - - Create a with a time range defined by the - specified s and no - baseCalendar. The Calendars are subject to the following - considerations: -
    -
  • - Only the time-of-day fields of the specified Calendars will be - used (the date fields will be ignored) -
  • -
  • - The starting time must be before the ending time of the defined - time range. Note this means that a time range may not cross - daily boundaries (10PM - 2AM). (because only time fields are - are used, it is possible for two Calendars to represent a valid - time range and - rangeStartingCalendar.after(rangeEndingCalendar) == true) - -
  • -
-
- The range starting calendar. - The range ending calendar. -
- - - Create a with a time range defined by the - specified s and the specified - . The Calendars are subject to the following - considerations: -
    -
  • - Only the time-of-day fields of the specified Calendars will be - used (the date fields will be ignored) -
  • -
  • - The starting time must be before the ending time of the defined - time range. Note this means that a time range may not cross - daily boundaries (10PM - 2AM). (because only time fields are - are used, it is possible for two Calendars to represent a valid - time range and - rangeStartingCalendarUtc > rangeEndingCalendarUtc == true) -
  • -
-
- The range starting calendar. - The range ending calendar. -
- - - Create a with a time range defined by the - specified values and no baseCalendar. The values are - subject to the following considerations: -
    -
  • - Only the time-of-day portion of the specified values will be - used -
  • -
  • - The starting time must be before the ending time of the defined - time range. Note this means that a time range may not cross - daily boundaries (10PM - 2AM). (because only time value are - are used, it is possible for the two values to represent a valid - time range and rangeStartingTime > rangeEndingTime) -
  • -
-
- The range starting time in millis. - The range ending time in millis. -
- - - Create a with a time range defined by the - specified values and the specified . The values - are subject to the following considerations: -
    -
  • - Only the time-of-day portion of the specified values will be - used -
  • -
  • - The starting time must be before the ending time of the defined - time range. Note this means that a time range may not cross - daily boundaries (10PM - 2AM). (because only time value are - are used, it is possible for the two values to represent a valid - time range and rangeStartingTime > rangeEndingTime) -
  • -
-
- The range starting time in millis. - The range ending time in millis. -
- - - Determine whether the given time is 'included' by the - Calendar. - - - - - - - Determine the next time (in milliseconds) that is 'included' by the - Calendar after the given time. Return the original value if timeStamp is - included. Return 0 if all days are excluded. - - - - - - - - Returns the start time of the time range of the day - specified in . - - - a DateTime representing the start time of the - time range for the specified date. - - - - - Returns the end time of the time range of the day - specified in - - - A DateTime representing the end time of the - time range for the specified date. - - - - - Returns a that represents the current . - - - A that represents the current . - - - - - Sets the time range for the to the times - represented in the specified Strings. - - The range starting time string. - The range ending time string. - - - - Sets the time range for the to the times - represented in the specified values. - - The range starting hour of day. - The range starting minute. - The range starting second. - The range starting millis. - The range ending hour of day. - The range ending minute. - The range ending second. - The range ending millis. - - - - Sets the time range for the to the times - represented in the specified s. - - The range starting calendar. - The range ending calendar. - - - - Sets the time range for the to the times - represented in the specified values. - - The range starting time. - The range ending time. - - - - Gets the start of day, practically zeroes time part. - - The time. - - - - - Gets the end of day, pratically sets time parts to maximum allowed values. - - The time. - - - - - Checks the specified values for validity as a set of time values. - - The hour of day. - The minute. - The second. - The millis. - - - - Indicates whether the time range represents an inverted time range (see - class description). - - true if invert time range; otherwise, false. - - - - This implementation of the Calendar stores a list of holidays (full days - that are excluded from scheduling). - - - The implementation DOES take the year into consideration, so if you want to - exclude July 4th for the next 10 years, you need to add 10 entries to the - exclude list. - - Sharada Jambula - Juergen Donnerstag - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The base calendar. - - - - Determine whether the given time (in milliseconds) is 'included' by the - Calendar. -

- Note that this Calendar is only has full-day precision. -

-
-
- - - Determine the next time (in milliseconds) that is 'included' by the - Calendar after the given time. -

- Note that this Calendar is only has full-day precision. -

-
-
- - - Add the given Date to the list of excluded days. Only the month, day and - year of the returned dates are significant. - - - - - Removes the excluded date. - - The date to remove. - - - - Returns a of Dates representing the excluded - days. Only the month, day and year of the returned dates are - significant. - - - - - This implementation of the Calendar excludes a set of days of the month. You - may use it to exclude every 1. of each month for example. But you may define - any day of a month. - - - - Juergen Donnerstag - - - - Initializes a new instance of the class. - - - - - Constructor - - The base calendar. - - - - Initialize internal variables - - - - - Return true, if mday is defined to be exluded. - - - - - Redefine a certain day of the month to be excluded (true) or included - (false). - - - - - Check if all days are excluded. That is no day is included. - - boolean - - - - - Determine whether the given time (in milliseconds) is 'included' by the - Calendar. -

- Note that this Calendar is only has full-day precision. -

-
-
- - - Determine the next time (in milliseconds) that is 'included' by the - Calendar after the given time. Return the original value if timeStamp is - included. Return DateTime.MinValue if all days are excluded. -

- Note that this Calendar is only has full-day precision. -

-
-
- - - Get or set the array which defines the exclude-value of each day of month - Setting will redefine the array of days excluded. The array must of size greater or - equal 31. - - - - - This implementation of the Calendar excludes a set of days of the week. You - may use it to exclude weekends for example. But you may define any day of - the week. - - - - Juergen Donnerstag - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The base calendar. - - - - Initialize internal variables - - - - - Return true, if wday is defined to be exluded. E. g. - saturday and sunday. - - - - - Redefine a certain day of the week to be excluded (true) or included - (false). Use java.util.Calendar's constants like MONDAY to determine the - wday. - - - - - Check if all week ays are excluded. That is no day is included. - - - - - Determine whether the given time (in milliseconds) is 'included' by the - Calendar. -

- Note that this Calendar is only has full-day precision. -

-
-
- - - Determine the next time (in milliseconds) that is 'included' by the - Calendar after the given time. Return the original value if timeStamp is - included. Return DateTime.MinValue if all days are excluded. -

- Note that this Calendar is only has full-day precision. -

-
-
- - - Get the array with the week days. - Setting will redefine the array of days excluded. The array must of size greater or - equal 8. java.util.Calendar's constants like MONDAY should be used as - index. A value of true is regarded as: exclude it. - - - - - A singleton implementation of . - - - Here are some examples of using this class: -

- To create a scheduler that does not write anything to the database (is not - persistent), you can call : -

-
-            DirectSchedulerFactory.Instance.CreateVolatileScheduler(10); // 10 threads 
-            // don't forget to start the scheduler: 
-            DirectSchedulerFactory.Instance.GetScheduler().Start();
-            
-

- Several create methods are provided for convenience. All create methods - eventually end up calling the create method with all the parameters: -

-
-            public void createScheduler(String schedulerName, string schedulerInstanceId, ThreadPool threadPool, JobStore jobStore, string rmiRegistryHost, int rmiRegistryPort)
-            
-

- Here is an example of using this method: -

-
-            // create the thread pool 
-            SimpleThreadPool threadPool = new SimpleThreadPool(maxThreads, Thread.NORM_PRIORITY); 
-            threadPool.Initialize(); 
-            // create the job store 
-            JobStore jobStore = new RAMJobStore(); 
-            jobStore.Initialize();
-            
-            DirectSchedulerFactory.Instance.CreateScheduler("My Quartz Scheduler", "My Instance", threadPool, jobStore, "localhost", 1099); 
-            // don't forget to start the scheduler: 
-            DirectSchedulerFactory.Instance.GetScheduler("My Quartz Scheduler", "My Instance").start();
-            
-
> - Mohammad Rezaei - James House - - -
- - - Provides a mechanism for obtaining client-usable handles to - instances. - - - - James House - - - - Returns a client-usable handle to a . - - - - - Returns a handle to the Scheduler with the given name, if it exists. - - - - - Returns handles to all known Schedulers (made by any SchedulerFactory - within this app domain.). - - - - - Initializes a new instance of the class. - - - - - Creates an in memory job store () - The thread priority is set to Thread.NORM_PRIORITY - - The number of threads in the thread pool - - - - Creates a proxy to a remote scheduler. This scheduler can be retrieved - via . - - SchedulerException - - - - Same as , - with the addition of specifying the scheduler name and instance ID. This - scheduler can only be retrieved via . - - The name for the scheduler. - The instance ID for the scheduler. - - SchedulerException - - - - Creates a scheduler using the specified thread pool and job store. This - scheduler can be retrieved via DirectSchedulerFactory#GetScheduler() - - - The thread pool for executing jobs - - - The type of job store - - SchedulerException - if initialization failed - - - - - Same as DirectSchedulerFactory#createScheduler(ThreadPool threadPool, JobStore jobStore), - with the addition of specifying the scheduler name and instance ID. This - scheduler can only be retrieved via DirectSchedulerFactory#getScheduler(String) - - The name for the scheduler. - The instance ID for the scheduler. - The thread pool for executing jobs - The type of job store - - - - Creates a scheduler using the specified thread pool and job store and - binds it to RMI. - - The name for the scheduler. - The instance ID for the scheduler. - The thread pool for executing jobs - The type of job store - The idle wait time. You can specify "-1" for - the default value, which is currently 30000 ms. - The db failure retry interval. - - - - Creates a scheduler using the specified thread pool and job store and - binds it to RMI. - - The name for the scheduler. - The instance ID for the scheduler. - The thread pool for executing jobs - The type of job store - - The idle wait time. You can specify TimeSpan.Zero for - the default value, which is currently 30000 ms. - The db failure retry interval. - - - - Returns a handle to the Scheduler produced by this factory. -

- you must call createRemoteScheduler or createScheduler methods before - calling getScheduler() -

-
- - SchedulerException -
- - - Returns a handle to the Scheduler with the given name, if it exists. - - - - - Gets the log. - - The log. - - - - Gets the instance. - - The instance. - - -

- Returns a handle to all known Schedulers (made by any - StdSchedulerFactory instance.). -

-
-
- - - An implementation of the interface that remotely - proxies all method calls to the equivalent call on a given - instance, via remoting or similar technology. - - - - - James House - - - - This is the main interface of a Quartz Scheduler. - - - - A maintains a registry of - s and s. Once - registered, the is responsible for executing - s when their associated s - fire (when their scheduled time arrives). - - - instances are produced by a - . A scheduler that has already been - created/initialized can be found and used through the same factory that - produced it. After a has been created, it is in - "stand-by" mode, and must have its method - called before it will fire any s. - - - s are to be created by the 'client program', by - defining a class that implements the interface. - objects are then created (also by the client) to - define a individual instances of the . - instances can then be registered with the - via the %IScheduler.ScheduleJob(JobDetail, - Trigger)% or %IScheduler.AddJob(JobDetail, bool)% method. - - - s can then be defined to fire individual - instances based on given schedules. - s are most useful for one-time firings, or - firing at an exact moment in time, with N repeats with a given delay between - them. s allow scheduling based on time of day, - day of week, day of month, and month of year. - - - s and s have a name and - group associated with them, which should uniquely identify them within a single - . The 'group' feature may be useful for creating - logical groupings or categorizations of s and - s. If you don't have need for assigning a group to a - given s of s, then you can use - the constant defined on - this interface. - - - Stored s can also be 'manually' triggered through the - use of the %IScheduler.TriggerJob(string, string)% function. - - - Client programs may also be interested in the 'listener' interfaces that are - available from Quartz. The interface provides - notifications of executions. The - interface provides notifications of - firings. The - interface provides notifications of events and - errors. - - - The setup/configuration of a instance is very - customizable. Please consult the documentation distributed with Quartz. - - - - - - - - - - - - returns true if the given JobGroup - is paused - - - - - - - returns true if the given TriggerGroup - is paused - - - - - - - Get a object describiing the settings - and capabilities of the scheduler instance. - - - Note that the data returned is an 'instantaneous' snap-shot, and that as - soon as it's returned, the meta data values may be different. - - - - - Return a list of objects that - represent all currently executing Jobs in this Scheduler instance. - - -

- This method is not cluster aware. That is, it will only return Jobs - currently executing in this Scheduler instance, not across the entire - cluster. -

-

- Note that the list returned is an 'instantaneous' snap-shot, and that as - soon as it's returned, the true list of executing jobs may be different. - Also please read the doc associated with - - especially if you're using remoting. -

-
- -
- - - Get the names of all groups that are paused. - - - - - Get the global that has - the given name. - - Global job listener's name - - - - - Get the global that - has the given name. - - Global trigger listener's name - - - - - Starts the 's threads that fire s. - When a scheduler is first created it is in "stand-by" mode, and will not - fire triggers. The scheduler can also be put into stand-by mode by - calling the method. - - - The misfire/recovery process will be started, if it is the initial call - to this method on this scheduler instance. - - - - - - - - Calls after the indicated delay. - (This call does not block). This can be useful within applications that - have initializers that create the scheduler immediately, before the - resources needed by the executing jobs have been fully initialized. - - - - - - - - Temporarily halts the 's firing of s. - - -

- When is called (to bring the scheduler out of - stand-by mode), trigger misfire instructions will NOT be applied - during the execution of the method - any misfires - will be detected immediately afterward (by the 's - normal process). -

-

- The scheduler is not destroyed, and can be re-started at any time. -

-
- - -
- - - Halts the 's firing of s, - and cleans up all resources associated with the Scheduler. Equivalent to - . - - - The scheduler cannot be re-started. - - - - - - Halts the 's firing of s, - and cleans up all resources associated with the Scheduler. - - - The scheduler cannot be re-started. - - - if the scheduler will not allow this method - to return until all currently executing jobs have completed. - - - - - - Add the given to the - Scheduler, and associate the given with - it. - - - If the given Trigger does not reference any , then it - will be set to reference the Job passed with it into this method. - - - - - Schedule the given with the - identified by the 's settings. - - - - - Remove the indicated from the scheduler. - - - - - Remove (delete) the with the - given name, and store the new given one - which must be associated - with the same job (the new trigger must have the job name & group specified) - - however, the new trigger need not have the same name as the old trigger. - - - The name of the to be replaced. - - - The group name of the to be replaced. - - - The new to be stored. - - - if a with the given - name and group was not found and removed from the store, otherwise - the first fire time of the newly scheduled trigger. - - - - - Add the given to the Scheduler - with no associated - . The will be 'dormant' until - it is scheduled with a , or - is called for it. - - - The must by definition be 'durable', if it is not, - SchedulerException will be thrown. - - - - - Delete the identified from the Scheduler - and any - associated s. - - true if the Job was found and deleted. - - - - Trigger the identified - (Execute it now) - the generated trigger will be non-volatile. - - - - - Trigger the identified - (Execute it now) - the generated trigger will be volatile. - - - - - Trigger the identified - (Execute it now) - the generated trigger will be non-volatile. - - the name of the Job to trigger - the group name of the Job to trigger - - the (possibly ) JobDataMap to be - associated with the trigger that fires the job immediately. - - - - - Trigger the identified - (Execute it now) - the generated trigger will be volatile. - - the name of the Job to trigger - the group name of the Job to trigger - - the (possibly ) JobDataMap to be - associated with the trigger that fires the job immediately. - - - - - Pause the with the given - name - by pausing all of its current s. - - - - - Pause all of the s in the - given group - by pausing all of their s. - - - The Scheduler will "remember" that the group is paused, and impose the - pause on any new jobs that are added to the group while the group is - paused. - - - - - - Pause the with the given name. - - - - - Pause all of the s in the given group. - - - The Scheduler will "remember" that the group is paused, and impose the - pause on any new triggers that are added to the group while the group is - paused. - - - - - - Resume (un-pause) the with - the given name. - - - If any of the 's s missed one - or more fire-times, then the 's misfire - instruction will be applied. - - - - - Resume (un-pause) all of the s - in the given group. - - - If any of the s had s that - missed one or more fire-times, then the 's - misfire instruction will be applied. - - - - - - Resume (un-pause) the with the given - name. - - - If the missed one or more fire-times, then the - 's misfire instruction will be applied. - - - - - Resume (un-pause) all of the s in the - given group. - - - If any missed one or more fire-times, then the - 's misfire instruction will be applied. - - - - - - Pause all triggers - similar to calling - on every group, however, after using this method - must be called to clear the scheduler's state of 'remembering' that all - new triggers will be paused as they are added. - - - When is called (to un-pause), trigger misfire - instructions WILL be applied. - - - - - - - - Resume (un-pause) all triggers - similar to calling - on every group. - - - If any missed one or more fire-times, then the - 's misfire instruction will be applied. - - - - - - Get the names of all the s in the given group. - - - - - Get all s that are associated with the - identified . - - - - - Get the names of all the s in the given - group. - - - - - Get the for the - instance with the given name and group. - - - - - Get the instance with the given name and - group. - - - - - Get the current state of the identified . - - - - - - - - - - - Add (register) the given to the Scheduler. - - Name of the calendar. - The calendar. - if set to true [replace]. - whether or not to update existing triggers that - referenced the already existing calendar so that they are 'correct' - based on the new trigger. - - - - Delete the identified from the Scheduler. - - Name of the calendar. - - true if the Calendar was found and deleted. - - - - - Get the instance with the given name. - - - - - Get the names of all registered . - - An array of calendar names. - - - - Request the interruption, within this Scheduler instance, of all - currently executing instances of the identified , which - must be an implementor of the interface. - - -

- If more than one instance of the identified job is currently executing, - the method will be called on - each instance. However, there is a limitation that in the case that - on one instances throws an exception, all - remaining instances (that have not yet been interrupted) will not have - their method called. -

- -

- If you wish to interrupt a specific instance of a job (when more than - one is executing) you can do so by calling - to obtain a handle - to the job instance, and then invoke on it - yourself. -

-

- This method is not cluster aware. That is, it will only interrupt - instances of the identified InterruptableJob currently executing in this - Scheduler instance, not across the entire cluster. -

-
- - - - true is at least one instance of the identified job was found and interrupted. - - - -
- - - Add the given to the 's - global list. - - - Listeners in the 'global' list receive notification of execution events - for ALL s. - - - - - Add the given to the 's - list, of registered s. - - - - - Remove the given from the 's - list of global listeners. - - - true if the identifed listener was found in the list, and removed. - - - - - Remove the identifed from the 's - list of global listeners. - - Global job listener's name - true if the identifed listener was found in the list, and removed - - - - Remove the identifed from the 's - list of registered listeners. - - - true if the identifed listener was found in the list, and removed. - - - - - Get the non-global that has - the given name. - - - - - Add the given to the 's - global list. - - - Listeners in the 'global' list receive notification of execution events - for ALL s. - - - - - Add the given to the 's - list, of registered s. - - - - - Remove the given from the 's - list of global listeners. - - - true if the identifed listener was found in the list, and removed. - - - - - Remove the identifed from the 's - list of global listeners. - - The name. - true if the identifed listener was found in the list, and removed. - - - - Remove the identifed from the - 's list of registered listeners. - - - true if the identifed listener was found in the list, and removed. - - - - - Get the non-global that - has the given name. - - - - - Register the given with the - - - - - Remove the given from the - . - - true if the identifed listener was found in the list, and - removed. - - - - - Returns the name of the . - - - - - Returns the instance Id of the . - - - - - Returns the of the . - - - - - Reports whether the is in stand-by mode. - - - - - - - Reports whether the has been Shutdown. - - - - - Set the that will be responsible for producing - instances of classes. - - - JobFactories may be of use to those wishing to have their application - produce instances via some special mechanism, such as to - give the opertunity for dependency injection. - - - - - - Get the names of all known groups. - - - - - Get the names of all known groups. - - - - - Get the names of all registered s. - - - - - Get a List containing all of the s in - the 'sglobal list. - - - - - Get a Set containing the names of all the non-global - s registered with the . - - - - - Get a List containing all of the - s in the 'sglobal list. - - - - - Get a Set containing the names of all the non-global - s registered with the . - - - - - Get a List containing all of the - s registered with the . - - - - - Whether the scheduler has been started. - - - Note: This only reflects whether has ever - been called on this Scheduler, so it will return even - if the is currently in standby mode or has been - since shutdown. - - - - - - - - Construct a instance to proxy the given - RemoteableQuartzScheduler instance, and with the given - . - - - - - returns true if the given JobGroup - is paused - - - - - - - returns true if the given TriggerGroup - is paused - - - - - - - Get a object describiing the settings - and capabilities of the scheduler instance. -

- Note that the data returned is an 'instantaneous' snap-shot, and that as - soon as it's returned, the meta data values may be different. -

-
- -
- - - Calls the equivalent method on the 'proxied' . - - - - - Get the global that has - the given name. - - - - - - - Get the global that - has the given name. - - - - - - - Get the names of all groups that are paused. - - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Get the names of all registered . - - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Remove the identifed from the 's - list of global listeners. - - - - true if the identifed listener was found in the list, and removed - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Remove the identifed from the 's - list of global listeners. - - The name. - - true if the identifed listener was found in the list, and removed. - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Returns the name of the . - - - - - Returns the instance Id of the . - - - - - Gets or sets the remote scheduler address. - - The remote scheduler address. - - - - Returns the of the . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Gets a value indicating whether this instance is paused. - - true if this instance is paused; otherwise, false. - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equialent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Set the that will be responsible for producing - instances of classes. -

- JobFactories may be of use to those wishing to have their application - produce instances via some special mechanism, such as to - give the opertunity for dependency injection. -

-
- - - SchedulerException -
- - - Whether the scheduler has been started. - - - - Note: This only reflects whether has ever - been called on this Scheduler, so it will return even - if the is currently in standby mode or has been - since shutdown. - - - - - - - - Holds references to Scheduler instances - ensuring uniqueness, and - preventing garbage collection, and allowing 'global' lookups. - - James House - Marko Lahma (.NET) - - - - Binds the specified sched. - - The sched. - - - - Removes the specified sched name. - - Name of the sched. - - - - - Lookups the specified sched name. - - Name of the sched. - - - - - Lookups all. - - - - - - Gets the singleton instance. - - The instance. - - - - Responsible for creating the instances of - to be used within the instance. -

- This implementation does not re-use any objects, it simply makes a new - JobRunShell each time is called. -

-
- James House -
- - - Initialize the factory, providing a handle to the - that should be made available within the and - the s within it, and a handle to the - that the shell will use in its own - operations with the . - - - - - Called by the to obtain instances of - . - - - - - Called by the to return instances of - . - - - - - An implementation of the interface that directly - proxies all method calls to the equivalent call on a given - instance. - - - - - James House - - - - returns true if the given JobGroup - is paused - - - - - - - returns true if the given TriggerGroup - is paused - - - - - - - Get a object describiing the settings - and capabilities of the scheduler instance. -

- Note that the data returned is an 'instantaneous' snap-shot, and that as - soon as it's returned, the meta data values may be different. -

-
- -
- - - Calls the equivalent method on the 'proxied' . - - - - - - - - - Get the global that has - the given name. - - - - - - - Get the global that - has the given name. - - - - - - - Construct a instance to proxy the given - instance, and with the given . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Get the names of all registered . - - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Remove the identifed from the 's - list of global listeners. - - - - true if the identifed listener was found in the list, and removed - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Remove the identifed from the 's - list of global listeners. - - The name. - - true if the identifed listener was found in the list, and removed. - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Request the interruption, within this Scheduler instance, of all - currently executing instances of the identified , which - must be an implementor of the interface. - - -

- If more than one instance of the identified job is currently executing, - the method will be called on - each instance. However, there is a limitation that in the case that - on one instances throws an exception, all - remaining instances (that have not yet been interrupted) will not have - their method called. -

-

- If you wish to interrupt a specific instance of a job (when more than - one is executing) you can do so by calling - to obtain a handle - to the job instance, and then invoke on it - yourself. -

-

- This method is not cluster aware. That is, it will only interrupt - instances of the identified InterruptableJob currently executing in this - Scheduler instance, not across the entire cluster. -

-
- - - true is at least one instance of the identified job was found and interrupted. - UnableToInterruptJobException if the job does not implement - - -
- - - Returns the name of the . - - - - - Returns the instance Id of the . - - - - - Returns the of the . - - - - - Whether the scheduler has been started. - - - - Note: This only reflects whether has ever - been called on this Scheduler, so it will return even - if the is currently in standby mode or has been - since shutdown. - - - - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' , - passing the associated with this - instance. - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - Calls the equivalent method on the 'proxied' . - - - - - - - - - An implementation of that - does all of it's work of creating a instance - based on the contenents of a properties file. - - -

- By default a properties are loaded from App.config's quartz section. - If that fails, then the "quartz.properties" - file located (as a embedded resource) in Quartz.dll is loaded. If you - wish to use a file other than these defaults, you must define the system - property 'quartz.properties' to point to the file you want. -

- -

- See the sample properties that are distributed with Quartz for - information about the various settings available within the file. -

- -

- Alternativly, you can explicitly Initialize the factory by calling one of - the methods before calling . -

- -

- Instances of the specified , - , classes will be created - by name, and then any additional properties specified for them in the config - file will be set on the instance by calling an equivalent 'set' method. For - example if the properties file contains the property 'quartz.jobStore. - myProp = 10' then after the JobStore class has been instantiated, the property - 'MyProp' will be set with the value. Type conversion to primitive CLR types - (int, long, float, double, boolean, enum and string) are performed before calling - the property's setter method. -

-
- James House - Anthony Eden - Mohammad Rezaei - Marko Lahma (.NET) -
- - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The props. - - - - Initialize the with - the contenents of a Properties file. - -

- By default a properties file named "quartz.properties" is loaded from - the 'current working directory'. If that fails, then the - "quartz.properties" file located (as a resource) in the org/quartz - package is loaded. If you wish to use a file other than these defaults, - you must define the system property 'quartz.properties' to point to - the file you want. -

-
-
- - - Creates a new name value collection and overrides its values - with system values (environment variables). - - The base properties to override. - A new NameValueCollection instance. - - - - Initialize the with - the contenents of the given Properties object. - - - - - - - - Returns a handle to the Scheduler produced by this factory. - - - - If one of the methods has not be previously - called, then the default (no-arg) method - will be called by this method. - - - -

- Returns a handle to the Scheduler with the given name, if it exists (if - it has already been instantiated). -

-
-
- - - Returns a handle to the default Scheduler, creating it if it does not - yet exist. - - - - - -

- Returns a handle to all known Schedulers (made by any - StdSchedulerFactory instance.). -

-
-
- - - Inspects a file and compares whether it's "last modified date" has changed - since the last time it was inspected. If the file has been updated, the - job invokes a "call-back" method on an identified - that can be found in the - . - - James House - - - - - A marker interface for s that - wish to have their state maintained between executions. - - - instances follow slightly different rules from - regular instances. The key difference is that their - associated is re-persisted after every - execution of the job, thus preserving state for the next execution. The - other difference is that stateful jobs are not allowed to Execute - concurrently, which means new triggers that occur before the completion of - the method will be delayed. - - - - - - James House - Marko Lahma (.NET) - - - - The interface to be implemented by classes which represent a 'job' to be - performed. - - - Instances of this interface must have a - no-argument constructor. provides a mechanism for 'instance member data' - that may be required by some implementations of this interface. - - - - - - James House - Marko Lahma (.NET) - - - - Called by the when a - fires that is associated with the . - - - The implementation may wish to set a result object on the - JobExecutionContext before this method exits. The result itself - is meaningless to Quartz, but may be informative to - s or - s that are watching the job's - execution. - - The execution context. - - - - Initializes a new instance of the class. - - - - - Called by the when a - fires that is associated with the . -

- The implementation may wish to set a result object on the - JobExecutionContext before this method exits. The result itself - is meaningless to Quartz, but may be informative to - s or - s that are watching the job's - execution. -

-
- The execution context. - - -
- - - Gets the last modified date. - - Name of the file. - - - - - Gets the log. - - The log. - - - - Interface for objects wishing to receive a 'call-back' from a - . - - James House - - - - - Ãnforms that certain file has been updated. - - Name of the file. - - - - Built in job for executing native executables in a separate process. - - Matthew Payne - James House - Steinar Overbeck Cook - - - - Required parameter that specifies the name of the command (executable) - to be ran. - - - - - Optional parameter that specifies the parameters to be passed to the - executed command. - - - - - Optional parameter (value should be 'true' or 'false') that specifies - whether the job should wait for the execution of the native process to - complete before it completes. - -

Defaults to .

-
-
- - - Optional parameter (value should be 'true' or 'false') that specifies - whether the spawned process's stdout and stderr streams should be - consumed. If the process creates output, it is possible that it might - 'hang' if the streams are not consumed. - -

Defaults to .

-
-
- - - Optional parameter that specifies the workling directory to be used by - the executed command. - - - - - Initializes a new instance of the class. - - - - - Called by the when a - fires that is associated with the . -

- The implementation may wish to set a result object on the - JobExecutionContext before this method exits. The result itself - is meaningless to Quartz, but may be informative to - s or - s that are watching the job's - execution. -

-
- -
- - - Gets the log. - - The log. - - - - Consumes data from the given input stream until EOF and prints the data to stdout - - cooste - James House - - - - Initializes a new instance of the class. - - The enclosing instance. - The input stream. - The type. - - - - Runs this object as a separate thread, printing the contents of the input stream - supplied during instantiation, to either Console. or stderr - - - - - An implementation of Job, that does absolutely nothing - useful for system - which only wish to use s - and s, rather than writing - Jobs that perform work. - - James House - - - - Do nothing. - - - - - A Job which sends an e-mail with the configured content to the configured - recipient. - - James House - Marko Lahma (.NET) - - - The host name of the smtp server. REQUIRED. - - - The e-mail address to send the mail to. REQUIRED. - - - The e-mail address to cc the mail to. Optional. - - - The e-mail address to claim the mail is from. REQUIRED. - - - The e-mail address the message should say to reply to. Optional. - - - The subject to place on the e-mail. REQUIRED. - - - The e-mail message body. REQUIRED. - - - - Executes the job. - - The job execution context. - - - - Holds a List of references to SchedulerListener instances and broadcasts all - events to them (in order). - - - This may be more convenient than registering all of the listeners - directly with the Scheduler, and provides the flexibility of easily changing - which listeners get notified. - - - - James House - - - - Construct an instance with the given List of listeners. - - The initial List of SchedulerListeners to broadcast to. - - - - Holds a List of references to JobListener instances and broadcasts all - events to them (in order) - if the event is not excluded via filtering - (read on). - - -

- The broadcasting behavior of this listener to delegate listeners may be - more convenient than registering all of the listeners directly with the - Trigger, and provides the flexibility of easily changing which listeners - get notified. -

- -

- You may also register a number of Regular Expression patterns to match - the events against. If one or more patterns are registered, the broadcast - will only take place if the event applies to a job who's name/group - matches one or more of the patterns. -

-
- - - - - - James House -
- - Construct an instance with the given name. - - (Remember to add some delegate listeners!) - - @param name the name of this instance - - - Construct an instance with the given name, and List of listeners. - - @param name the name of this instance - @param listeners the initial List of JobListeners to broadcast to. - - - - If one or more name patterns are specified, only events relating to - jobs who's name matches the given regular expression pattern - will be dispatched to the delegate listeners. - - - - - - If one or more group patterns are specified, only events relating to - jobs who's group matches the given regular expression pattern - will be dispatched to the delegate listeners. - - - - - - Holds a List of references to TriggerListener instances and broadcasts all - events to them (in order) - if the event is not excluded via filtering - (read on). - - -

- The broadcasting behavior of this listener to delegate listeners may be - more convenient than registering all of the listeners directly with the - Trigger, and provides the flexibility of easily changing which listeners - get notified. -

- -

- You may also register a number of Regular Expression patterns to match - the events against. If one or more patterns are registered, the broadcast - will only take place if the event applies to a trigger who's name/group - matches one or more of the patterns. -

-
- - - - - - James House -
- - - The interface to be implemented by classes that want to be informed when a - fires. In general, applications that use a - will not have use for this mechanism. - - - - - - James House - - - - Called by the when a - has fired, and it's associated - is about to be executed. -

- It is called before the method of this - interface. -

-
- The that has fired. - - The that will be passed to the 's method. - -
- - - Called by the when a - has fired, and it's associated - is about to be executed. -

- It is called after the method of this - interface. -

-
- The that has fired. - The that will be passed to - the 's method. - Returns true if job execution should be vetoed, false otherwise. -
- - - Called by the when a - has misfired. -

- Consideration should be given to how much time is spent in this method, - as it will affect all triggers that are misfiring. If you have lots - of triggers misfiring at once, it could be an issue it this method - does a lot. -

-
- The that has misfired. -
- - - Called by the when a - has fired, it's associated - has been executed, and it's method has been - called. - - The that was fired. - - The that was passed to the - 's method. - - - The result of the call on the 's method. - - - - - Get the name of the . - - - - - Construct an instance with the given name. - - (Remember to add some delegate listeners!) - - the name of this instance - - - - Construct an instance with the given name, and List of listeners. - - the name of this instance - the initial List of TriggerListeners to broadcast to - - - - If one or more name patterns are specified, only events relating to - triggers who's name matches the given regular expression pattern - will be dispatched to the delegate listeners. - - - - - - If one or more group patterns are specified, only events relating to - triggers who's group matches the given regular expression pattern - will be dispatched to the delegate listeners. - - - - - - Keeps a collection of mappings of which Job to trigger after the completion - of a given job. If this listener is notified of a job completing that has a - mapping, then it will then attempt to trigger the follow-up job. This - achieves "job chaining", or a "poor man's workflow". - - -

- Generally an instance of this listener would be registered as a global - job listener, rather than being registered directly to a given job. -

-

- If for some reason there is a failure creating the trigger for the - follow-up job (which would generally only be caused by a rare serious - failure in the system, or the non-existence of the follow-up job), an error - messsage is logged, but no other action is taken. If you need more rigorous - handling of the error, consider scheduling the triggering of the flow-up - job within your job itself. -

-
- James House -
- - - A helpful abstract base class for implementors of . - - -

- The methods in this class are empty so you only need to override the - subset for the events you care about. -

- -

- You are required to implement - to return the unique name of your . -

-
- -
- - - Initializes a new instance of the class. - - - - - Called by the when a - is about to be executed (an associated - has occured). -

- This method will not be invoked if the execution of the Job was vetoed - by a . -

-
- - -
- - - Called by the when a - was about to be executed (an associated - has occured), but a vetoed it's - execution. - - - - - - - Called by the after a - has been executed, and be for the associated 's - method has been called. - - - - - - - Get the for this class's category. - This should be used by subclasses for logging. - - - - - Get the name of the . - - - - - - Construct an instance with the given name. - - The name of this instance. - - - - Add a chain mapping - when the Job identified by the first key completes - the job identified by the second key will be triggered. - - a Key with the name and group of the first job - a Key with the name and group of the follow-up job - - - - A helpful abstract base class for implementors of - . - - -

- The methods in this class are empty so you only need to override the - subset for the events - you care about. -

- -

- You are required to implement - to return the unique name of your . -

-
- -
- - - Get the for this - class's category. This should be used by subclasses for logging. - - - - - Get the name of the . - - - - - - Logs a history of all job executions (and execution vetos) via common - logging. - - -

- The logged message is customizable by setting one of the following message - properties to a string that conforms to the syntax of . -

-

- JobToBeFiredMessage - available message data are: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ElementData TypeDescription
0StringThe Job's Name.
1StringThe Job's Group.
2DateThe current time.
3StringThe Trigger's name.
4StringThe Triggers's group.
5DateThe scheduled fire time.
6DateThe next scheduled fire time.
7IntegerThe re-fire count from the JobExecutionContext.
- The default message text is "Job {1}.{0} fired (by trigger {4}.{3}) at: - {2, date, HH:mm:ss MM/dd/yyyy" -

-

- JobSuccessMessage - available message data are: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ElementData TypeDescription
0StringThe Job's Name.
1StringThe Job's Group.
2DateThe current time.
3StringThe Trigger's name.
4StringThe Triggers's group.
5DateThe scheduled fire time.
6DateThe next scheduled fire time.
7IntegerThe re-fire count from the JobExecutionContext.
8ObjectThe string value (toString() having been called) of the result (if any) - that the Job set on the JobExecutionContext, with on it. "NULL" if no - result was set.
- The default message text is "Job {1}.{0} execution complete at {2, date, - HH:mm:ss MM/dd/yyyy} and reports: {8" -

-

- JobFailedMessage - available message data are: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ElementData TypeDescription
0StringThe Job's Name.
1StringThe Job's Group.
2DateThe current time.
3StringThe Trigger's name.
4StringThe Triggers's group.
5DateThe scheduled fire time.
6DateThe next scheduled fire time.
7IntegerThe re-fire count from the JobExecutionContext.
8StringThe message from the thrown JobExecution Exception. -
- The default message text is "Job {1}.{0} execution failed at {2, date, - HH:mm:ss MM/dd/yyyy} and reports: {8" -

-

- JobWasVetoedMessage - available message data are: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ElementData TypeDescription
0StringThe Job's Name.
1StringThe Job's Group.
2DateThe current time.
3StringThe Trigger's name.
4StringThe Triggers's group.
5DateThe scheduled fire time.
6DateThe next scheduled fire time.
7IntegerThe re-fire count from the JobExecutionContext.
- The default message text is "Job {1}.{0} was vetoed. It was to be fired - (by trigger {4}.{3}) at: {2, date, HH:mm:ss MM/dd/yyyy" -

-
-
- - - Provides an interface for a class to become a "plugin" to Quartz. - - - Plugins can do virtually anything you wish, though the most interesting ones - will obviously interact with the scheduler in some way - either actively: by - invoking actions on the scheduler, or passively: by being a , - , and/or . -

- If you use to - Initialize your Scheduler, it can also create and Initialize your plugins - - look at the configuration docs for details. -

-

- If you need direct access your plugin, you can have it explicitly put a - reference to itself in the 's - as part of its - method. -

-
- James House -
- - - Called during creation of the in order to give - the a chance to Initialize. - - - At this point, the Scheduler's is not yet -

- If you need direct access your plugin, you can have it explicitly put a - reference to itself in the 's - as part of its - method. -

-
- - The name by which the plugin is identified. - - - The scheduler to which the plugin is registered. - -
- - - Called when the associated is started, in order - to let the plug-in know it can now make calls into the scheduler if it - needs to. - - - - - Called in order to inform the that it - should free up all of it's resources because the scheduler is shutting - down. - - - - - Called during creation of the in order to give - the a chance to Initialize. - - - - - Called when the associated is started, in order - to let the plug-in know it can now make calls into the scheduler if it - needs to. - - - - - Called in order to inform the that it - should free up all of it's resources because the scheduler is shutting - down. - - - - - Called by the when a is - about to be executed (an associated has occurred). - - This method will not be invoked if the execution of the Job was vetoed by a - . - - - - - - - Called by the after a - has been executed, and be for the associated 's - method has been called. - - - - - - - Called by the when a - was about to be executed (an associated - has occured), but a vetoed it's - execution. - - - - - - - Logger instance to use. Defaults to common logging. - - - - - Get or sets the message that is logged when a Job successfully completes its - execution. - - - - - Get or sets the message that is logged when a Job fails its - execution. - - - - - Gets or sets the message that is logged when a Job is about to Execute. - - - - - Gets or sets the message that is logged when a Job execution is vetoed by a - trigger listener. - - - - - Get the name of the . - - - - - - Logs a history of all trigger firings via the Jakarta Commons-Logging - framework. - - -

- The logged message is customizable by setting one of the following message - properties to a string that conforms to the syntax of . -

- -

- TriggerFiredMessage - available message data are: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ElementData TypeDescription
0StringThe Trigger's Name.
1StringThe Trigger's Group.
2DateThe scheduled fire time.
3DateThe next scheduled fire time.
4DateThe actual fire time.
5StringThe Job's name.
6StringThe Job's group.
7IntegerThe re-fire count from the JobExecutionContext.
- - The default message text is "Trigger {1}.{0} fired job {6}.{5} at: {4, - date, HH:mm:ss MM/dd/yyyy" -

- -

- TriggerMisfiredMessage - available message data are: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ElementData TypeDescription
0StringThe Trigger's Name.
1StringThe Trigger's Group.
2DateThe scheduled fire time.
3DateThe next scheduled fire time.
4DateThe actual fire time. (the time the misfire was detected/handled)
5StringThe Job's name.
6StringThe Job's group.
- - The default message text is "Trigger {1}.{0} misfired job {6}.{5} at: - {4, date, HH:mm:ss MM/dd/yyyy}. Should have fired at: {3, date, HH:mm:ss - MM/dd/yyyy" -

- -

- TriggerCompleteMessage - available message data are: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ElementData TypeDescription
0StringThe Trigger's Name.
1StringThe Trigger's Group.
2DateThe scheduled fire time.
3DateThe next scheduled fire time.
4DateThe job completion time.
5StringThe Job's name.
6StringThe Job's group.
7IntegerThe re-fire count from the JobExecutionContext.
8IntegerThe trigger's resulting instruction code.
9StringA human-readable translation of the trigger's resulting instruction - code.
- - The default message text is "Trigger {1}.{0} completed firing job - {6}.{5} at {4, date, HH:mm:ss MM/dd/yyyy} with resulting trigger instruction - code: {9" -

-
- James House -
- - - Called during creation of the in order to give - the a chance to Initialize. - - - - - Called when the associated is started, in order - to let the plug-in know it can now make calls into the scheduler if it - needs to. - - - - - Called in order to inform the that it - should free up all of it's resources because the scheduler is shutting - down. - - - - - Called by the when a - has fired, and it's associated - is about to be executed. -

- It is called before the method of this - interface. -

-
- The that has fired. - The that will be passed to the 's method. -
- - - Called by the when a - has misfired. -

- Consideration should be given to how much time is spent in this method, - as it will affect all triggers that are misfiring. If you have lots - of triggers misfiring at once, it could be an issue it this method - does a lot. -

-
- The that has misfired. -
- - - Called by the when a - has fired, it's associated - has been executed, and it's method has been - called. - - The that was fired. - The that was passed to the - 's method. - The result of the call on the 's method. - - - - Called by the when a - has fired, and it's associated - is about to be executed. -

- It is called after the method of this - interface. -

-
- The that has fired. - The that will be passed to - the 's method. - -
- - - Logger instance to use. Defaults to common logging. - - - - - Get or set the message that is printed upon the completion of a trigger's - firing. - - - - - Get or set the message that is printed upon a trigger's firing. - - - - - Get or set the message that is printed upon a trigger's mis-firing. - - - - - Get the name of the . - - - - - - This plugin catches the event of the VM terminating (such as upon a CRTL-C) - and tells the scheuler to Shutdown. - - - James House - - - - Called during creation of the in order to give - the a chance to Initialize. - - - - - Called when the associated is started, in order - to let the plug-in know it can now make calls into the scheduler if it - needs to. - - - - - Called in order to inform the that it - should free up all of it's resources because the scheduler is shutting - down. - - - - - Determine whether or not the plug-in is configured to cause a clean - Shutdown of the scheduler. -

- The default value is . -

-
- -
- - - Attribute to use with public properties that - can be set with Quartz configuration. Attribute can be used to advice - parsing to use correct type of time span (milliseconds, seconds, minutes, hours) - as it may depend on property. - - - - - - Initializes a new instance of the class. - - The rule. - - - - Gets the rule. - - The rule. - - - - Possible parse rules for s. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - This plugin loads XML file(s) to add jobs and schedule them with triggers - as the scheduler is initialized, and can optionally periodically scan the - file for changes. - - - The periodically scanning of files for changes is not currently supported in a - clustered environment. - - James House - Pierre Awaragi - - - - Initializes a new instance of the class. - - - - - - - - - - - Called during creation of the in order to give - the a chance to initialize. - - The name. - The scheduler. - SchedulerConfigException - - - - Called when the associated is started, in order - to let the plug-in know it can now make calls into the scheduler if it - needs to. - - - - Helper method for generating unique job/trigger name for the - file scanning jobs (one per FileJob). The unique names are saved - in jobTriggerNameSet. - - - - Called in order to inform the that it - should free up all of it's resources because the scheduler is shutting - down. - - - - - Gets the log. - - The log. - - - - Comma separated list of file names (with paths) to the XML files that should be read. - - - - - Whether or not jobs defined in the XML file should be overwrite existing - jobs with the same name. - - - - - The interval at which to scan for changes to the file. - If the file has been changed, it is re-loaded and parsed. The default - value for the interval is 0, which disables scanning. - - - - - Whether or not initialization of the plugin should fail (throw an - exception) if the file cannot be found. Default is . - - - - - Whether or not the XML should be validated. Default is . - - - - - Whether or not the XML schema should be validated. Default is . - - - - - A uses all of the - types that are found in this package in its attempts to load a class, when - one scheme is found to work, it is promoted to the scheme that will be used - first the next time a class is loaded (in order to improve perfomance). - - - This approach is used because of the wide variance in class loader behavior - between the various environments in which Quartz runs (e.g. disparate - application servers, stand-alone, mobile devices, etc.). Because of this - disparity, Quartz ran into difficulty with a one class-load style fits-all - design. Thus, this class loader finds the approach that works, then - 'remembers' it. - - James House - - - - Called to give the ClassLoadHelper a chance to Initialize itself, - including the oportunity to "steal" the class loader off of the calling - thread, which is the thread that is initializing Quartz. - - - - - Return the class with the given name. - - - - Finds a resource with a given name. This method returns null if no - resource with this name is found. - - name of the desired resource - - a java.net.URL object - - - - Finds a resource with a given name. This method returns null if no - resource with this name is found. - - name of the desired resource - - a java.io.InputStream object - - - - - that names the scheduler instance using - just the machine hostname. -

- This class is useful when you know that your scheduler instance will be the - only one running on a particular machine. Each time the scheduler is - restarted, it will get the same instance id as long as the machine is not - renamed. -

- -
- - -
- - - An IInstanceIdGenerator is responsible for generating the clusterwide unique - instance id for a nodde. -

- This interface may be of use to those wishing to have specific control over - the mechanism by which the instances in their - application are named. -

- -
- -
- - Generate the instance id for a - - - The clusterwide unique instance id. - - - - - Generate the instance id for a - - The clusterwide unique instance id. - - - - A that uses either the loader of it's own - class. - - - - - James House - - - - Called to give the ClassLoadHelper a chance to Initialize itself, - including the oportunity to "steal" the class loader off of the calling - thread, which is the thread that is initializing Quartz. - - - - Return the class with the given name. - - - Finds a resource with a given name. This method returns null if no - resource with this name is found. - - name of the desired resource - - a java.net.URL object - - - - Finds a resource with a given name. This method returns null if no - resource with this name is found. - - name of the desired resource - - a java.io.InputStream object - - - - - A JobFactory that instantiates the Job instance (using the default no-arg - constructor, or more specifically: ), and - then attempts to set all values in the 's - onto bean properties of the . - - - - - - - James Houser - Marko Lahma (.NET) - - - - The default JobFactory used by Quartz - simply calls - on the job class. - - - - James House - Marko Lahma (.NET) - - - - A JobFactory is responsible for producing instances of - classes. - - - This interface may be of use to those wishing to have their application - produce instances via some special mechanism, such as to - give the opertunity for dependency injection. - - - - - James House - - - - Called by the scheduler at the time of the trigger firing, in order to - produce a instance on which to call Execute. - - -

- It should be extremely rare for this method to throw an exception - - basically only the the case where there is no way at all to instantiate - and prepare the Job for execution. When the exception is thrown, the - Scheduler will move all triggers associated with the Job into the - state, which will require human - intervention (e.g. an application restart after fixing whatever - configuration problem led to the issue wih instantiating the Job. -

- -
- - The TriggerFiredBundle from which the - and other info relating to the trigger firing can be obtained. - - SchedulerException if there is a problem instantiating the Job. - the newly instantiated Job - -
- - - Called by the scheduler at the time of the trigger firing, in order to - produce a instance on which to call Execute. - - - It should be extremely rare for this method to throw an exception - - basically only the the case where there is no way at all to instantiate - and prepare the Job for execution. When the exception is thrown, the - Scheduler will move all triggers associated with the Job into the - state, which will require human - intervention (e.g. an application restart after fixing whatever - configuration problem led to the issue wih instantiating the Job. - - The TriggerFiredBundle from which the - and other info relating to the trigger firing can be obtained. - the newly instantiated Job - SchedulerException if there is a problem instantiating the Job. - - - - Called by the scheduler at the time of the trigger firing, in order to - produce a instance on which to call Execute. - - -

- It should be extremely rare for this method to throw an exception - - basically only the the case where there is no way at all to instantiate - and prepare the Job for execution. When the exception is thrown, the - Scheduler will move all triggers associated with the Job into the - state, which will require human - intervention (e.g. an application restart after fixing whatever - configuration problem led to the issue wih instantiating the Job. -

-
- The TriggerFiredBundle from which the - and other info relating to the trigger firing can be obtained. - the newly instantiated Job - SchedulerException if there is a problem instantiating the Job. -
- - - Sets the object properties. - - The object to set properties to. - The data to set. - - - - Whether the JobInstantiation should fail and throw and exception if - a key (name) and value (type) found in the JobDataMap does not - correspond to a proptery setter on the Job class. - - - - - Get or set whether a warning should be logged if - a key (name) and value (type) found in the JobDataMap does not - correspond to a proptery setter on the Job class. - - - - - This class implements a that - utilizes RAM as its storage device. -

- As you should know, the ramification of this is that access is extrememly - fast, but the data is completely volatile - therefore this - should not be used if true persistence between program shutdowns is - required. -

-
- James House - Sharada Jambula - Marko Lahma (.NET) -
- - - Initializes a new instance of the class. - - - - - Called by the QuartzScheduler before the is - used, in order to give the it a chance to Initialize. - - - - - Called by the QuartzScheduler to inform the that - the scheduler has started. - - - - - Called by the QuartzScheduler to inform the that - it should free up all of it's resources because the scheduler is - shutting down. - - - - - Store the given and . - - The scheduling context. - The to be stored. - The to be stored. - - - - Returns true if the given job group is paused. - - - Job group name - - - - - returns true if the given TriggerGroup is paused. - - - - - - - - Store the given . - - The scheduling context. - The to be stored. - If , any existing in the - with the same name and group should be - over-written. - - - - Remove (delete) the with the given - name, and any s that reference - it. - - The scheduling context. - The name of the to be removed. - The group name of the to be removed. - - if a with the given name and - group was found and removed from the store. - - - - - Remove (delete) the with the - given name. - - The scheduling context. - The name of the to be removed. - The group name of the to be removed. - - if a with the given - name and group was found and removed from the store. - - - - - Store the given . - - The scheduling context. - The to be stored. - If , any existing in - the with the same name and group should - be over-written. - - - - Remove (delete) the with the - given name. - - The scheduling context. - The name of the to be removed. - The group name of the to be removed. - - if a with the given - name and group was found and removed from the store. - - Whether to delete orpahaned job details from scheduler if job becomes orphaned from removing the trigger. - - - - Replaces the trigger. - - The scheduling context. - Name of the trigger. - Name of the group. - The new trigger. - - - - - Retrieve the for the given - . - - The scheduling context. - The name of the to be retrieved. - The group name of the to be retrieved. - - The desired , or null if there is no match. - - - - - Retrieve the given . - - The scheduling context. - The name of the to be retrieved. - The group name of the to be retrieved. - - The desired , or null if there is no match. - - - - - Get the current state of the identified . - - - - - - - - - - - Store the given . - - The scheduling context. - The name. - The to be stored. - If , any existing - in the with the same name and group - should be over-written. - If , any s existing - in the that reference an existing - Calendar with the same name with have their next fire time - re-computed with the new . - - - - Remove (delete) the with the - given name. -

- If removal of the would result in - s pointing to non-existent calendars, then a - will be thrown.

-
- The scheduling context. - The name of the to be removed. - - if a with the given name - was found and removed from the store. - -
- - - Retrieve the given . - - The scheduling context. - The name of the to be retrieved. - - The desired , or null if there is no match. - - - - - Get the number of s that are - stored in the . - - - - - Get the number of s that are - stored in the . - - - - - Get the number of s that are - stored in the . - - - - - Get the names of all of the s that - have the given group name. - - - - - Get the names of all of the s - in the . -

- If there are no ICalendars in the given group name, the result should be - a zero-length array (not ). -

-
-
- - - Get the names of all of the s - that have the given group name. - - - - - Get the names of all of the - groups. - - - - - Get the names of all of the groups. - - - - - Get all of the Triggers that are associated to the given Job. -

- If there are no matches, a zero-length array should be returned. -

-
-
- - - Gets the trigger wrappers for job. - - Name of the job. - Name of the group. - - - - - Gets the trigger wrappers for calendar. - - Name of the cal. - - - - - Pause the with the given name. - - - - - Pause all of the s in the given group. -

- The JobStore should "remember" that the group is paused, and impose the - pause on any new triggers that are added to the group while the group is - paused. -

-
-
- - - Pause the with the given - name - by pausing all of its current s. - - - - - Pause all of the s in the - given group - by pausing all of their s. -

- The JobStore should "remember" that the group is paused, and impose the - pause on any new jobs that are added to the group while the group is - paused. -

-
-
- - - Resume (un-pause) the with the given name. - - - If the missed one or more fire-times, then the - 's misfire instruction will be applied. - - - - - Resume (un-pause) all of the s in the - given group. -

- If any missed one or more fire-times, then the - 's misfire instruction will be applied. -

-
-
- - - Resume (un-pause) the with - the given name. -

- If any of the 's s missed one - or more fire-times, then the 's misfire - instruction will be applied. -

-
-
- - - Resume (un-pause) all of the s - in the given group. -

- If any of the s had s that - missed one or more fire-times, then the 's - misfire instruction will be applied. -

-
-
- - - Pause all triggers - equivalent of calling - on every group. -

- When is called (to un-pause), trigger misfire - instructions WILL be applied. -

-
- -
- - - Resume (un-pause) all triggers - equivalent of calling - on every trigger group and setting all job groups unpaused />. -

- If any missed one or more fire-times, then the - 's misfire instruction will be applied. -

-
- -
- - - Applies the misfire. - - The trigger wrapper. - - - - - Get a handle to the next trigger to be fired, and mark it as 'reserved' - by the calling scheduler. - - - - - - Inform the that the scheduler no longer plans to - fire the given , that it had previously acquired - (reserved). - - - - - Inform the that the scheduler is now firing the - given (executing its associated ), - that it had previously acquired (reserved). - - - - - Inform the that the scheduler has completed the - firing of the given (and the execution its - associated ), and that the - in the given should be updated if the - is stateful. - - - - - Sets the state of all triggers of job to specified state. - - Name of the job. - The job group. - The internal state to set. - - - - Peeks the triggers. - - - - - - - - - The time span by which a trigger must have missed its - next-fire-time, in order for it to be considered "misfired" and thus - have its misfire instruction applied. - - - - - Gets the fired trigger record id. - - The fired trigger record id. - - - - Returns whether this instance supports persistence. - - - - - - - Comparer for triggers. - - - - - Possible internal trigger states - in RAMJobStore - - - - - Waiting - - - - - Acquired - - - - - Executing - - - - - Complete - - - - - Paused - - - - - Blocked - - - - - Paused and Blocked - - - - - Error - - - - - Helper wrapper class - - - - - The key used - - - - - Job's key - - - - - The trigger - - - - - Current state - - - - - Determines whether the specified is equal to the current . - - The to compare with the current . - - true if the specified is equal to the current ; otherwise, false. - - - - - Serves as a hash function for a particular type. is suitable for use in hashing algorithms and data structures like a hash table. - - - A hash code for the current . - - - - - Gets the trigger - - The trigger - - - - Scheduler exporter that exports scheduler to remoting context. - - Marko Lahma - - - - Service interface for scheduler exporters. - - Marko Lahma - - - - Binds (exports) scheduler to external context. - - - - - - Unbinds scheduler from external context. - - - - - - Registers remoting channel if needed. This is determined - by checking whether there is a positive value for port. - - - - - Gets or sets the port used for remoting. - - - - - Gets or sets the name to use when exporting - scheduler to remoting context. - - - - - Sets the channel type when registering remoting. - - - - - - Sets the used when - exporting to remoting context. Defaults to - . - - - - - A that simply calls . - - - - James House - - - - Called to give the ClassLoadHelper a chance to Initialize itself, - including the oportunity to "steal" the class loader off of the calling - thread, which is the thread that is initializing Quartz. - - - - Return the class with the given name. - - - - Finds a resource with a given name. This method returns null if no - resource with this name is found. - - name of the desired resource - - a Uri object - - - - Finds a resource with a given name. This method returns null if no - resource with this name is found. - - name of the desired resource - - a Stream object - - - - - The default InstanceIdGenerator used by Quartz when instance id is to be - automatically generated. Instance id is of the form HOSTNAME + CURRENT_TIME. - - - - - - - - - Generate the instance id for a - - The clusterwide unique instance id. - - - - This is class is a simple implementation of a thread pool, based on the - interface. -

- objects are sent to the pool with the - method, which blocks until a becomes available. -

- -

- The pool has a fixed number of s, and does not grow or - shrink based on demand. -

-
- James House - Juergen Donnerstag -
- - - The interface to be implemented by classes that want to provide a thread - pool for the 's use. - - - implementation instances should ideally be made - for the sole use of Quartz. Most importantly, when the method - returns a value of 1 or greater, - there must still be at least one available thread in the pool when the - method is called a few moments (or - many moments) later. If this assumption does not hold true, it may - result in extra JobStore queries and updates, and if clustering features - are being used, it may result in greater imballance of load. - - - James House - - - - Execute the given in the next - available . - - - The implementation of this interface should not throw exceptions unless - there is a serious problem (i.e. a serious misconfiguration). If there - are no available threads, rather it should either queue the Runnable, or - block until a thread is available, depending on the desired strategy. - - - - - Determines the number of threads that are currently available in in - the pool. Useful for determining the number of times - can be called before returning - false. - - - The implementation of this method should block until there is at - least one available thread. - - the number of currently available threads - - - - Called by the QuartzScheduler before the is - used, in order to give the it a chance to Initialize. - - - - - Called by the QuartzScheduler to inform the - that it should free up all of it's resources because the scheduler is - shutting down. - - - - - Gets the size of the pool. - - The size of the pool. - - - - Create a new (unconfigured) . - - - - - Create a new with the specified number - of s that have the given priority. - - - the number of worker s in the pool, must - be > 0. - - - the thread priority for the worker threads. - - - - - - Called by the QuartzScheduler before the is - used, in order to give the it a chance to Initialize. - - - - - Terminate any worker threads in this thread group. - Jobs currently in progress will complete. - - - - - Run the given object in the next available - . If while waiting the thread pool is asked to - shut down, the Runnable is executed immediately within a new additional - thread. - - The to be added. - - - - Creates the worker threads. - - The thread count. - - - - - Terminate any worker threads in this thread group. - Jobs currently in progress will complete. - - - - - Gets or sets the number of worker threads in the pool. - Set has no effect after has been called. - - - - - Get or set the thread priority of worker threads in the pool. - Set operation has no effect after has been called. - - - - - Gets or sets the thread name prefix. - - The thread name prefix. - - - - Gets or sets the value of makeThreadsDaemons. - - - - - Gets the size of the pool. - - The size of the pool. - - - - A Worker loops, waiting to Execute tasks. - - - - - Create a worker thread and start it. Waiting for the next Runnable, - executing it, and waiting for the next Runnable, until the Shutdown - flag is set. - - - - - Create a worker thread, start it, Execute the runnable and terminate - the thread (one time execution). - - - - - Signal the thread that it should terminate. - - - - - Loop, executing targets as they are received. - - - - - This is class is a simple implementation of a zero size thread pool, based on the - {@link org.quartz.spi.ThreadPool} interface. - - - The pool has zero s and does not grow or shrink based on demand. - Which means it is obviously not useful for most scenarios. When it may be useful - is to prevent creating any worker threads at all - which may be desirable for - the sole purpose of preserving system resources in the case where the scheduler - instance only exists in order to schedule jobs, but which will never execute - jobs (e.g. will never have Start() called on it). - - Wayne Fay - - - - Initializes a new instance of the class. - - - - - Called by the QuartzScheduler before the is - used, in order to give the it a chance to Initialize. - - - - - Shutdowns this instance. - - - - - Called by the QuartzScheduler to inform the - that it should free up all of it's resources because the scheduler is - shutting down. - - - - - - Execute the given in the next - available . - - - - - The implementation of this interface should not throw exceptions unless - there is a serious problem (i.e. a serious misconfiguration). If there - are no available threads, rather it should either queue the Runnable, or - block until a thread is available, depending on the desired strategy. - - - - - Determines the number of threads that are currently available in in - the pool. Useful for determining the number of times - can be called before returning - false. - - - the number of currently available threads - - - The implementation of this method should block until there is at - least one available thread. - - - - - Gets the log. - - The log. - - - - Gets the size of the pool. - - The size of the pool. - - - - A simple class (structure) used for returning execution-time data from the - JobStore to the . - - - James House - - - - Initializes a new instance of the class. - - The job. - The trigger. - The calendar. - if set to true [job is recovering]. - The fire time. - The scheduled fire time. - The previous fire time. - The next fire time. - - - - Gets the job detail. - - The job detail. - - - - Gets the trigger. - - The trigger. - - - - Gets the calendar. - - The calendar. - - - - Gets a value indicating whether this is recovering. - - true if recovering; otherwise, false. - - - - Returns the UTC fire time. - - - - - Gets the next UTC fire time. - - The next fire time. - Returns the nextFireTimeUtc. - - - - Gets the previous UTC fire time. - - The previous fire time. - Returns the previous fire time. - - - - Returns the scheduled UTC fire time. - - - - - DateTime related utility methods. - - - - - Assumes that given input is in UTC and sets the kind to be UTC. - Just a precaution if somebody does not set it explicitly. - This only works in .NET Framework 2.0 onwards. - - The datetime to check. - DateTime with kind set to UTC. - - - - Assumes that given input is in UTC and sets the kind to be UTC. - Just a precaution if somebody does not set it explicitly. - - The datetime to check. - DateTime with kind set to UTC. - - - - Manages a collection of IDbProviders, and provides transparent access - to their database. - - - James House - Sharada Jambula - Mohammad Rezaei - - - - Private constructor - - - - - Adds the connection provider. - - Name of the data source. - The provider. - - - - Get a database connection from the DataSource with the given name. - - a database connection - - - - Shuts down database connections from the DataSource with the given name, - if applicable for the underlying provider. - - a database connection - - - - Gets the db provider. - - Name of the ds. - - - - - Get the class instance. - - an instance of this class - - - - - An implementation of that wraps another - and flags itself 'dirty' when it is modified. - - James House - - - - Create a DirtyFlagMap that 'wraps' a . - - - - - Create a DirtyFlagMap that 'wraps' a that has the - given initial capacity. - - - - - Create a DirtyFlagMap that 'wraps' a that has the - given initial capacity and load factor. - - - - - Creates a new object that is a copy of the current instance. - - - A new object that is a copy of this instance. - - - - - When implemented by a class, removes all elements from the . - - - The is read-only. - - - - - When implemented by a class, determines whether the contains an element with the specified key. - - The key to locate in the . - - if the contains an element with the key; otherwise, . - - - is . - - - - When implemented by a class, removes the element with the - specified key from the . - - The key of the element to remove. - - is . - - The is read-only. - -or- - The has a fixed size. - - - - - When implemented by a class, returns an - for the . - - - An for the . - - - - - When implemented by a class, adds an element with the provided key and value to the . - - The to use as the key of the element to add. - The to use as the value of the element to add. - is . - - An element with the same key already exists in the . - - - The is read-only. - -or- - The has a fixed size. - - - - - When implemented by a class, copies the elements of - the to an , starting at a particular index. - - The one-dimensional that is the destination of the elements copied from . The must have zero-based indexing. - The zero-based index in at which copying begins. - - is . - - is less than zero. - - - is multidimensional. - -or- - - is equal to or greater than the length of . - -or- - The number of elements in the source is greater than the available space from to the end of the destination . - - The type of the source cannot be cast automatically to the type of the destination . - - - - Clear the 'dirty' flag (set dirty flag to ). - - - - - Determines whether the specified obj contains value. - - The obj. - - true if the specified obj contains value; otherwise, false. - - - - - Gets the entries as a set. - - - - - - Determines whether the specified is equal to the current . - - The to compare with the current . - - if the specified is equal to the - current ; otherwise, . - - - - - Serves as a hash function for a particular type, suitable - for use in hashing algorithms and data structures like a hash table. - - - A hash code for the current . - - - - - Gets keyset for this map. - - - - - - Puts the value behind a specified key. - - The key. - The val. - - - - - Puts all. - - The t. - - - - Determine whether the is flagged dirty. - - - - - Get a direct handle to the underlying Map. - - - - - Gets a value indicating whether this instance is empty. - - true if this instance is empty; otherwise, false. - - - - Gets or sets the with the specified key. - - - - - - When implemented by a class, gets the number of - elements contained in the . - - - - - - When implemented by a class, gets an containing the values in the . - - - - - - When implemented by a class, gets an containing the keys of the . - - - - - - When implemented by a class, gets a value indicating whether the - is read-only. - - - - - - When implemented by a class, gets a value indicating whether the - has a fixed size. - - - - - - When implemented by a class, gets an object that - can be used to synchronize access to the . - - - - - - When implemented by a class, gets a value - indicating whether access to the is synchronized - (thread-safe). - - - - - - Utility class for file handling related things. - - - - - Resolves file to actual file if for example relative '~' used. - - File name to check - Expanded file name or actual no resolving was done. - - - - object representing a job or trigger key. - - Jeffrey Wescott - - - - - Utility class for storing two pieces of information together. - - Jeffrey Wescott - - - - Test equality of this object with that. - - object to compare - true if objects are equal, false otherwise - - - - Serves as a hash function for a particular type. is suitable for use in hashing algorithms and data structures like a hash table. - - - A hash code for the current . - - - - - Get or sets the first object in the pair. - - - - - Get or sets the second object in the pair. - - - - Construct a new key with the given name and group. - - - - the name - - - the group - - - -

- Return the string representation of the key. The format will be: - <group>.<name>. -

- -
- the string representation of the key - -
- - - Get the name portion of the key. - - the name - - - -

- Get the group portion of the key. -

- -
- the group - -
- - - Wrapper class to access thread local data. - Data is either accessed from thread or HTTP Context's - data if HTTP Context is avaiable. - - Marko Lahma (.NET) - - - - Retrieves an object with the specified name. - - The name of the item. - The object in the call context associated with the specified name or null if no object has been stored previously - - - - Stores a given object and associates it with the specified name. - - The name with which to associate the new item. - The object to store in the call context. - - - - Empties a data slot with the specified name. - - The name of the data slot to empty. - - - - Utility methods that are used to convert objects from one type into another. - - Aleksandar Seovic - - - - Convert the value to the required (if necessary from a string). - - The proposed change value. - - The we must convert to. - - The new value, possibly the result of type conversion. - - - - Determines whether value is assignable to required type. - - The value to check. - Type of the required. - - true if value can be assigned as given type; otherwise, false. - - - - - Instantiates an instance of the type specified. - - The type to instantiate. - - - - - Sets the object properties using reflection. - - The object to set values to. - The properties to set to object. - - - - This is an utility class used to parse the properties. - - James House - - - - Initializes a new instance of the class. - - The props. - - - - Gets the string property. - - The name. - - - - - Gets the string property. - - The name. - The default value. - - - - - Gets the string array property. - - The name. - - - - - Gets the string array property. - - The name. - The default value. - - - - - Gets the boolean property. - - The name. - - - - - Gets the boolean property. - - The name. - if set to true [defaultValue]. - - - - - Gets the byte property. - - The name. - - - - - Gets the byte property. - - The name. - The default value. - - - - - Gets the char property. - - The name. - - - - - Gets the char property. - - The name. - The default value. - - - - - Gets the double property. - - The name. - - - - - Gets the double property. - - The name. - The default value. - - - - - Gets the float property. - - The name. - - - - - Gets the float property. - - The name. - The default value. - - - - - Gets the int property. - - The name. - - - - - Gets the int property. - - The name. - The default value. - - - - - Gets the int array property. - - The name. - - - - - Gets the int array property. - - The name. - The default value. - - - - - Gets the long property. - - The name. - - - - - Gets the long property. - - The name. - The def. - - - - - Gets the TimeSpan property. - - The name. - The def. - - - - - Gets the short property. - - The name. - - - - - Gets the short property. - - The name. - The default value. - - - - - Gets the property groups. - - The prefix. - - - - - Gets the property group. - - The prefix. - - - - - Gets the property group. - - The prefix. - if set to true [strip prefix]. - - - - - Get all properties that start with the given prefix. - - The prefix for which to search. If it does not end in a "." then one will be added to it for search purposes. - Whether to strip off the given in the result's keys. - Optional array of fully qualified prefixes to exclude. For example if is "a.b.c", then might be "a.b.c.ignore". - Group of that start with the given prefix, optionally have that prefix removed, and do not include properties that start with one of the given excluded prefixes. - - - - Reads the properties from assembly (embedded resource). - - The file name to read resources from. - - - - - Reads the properties from file system. - - The file name to read resources from. - - - - - Gets the underlying properties. - - The underlying properties. - - - - An implementation of that wraps another - and flags itself 'dirty' when it is modified, enforces that all keys are - strings. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The initial capacity. - - - - Initializes a new instance of the class. - - The initial capacity. - The load factor. - - - - Gets the keys. - - - - - - Adds the name-value pairs in the given to the . -

- All keys must be s, and all values must be serializable. -

-
-
- - - Adds the given value to the 's - data map. - - - - - Adds the given value to the 's - data map. - - - - - Adds the given value to the 's - data map. - - - - - Adds the given value to the 's - data map. - - - - - Adds the given value to the 's - data map. - - - - - Adds the given value to the 's - data map. - - - - - Adds the given value to the 's - data map. - - - - - Adds the given serializable object value to the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Object representing a job or trigger key. - - James House - - - - Construct a new TriggerStatus with the status name and nextFireTime. - - The trigger's status - The next UTC time the trigger will fire - - - - Return the string representation of the TriggerStatus. - - - - - Gets or sets the job key. - - The job key. - - - - Gets or sets the key. - - The key. - - - - Get the name portion of the key. - - the name - - - - Get the group portion of the key. - - the group - - - - Wraps a . - - Chris Bonham - - - - Gets or sets the name of the calendar. - - The name of the calendar. - - - - Gets or sets the name of the class. - - The name of the class. - - - - Gets or sets the calendar. - - The calendar. - - - - Gets or sets a description for the instance - may be - useful for remembering/displaying the purpose of the calendar, though - the description has no meaning to Quartz. - - - - - - Set a new base calendar or remove the existing one. - - - - - - Wraps a and . - - Chris Bonham - James House - - - - Adds a trigger to this bundle. - - The trigger. - - - - Removes the given trigger from this bundle. - - The trigger. - - - - Gets or sets the job detail. - - The job detail. - - - - Gets or sets the triggers associated with this bundle. - - The triggers. - - - - Gets the name of the bundle. - - The name. - - - - Gets the full name. - - The full name. - - - - Gets a value indicating whether this is valid. - - true if valid; otherwise, false. - - - - Parses an XML file that declares Jobs and their schedules (Triggers). - - -

- The xml document must conform to the format defined in - "job_scheduling_data.xsd" -

- -

- After creating an instance of this class, you should call one of the - functions, after which you may call the - function to get a handle to the defined Jobs and Triggers, which can then be - scheduled with the . Alternatively, you could call - the function to do all of this - in one step. -

- -

- The same instance can be used again and again, with the list of defined Jobs - being cleared each time you call a method, - however a single instance is not thread-safe. -

-
- Chris Bonham - James House - Marko Lahma (.NET) -
- - - XML Schema dateTime datatype format. -

- See - http://www.w3.org/TR/2001/REC-xmlschema-2-20010502/#dateTime -

-
-
- - - Constructor for JobSchedulingDataProcessor. - - - - - Constructor for JobSchedulingDataProcessor. - - whether or not to validate XML. - whether or not to validate XML schema. - - - - Process the xml file in the default location (a file named - "quartz_jobs.xml" in the current working directory). - - - - - Process the xml file named . - - meta data file name. - - - - Process the xmlfile named with the given system - ID. - - Name of the file. - The system id. - - - - Process the xmlfile named with the given system - ID. - - The stream. - The system id. - - - - Process the xml file in the default location, and schedule all of the - jobs defined within it. - - - - - Process the xml file in the given location, and schedule all of the - jobs defined within it. - - meta data file name. - The scheduler. - if set to true overwrite existing jobs. - - - - Process the xml file in the given location, and schedule all of the - jobs defined within it. - - Name of the file. - The system id. - The sched. - if set to true [over write existing jobs]. - - - - Add the Jobs and Triggers defined in the given map of - s to the given scheduler. - - The job bundles. - The sched. - if set to true [over write existing jobs]. - - - - Returns a for the job name. - - The name. - - a for the job name. - - - - - Returns an from the fileName as a resource. - - Name of the file. - - an from the fileName as a resource. - - - - - Schedules a given job and trigger (both wrapped by a ). - - job wrapper. - - if the Job or Trigger cannot be added to the Scheduler, or - there is an internal Scheduler error. - - - - - Schedules a given job and trigger (both wrapped by a ). - - The job. - The sched. - if set to true [local over write existing jobs]. - - if the Job or Trigger cannot be added to the Scheduler, or - there is an internal Scheduler error. - - - - - Adds a scheduled job. - - The job. - - - - Adds a calendar. - - The sched. - calendar bundle. - SchedulerException if the Calendar cannot be added to the Scheduler, or - - - - Adds a detected validation exception. - - The exception. - - - - Resets the the number of detected validation exceptions. - - - - - Throws a ValidationException if the number of validationExceptions - detected is greater than zero. - - - DTD validation exception. - - - - - Gets or sets whether to overwrite existing jobs. - - - - - Gets the log. - - The log. - - - - Returns a of scheduled jobs. -

- The key is the job name and the value is a - containing the and . -

-
- a of scheduled jobs. - -
- - - Helper class to map constant names to their values. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Reports JobSchedulingDataProcessor validation exceptions. - - Chris Bonham - - - - Constructor for ValidationException. - - - - - Constructor for ValidationException. - - exception message. - - - - Constructor for ValidationException. - - collection of validation exceptions. - - - - Gets the validation exceptions. - - The validation exceptions. - - - - Returns the detail message string. - - - - - An exception that is thrown to indicate that there has been a critical - failure within the scheduler's core services (such as loss of database - connectivity). - - James House - - - - Create a with the given message. - - - - - Initializes a new instance of the class. - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - The class name is null or is zero (0). - The info parameter is null. - - - - Provides a parser and evaluator for unix-like cron expressions. Cron - expressions provide the ability to specify complex time combinations such as - "At 8:00am every Monday through Friday" or "At 1:30am every - last Friday of the month". - - -

- Cron expressions are comprised of 6 required fields and one optional field - separated by white space. The fields respectively are described as follows: -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Field Name Allowed Values Allowed Special Characters
Seconds 0-59 , - /// /
Minutes 0-59 , - /// /
Hours 0-23 , - /// /
Day-of-month 1-31 , - /// ? / L W C
Month 1-12 or JAN-DEC , - /// /
Day-of-Week 1-7 or SUN-SAT , - /// ? / L #
Year (Optional) empty, 1970-2099 , - /// /
-

- The '*' character is used to specify all values. For example, "*" - in the minute field means "every minute". -

-

- The '?' character is allowed for the day-of-month and day-of-week fields. It - is used to specify 'no specific value'. This is useful when you need to - specify something in one of the two fields, but not the other. -

-

- The '-' character is used to specify ranges For example "10-12" in - the hour field means "the hours 10, 11 and 12". -

-

- The ',' character is used to specify additional values. For example - "MON,WED,FRI" in the day-of-week field means "the days Monday, - Wednesday, and Friday". -

-

- The '/' character is used to specify increments. For example "0/15" - in the seconds field means "the seconds 0, 15, 30, and 45". And - "5/15" in the seconds field means "the seconds 5, 20, 35, and - 50". Specifying '*' before the '/' is equivalent to specifying 0 is - the value to start with. Essentially, for each field in the expression, there - is a set of numbers that can be turned on or off. For seconds and minutes, - the numbers range from 0 to 59. For hours 0 to 23, for days of the month 0 to - 31, and for months 1 to 12. The "/" character simply helps you turn - on every "nth" value in the given set. Thus "7/6" in the - month field only turns on month "7", it does NOT mean every 6th - month, please note that subtlety. -

-

- The 'L' character is allowed for the day-of-month and day-of-week fields. - This character is short-hand for "last", but it has different - meaning in each of the two fields. For example, the value "L" in - the day-of-month field means "the last day of the month" - day 31 - for January, day 28 for February on non-leap years. If used in the - day-of-week field by itself, it simply means "7" or - "SAT". But if used in the day-of-week field after another value, it - means "the last xxx day of the month" - for example "6L" - means "the last friday of the month". When using the 'L' option, it - is important not to specify lists, or ranges of values, as you'll get - confusing results. -

-

- The 'W' character is allowed for the day-of-month field. This character - is used to specify the weekday (Monday-Friday) nearest the given day. As an - example, if you were to specify "15W" as the value for the - day-of-month field, the meaning is: "the nearest weekday to the 15th of - the month". So if the 15th is a Saturday, the trigger will fire on - Friday the 14th. If the 15th is a Sunday, the trigger will fire on Monday the - 16th. If the 15th is a Tuesday, then it will fire on Tuesday the 15th. - However if you specify "1W" as the value for day-of-month, and the - 1st is a Saturday, the trigger will fire on Monday the 3rd, as it will not - 'jump' over the boundary of a month's days. The 'W' character can only be - specified when the day-of-month is a single day, not a range or list of days. -

-

- The 'L' and 'W' characters can also be combined for the day-of-month - expression to yield 'LW', which translates to "last weekday of the - month". -

-

- The '#' character is allowed for the day-of-week field. This character is - used to specify "the nth" XXX day of the month. For example, the - value of "6#3" in the day-of-week field means the third Friday of - the month (day 6 = Friday and "#3" = the 3rd one in the month). - Other examples: "2#1" = the first Monday of the month and - "4#5" = the fifth Wednesday of the month. Note that if you specify - "#5" and there is not 5 of the given day-of-week in the month, then - no firing will occur that month. If the '#' character is used, there can - only be one expression in the day-of-week field ("3#1,6#3" is - not valid, since there are two expressions). -

-

- -

-

- The legal characters and the names of months and days of the week are not - case sensitive. -

-

- NOTES: -

    -
  • Support for specifying both a day-of-week and a day-of-month value is - not complete (you'll need to use the '?' character in one of these fields). -
  • -
  • Overflowing ranges is supported - that is, having a larger number on - the left hand side than the right. You might do 22-2 to catch 10 o'clock - at night until 2 o'clock in the morning, or you might have NOV-FEB. It is - very important to note that overuse of overflowing ranges creates ranges - that don't make sense and no effort has been made to determine which - interpretation CronExpression chooses. An example would be - "0 0 14-6 ? * FRI-MON".
  • -
-

-
- Sharada Jambula - James House - Contributions from Mads Henderson - Refactoring from CronTrigger to CronExpression by Aaron Craven -
- - - Field specification for second. - - - - - Field specification for minute. - - - - - Field specification for hour. - - - - - Field specification for day of month. - - - - - Field specification for month. - - - - - Field specification for day of week. - - - - - Field specification for year. - - - - - Field specification for all wildcard value '*'. - - - - - Field specification for not specified value '?'. - - - - - Field specification for wildcard '*'. - - - - - Field specification for no specification at all '?'. - - - - - Seconds. - - - - - minutes. - - - - - Hours. - - - - - Days of month. - - - - - Months. - - - - - Days of week. - - - - - Years. - - - - - Last day of week. - - - - - Nth day of week. - - - - - Last day of month. - - - - - Nearest weekday. - - - - - Calendar day of week. - - - - - Calendar day of month. - - - - - Expression parsed. - - - - - Constructs a new based on the specified - parameter. - - - String representation of the cron expression the new object should represent - - - - - - Indicates whether the given date satisfies the cron expression. - - - Note that milliseconds are ignored, so two Dates falling on different milliseconds - of the same second will always have the same result here. - - The date to evaluate. - a boolean indicating whether the given date satisfies the cron expression - - - - Returns the next date/time after the given date/time which - satisfies the cron expression. - - the date/time at which to begin the search for the next valid date/time - the next valid date/time - - - - Returns the next date/time after the given date/time which does - not satisfy the expression. - - the date/time at which to begin the search for the next invalid date/time - the next valid date/time - - - - Returns the string representation of the - - The string representation of the - - - - Indicates whether the specified cron expression can be parsed into a - valid cron expression - - the expression to evaluate - a boolean indicating whether the given expression is a valid cron - expression - - - - Builds the expression. - - The expression. - - - - Stores the expression values. - - The position. - The string to traverse. - The type of value. - - - - - Checks the next value. - - The position. - The string to check. - The value. - The type to search. - - - - - Gets the expression summary. - - - - - - Gets the expression set summary. - - The data. - - - - - Skips the white space. - - The i. - The s. - - - - - Finds the next white space. - - The i. - The s. - - - - - Adds to set. - - The val. - The end. - The incr. - The type. - - - - Gets the set of given type. - - The type of set to get. - - - - - Gets the value. - - The v. - The s. - The i. - - - - - Gets the numeric value from string. - - The string to parse from. - The i. - - - - - Gets the month number. - - The string to map with. - - - - - Gets the day of week number. - - The s. - - - - - Gets the time from given time parts. - - The seconds. - The minutes. - The hours. - The day of month. - The month. - - - - - Gets the next fire time after the given time. - - The UTC time to start searching from. - - - - - Creates the date time without milliseconds. - - The time. - - - - - Advance the calendar to the particular hour paying particular attention - to daylight saving problems. - - The date. - The hour. - - - - - Gets the time before. - - The end time. - - - - - NOT YET IMPLEMENTED: Returns the final time that the - will match. - - - - - - Determines whether given year is a leap year. - - The year. - - true if the specified year is a leap year; otherwise, false. - - - - - Gets the last day of month. - - The month num. - The year. - - - - - Creates a new object that is a copy of the current instance. - - - A new object that is a copy of this instance. - - - - - Sets or gets the time zone for which the of this - will be resolved. - - - - - Gets the cron expression string. - - The cron expression string. - - - - Helper class for cron expression handling. - - - - - The value. - - - - - The position. - - - - - A concrete that is used to fire a - at given moments in time, defined with Unix 'cron-like' definitions. - - -

- For those unfamiliar with "cron", this means being able to create a firing - schedule such as: "At 8:00am every Monday through Friday" or "At 1:30am - every last Friday of the month". -

- -

- The format of a "Cron-Expression" string is documented on the - class. -

- -

- Here are some full examples:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Expression Meaning
"0 0 12 * * ?"" /> Fire at 12pm (noon) every day" />
"0 15 10 ? * *"" /> Fire at 10:15am every day" />
"0 15 10 * * ?"" /> Fire at 10:15am every day" />
"0 15 10 * * ? *"" /> Fire at 10:15am every day" />
"0 15 10 * * ? 2005"" /> Fire at 10:15am every day during the year 2005" /> -
"0 * 14 * * ?"" /> Fire every minute starting at 2pm and ending at 2:59pm, every day" /> -
"0 0/5 14 * * ?"" /> Fire every 5 minutes starting at 2pm and ending at 2:55pm, every day" /> -
"0 0/5 14,18 * * ?"" /> Fire every 5 minutes starting at 2pm and ending at 2:55pm, AND fire every 5 minutes starting at 6pm and ending at 6:55pm, every day" /> -
"0 0-5 14 * * ?"" /> Fire every minute starting at 2pm and ending at 2:05pm, every day" /> -
"0 10,44 14 ? 3 WED"" /> Fire at 2:10pm and at 2:44pm every Wednesday in the month of March." /> -
"0 15 10 ? * MON-FRI"" /> Fire at 10:15am every Monday, Tuesday, Wednesday, Thursday and Friday" /> -
"0 15 10 15 * ?"" /> Fire at 10:15am on the 15th day of every month" /> -
"0 15 10 L * ?"" /> Fire at 10:15am on the last day of every month" /> -
"0 15 10 ? * 6L"" /> Fire at 10:15am on the last Friday of every month" /> -
"0 15 10 ? * 6L"" /> Fire at 10:15am on the last Friday of every month" /> -
"0 15 10 ? * 6L 2002-2005"" /> Fire at 10:15am on every last friday of every month during the years 2002, 2003, 2004 and 2005" /> -
"0 15 10 ? * 6#3"" /> Fire at 10:15am on the third Friday of every month" /> -
-

- -

- Pay attention to the effects of '?' and '*' in the day-of-week and - day-of-month fields! -

- -

- NOTES: -

    -
  • Support for specifying both a day-of-week and a day-of-month value is - not complete (you'll need to use the '?' character in on of these fields). -
  • -
  • Be careful when setting fire times between mid-night and 1:00 AM - - "daylight savings" can cause a skip or a repeat depending on whether the - time moves back or jumps forward.
  • -
-

-
- - - - Sharada Jambula - James House - Contributions from Mads Henderson -
- - - The base abstract class to be extended by all triggers. - - -

- s have a name and group associated with them, which - should uniquely identify them within a single . -

- -

- s are the 'mechanism' by which s - are scheduled. Many s can point to the same , - but a single can only point to one . -

- -

- Triggers can 'send' parameters/data to s by placing contents - into the on the . -

-
- - - - - - - James House - Sharada Jambula -
- - - The default value for priority. - - - - - Remove all s from the . - - - - - Create a with no specified name, group, or . - - - Note that the , and - the and properties - must be set before the can be placed into a - . - - - - - Create a with the given name, and default group. - - - Note that the and - properties must be set before the - can be placed into a . - - The name. - - - - Create a with the given name, and group. - - - Note that the and - properties must be set before the - can be placed into a . - - The name. - if , Scheduler.DefaultGroup will be used. - - - - Create a with the given name, and group. - - The name. - if , Scheduler.DefaultGroup will be used. - Name of the job. - The job group. - ArgumentException - if name is null or empty, or the group is an empty string. - - - - - Add the specified name of a to - the end of the 's list of listeners. - - Name of the listener. - - - - Remove the specified name of a - from the 's list of listeners. - - true if the given name was found in the list, and removed - - - - - This method should not be used by the Quartz client. -

- Called when the has decided to 'fire' - the trigger (Execute the associated ), in order to - give the a chance to update itself for its next - triggering (if any). -

- -
- - -
- - - This method should not be used by the Quartz client. - - -

- Called by the scheduler at the time a is first - added to the scheduler, in order to have the - compute its first fire time, based on any associated calendar. -

- -

- After this method has been called, - should return a valid answer. -

-
- - The first time at which the will be fired - by the scheduler, which is also the same value - will return (until after the first firing of the ). - -
- - - This method should not be used by the Quartz client. - - - Called after the has executed the - associated with the - in order to get the final instruction code from the trigger. - - - is the that was used by the - 's method. - is the thrown by the - , if any (may be null). - - - One of the members. - - - - - - - - - - Used by the to determine whether or not - it is possible for this to fire again. -

- If the returned value is then the - may remove the from the . -

-
-
- - - Returns the next time at which the is scheduled to fire. If - the trigger will not fire again, will be returned. Note that - the time returned can possibly be in the past, if the time that was computed - for the trigger to next fire has already arrived, but the scheduler has not yet - been able to fire the trigger (which would likely be due to lack of resources - e.g. threads). - - - The value returned is not guaranteed to be valid until after the - has been added to the scheduler. - - - - - - - Returns the previous time at which the fired. - If the trigger has not yet fired, will be returned. - - - - - Returns the next time at which the will fire, - after the given time. If the trigger will not fire after the given time, - will be returned. - - - - - Validates the misfire instruction. - - The misfire instruction. - - - - - This method should not be used by the Quartz client. -

- To be implemented by the concrete classes that extend this class. -

-

- The implementation should update the 's state - based on the MISFIRE_INSTRUCTION_XXX that was selected when the - was created. -

-
-
- - - This method should not be used by the Quartz client. -

- The implementation should update the 's state - based on the given new version of the associated - (the state should be updated so that it's next fire time is appropriate - given the Calendar's new settings). -

-
- - -
- - - Validates whether the properties of the are - valid for submission into a . - - - - - Return a simple string representation of this object. - - - - - Compare the next fire time of this to that of - another. - - - - - Determines whether the specified is equal to the current . - - The to compare with the current . - - true if the specified is equal to the current ; otherwise, false. - - - - - Serves as a hash function for a particular type. is suitable for use in hashing algorithms and data structures like a hash table. - - - A hash code for the current . - - - - - Creates a new object that is a copy of the current instance. - - - A new object that is a copy of this instance. - - - - - Get or sets the name of this . - - If name is null or empty. - - - - Get the group of this . If , Scheduler.DefaultGroup will be used. - - - if group is an empty string. - - - - - Get or set the name of the associated . - - - if jobName is null or empty. - - - - - Gets or sets the name of the associated 's - group. If set with , Scheduler.DefaultGroup will be used. - - ArgumentException - if group is an empty string. - - - - - Returns the 'full name' of the in the format - "group.name". - - - - - Gets the key. - - The key. - - - - Returns the 'full name' of the that the - points to, in the format "group.name". - - - - - Get or set the description given to the instance by - its creator (if any). - - - - - Get or set the with the given name with - this Trigger. Use when setting to dis-associate a Calendar. - - - - - Get or set the that is associated with the - . -

- Changes made to this map during job execution are not re-persisted, and - in fact typically result in an illegal state. -

-
-
- - - Whether or not the should be persisted in the - for re-use after program restarts. -

- If not explicitly set, the default value is . -

-
-
- - - Returns an array of s containing the names of all - s assigned to the , - in the order in which they should be notified. - - - - - Returns the last UTC time at which the will fire, if - the Trigger will repeat indefinitely, null will be returned. -

- Note that the return time *may* be in the past. -

-
-
- - - Get or set the instruction the should be given for - handling misfire situations for this - the - concrete type that you are using will have - defined a set of additional MISFIRE_INSTRUCTION_XXX - constants that may be passed to this method. -

- If not explicitly set, the default value is . -

-
- - - - -
- - - This method should not be used by the Quartz client. -

- Usable by - implementations, in order to facilitate 'recognizing' instances of fired - s as their jobs complete execution. -

-
-
- - - Returns the date/time on which the trigger must stop firing. This - defines the final boundary for trigger firings 舒 the trigger will - not fire after to this date and time. If this value is null, no end time - boundary is assumed, and the trigger can continue indefinitely. - - Sets the date/time on which the trigger must stop firing. This defines - the final boundary for trigger firings 舒 the trigger will not - fire after to this date and time. If this value is null, no end time - boundary is assumed, and the trigger can continue indefinitely. - - - - - The time at which the trigger's scheduling should start. May or may not - be the first actual fire time of the trigger, depending upon the type of - trigger and the settings of the other properties of the trigger. However - the first actual first time will not be before this date. - - - Setting a value in the past may cause a new trigger to compute a first - fire time that is in the past, which may cause an immediate misfire - of the trigger. - - - - - Tells whether this Trigger instance can handle events - in millisecond precision. - - - - - The priority of a acts as a tie breaker such that if - two s have the same scheduled fire time, then Quartz - will do its best to give the one with the higher priority first access - to a worker thread. - - - If not explicitly set, the default value is 5. - - - - - - - Gets a value indicating whether this instance has additional properties - that should be considered when for example saving to database. - - - If trigger implementation has additional properties that need to be saved - with base properties you need to make your class override this property with value true. - Returning true will effectively mean that ADOJobStore needs to serialize - this trigger instance to make sure additional properties are also saved. - - - true if this instance has additional properties; otherwise, false. - - - - - Create a with no settings. - - - The start-time will also be set to the current time, and the time zone - will be set the the system's default time zone. - - - - - Create a with the given name and default group. - - - The start-time will also be set to the current time, and the time zone - will be set the the system's default time zone. - - The name. - - - - Create a with the given name and group. - - - The start-time will also be set to the current time, and the time zone - will be set the the system's default time zone. - - The name. - The group. - - - - Create a with the given name, group and - expression. - - - The start-time will also be set to the current time, and the time zone - will be set the the system's default time zone. - - The name. - The group. - The cron expression. - - - - Create a with the given name and group, and - associated with the identified . - - - The start-time will also be set to the current time, and the time zone - will be set the the system's default time zone. - - The name. - The group. - Name of the job. - The job group. - - - - Create a with the given name and group, - associated with the identified , - and with the given "cron" expression. - - - The start-time will also be set to the current time, and the time zone - will be set the the system's default time zone. - - The name. - The group. - Name of the job. - The job group. - The cron expression. - - - - Create a with the given name and group, - associated with the identified , - and with the given "cron" expression resolved with respect to the . - - The name. - The group. - Name of the job. - The job group. - The cron expression. - The time zone. - - - - Create a that will occur at the given time, - until the given end time. -

- If null, the start-time will also be set to the current time, the time - zone will be set the the system's default. -

-
- The name. - The group. - Name of the job. - The job group. - The start time. - The end time. - The cron expression. -
- - - Create a with fire time dictated by the - resolved with respect to the specified - occuring from the until - the given . - - The name. - The group. - Name of the job. - The job group. - The start time. - The end time. - - - - Clones this instance. - - - - - - Returns the next time at which the is scheduled to fire. If - the trigger will not fire again, will be returned. Note that - the time returned can possibly be in the past, if the time that was computed - for the trigger to next fire has already arrived, but the scheduler has not yet - been able to fire the trigger (which would likely be due to lack of resources - e.g. threads). - - - The value returned is not guaranteed to be valid until after the - has been added to the scheduler. - - - - - - - Returns the previous time at which the fired. - If the trigger has not yet fired, will be returned. - - - - - - Sets the next fire time. -

- This method should not be invoked by client code. -

-
- The fire time. -
- - - Sets the previous fire time. -

- This method should not be invoked by client code. -

-
- The fire time. -
- - - Returns the next time at which the will fire, - after the given time. If the trigger will not fire after the given time, - will be returned. - - - - - - - Used by the to determine whether or not - it is possible for this to fire again. -

- If the returned value is then the - may remove the from the . -

-
- -
- - - Validates the misfire instruction. - - The misfire instruction. - - - - - This method should not be used by the Quartz client. -

- To be implemented by the concrete classes that extend this class. -

-

- The implementation should update the 's state - based on the MISFIRE_INSTRUCTION_XXX that was selected when the - was created. -

-
- -
- - -

- Determines whether the date and (optionally) time of the given Calendar - instance falls on a scheduled fire-time of this trigger. -

- -

- Equivalent to calling . -

-
- The date to compare. - -
- - - Determines whether the date and (optionally) time of the given Calendar - instance falls on a scheduled fire-time of this trigger. -

- Note that the value returned is NOT validated against the related - ICalendar (if any). -

-
- The date to compare - If set to true, the method will only determine if the - trigger will fire during the day represented by the given Calendar - (hours, minutes and seconds will be ignored). - -
- - - Called when the has decided to 'fire' - the trigger (Execute the associated ), in order to - give the a chance to update itself for its next - triggering (if any). - - - - - - - Updates the trigger with new calendar. - - The calendar to update with. - The misfire threshold. - - - - Called by the scheduler at the time a is first - added to the scheduler, in order to have the - compute its first fire time, based on any associated calendar. -

- After this method has been called, - should return a valid answer. -

-
- - - the first time at which the will be fired - by the scheduler, which is also the same value - will return (until after the first firing of the ). - -
- - - Gets the expression summary. - - - - - - Gets the next time to fire after the given time. - - The time to compute from. - - - - - NOT YET IMPLEMENTED: Returns the time before the given time - that this will fire. - - The date. - - - - - Gets or sets the cron expression string. - - The cron expression string. - - - - Set the CronExpression to the given one. The TimeZone on the passed-in - CronExpression over-rides any that was already set on the Trigger. - - The cron expression. - - - - Returns the date/time on which the trigger may begin firing. This - defines the initial boundary for trigger firings the trigger - will not fire prior to this date and time. - - - - - - Get or sets the time at which the CronTrigger should quit - repeating - even if repeastCount isn't yet satisfied. - - - - - Sets the time zone for which the of this - will be resolved. - - - If is set after this - property, the TimeZone setting on the CronExpression will "win". However - if is set after this property, the - time zone applied by this method will remain in effect, since the - string cron expression does not carry a time zone! - - The time zone. - - - - Returns the last UTC time at which the will fire, if - the Trigger will repeat indefinitely, null will be returned. -

- Note that the return time *may* be in the past. -

-
-
- - - Tells whether this Trigger instance can handle events - in millisecond precision. - - - - - - The interface to be implemented by s that provide a - mechanism for having their execution interrupted. It is NOT a requirment - for jobs to implement this interface - in fact, for most people, none of - their jobs will. - - -

- The means of actually interrupting the Job must be implemented within the - itself (the method of this - interface is simply a means for the scheduler to inform the - that a request has been made for it to be interrupted). The mechanism that - your jobs use to interrupt themselves might vary between implementations. - However the principle idea in any implementation should be to have the - body of the job's periodically check some flag to - see if an interruption has been requested, and if the flag is set, somehow - abort the performance of the rest of the job's work. An example of - interrupting a job can be found in the java source for the class - Quartz.Examples.Example7.DumbInterruptableJob. It is legal to use - some combination of and - synchronization within and - in order to have the method block until the - signals that it has noticed the set flag. -

- -

- If the Job performs some form of blocking I/O or similar functions, you may - want to consider having the method store a - reference to the calling as a member variable. Then the - impplementation of this interfaces method can call - on that Thread. Before attempting this, make - sure that you fully understand what - does and doesn't do. Also make sure that you clear the Job's member - reference to the Thread when the Execute(..) method exits (preferrably in a - block. -

-
- - - James House -
- - - Called by the when a user - interrupts the . - - void (nothing) if job interrupt is successful. - - - - Scheduler constants. - - - - - A (possibly) usefull constant that can be used for specifying the group - that and instances belong to. - - - - - A constant group name used internally by the - scheduler - clients should not use the value of this constant - ("MANUAL_TRIGGER") for thename of a 's group. - - - - - A constant group name used internally by the - scheduler - clients should not use the value of this constant - ("RECOVERING_JOBS") for thename of a 's group. - - - - - A constant group name used internally by the - scheduler - clients should not use the value of this constant - ("FAILED_OVER_JOBS") for thename of a 's group. - - - - - A constant key that can be used to retrieve the - name of the original from a recovery trigger's - data map in the case of a job recovering after a failed scheduler - instance. - - - - - - A constant key that can be used to retrieve the - group of the original from a recovery trigger's - data map in the case of a job recovering after a failed scheduler - instance. - - - - - - A constant key that can be used to retrieve the - scheduled fire time of the original from a recovery - trigger's data map in the case of a job recovering after a failed scheduler - instance. - - - - - - Holds state information for instances. - - - instances are stored once when the - is added to a scheduler. They are also re-persisted after every execution of - instances. -

- instances can also be stored with a - . This can be useful in the case where you have a Job - that is stored in the scheduler for regular/repeated use by multiple - Triggers, yet with each independent triggering, you want to supply the - Job with different data inputs. -

-

- The passed to a Job at execution time - also contains a convenience that is the result - of merging the contents of the trigger's JobDataMap (if any) over the - Job's JobDataMap (if any). -

-
- - - - - James House -
- - - Create an empty . - - - - - Create a with the given data. - - - - - Adds the given value as a string version to the - 's data map. - - - - - Adds the given value as a string version to the - 's data map. - - - - - Adds the given value as a string version to the - 's data map. - - - - - Adds the given value as a string version to the - 's data map. - - - - - Adds the given value as a string version to the - 's data map. - - - - - Adds the given value as a string version to the - 's data map. - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the - . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Retrieve the identified value from the . - - - - - Gets the date time. - - The key. - - - - - Gets the value behind the specified key. - - The key. - - - - - Conveys the detail properties of a given instance. - - - Quartz does not store an actual instance of a type, but - instead allows you to define an instance of one, through the use of a . -

- s have a name and group associated with them, which - should uniquely identify them within a single . -

-

- s are the 'mechanism' by which s - are scheduled. Many s can point to the same , - but a single can only point to one . -

-
- - - - - James House - Sharada Jambula -
- - - Create a with no specified name or group, and - the default settings of all the other properties. -

- Note that the , and - properties must be set before the job can be - placed into a . -

-
-
- - - Create a with the given name, default group, and - the default settings of all the other properties. - If , Scheduler.DefaultGroup will be used. - - - If name is null or empty, or the group is an empty string. - - - - - Create a with the given name, and group, and - the default settings of all the other properties. - If , Scheduler.DefaultGroup will be used. - - - If name is null or empty, or the group is an empty string. - - - - - Create a with the given name, and group, and - the given settings of all the other properties. - - The name. - if , Scheduler.DefaultGroup will be used. - Type of the job. - if set to true, job will be volatile. - if set to true, job will be durable. - if set to true, job will request recovery. - - ArgumentException if name is null or empty, or the group is an empty string. - - - - - Validates whether the properties of the are - valid for submission into a . - - - - - Add the specified name of a to the - end of the 's list of listeners. - - - - - Remove the specified name of a from - the 's list of listeners. - - true if the given name was found in the list, and removed - - - - Return a simple string representation of this object. - - - - - Creates a new object that is a copy of the current instance. - - - A new object that is a copy of this instance. - - - - - Determines whether the specified detail is equal to this instance. - - The detail to examine. - - true if the specified detail is equal; otherwise, false. - - - - - Determines whether the specified is equal to the current . - - The to compare with the current . - - if the specified is equal to the - current ; otherwise, . - - - - - Checks equality between given job detail and this instance. - - The detail to compare this instance with. - - - - - Serves as a hash function for a particular type, suitable - for use in hashing algorithms and data structures like a hash table. - - - A hash code for the current . - - - - - Get or sets the name of this . - - - if name is null or empty. - - - - - Get or sets the group of this . - If , will be used. - - - If the group is an empty string. - - - - - Returns the 'full name' of the in the format - "group.name". - - - - - Gets the key. - - The key. - - - - Get or set the description given to the instance by its - creator (if any). - - - May be useful for remembering/displaying the purpose of the job, though the - description has no meaning to Quartz. - - - - - Get or sets the instance of that will be executed. - - - if jobType is null or the class is not a . - - - - - Get or set the that is associated with the . - - - - - Set whether or not the the should re-Execute - the if a 'recovery' or 'fail-over' situation is - encountered. -

- If not explicitly set, the default value is . -

-
- -
- - - Whether or not the should not be persisted in the - for re-use after program - restarts. -

- If not explicitly set, the default value is . -

-
- if the should be garbage - collected along with the . - -
- - - Whether or not the should remain stored after it is - orphaned (no s point to it). -

- If not explicitly set, the default value is . -

-
- - if the Job should remain persisted after - being orphaned. - -
- - - Whether or not the implements the interface . - - - - - Gets or sets an array of s containing the names of all - s assigned to the , - in the order in which they should be notified. Setting the array - clears any listener names that were in the list. - - - - - A context bundle containing handles to various environment information, that - is given to a instance as it is - executed, and to a instance after the - execution completes. - - -

- The found on this object (via the - method) serves as a convenience - - it is a merge of the found on the - and the one found on the , with - the value in the latter overriding any same-named values in the former. - It is thus considered a 'best practice' that the Execute code of a Job - retrieve data from the JobDataMap found on this object NOTE: Do not - expect value 'set' into this JobDataMap to somehow be set back onto a - 's own JobDataMap. -

- -

- s are also returned from the - - method. These are the same instances as those past into the jobs that are - currently executing within the scheduler. The exception to this is when your - application is using Quartz remotely (i.e. via RMI) - in which case you get - a clone of the s, and their references to - the and instances have been lost (a - clone of the is still available - just not a handle - to the job instance that is running). -

-
- - - - - - James House -
- - - Create a JobExcecutionContext with the given context data. - - - - - Increments the refire count. - - - - - Returns a that represents the current . - - - A that represents the current . - - - - - Put the specified value into the context's data map with the given key. - Possibly useful for sharing data between listeners and jobs. -

- NOTE: this data is volatile - it is lost after the job execution - completes, and all TriggerListeners and JobListeners have been - notified. -

-
- - - - -
- - - Get the value with the given key from the context's data map. - - - - - - - Get a handle to the instance that fired the - . - - - - - Get a handle to the instance that fired the - . - - - - - Get a handle to the referenced by the - instance that fired the . - - - - - If the is being re-executed because of a 'recovery' - situation, this method will return . - - - - - Gets the refire count. - - The refire count. - - - - Get the convenience of this execution context. - - -

- The found on this object serves as a convenience - - it is a merge of the found on the - and the one found on the , with - the value in the latter overriding any same-named values in the former. - It is thus considered a 'best practice' that the Execute code of a Job - retrieve data from the JobDataMap found on this object. -

- -

NOTE: Do not expect value 'set' into this JobDataMap to somehow be - set back onto a 's own JobDataMap. -

- -

- Attempts to change the contents of this map typically result in an - illegal state. -

- -
-
- - - Get the associated with the . - - - - - Get the instance of the that was created for this - execution. -

- Note: The Job instance is not available through remote scheduler - interfaces. -

-
-
- - - The actual time the trigger fired. For instance the scheduled time may - have been 10:00:00 but the actual fire time may have been 10:00:03 if - the scheduler was too busy. - - Returns the fireTimeUtc. - - - - - The scheduled time the trigger fired for. For instance the scheduled - time may have been 10:00:00 but the actual fire time may have been - 10:00:03 if the scheduler was too busy. - - Returns the scheduledFireTimeUtc. - - - - - Gets the previous fire time. - - The previous fire time. - - - - Gets the next fire time. - - The next fire time. - - - - Returns the result (if any) that the set before its - execution completed (the type of object set as the result is entirely up - to the particular job). - - -

- The result itself is meaningless to Quartz, but may be informative - to s or - s that are watching the job's - execution. -

- - Set the result (if any) of the 's execution (the type of - object set as the result is entirely up to the particular job). - -

- The result itself is meaningless to Quartz, but may be informative - to s or - s that are watching the job's - execution. -

-
-
- - - The amount of time the job ran for. The returned - value will be until the job has actually completed (or thrown an - exception), and is therefore generally only useful to - s and s. - - - - - An exception that can be thrown by a - to indicate to the Quartz that an error - occured while executing, and whether or not the requests - to be re-fired immediately (using the same , - or whether it wants to be unscheduled. - - - Note that if the flag for 'refire immediately' is set, the flags for - unscheduling the Job are ignored. - - - - - James House - - - - Create a JobExcecutionException, with the 're-fire immediately' flag set - to . - - - - - Create a JobExcecutionException, with the given cause. - - The cause. - - - - Create a JobExcecutionException, with the given message. - - - - - Initializes a new instance of the class. - - The message. - The original cause. - - - - Create a JobExcecutionException with the 're-fire immediately' flag set - to the given value. - - - - - Create a JobExcecutionException with the given underlying exception, and - the 're-fire immediately' flag set to the given value. - - - - - Create a JobExcecutionException with the given message, and underlying - exception, and the 're-fire immediately' flag set to the given value. - - - - - Initializes a new instance of the class. - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - The class name is null or is zero (0). - The info parameter is null. - - - - Creates and returns a string representation of the current exception. - - - A string representation of the current exception. - - - - - - Gets or sets a value indicating whether to unschedule firing trigger. - - - true if firing trigger should be unscheduled; otherwise, false. - - - - - Gets or sets a value indicating whether to unschedule all triggers. - - - true if all triggers should be unscheduled; otherwise, false. - - - - - Gets or sets a value indicating whether to refire immediately. - - true if to refire immediately; otherwise, false. - - - - Misfire instructions. - - - - - Instruction not set (yet). - - - - - Use smart policy. - - - - - Misfire policy settings for SimpleTrigger. - - - - - Instructs the that upon a mis-fire - situation, the wants to be fired - now by . -

- NOTE: This instruction should typically only be used for - 'one-shot' (non-repeating) Triggers. If it is used on a trigger with a - repeat count > 0 then it is equivalent to the instruction - . -

-
-
- - - Instructs the that upon a mis-fire - situation, the wants to be - re-scheduled to 'now' (even if the associated - excludes 'now') with the repeat count left as-is. This does obey the - end-time however, so if 'now' is after the - end-time the will not fire again. - - -

- NOTE: Use of this instruction causes the trigger to 'forget' - the start-time and repeat-count that it was originally setup with (this - is only an issue if you for some reason wanted to be able to tell what - the original values were at some later time). -

-
-
- - - Instructs the that upon a mis-fire - situation, the wants to be - re-scheduled to 'now' (even if the associated - excludes 'now') with the repeat count set to what it would be, if it had - not missed any firings. This does obey the end-time - however, so if 'now' is after the end-time the will - not fire again. - -

- NOTE: Use of this instruction causes the trigger to 'forget' - the start-time and repeat-count that it was originally setup with. - Instead, the repeat count on the trigger will be changed to whatever - the remaining repeat count is (this is only an issue if you for some - reason wanted to be able to tell what the original values were at some - later time). -

- -

- NOTE: This instruction could cause the - to go to the 'COMPLETE' state after firing 'now', if all the - repeat-fire-times where missed. -

-
-
- - - Instructs the that upon a mis-fire - situation, the wants to be - re-scheduled to the next scheduled time after 'now' - taking into - account any associated , and with the - repeat count set to what it would be, if it had not missed any firings. - - - NOTE/WARNING: This instruction could cause the - to go directly to the 'COMPLETE' state if all fire-times where missed. - - - - - Instructs the that upon a mis-fire - situation, the wants to be - re-scheduled to the next scheduled time after 'now' - taking into - account any associated , and with the - repeat count left unchanged. - - -

- NOTE/WARNING: This instruction could cause the - to go directly to the 'COMPLETE' state if all the end-time of the trigger - has arrived. -

-
-
- - - misfire instructions for CronTrigger - - - - - Instructs the that upon a mis-fire - situation, the wants to be fired now - by . - - - - - Instructs the that upon a mis-fire - situation, the wants to have it's - next-fire-time updated to the next time in the schedule after the - current time (taking into account any associated , - but it does not want to be fired now. - - - - - misfire instructions for NthIncludedDayTrigger - - - - - Instructs the that upon a mis-fire situation, the - wants to be fired now by the - - - - - - Instructs the that upon a mis-fire situation, the - wants to have - nextFireTime updated to the next time in the schedule after - the current time, but it does not want to be fired now. - - - - - A trigger which fires on the Nth day of every interval type - , or - that is not excluded by the associated - calendar. - - - When determining what the Nth day of the month or year - is, will skip excluded days on the - associated calendar. This would commonly be used in an Nth - business day situation, in which the user wishes to fire a particular job on - the Nth business day (i.e. the 5th business day of - every month). Each also has an associated - which indicates at what time of day the trigger is - to fire. -

- All s default to a monthly interval type - (fires on the Nth day of every month) with N = 1 (first - non-excluded day) and set to 12:00 PM (noon). These - values can be changed using the , , and - methods. Users may also want to note the - and - methods. -

-

- Take, for example, the following calendar: -

- - July August September - Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa - 1 W 1 2 3 4 5 W 1 2 W - W H 5 6 7 8 W W 8 9 10 11 12 W W H 6 7 8 9 W - W 11 12 13 14 15 W W 15 16 17 18 19 W W 12 13 14 15 16 W - W 18 19 20 21 22 W W 22 23 24 25 26 W W 19 20 21 22 23 W - W 25 26 27 28 29 W W 29 30 31 W 26 27 28 29 30 - W - - Where W's represent weekend days, and H's represent holidays, all of which - are excluded on a calendar associated with an - with n=5 and - intervalType=IntervalTypeMonthly. In this case, the trigger - would fire on the 8th of July (because of the July 4 holiday), - the 5th of August, and the 8th of September (because - of Labor Day). -
- Aaron Craven -
- - - Indicates a monthly trigger type (fires on the Nth included - day of every month). - - - - indicates a yearly trigger type (fires on the Nth included - day of every year). - - - - - Indicates a weekly trigger type (fires on the Nth included - day of every week). When using this interval type, care must be taken - not to think of the value of as an analog to - . Such a comparison can only - be drawn when there are no calendars associated with the trigger. To - illustrate, consider an with - n = 3 which is associated with a Calendar excluding - non-weekdays. The trigger would fire on the 3rd - included day of the week, which would be 4th - actual day of the week. - - - - - Create an with no specified name, - group, or . This will result initially in a - default monthly trigger that fires on the first day of every month at - 12:00 PM (n = 1, - intervalType=, - fireAtTime="12:00"). - - - Note that , , - , and , must be - called before the can be placed into - a . - - - - - Create an with the given name and - default group but no specified . This will result - initially in a default monthly trigger that fires on the first day of - every month at 12:00 PM (=1, - intervalType=, - fireAtTime=12:00"). -

- Note that and must - be called before the can be placed - into a . -

-
- the name for the -
- - - Create an with the given name and - group but no specified . This will result - initially in a default monthly trigger that fires on the first day of - every month at 12:00 PM (=1, - intervalType=, - fireAtTime=12:00"). -

- Note that and must - be called before the can be placed - into a . -

-
- the name for the - - the group for the - -
- - - Create an with the given name and - group and the specified . This will result - initially in a default monthly trigger that fires on the first day of - every month at 12:00 PM (=1, - intervalType=, - fireAtTime="12:00"). - - The name for the . - The group for the . - The name of the job to associate with the . - The group containing the job to associate with the . - - - - Returns the next UTC time at which the - will fire. If the trigger will not fire again, will be - returned. - - -

- Because of the conceptual design of , - it is not always possible to decide with certainty that the trigger - will never fire again. Therefore, it will search for the next - fire time up to a given cutoff. These cutoffs can be changed by using the - property. The default cutoff is 12 - of the intervals specified by intervalType. -

-

- The returned value is not guaranteed to be valid until after - the trigger has been added to the scheduler. -

-
- the next fire time for the trigger - -
- - - Returns the previous UTC time at which the - fired. If the trigger has not yet - fired, will be returned. - - the previous fire time for the trigger - - - - Returns the first time the will fire - after the specified date. - - -

- Because of the conceptual design of , - it is not always possible to decide with certainty that the trigger - will never fire again. Therefore, it will search for the next - fire time up to a given cutoff. These cutoffs can be changed by using the - property. The default cutoff is 12 - of the intervals specified by intervalType. -

-

- Therefore, for triggers with intervalType = - , if the trigger - will not fire within 12 - weeks after the given date/time, will be returned. For - triggers with intervalType = - - , if the trigger will not fire within 12 - months after the given date/time, will be returned. - For triggers with intervalType = - - , if the trigger will not fire within 12 - years after the given date/time, will be returned. In - all cases, if the trigger will not fire before , - will be returned. -

-
- The time after which to find the nearest fire time. - This argument is treated as exclusive 舒 that is, - if afterTime is a valid fire time for the trigger, it - will not be returned as the next fire time. - - - the first time the trigger will fire following the specified date - -
- - - Called when the has decided to 'fire' the trigger - (Execute the associated ), in order to give the - a chance to update itself for its next triggering - (if any). - - - - - Called by the scheduler at the time a is first - added to the scheduler, in order to have the - compute its first fire time, based on any associated calendar. -

- After this method has been called, - should return a valid answer. -

- -
- the first time at which the will be fired - by the scheduler, which is also the same value - will return (until after the first - firing of the ). - -
- - - Called after the has executed the - associated with the in order - to get the final instruction code from the trigger. - - - The that was used by the - 's method. - - - The thrown by the - , if any (may be ) - - one of the Trigger.INSTRUCTION_XXX constants. - - - - - Used by the to determine whether or not it is - possible for this to fire again. - ' - -

- If the returned value is then the - may remove the from the - -

-
- - A boolean indicator of whether the trigger could potentially fire - again. - -
- - - Indicates whether is a valid misfire - instruction for this . - - Whether is valid. - - - Updates the 's state based on the - MisfireInstruction that was selected when the - was created -

- If the misfire instruction is set to MISFIRE_INSTRUCTION_SMART_POLICY, - then the instruction will be interpreted as - . -

-
- a new or updated calendar to use for the trigger - -
- - - Updates the 's state based on the - given new version of the associated . - - A new or updated calendar to use for the trigger - the amount of time that must - be between "now" and the time the next - firing of the trigger is supposed to occur. - - - - - Calculates the first time an with - intervalType = IntervalTypeWeekly will fire - after the specified date. See for more - information. - - The time after which to find the nearest fire time. - This argument is treated as exclusive 舒 that is, - if afterTime is a valid fire time for the trigger, it - will not be returned as the next fire time. - - the first time the trigger will fire following the specified - date - - - - - Calculates the first UTC time an with - intervalType = will fire - after the specified date. See for more - information. - - - The UTC time after which to find the nearest fire time. - This argument is treated as exclusive 舒 that is, - if afterTime is a valid fire time for the trigger, it - will not be returned as the next fire time. - - the first time the trigger will fire following the specified date - - - - Calculates the first time an with - intervalType = will fire - after the specified date. See for more - information. - - - The UTC time after which to find the nearest fire time. - This argument is treated as exclusive 舒 that is, - if afterTime is a valid fire time for the trigger, it - will not be returned as the next fire time. - - the first time the trigger will fire following the specified - date - - - - - Gets or sets the day of the interval on which the - should fire. If the Nth - day of the interval does not exist (i.e. the 32nd of a - month), the trigger simply will never fire. N may not be less than 1. - - - - - Returns the interval type for the . - - - Sets the interval type for the . If - , the trigger will fire on the - Nth included day of every month. If - , the trigger will fire on the - Nth included day of every year. If - , the trigger will fire on the - Nth included day of every week. - - - - - - - - Returns the fire time for the as a - string with the format "HH:MM[:SS]", with HH representing the - 24-hour clock hour of the fire time. Seconds are optional and their - inclusion depends on whether or not they were provided to - . - - - - - Returns the for the - . - - -

- Because of the conceptual design of , - it is not always possible to decide with certainty that the trigger - will never fire again. Therefore, it will search for the next - fire time up to a given cutoff. These cutoffs can be changed by using the - property. The default cutoff is 12 - of the intervals specified by intervalType" />. -

-

- Because of the conceptual design of , - it is not always possible to decide with certainty that the trigger - will never fire again. Therefore, it will search for the next - fire time up to a given cutoff. These cutoffs can be changed by using the - method. The default cutoff is 12 - of the intervals specified by intervalType". -

-

- In most cases, the default value of this setting (12) is sufficient (it - is highly unlikely, for example, that you will need to look at more than - 12 months of dates to ensure that your trigger will never fire again). - However, this setting is included to allow for the rare exceptions where - this might not be true. -

-

- For example, if your trigger is associated with a calendar that excludes - a great many dates in the next 12 months, and hardly any following that, - it is possible (if is large enough) that you could run - into this situation. -

-
-
- - - Returns the last UTC time the will fire. - If the trigger will not fire at any point between - and , will be returned. - - the last time the trigger will fire. - - - - Tells whether this Trigger instance can handle events - in millisecond precision. - - - - - - Sets or gets the time zone in which the will be resolved. - If no time zone is provided, then the default time zone will be used. - - - - - - - Gets or sets the trigger's calendar week rule. - - The trigger calendar week rule. - - - - Gets or sets the trigger's calendar first day of week rule. - - The trigger calendar first day of week. - - - - An exception that is thrown to indicate that an attempt to store a new - object (i.e. , - or ) in a - failed, because one with the same name and group already exists. - - James House - - -

- Create a with the given - message. -

-
-
- - - Initializes a new instance of the class. - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - The class name is null or is zero (0). - The info parameter is null. - - -

- Create a and auto-generate a - message using the name/group from the given . -

- -

- The message will read:
"Unable to store Job with name: '__' and - group: '__', because one already exists with this identification." -

-
-
- -

- Create a and auto-generate a - message using the name/group from the given . -

- -

- The message will read:
"Unable to store Trigger with name: '__' and - group: '__', because one already exists with this identification." -

-
-
- - - An exception that is thrown to indicate that there is a misconfiguration of - the - or one of the components it - configures. - - James House - - - - Create a with the given message. - - - - - Create a with the given message - and cause. - - - - - Initializes a new instance of the class. - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - The class name is null or is zero (0). - The info parameter is null. - - - - Holds context/environment data that can be made available to Jobs as they - are executed. - - - James House - - - - Create an empty . - - - - - Create a with the given data. - - - - - Instructs Scheduler what to do with a trigger and job. - - - - - Instructs the that the - has no further instructions. - - - - - Instructs the that the - wants the to re-Execute - immediately. If not in a 'RECOVERING' or 'FAILED_OVER' situation, the - execution context will be re-used (giving the the - abilitiy to 'see' anything placed in the context by its last execution). - - - - - Instructs the that the - should be put in the state. - - - - - Instructs the that the - wants itself deleted. - - - - - Instructs the that all - s referencing the same as - this one should be put in the state. - - - - - Instructs the that all - s referencing the same as - this one should be put in the state. - - - - - Instructs the that the - should be put in the state. - - - - - Describes the settings and capabilities of a given - instance. - - James House - - - - Initializes a new instance of the class. - - Name of the scheduler. - The scheduler instance. - The scheduler type. - if set to true, scheduler is a remote scheduler. - if set to true, scheduler is started. - if set to true, scheduler is in standby mode. - if set to true, scheduler is shutdown. - The start time. - The number of jobs executed. - The job store type. - if set to true, job store is persistent. - The thread pool type. - Size of the thread pool. - The version string. - - - - Returns a formatted (human readable) string describing all the 's - meta-data values. - - -

- The format of the string looks something like this: -

-            Quartz Scheduler 'SchedulerName' with instanceId 'SchedulerInstanceId' Scheduler class: 'Quartz.Impl.StdScheduler' - running locally. Running since: '11:33am on Jul 19, 2002' Not currently paused. Number of Triggers fired: '123' Using thread pool 'Quartz.Simpl.SimpleThreadPool' - with '8' threads Using job-store 'Quartz.Impl.JobStore' - which supports persistence.
-            
-

-
-
- - - Return a simple string representation of this object. - - - - - Returns the name of the . - - - - - Returns the instance Id of the . - - - - - Returns the class-name of the instance. - - - - - Returns whether the is being used remotely (via remoting). - - - - - Returns whether the scheduler has been started. - - - Note: may return even if - returns . - - - - - Reports whether the is in standby mode. - - - Note: may return even if - returns . - - - - - Reports whether the has been Shutdown. - - - - - Returns the class-name of the instance that is - being used by the . - - - - - Returns the type name of the instance that is - being used by the . - - - - - Returns the number of threads currently in the 's - - - - - Returns the version of Quartz that is running. - - - - - Returns the at which the Scheduler started running. - - null if the scheduler has not been started. - - - - - Returns the number of jobs executed since the - started.. - - - - - Returns whether or not the 's - instance supports persistence. - - - - - A concrete that is used to fire a - at a given moment in time, and optionally repeated at a specified interval. - - - - - - James House - Contributions by Lieven Govaerts of Ebitec Nv, Belgium. - Marko Lahma (.NET) - - - - Used to indicate the 'repeat count' of the trigger is indefinite. Or in - other words, the trigger should repeat continually until the trigger's - ending timestamp. - - - - - Create a with no settings. - - - - - Create a that will occur immediately, and - not repeat. - - - - - Create a that will occur immediately, and - not repeat. - - - - - Create a that will occur immediately, and - repeat at the the given interval the given number of times. - - - - - Create a that will occur immediately, and - repeat at the the given interval the given number of times. - - - - - Create a that will occur at the given time, - and not repeat. - - - - - Create a that will occur at the given time, - and not repeat. - - - - - Create a that will occur at the given time, - and repeat at the the given interval the given number of times, or until - the given end time. - - The name. - A UTC set to the time for the to fire. - A UTC set to the time for the - to quit repeat firing. - The number of times for the to repeat - firing, use for unlimited times. - The time span to pause between the repeat firing. - - - - Create a that will occur at the given time, - and repeat at the the given interval the given number of times, or until - the given end time. - - The name. - The group. - A UTC set to the time for the to fire. - A UTC set to the time for the - to quit repeat firing. - The number of times for the to repeat - firing, use for unlimited times. - The time span to pause between the repeat firing. - - - - Create a that will occur at the given time, - fire the identified and repeat at the the given - interval the given number of times, or until the given end time. - - The name. - The group. - Name of the job. - The job group. - A set to the time for the - to fire. - A set to the time for the - to quit repeat firing. - The number of times for the to repeat - firing, use RepeatIndefinitely for unlimited times. - The time span to pause between the repeat firing. - - - - Validates the misfire instruction. - - The misfire instruction. - - - - - Updates the 's state based on the - MisfireInstruction value that was selected when the - was created. - - - If MisfireSmartPolicyEnabled is set to true, - then the following scheme will be used:
-
    -
  • If the Repeat Count is 0, then the instruction will - be interpreted as .
  • -
  • If the Repeat Count is , then - the instruction will be interpreted as . - WARNING: using MisfirePolicy.SimpleTrigger.RescheduleNowWithRemainingRepeatCount - with a trigger that has a non-null end-time may cause the trigger to - never fire again if the end-time arrived during the misfire time span. -
  • -
  • If the Repeat Count is > 0, then the instruction - will be interpreted as . -
  • -
-
-
- - - Called when the has decided to 'fire' - the trigger (Execute the associated ), in order to - give the a chance to update itself for its next - triggering (if any). - - - - - - Updates the instance with new calendar. - - The calendar. - The misfire threshold. - - - - Called by the scheduler at the time a is first - added to the scheduler, in order to have the - compute its first fire time, based on any associated calendar. -

- After this method has been called, - should return a valid answer. -

-
- - The first time at which the will be fired - by the scheduler, which is also the same value - will return (until after the first firing of the ). - -
- - - Returns the next time at which the will - fire. If the trigger will not fire again, will be - returned. The value returned is not guaranteed to be valid until after - the has been added to the scheduler. - - - - - Returns the previous time at which the fired. - If the trigger has not yet fired, will be - returned. - - - - - Set the next UTC time at which the should fire. - This method should not be invoked by client code. - - - - - Set the previous UTC time at which the fired. - This method should not be invoked by client code. - - - - - Returns the next UTC time at which the will - fire, after the given UTC time. If the trigger will not fire after the given - time, will be returned. - - - - - Returns the last UTC time at which the will - fire, before the given time. If the trigger will not fire before the - given time, will be returned. - - - - - Computes the number of times fired between the two UTC date times. - - The UTC start date and time. - The UTC end date and time. - - - - - Determines whether or not the will occur - again. - - - - - Validates whether the properties of the are - valid for submission into a . - - - - - Get or set thhe number of times the should - repeat, after which it will be automatically deleted. - - - - - - Get or set the the time interval at which the should repeat. - - - - - Get or set the number of times the has already - fired. - - - - - Returns the final UTC time at which the will - fire, if repeatCount is RepeatIndefinitely, null will be returned. -

- Note that the return time may be in the past. -

-
-
- - - Tells whether this Trigger instance can handle events - in millisecond precision. - - - - - - All trigger states known to Scheduler. - - - - - Indicates that the is in the "normal" state. - - - - - Indicates that the is in the "paused" state. - - - - - Indicates that the is in the "complete" state. - - - "Complete" indicates that the trigger has not remaining fire-times in - its schedule. - - - - - Indicates that the is in the "error" state. - - -

- A arrives at the error state when the scheduler - attempts to fire it, but cannot due to an error creating and executing - its related job. Often this is due to the 's - class not existing in the classpath. -

- -

- When the trigger is in the error state, the scheduler will make no - attempts to fire it. -

-
-
- - - Indicates that the is in the "blocked" state. - - - A arrives at the blocked state when the job that - it is associated with is a and it is - currently executing. - - - - - - Indicates that the does not exist. - - - - - Convenience and utility methods for simplifying the construction and - configuration of s. - - - Please submit suggestions for additional convenience methods to either the - Quartz user forum or the developer's mail list at - source forge. - - - - James House - - - - Constant indicating last day of month. - - - - - Milliseconds in minute. - - - - - Milliseconds in hour. - - - - - Seconds in day. - - - - - Milliseconds in day. - - - - - Initializes a new instance of the class. - - - - - Set the given 's name to the given value, and its - group to the default group (). - - the tigger to change name to - the new trigger name - - - - Set the given 's name to the given value, and its - group to the given group. - - the tigger to change name to - the new trigger name - the new trigger group - - - - Make a trigger that will fire every day at the given time. -

- The generated trigger will not have its name, group, - or end-time set. The Start time defaults to 'now'. -

-
- the hour (0-23) upon which to fire - the minute (0-59) upon which to fire - the new trigger -
- - - Make a trigger that will fire every day at the given time. -

- The generated trigger will not have its group or end-time set. - The Start time defaults to 'now'. -

-
- the trigger's name - the hour (0-23) upon which to fire - the minute (0-59) upon which to fire - the newly created trigger -
- - - Make a trigger that will fire every week at the given day and time. -

- The generated trigger will not have its name, group, - or end-time set. The Start time defaults to 'now'. -

-
- (1-7) the day of week upon which to fire - the hour (0-23) upon which to fire - the minute (0-59) upon which to fire - the new trigger -
- - - Make a trigger that will fire every week at the given day and time. -

- The generated trigger will not have its group, - or end-time set. The Start time defaults to 'now'. -

-
- the trigger's name - the day of week upon which to fire - the hour (0-23) upon which to fire - the minute (0-59) upon which to fire - the newly created trigger -
- - - Make a trigger that will fire every month at the given day and time. -

- The generated trigger will not have its name, group, - or end-time set. The Start time defaults to 'now'. -

-

- If the day of the month specified does not occur in a given month, a - firing will not occur that month. (i.e. if dayOfMonth is specified as - 31, no firing will occur in the months of the year with fewer than 31 - days). -

-
- (1-31, or -1) the day of week upon which to fire - the hour (0-23) upon which to fire - the minute (0-59) upon which to fire - the newly created trigger -
- - - Make a trigger that will fire every month at the given day and time. -

- The generated trigger will not have its group, - or end-time set. The Start time defaults to 'now'. -

-

- If the day of the month specified does not occur in a given month, a - firing will not occur that month. (i.e. if dayOfMonth is specified as - 31, no firing will occur in the months of the year with fewer than 31 - days). -

-
- the trigger's name - (1-31, or -1) the day of week upon which to fire - the hour (0-23) upon which to fire - the minute (0-59) upon which to fire - the newly created trigger -
- - - Make a trigger that will fire times, waiting - between each fire. - - - The generated trigger will not have its name, group, - or end-time set. The Start time defaults to 'now'. - - the newly created trigger - - - - Make a trigger that will fire times, waiting - between each fire. -

- The generated trigger will not have its name, group, - or end-time set. The Start time defaults to 'now'. -

-
- the trigger's name - the new trigger -
- - - Make a trigger that will fire every second, indefinitely. -

- The generated trigger will not have its name, group, - or end-time set. The Start time defaults to 'now'. -

-
- the new trigger -
- - - Make a trigger that will fire every second, indefinitely. -

- The generated trigger will not have its group, - or end-time set. The Start time defaults to 'now'. -

-
- the trigger's name - the new trigger -
- - - Make a trigger that will fire every N seconds, indefinitely. -

- The generated trigger will not have its name, group, - or end-time set. The Start time defaults to 'now'. -

-
- the number of seconds between firings - the new trigger -
- - - Make a trigger that will fire every N seconds, with the given number of - repeats. -

- The generated trigger will not have its name, group, - or end-time set. The Start time defaults to 'now'. -

-
- the number of seconds between firings - the number of times to repeat the firing - the new trigger -
- - - Make a trigger that will fire every N seconds, with the given number of - repeats. -

- The generated trigger will not have its group, - or end-time set. The Start time defaults to 'now'. -

-
- the trigger's name - the number of seconds between firings - the number of times to repeat the firing - the new trigger -
- - - Make a trigger that will fire every minute, indefinitely. -

- The generated trigger will not have its name, group, - or end-time set. The Start time defaults to 'now'. -

-
- the new trigger -
- - - Make a trigger that will fire every minute, indefinitely. -

- The generated trigger will not have its group, - or end-time set. The Start time defaults to 'now'. -

-
- the trigger's name - the new trigger -
- - - Make a trigger that will fire every N minutes, indefinitely. -

- The generated trigger will not have its name, group, - or end-time set. The Start time defaults to 'now'. -

-
- the number of minutes between firings - the new trigger -
- - - Make a trigger that will fire every N minutes, with the given number of - repeats. -

- The generated trigger will not have its name, group, - or end-time set. The Start time defaults to 'now'. -

-
- the number of minutes between firings - the number of times to repeat the firing - the new trigger -
- - - Make a trigger that will fire every N minutes, with the given number of - repeats. -

- The generated trigger will not have its group, - or end-time set. The Start time defaults to 'now'. -

-
- the trigger's name - the number of minutes between firings - the number of times to repeat the firing - the new trigger -
- - - Make a trigger that will fire every hour, indefinitely. -

- The generated trigger will not have its name, group, - or end-time set. The Start time defaults to 'now'. -

-
- the new trigger -
- - - Make a trigger that will fire every hour, indefinitely. -

- The generated trigger will not have its group, - or end-time set. The Start time defaults to 'now'. -

-
- the trigger's name - the new trigger -
- - - Make a trigger that will fire every N hours, indefinitely. -

- The generated trigger will not have its name, group, - or end-time set. The Start time defaults to 'now'. -

-
- the number of hours between firings - the new trigger -
- - - Make a trigger that will fire every N hours, with the given number of - repeats. -

- The generated trigger will not have its name, group, - or end-time set. The Start time defaults to 'now'. -

-
- the number of hours between firings - the number of times to repeat the firing - the new trigger -
- - - Make a trigger that will fire every N hours, with the given number of - repeats. -

- The generated trigger will not have its group, - or end-time set. The Start time defaults to 'now'. -

-
- the trigger's name - the number of hours between firings - the number of times to repeat the firing - the new trigger -
- - - Returns a date that is rounded to the next even hour above the given - date. -

- For example an input date with a time of 08:13:54 would result in a date - with the time of 09:00:00. If the date's time is in the 23rd hour, the - date's 'day' will be promoted, and the time will be set to 00:00:00. -

-
- the Date to round, if the current time will - be used - the new rounded date -
- - - Returns a date that is rounded to the previous even hour below the given - date. -

- For example an input date with a time of 08:13:54 would result in a date - with the time of 08:00:00. -

-
- the Date to round, if the current time will - be used - the new rounded date -
- - - Returns a date that is rounded to the next even minute above the given - date. -

- For example an input date with a time of 08:13:54 would result in a date - with the time of 08:14:00. If the date's time is in the 59th minute, - then the hour (and possibly the day) will be promoted. -

-
- The Date to round, if the current time will be used - The new rounded date -
- - - Returns a date that is rounded to the previous even minute below the - given date. -

- For example an input date with a time of 08:13:54 would result in a date - with the time of 08:13:00. -

-
- the Date to round, if the current time will - be used - the new rounded date -
- - - Returns a date that is rounded to the next even second above the given - date. - - the Date to round, if the current time will - be used - the new rounded date - - - - Returns a date that is rounded to the previous even second below the - given date. -

- For example an input date with a time of 08:13:54.341 would result in a - date with the time of 08:13:00.000. -

-
- the Date to round, if the current time will - be used - the new rounded date -
- - - Returns a date that is rounded to the next even multiple of the given - minute. -

- For example an input date with a time of 08:13:54, and an input - minute-base of 5 would result in a date with the time of 08:15:00. The - same input date with an input minute-base of 10 would result in a date - with the time of 08:20:00. But a date with the time 08:53:31 and an - input minute-base of 45 would result in 09:00:00, because the even-hour - is the next 'base' for 45-minute intervals. -

- -

- More examples: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Input TimeMinute-BaseResult Time
11:16:412011:20:00
11:36:412011:40:00
11:46:412012:00:00
11:26:413011:30:00
11:36:413012:00:00
11:16:411711:17:00
11:17:411711:34:00
11:52:411712:00:00
11:52:41511:55:00
11:57:41512:00:00
11:17:41012:00:00
11:17:41111:08:00
-

- -
- - the Date to round, if the current time will - be used - - - the base-minute to set the time on - - the new rounded date -
- - - Returns a date that is rounded to the next even multiple of the given - minute. -

- The rules for calculating the second are the same as those for - calculating the minute in the method - . -

-
- The date. - The second base. - -
- - - Returns a list of Dates that are the next fire times of a - . - The input trigger will be cloned before any work is done, so you need - not worry about its state being altered by this method. - - The trigger upon which to do the work - The calendar to apply to the trigger's schedule - The number of next fire times to produce - List of java.util.Date objects - - - - Returns a list of Dates that are the next fire times of a - that fall within the given date range. The input trigger will be cloned - before any work is done, so you need not worry about its state being - altered by this method. -

- NOTE: if this is a trigger that has previously fired within the given - date range, then firings which have already occured will not be listed - in the output List. -

-
- The trigger upon which to do the work - The calendar to apply to the trigger's schedule - The starting date at which to find fire times - The ending date at which to stop finding fire times - List of java.util.Date objects -
- - - Translate a date and time from a users timezone to the another - (probably server) timezone to assist in creating a simple trigger with - the right date and time. - - the date to translate - the original time-zone - the destination time-zone - the translated UTC date - - - - Gets the offset from UT for the given date in the given timezone, - taking into account daylight savings. - - the date that is the base for the offset - the time-zone to calculate to offset to - the offset - - - - This functions determines if the TimeZone uses daylight saving time - - TimeZone instance to validate - True or false depending if daylight savings time is used - - - - An exception that is thrown to indicate that a call to - failed without interrupting the Job. - - - James House - - - - Create a with the given message. - - - - - Create a with the given cause. - - - - - Initializes a new instance of the class. - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - The class name is null or is zero (0). - The info parameter is null. - -
-
+ + + + Quartz + + + + + Collection manipulation related utility methods. + + + + + Removes the specified item from list of items and returns + whether removal was success. + + The items to remove from. + The item to remove. + + + + + A hash based set. + + + + + Represents a collection ob objects that contains no duplicate elements. + + + + + Adds a new element to the Collection if it is not already present. + + The object to add to the collection. + Returns true if the object was added to the collection, otherwise false. + + + + Adds all the elements of the specified collection to the Set. + + Collection of objects to add. + true + + + + Returns the first item in the set. + + First object. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The whose elements are copied to the new list. + + is . + + + + Initializes a new instance of the class. + + The capacity. + + + + Unmodifiables the hash set. + + The collection. + + + + + Adds a new element to the ArrayList if it is not already present. + + Element to insert to the ArrayList. + Returns true if the new element was inserted, false otherwise. + + + + Adds all the elements of the specified collection that are not present to the list. + + Collection where the new elements will be added + Returns true if at least one element was added, false otherwise. + + + + Returns the first item in the set. + + First object. + + + + Returns a copy of the HashSet instance. + + Returns a shallow copy of the current HashSet. + + + + A sorted set. + + + + + Returns a portion of the list whose elements are greater than the limit object parameter. + + The start element of the portion to extract. + The portion of the collection whose elements are greater than the limit object parameter. + + + + SupportClass for the TreeSet class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The whose elements are copied to the new list. + + is . + + + + Initializes a new instance of the class. + + The c. + + + + Unmodifiables the tree set. + + The collection. + + + + + Adds a new element to the ArrayList if it is not already present and sorts the ArrayList. + + Element to insert to the ArrayList. + TRUE if the new element was inserted, FALSE otherwise. + + + + Adds all the elements of the specified collection that are not present to the list. + + Collection where the new elements will be added + Returns true if at least one element was added to the collection. + + + + Returns the first item in the set. + + First object. + + + + Determines whether an element is in the the current TreeSetSupport collection. The IComparer defined for + the current set will be used to make comparisons between the elements already inserted in the collection and + the item specified. + + The object to be locatet in the current collection. + true if item is found in the collection; otherwise, false. + + + + Returns a portion of the list whose elements are greater than the limit object parameter. + + The start element of the portion to extract. + The portion of the collection whose elements are greater than the limit object parameter. + + + + Gets the IComparator object used to sort this set. + + + + + Responsible for creating the instances of + to be used within the instance. + + + Although this interface looks a lot like an 'object pool', implementations + do not have to support the re-use of instances. If an implementation does + not wish to pool instances, then the + method would simply create a new instance, and the + method would do nothing. + + James House + Marko Lahma (.NET) + + + + Initialize the factory, providing a handle to the + that should be made available within the and + the s within it, and a handle to the + that the shell will use in its own + operations with the . + + + + + Called by the + to obtain instances of . + + + + + Called by the + to return instances of . + + + + + JobRunShell instances are responsible for providing the 'safe' environment + for s to run in, and for performing all of the work of + executing the , catching ANY thrown exceptions, updating + the with the 's completion code, + etc. +

+ A instance is created by a + on behalf of the which then runs the + shell in a thread from the configured when the + scheduler determines that a has been triggered. +

+
+ + + + + James House + Marko Lahma (.NET) +
+ + + This interface should be implemented by any class whose instances are intended + to be executed by a thread. + + + + + This method has to be implemented in order that starting of the thread causes the object's + run method to be called in that separately executing thread. + + + + + Create a JobRunShell instance with the given settings. + + A handle to the that produced + this . + The instance that should be made + available within the . + the that should be used by the + when making updates to the . + + + + Initializes the job execution context with given scheduler and bundle. + + The scheduler. + The bundle offired triggers. + + + + Requests the Shutdown. + + + + + This method has to be implemented in order that starting of the thread causes the object's + run method to be called in that separately executing thread. + + + + + Runs begin procedures on this instance. + + + + + Completes the execution. + + if set to true [successful execution]. + + + + Passivates this instance. + + + + + Completes the trigger retry loop. + + The trigger. + The job detail. + The inst code. + + + + + Vetoeds the job retry loop. + + The trigger. + The job detail. + The inst code. + + + + + This is the heart of Quartz, an indirect implementation of the + interface, containing methods to schedule s, + register instances, etc. + + + + + + James House + Marko Lahma (.NET) + + + + Starts this instance. + + + + + Standbies this instance. + + + + + Shutdowns this instance. + + + + + returns true if the given JobGroup + is paused + + The scheduling context. + + + + + + returns true if the given TriggerGroup + is paused + + + + + + + + Initializes the class. + + + + + Get the global + that has the given name. + + + + + + + Create a with the given configuration + properties. + + + + + + Bind the scheduler to remoting infrastructure. + + + + + Un-bind the scheduler from remoting infrastructure. + + + + + Adds an object that should be kept as reference to prevent + it from being garbage collected. + + The obj. + + + + Removes the object from garbae collection protected list. + + The obj. + + + + + Starts the 's threads that fire s. +

+ All s that have misfired will + be passed to the appropriate TriggerListener(s). +

+
+
+ + + Temporarily halts the 's firing of s. +

+ The scheduler is not destroyed, and can be re-started at any time. +

+
+
+ + + Halts the 's firing of s, + and cleans up all resources associated with the QuartzScheduler. + Equivalent to . +

+ The scheduler cannot be re-started. +

+
+
+ + + Halts the 's firing of s, + and cleans up all resources associated with the QuartzScheduler. +

+ The scheduler cannot be re-started. +

+
+ + if the scheduler will not allow this method + to return until all currently executing jobs have completed. + +
+ + + Validates the state. + + + + + Add the identified by the given + to the Scheduler, and + associate the given with it. +

+ If the given Trigger does not reference any , then it + will be set to reference the Job passed with it into this method. +

+
+
+ + + Schedule the given with the + identified by the 's settings. + + + + + Add the given to the Scheduler - with no associated + . The will be 'dormant' until + it is scheduled with a , or + is called for it. +

+ The must by definition be 'durable', if it is not, + SchedulerException will be thrown. +

+
+
+ + + Delete the identified from the Scheduler - and any + associated s. + + true if the Job was found and deleted. + + + + Remove the indicated from the + scheduler. + + + + + Remove (delete) the with the + given name, and store the new given one - which must be associated + with the same job. + + The scheduling context. + The name of the to be removed. + The group name of the to be removed. + The new to be stored. + + if a with the given + name and group was not found and removed from the store, otherwise + the first fire time of the newly scheduled trigger. + + + + + Creates a new positive random number + + The last random obtained + Returns a new positive random number + + + + Trigger the identified (Execute it now) - with a non-volatile trigger. + + + + + Trigger the identified (Execute it + now) - with a volatile trigger. + + + + + Pause the with the given name. + + + + + Pause all of the s in the given group. + + + + + Pause the with the given + name - by pausing all of its current s. + + + + + Pause all of the s in the + given group - by pausing all of their s. + + + + + Resume (un-pause) the with the given + name. +

+ If the missed one or more fire-times, then the + 's misfire instruction will be applied. +

+
+
+ + + Resume (un-pause) all of the s in the + given group. +

+ If any missed one or more fire-times, then the + 's misfire instruction will be applied. +

+
+
+ + + Gets the paused trigger groups. + + The the job scheduling context. + + + + + Resume (un-pause) the with + the given name. +

+ If any of the 's s missed one + or more fire-times, then the 's misfire + instruction will be applied. +

+
+
+ + + Resume (un-pause) all of the s + in the given group. +

+ If any of the s had s that + missed one or more fire-times, then the 's + misfire instruction will be applied. +

+
+
+ + + Pause all triggers - equivalent of calling + on every group. +

+ When is called (to un-pause), trigger misfire + instructions WILL be applied. +

+
+ + +
+ + + Resume (un-pause) all triggers - equivalent of calling + on every group. +

+ If any missed one or more fire-times, then the + 's misfire instruction will be applied. +

+
+ +
+ + + Get the names of all known groups. + + + + + Get the names of all the s in the + given group. + + + + + Get all s that are associated with the + identified . + + + + + Get the names of all known + groups. + + + + + Get the names of all the s in + the given group. + + + + + Get the for the + instance with the given name and group. + + + + + Get the instance with the given name and + group. + + + + + Get the current state of the identified . + + + + + + + + + Add (register) the given to the Scheduler. + + + + + Delete the identified from the Scheduler. + + true if the Calendar was found and deleted. + + + + Get the instance with the given name. + + + + + Get the names of all registered s. + + + + + Add the given to the + 'sglobal list. +

+ Listeners in the 'global' list receive notification of execution events + for ALL s. +

+
+
+ + + Add the given to the + 's list, of registered s. + + + + + Remove the given from the + 's list of global listeners. + + + true if the identifed listener was found in the list, and removed. + + + + + Remove the identifed from the 's + list of global listeners. + + + true if the identifed listener was found in the list, and removed. + + + + Remove the identifed from + the 's list of registered listeners. + + + true if the identifed listener was found in the list, and removed. + + + + + Get the non-global that has the given name. + + + + + Add the given to the + 'sglobal list. +

+ Listeners in the 'global' list receive notification of execution events + for ALL s. +

+
+
+ + + Add the given to the + 's list, of registered s. + + + + + Remove the given from + the 's list of global listeners. + + + true if the identifed listener was found in the list, and removed. + + + + + Remove the identifed from the 's + list of global listeners. + + + true if the identifed listener was found in the list, and removed + + + + Remove the identifed + from the 's list of registered listeners. + + + true if the identifed listener was found in the list, and removed. + + + + + Get the non-global + that has the given name. + + + + + Get the global that + has the given name. + + + + + + + Register the given with the + . + + + + + Remove the given from the + . + + + true if the identifed listener was found in the list, and removed. + + + + + Notifies the job store job complete. + + The job scheduling context. + The trigger. + The detail. + The instruction code. + + + + Notifies the scheduler thread. + + + + + Notifies the trigger listeners about fired trigger. + + The job execution context. + + + + + Notifies the trigger listeners about misfired trigger. + + The trigger. + + + + Notifies the trigger listeners of completion. + + The job executution context. + The instruction code to report to triggers. + + + + Notifies the job listeners about job to be executed. + + The jec. + + + + Notifies the job listeners that job exucution was vetoed. + + The job execution context. + + + + Notifies the job listeners that job was executed. + + The jec. + The je. + + + + Notifies the scheduler listeners about scheduler error. + + The MSG. + The se. + + + + Notifies the scheduler listeners about job that was scheduled. + + The trigger. + + + + Notifies the scheduler listeners about job that was unscheduled. + + Name of the trigger. + The trigger group. + + + + Notifies the scheduler listeners about finalized trigger. + + The trigger. + + + + Notifies the scheduler listeners about paused trigger. + + The name. + The group. + + + + Notifies the scheduler listeners resumed trigger. + + The name. + The group. + + + + Notifies the scheduler listeners about paused job. + + The name. + The group. + + + + Notifies the scheduler listeners about resumed job. + + The name. + The group. + + + + Notifies the scheduler listeners about scheduler shutdown. + + + + + Interrupt all instances of the identified InterruptableJob. + + + + + Obtains a lifetime service object to control the lifetime policy for this instance. + + + + + Gets the version of the Quartz Scheduler. + + The version. + + + + Gets the version major. + + The version major. + + + + Gets the version minor. + + The version minor. + + + + Gets the version iteration. + + The version iteration. + + + + Gets the scheduler signaler. + + The scheduler signaler. + + + + Returns the name of the . + + + + + Returns the instance Id of the . + + + + + Returns the of the . + + + + + Gets or sets a value indicating whether to signal on scheduling change. + + + true if schduler should signal on scheduling change; otherwise, false. + + + + + Reports whether the is paused. + + + + + Gets the job store class. + + The job store class. + + + + Gets the thread pool class. + + The thread pool class. + + + + Gets the size of the thread pool. + + The size of the thread pool. + + + + Reports whether the has been Shutdown. + + + + + Return a list of objects that + represent all currently executing Jobs in this Scheduler instance. +

+ This method is not cluster aware. That is, it will only return Jobs + currently executing in this Scheduler instance, not across the entire + cluster. +

+

+ Note that the list returned is an 'instantaneous' snap-shot, and that as + soon as it's returned, the true list of executing jobs may be different. +

+
+
+ + + Get a List containing all of the + s in the 'sglobal list. + + + + + Get a Set containing the names of all the non-global + s registered with the . + + + + + Get a list containing all of the + s in the 'sglobal list. + + + + + Get a Set containing the names of all the non-global + s registered with the . + + + + + Get a List containing all of the + s registered with the . + + + + + Gets or sets the job factory. + + The job factory. + + + + Gets the running since. + + The running since. + + + + Gets the number of jobs executed. + + The number of jobs executed. + + + + Gets a value indicating whether this scheduler supports persistence. + + true if supports persistence; otherwise, false. + + + + Helper class to start scheduler in a delayed fashion. + + + + + ErrorLogger - Scheduler Listener Class + + + + + A helpful abstract base class for implementors of + . + + + The methods in this class are empty so you only need to override the + subset for the events you care about. + + + + + + The interface to be implemented by classes that want to be informed of major + events. + + + + + James House + + + + Called by the when a + is scheduled. + + + + + Called by the when a + is unscheduled. + + + + + Called by the when a + has reached the condition in which it will never fire again. + + + + + Called by the when a + or group of s has been paused. +

+ If a group was paused, then the parameter + will be null. +

+
+ Name of the trigger. + The trigger group. +
+ + + Called by the when a + or group of s has been un-paused. +

+ If a group was resumed, then the parameter + will be null. +

+
+ Name of the trigger. + The trigger group. +
+ + + Called by the when a + or group of s has been paused. +

+ If a group was paused, then the parameter will be + null. If all jobs were paused, then both parameters will be null. +

+
+ Name of the job. + The job group. +
+ + + Called by the when a + or group of s has been un-paused. +

+ If a group was resumed, then the parameter will + be null. If all jobs were paused, then both parameters will be null. +

+
+ The job group. +
+ + + Called by the when a serious error has + occured within the scheduler - such as repeated failures in the , + or the inability to instantiate a instance when its + has fired. +

+ The property of the given SchedulerException + can be used to determine more specific information about the type of + error that was encountered. +

+
+
+ + + Called by the to inform the listener + that it has Shutdown. + + + + + Get the for this + type's category. This should be used by subclasses for logging. + + + + + The interface to be implemented by classes that want to be informed when a + executes. In general, applications that use a + will not have use for this mechanism. + + + + + + + James House + + + + Called by the when a + is about to be executed (an associated + has occured). +

+ This method will not be invoked if the execution of the Job was vetoed + by a . +

+
+ +
+ + + Called by the when a + was about to be executed (an associated + has occured), but a vetoed it's + execution. + + + + + + Called by the after a + has been executed, and be for the associated 's + method has been called. + + + + + Get the name of the . + + + + + Contains all of the resources (,, + etc.) necessary to create a instance. + + + James House + Marko Lahma (.NET) + + + + Gets the unique identifier. + + Name of the scheduler. + The scheduler instance id. + + + + + Gets the unique identifier. + + + + + + Add the given for the + to use. This method expects the plugin's + "initialize" method to be invoked externally (either before or after + this method is called). + + + + + + Get or set the name for the . + + + if name is null or empty. + + + + + Get or set the instance Id for the . + + + if name is null or empty. + + + + + Get or set the name for the . + + + if name is null or empty. + + + + + Get or set the for the + to use. + + + if threadPool is null. + + + + + Get or set the for the + to use. + + + if jobStore is null. + + + + + Get or set the for the + to use. + + + if jobRunShellFactory is null. + + + + + Get the of all + s for the + to use. + + + + + + Gets or sets a value indicating whether to make scheduler thread daemon. + + + true if scheduler should be thread daemon; otherwise, false. + + + + + Gets or sets the scheduler exporter. + + The scheduler exporter. + + + + The thread responsible for performing the work of firing + s that are registered with the . + + + + + James House + Marko Lahma (.NET) + + + + Support class used to handle threads + + + + + The instance of System.Threading.Thread + + + + + Initializes a new instance of the QuartzThread class + + + + + Initializes a new instance of the Thread class. + + The name of the thread + + + + Initializes a new instance of the Thread class. + + A ThreadStart delegate that references the methods to be invoked when this thread begins executing + + + + Initializes a new instance of the Thread class. + + A ThreadStart delegate that references the methods to be invoked when this thread begins executing + The name of the thread + + + + This method has no functionality unless the method is overridden + + + + + Causes the operating system to change the state of the current thread instance to ThreadState.Running + + + + + Interrupts a thread that is in the WaitSleepJoin thread state + + + + + Blocks the calling thread until a thread terminates + + + + + Blocks the calling thread until a thread terminates or the specified time elapses + + Time of wait in milliseconds + + + + Blocks the calling thread until a thread terminates or the specified time elapses + + Time of wait in milliseconds + Time of wait in nanoseconds + + + + Resumes a thread that has been suspended + + + + + Raises a ThreadAbortException in the thread on which it is invoked, + to begin the process of terminating the thread. Calling this method + usually terminates the thread + + + + + Raises a ThreadAbortException in the thread on which it is invoked, + to begin the process of terminating the thread while also providing + exception information about the thread termination. + Calling this method usually terminates the thread. + + An object that contains application-specific information, such as state, which can be used by the thread being aborted + + + + Suspends the thread, if the thread is already suspended it has no effect + + + + + Obtain a string that represents the current object + + A string that represents the current object + + + + Gets the currently running thread + + The currently running thread + + + + Gets the current thread instance + + + + + Gets or sets the name of the thread + + + + + Gets or sets a value indicating the scheduling priority of a thread + + + + + Gets a value indicating the execution status of the current thread + + + + + Gets or sets a value indicating whether or not a thread is a background thread. + + + + + Gets the randomized idle wait time. + + The randomized idle wait time. + + + + Construct a new for the given + as a non-daemon + with normal priority. + + + + + Construct a new for the given + as a with the given + attributes. + + + + + Signals the main processing loop to pause at the next possible point. + + + + + Signals the main processing loop to pause at the next possible point. + + + + + Signals the main processing loop that a change in scheduling has been + made - in order to interrupt any sleeping that may be occuring while + waiting for the fire time to arrive. + + + the time when the newly scheduled trigger + will fire. If this method is being called do to some other even (rather + than scheduling a trigger), the caller should pass null. + + + + + The main processing loop of the . + + + + + Trigger retry loop that is executed on error condition. + + The bndle. + + + + Releases the trigger retry loop. + + The trigger. + + + + Gets the log. + + The log. + + + + Sets the idle wait time. + + The idle wait time. + + + + Gets a value indicating whether this is paused. + + true if paused; otherwise, false. + + + + Gets or sets the db failure retry interval. + + The db failure retry interval. + + + + An interface to be used by instances in order to + communicate signals back to the . + + James House + Marko Lahma (.NET) + + + + An interface to be used by instances in order to + communicate signals back to the . + + James House + + + + Notifies the scheduler about misfired trigger. + + The trigger that misfired. + + + + Notifies the scheduler about finalized trigger. + + The trigger that has finalized. + + + + Signals the scheduling change. + + + + + Notifies the scheduler about misfired trigger. + + The trigger that misfired. + + + + Notifies the scheduler about finalized trigger. + + The trigger that has finalized. + + + + Signals the scheduling change. + + + + + An object used to pass information about the 'client' to the . + + + James House + Marko Lahma (.NET) + + + + get the instanceId in the cluster. + +

+ Set the instanceId. +

+
+
+ + + Metadata information about specific ADO.NET driver library. Metadata is used to + create correct types of object instances to interact with the underlying + database. + + + + + Initializes this instance. Parses information and initializes startup + values. + + + + + Gets the name of the parameter which includes the parameter prefix for this + database. + + Name of the parameter. + + + Gets or sets the name of the assembly that holds the connection library. + The name of the assembly. + + + + Gets or sets the name of the product. + + The name of the product. + + + + Gets or sets the type of the connection. + + The type of the connection. + + + + Gets or sets the type of the command. + + The type of the command. + + + + Gets or sets the type of the parameter. + + The type of the parameter. + + + + Gets the type of the command builder. + + The type of the command builder. + + + Gets the command builder's derive parameters method. + The command builder derive parameters method. + + + + Gets or sets the parameter name prefix. + + The parameter name prefix. + + + + Gets or sets the type of the exception that is thrown when using driver + library. + + The type of the exception. + + + + Gets or sets a value indicating whether parameters are bind by name when using + ADO.NET parameters. + + true if parameters are bind by name; otherwise, false. + + + Gets or sets the type of the database parameters. + The type of the parameter db. + + + + Gets the parameter db type property. + + The parameter db type property. + + + + Gets the parameter is nullable property. + + The parameter is nullable property. + + + + Gets or sets the type of the db binary column. This is a string representation of + Enum element because this information is database driver specific. + + The type of the db binary. + + + Gets the type of the db binary. + The type of the db binary. + + + + Sets the name of the parameter db type property. + + The name of the parameter db type property. + + + + Gets or sets a value indicating whether [use parameter name prefix in parameter collection]. + + + true if [use parameter name prefix in parameter collection]; otherwise, false. + + + + + + + + + + + + + + + Returns a new command object for executing SQL statments/Stored Procedures + against the database. + + An new + + + + Returns a new instance of the providers CommandBuilder class. + + In .NET 1.1 there was no common base class or interface + for command builders, hence the return signature is object to + be portable (but more loosely typed) across .NET 1.1/2.0 + A new Command Builder + + + + Returns a new connection object to communicate with the database. + + A new + + + + Returns a new parameter object for binding values to parameter + placeholders in SQL statements or Stored Procedure variables. + + A new + + + + Shutdowns this instance. + + + + + Connection string used to create connections. + + + + + Registers DB metadata information for given provider name. + + + + + + + Initializes a new instance of the class. + + Name of the db provider. + The connection string. + + + + Returns a new command object for executing SQL statments/Stored Procedures + against the database. + + An new + + + + Returns a new instance of the providers CommandBuilder class. + + A new Command Builder + In .NET 1.1 there was no common base class or interface + for command builders, hence the return signature is object to + be portable (but more loosely typed) across .NET 1.1/2.0 + + + + Returns a new connection object to communicate with the database. + + A new + + + + Returns a new parameter object for binding values to parameter + placeholders in SQL statements or Stored Procedure variables. + + A new + + + + Shutdowns this instance. + + + + + Connection string used to create connections. + + + + + + Gets the metadata. + + The metadata. + + + + Summary description for DbProviderFactory. + + + + + This interface can be implemented by any + class that needs to use the constants contained herein. + + Jeffrey Wescott + James House + + + @deprecated Whether a trigger has misfired is no longer a state, but + rather now identified dynamically by whether the trigger's next fire + time is more than the misfire threshold time in the past. + + + + This class contains utility functions for use in all delegate classes. + + Jeffrey Wescott + + + + Replace the table prefix in a query by replacing any occurrences of + "{0}" with the table prefix. + + The unsubstitued query + The table prefix + The query, with proper table prefix substituted + + + + Obtain a unique key for a given job. + + The job name + The group containing the job + + A unique key + + + + Obtain a unique key for a given trigger. + + The trigger name + The group containing the trigger + A unique key + + + + Base class for database based lock handlers for providing thread/resource locking + in order to protect resources from being altered by multiple threads at the + same time. + + + + + This class extends + to include the query string constants in use by the + class. + + Jeffrey Wescott + + + + An interface for providing thread/resource locking in order to protect + resources from being altered by multiple threads at the same time. + + James House + + + + Grants a lock on the identified resource to the calling thread (blocking + until it is available). + + true if the lock was obtained. + + + + Release the lock on the identified resource if it is held by the calling + thread. + + + + + Determine whether the calling thread owns a lock on the identified + resource. + + + + + Whether this Semaphore implementation requires a database connection for + its lock management operations. + + + + + + + + Interface for Quartz objects that need to know what the table prefix of + the tables used by a ADO.NET JobStore is. + + + + + Initializes a new instance of the class. + + The table prefix. + The SQL. + The default SQL. + The db provider. + + + + Execute the SQL that will lock the proper database row. + + + + + + + + Grants a lock on the identified resource to the calling thread (blocking + until it is available). + + + + + true if the lock was obtained. + + + + Release the lock on the identified resource if it is held by the calling + thread. + + + + + + + Determine whether the calling thread owns a lock on the identified + resource. + + + + + + + + Gets or sets the lock owners. + + The lock owners. + + + + Gets the log. + + The log. + + + + This Semaphore implementation does use the database. + + + + + Gets or sets the table prefix. + + The table prefix. + + + + A FirebirdDelegate specific driver delegate. + + Marko Lahma + + + + This is meant to be an abstract base class for most, if not all, + implementations. Subclasses should override only those methods that need + special handling for the DBMS driver in question. + + Jeffrey Wescott + James House + Marko Lahma (.NET) + + + + This is the base interface for all driver delegate classes. + + +

+ This interface is very similar to the + interface except each method has an additional + parameter. +

+

+ Unless a database driver has some extremely-DB-specific + requirements, any IDriverDelegate implementation classes should extend the + class. +

+
+ Jeffrey Wescott + James House + Marko Lahma (.NET) +
+ + + Update all triggers having one of the two given states, to the given new + state. + + The DB Connection + The new state for the triggers + The first old state to update + The second old state to update + Number of rows updated + + + + Get the names of all of the triggers that have misfired - according to + the given timestamp. + + The DB Connection + The timestamp. + An array of objects + + + + Get the names of all of the triggers in the given state that have + misfired - according to the given timestamp. + + The DB Connection + The state. + The time stamp. + An array of objects + + + + Get the names of all of the triggers in the given group and state that + have misfired - according to the given timestamp. + + The DB Connection + Name of the group. + The state. + The timestamp. + An array of objects + + + + Select all of the triggers for jobs that are requesting recovery. The + returned trigger objects will have unique "recoverXXX" trigger names and + will be in the trigger group. + + + In order to preserve the ordering of the triggers, the fire time will be + set from the ColumnFiredTime column in the TableFiredTriggers + table. The caller is responsible for calling + on each returned trigger. It is also up to the caller to insert the + returned triggers to ensure that they are fired. + + The DB Connection + An array of objects + + + + Delete all fired triggers. + + The DB Connection + The number of rows deleted + + + + Delete all fired triggers of the given instance. + + The DB Connection + The instance id. + The number of rows deleted + + + + Delete all volatile fired triggers. + + The DB Connection + The number of rows deleted + + + + Get the names of all of the triggers that are volatile. + + The DB Connection + An array of see cref="Key" /> objects. + + + + Get the names of all of the jobs that are volatile. + + The DB Connection + An array of objects. + + + + Insert the job detail record. + + The DB Connection + The job to insert. + Number of rows inserted. + + + + Update the job detail record. + + The DB Connection. + The job to update. + Number of rows updated. + + +

+ Get the names of all of the triggers associated with the given job. +

+ +
+ The DB Connection + The job name + The job group +
+ + + Delete all job listeners for the given job. + + The DB Connection + The name of the job + The group containing the job + The number of rows deleted + + + + Delete the job detail record for the given job. + + The DB Connection + the name of the job + Name of the group. + the number of rows deleted + + + + Check whether or not the given job is stateful. + + The DB Connection + The name of the job + The group containing the job + true if the job exists and is stateful, false otherwise + + + + Check whether or not the given job exists. + + The DB Connection + Name of the job. + Name of the group. + true if the job exists, false otherwise + + + + Update the job data map for the given job. + + The DB Connection + The job. + the number of rows updated + + + + Associate a listener with a job. + + The DB Connection + The job to associate with the listener. + The listener to insert. + The number of rows inserted. + + +

+ Get all of the listeners for a given job. +

+ +
+ The DB Connection + The job name whose listeners are wanted + The group containing the job + array of listener names +
+ + + Select the JobDetail object for a given job name / group name. + + The DB Connection + The job name whose listeners are wanted + The group containing the job + The class load helper. + The populated JobDetail object + + + + Select the total number of jobs stored. + + The DB Connection + the total number of jobs stored + + + + Select all of the job group names that are stored. + + The DB Connection. + an array of group names + + + + Select all of the jobs contained in a given group. + + The DB Connection + The group containing the jobs + an array of job names + + + + Insert the base trigger data. + + The DB Connection + The trigger to insert. + The state that the trigger should be stored in. + The job detail. + The number of rows inserted + + + + Insert the simple trigger data. + + The DB Connection + The trigger to insert + The number of rows inserted + + + + Insert the blob trigger data. + + The DB Connection + The trigger to insert + The number of rows inserted + + + + Insert the cron trigger data. + + the DB Connection + The trigger. + the number of rows inserted + + + + Update the base trigger data. + + the DB Connection + The trigger. + The state. + The job detail. + the number of rows updated + + + + Update the simple trigger data. + + the DB Connection + The trigger. + the number of rows updated + + + + Update the cron trigger data. + + the DB Connection + The trigger. + the number of rows updated + + + + Update the blob trigger data. + + the DB Connection + The trigger. + the number of rows updated + + + + Check whether or not a trigger exists. + + the DB Connection + Name of the trigger. + Name of the group. + the number of rows updated + + + + Update the state for a given trigger. + + The DB Connection + The name of the trigger. + The group containing the trigger. + The new state for the trigger. + the number of rows updated + + + + Update the given trigger to the given new state, if it is in the given + old state. + + The DB connection + The name of the trigger. + The group containing the trigger + The new state for the trigger + The old state the trigger must be in + int the number of rows updated + + + + Update the given trigger to the given new state, if it is one of the + given old states. + + The DB connection + The name of the trigger + The group containing the trigger + The new state for the trigger + One of the old state the trigger must be in + One of the old state the trigger must be in + One of the old state the trigger must be in + + int the number of rows updated + + SQLException + + + + Update the all triggers to the given new state, if they are in one of + the given old states AND its next fire time is before the given time. + + The DB connection + The new state for the trigger + One of the old state the trigger must be in + One of the old state the trigger must be in + The time before which the trigger's next fire time must be + int the number of rows updated + + + + Update all triggers in the given group to the given new state, if they + are in one of the given old states. + + The DB connection + The group containing the trigger + The new state for the trigger + One of the old state the trigger must be in + One of the old state the trigger must be in + One of the old state the trigger must be in + The number of rows updated + + + + Update all of the triggers of the given group to the given new state, if + they are in the given old state. + + The DB connection + The group containing the triggers + The new state for the trigger group + The old state the triggers must be in. + int the number of rows updated + + + + Update the states of all triggers associated with the given job. + + The DB Connection + The name of the job. + The group containing the job. + The new state for the triggers. + The number of rows updated + + + + Update the states of any triggers associated with the given job, that + are the given current state. + + The DB Connection + The name of the job + The group containing the job + The new state for the triggers + The old state of the triggers + the number of rows updated + + + + Delete all of the listeners associated with a given trigger. + + The DB Connection + The name of the trigger whose listeners will be deleted + The name of the group containing the trigger + the number of rows deleted + + + + Associate a listener with the given trigger. + + The DB Connectio + The trigger + The name of the listener to associate with the trigger + the number of rows inserted + + + + Select the listeners associated with a given trigger. + + The DB Connection + The name of the trigger + The group containing the trigger + array of trigger listener names + + + + Delete the simple trigger data for a trigger. + + The DB Connection + The name of the trigger + The group containing the trigger + The number of rows deleted + + + + Delete the BLOB trigger data for a trigger. + + The DB Connection + The name of the trigger + The group containing the trigger + The number of rows deleted + + + + Delete the cron trigger data for a trigger. + + The DB Connection + The name of the trigger + The group containing the trigger + the number of rows deleted + + + + Delete the base trigger data for a trigger. + + The DB Connection + The name of the trigger + The group containing the trigger + the number of rows deleted + + + + Select the number of triggers associated with a given job. + + The DB Connection + The name of the job + The group containing the job + the number of triggers for the given job + + + + Select the job to which the trigger is associated. + + The DB Connection + The name of the trigger + The group containing the trigger + The load helper. + + The object associated with the given trigger + + + + + Select the stateful jobs which are referenced by triggers in the given + trigger group. + + The DB Connection + The trigger group. + a List of Keys to jobs. + + + + Select the triggers for a job> + + The DB Connection + The name of the trigger + The group containing the trigger + an array of objects associated with a given job. + + + + Select the triggers for a calendar + + The DB Connection. + Name of the calendar. + + An array of objects associated with a given job. + + + + + Select a trigger. + + The DB Connection. + The name of the trigger. + The group containing the trigger. + The object. + + + + + Select a trigger's JobDataMap. + + The DB Connection. + The name of the trigger. + The group containing the trigger. + The of the Trigger, never null, but possibly empty. + + + + Select a trigger's state value. + + The DB Connection. + The name of the trigger. + The group containing the trigger. + The object. + + + + Select a triggers status (state and next fire time). + + The DB Connection. + The name of the trigger. + The group containing the trigger. + A object, or null + + + + Select the total number of triggers stored. + + The DB Connection. + The total number of triggers stored. + + + + Select all of the trigger group names that are stored. + + The DB Connection. + An array of group names. + + + + Select all of the triggers contained in a given group. + + The DB Connection. + The group containing the triggers. + An array of trigger names. + + + + Select all of the triggers in a given state. + + The DB Connection. + The state the triggers must be in. + An array of trigger s. + + + + Inserts the paused trigger group. + + The conn. + Name of the group. + + + + + Deletes the paused trigger group. + + The conn. + Name of the group. + + + + + Deletes all paused trigger groups. + + The conn. + + + + + Determines whether the specified trigger group is paused. + + The conn. + Name of the group. + + true if trigger group is paused; otherwise, false. + + + + + Selects the paused trigger groups. + + The DB Connection. + + + + + Determines whether given trigger group already exists. + + The conn. + Name of the group. + + true if trigger group exists; otherwise, false. + + + + + Insert a new calendar. + + The DB Connection. + The name for the new calendar. + The calendar. + The number of rows inserted. + + + + Update a calendar. + + The DB Connection. + The name for the new calendar. + The calendar. + The number of rows updated. + + + + Check whether or not a calendar exists. + + The DB Connection. + The name of the calendar. + true if the trigger exists, false otherwise. + + + + Select a calendar. + + The DB Connection. + The name of the calendar. + The Calendar. + + + + Check whether or not a calendar is referenced by any triggers. + + The DB Connection. + The name of the calendar. + true if any triggers reference the calendar, false otherwise + + + + Delete a calendar. + + The DB Connection + The name of the trigger. + The number of rows deleted. + + + + Select the total number of calendars stored. + + The DB Connection + The total number of calendars stored. + + + + Select all of the stored calendars. + + The DB Connection + An array of calendar names. + + + + Select the trigger that will be fired at the given fire time. + + The DB Connection + The time that the trigger will be fired. + + A representing the + trigger that will be fired at the given fire time, or null if no + trigger will be fired at that time + + + + + Insert a fired trigger. + + The DB Connection + The trigger. + The state that the trigger should be stored in. + The job detail. + The number of rows inserted. + + + + Select the states of all fired-trigger records for a given trigger, or + trigger group if trigger name is . + + The DB Connection + Name of the trigger. + Name of the group. + A list of FiredTriggerRecord objects. + + + + Select the states of all fired-trigger records for a given job, or job + group if job name is . + + The DB Connection + Name of the job. + Name of the group. + A List of FiredTriggerRecord objects. + + + + Select the states of all fired-trigger records for a given scheduler + instance. + + The DB Connection + Name of the instance. + A list of FiredTriggerRecord objects. + + + + Delete a fired trigger. + + The DB Connection + The fired trigger entry to delete. + The number of rows deleted. + + + + Get the number instances of the identified job currently executing. + + The DB Connection + Name of the job. + The job group. + + The number instances of the identified job currently executing. + + + + + Insert a scheduler-instance state record. + + The DB Connection + The instance id. + The check in time. + The interval. + The number of inserted rows. + + + + Delete a scheduler-instance state record. + + The DB Connection + The instance id. + The number of deleted rows. + + + + Update a scheduler-instance state record. + + The DB Connection + The instance id. + The check in time. + The number of updated rows. + + + + A List of all current s. +

+ If instanceId is not null, then only the record for the identified + instance will be returned. +

+
+ The DB Connection + The instance id. + +
+ + + Select the next trigger which will fire to fire between the two given timestamps + in ascending order of fire time, and then descending by priority. + + The conn. + highest value of of the triggers (exclusive) + highest value of of the triggers (inclusive) + A (never null, possibly empty) list of the identifiers (Key objects) of the next triggers to be fired. + + + + Select the distinct instance names of all fired-trigger records. + + + This is useful when trying to identify orphaned fired triggers (a + fired trigger without a scheduler state record.) + + The conn. + + + + + Counts the misfired triggers in states. + + The conn. + The state1. + The state2. + The ts. + + + + + Selects the misfired triggers in states. + + The conn. + The state1. + The state2. + The ts. + The count. + The result list. + + + + + Create new StdAdoDelegate instance. + + the logger to use during execution + the prefix of all table names + The instance id. + The db provider. + + + + Create new StdAdoDelegate instance. + + the logger to use during execution + the prefix of all table names + The instance id. + The db provider. + if set to true [use properties]. + + + + Insert the job detail record. + + the DB Connection + the new state for the triggers + the first old state to update + the second old state to update + number of rows updated + + + + Get the names of all of the triggers that have misfired. + + the DB Connection + The ts. + an array of objects + + + + Select all of the triggers in a given state. + + The DB Connection + The state the triggers must be in + an array of trigger s + + + + Get the names of all of the triggers in the given state that have + misfired - according to the given timestamp. + + The DB Connection + The state. + The time stamp. + An array of objects + + + + Get the names of all of the triggers in the given states that have + misfired - according to the given timestamp. No more than count will + be returned. + + The conn. + The state1. + The state2. + The ts. + The most misfired triggers to return, negative for all + + Output parameter. A List of objects. Must not be null + + Whether there are more misfired triggers left to find beyond the given count. + + + + Get the number of triggers in the given states that have + misfired - according to the given timestamp. + + + + + + + + + + Get the names of all of the triggers in the given group and state that + have misfired. + + The DB Connection + Name of the group. + The state. + The timestamp. + an array of objects + + + + Select all of the triggers for jobs that are requesting recovery. The + returned trigger objects will have unique "recoverXXX" trigger names and + will be in the + trigger group. + + + In order to preserve the ordering of the triggers, the fire time will be + set from the ColumnFiredTime column in the TableFiredTriggers + table. The caller is responsible for calling + on each returned trigger. It is also up to the caller to insert the + returned triggers to ensure that they are fired. + + The DB Connection + an array of objects + + + + Delete all fired triggers. + + The DB Connection. + The number of rows deleted. + + + + Delete all fired triggers of the given instance. + + The DB Connection + The instance id. + The number of rows deleted + + + + Insert the job detail record. + + The DB Connection. + The job to insert. + Number of rows inserted. + + + + Gets the db presentation for boolean value. Subclasses can overwrite this behaviour. + + Value to map to database. + + + + + Update the job detail record. + + The DB Connection. + The job to update. + Number of rows updated. + + + + Get the names of all of the triggers associated with the given job. + + The DB Connection. + The name of the job. + The group containing the job. + An array of objects + + + + Delete all job listeners for the given job. + + The DB Connection. + The name of the job. + The group containing the job. + The number of rows deleted. + + + + Delete the job detail record for the given job. + + the DB Connection + the name of the job + the group containing the job + the number of rows deleted + + + + Check whether or not the given job is stateful. + + the DB Connection + the name of the job + the group containing the job + + true if the job exists and is stateful, false otherwise + + + + + Check whether or not the given job exists. + + the DB Connection + the name of the job + the group containing the job + true if the job exists, false otherwise + + + + Update the job data map for the given job. + + The conn. + the job to update + the number of rows updated + + + + Associate a listener with a job. + + The DB Connection. + The job to associate with the listener. + The listener to insert. + The number of rows inserted. + + + + Get all of the listeners for a given job. + + The DB Connection. + The job name whose listeners are wanted. + The group containing the job. + Array of listener names. + + + + Select the JobDetail object for a given job name / group name. + + The DB Connection. + The job name whose listeners are wanted. + The group containing the job. + The load helper. + The populated JobDetail object. + + + build Map from java.util.Properties encoding. + + + + Select the total number of jobs stored. + + The DB Connection. + The total number of jobs stored. + + + + Select all of the job group names that are stored. + + The DB Connection. + An array of group names. + + + + Select all of the jobs contained in a given group. + + The DB Connection. + The group containing the jobs. + An array of job names. + + + + Insert the base trigger data. + + the DB Connection + the trigger to insert + the state that the trigger should be stored in + The job detail. + the number of rows inserted + + + + Insert the simple trigger data. + + The DB Connection. + The trigger to insert. + The number of rows inserted. + + + + Insert the cron trigger data. + + the DB Connection + the trigger to insert + the number of rows inserted + + + + Insert the blob trigger data. + + The DB Connection. + The trigger to insert. + The number of rows inserted. + + + + Update the base trigger data. + + The DB Connection. + The trigger to insert. + The state that the trigger should be stored in. + The job detail. + The number of rows updated. + + + + Update the simple trigger data. + + The DB Connection. + The trigger to insert. + The number of rows updated. + + + + Update the cron trigger data. + + The DB Connection. + The trigger to insert. + The number of rows updated. + + + + Update the blob trigger data. + + The DB Connection. + The trigger to insert. + The number of rows updated. + + + + Check whether or not a trigger exists. + + The DB Connection. + The name of the trigger. + The group containing the trigger. + true if the trigger exists, false otherwise + + + + Update the state for a given trigger. + + The DB Connection. + The name of the trigger. + The group containing the trigger. + The new state for the trigger. + The number of rows updated. + + + + Update the given trigger to the given new state, if it is one of the + given old states. + + The DB connection. + The name of the trigger. + The group containing the trigger. + The new state for the trigger. + One of the old state the trigger must be in. + One of the old state the trigger must be in. + One of the old state the trigger must be in. + The number of rows updated. + + + + Update the all triggers to the given new state, if they are in one of + the given old states AND its next fire time is before the given time. + + The DB connection + The new state for the trigger + One of the old state the trigger must be in + One of the old state the trigger must be in + The time before which the trigger's next fire time must be + int the number of rows updated + + + + Update all triggers in the given group to the given new state, if they + are in one of the given old states. + + The DB connection. + The group containing the trigger. + The new state for the trigger. + One of the old state the trigger must be in. + One of the old state the trigger must be in. + One of the old state the trigger must be in. + The number of rows updated. + + + + Update the given trigger to the given new state, if it is in the given + old state. + + the DB connection + the name of the trigger + the group containing the trigger + the new state for the trigger + the old state the trigger must be in + int the number of rows updated + + + + Update all of the triggers of the given group to the given new state, if + they are in the given old state. + + the DB connection + the group containing the triggers + the new state for the trigger group + the old state the triggers must be in + int the number of rows updated + + + + Update the states of all triggers associated with the given job. + + the DB Connection + the name of the job + the group containing the job + the new state for the triggers + the number of rows updated + + + + Updates the state of the trigger states for job from other. + + The conn. + Name of the job. + Name of the group. + The state. + The old state. + + + + + Delete all of the listeners associated with a given trigger. + + the DB Connection + the name of the trigger whose listeners will be deleted + the name of the group containing the trigger + the number of rows deleted + + + + Associate a listener with the given trigger. + + the DB Connection + the trigger + the name of the listener to associate with the trigger + the number of rows inserted + + + + Select the listeners associated with a given trigger. + + the DB Connection + the name of the trigger + the group containing the trigger + + array of trigger listener names + + + + + Delete the simple trigger data for a trigger. + + the DB Connection + the name of the trigger + the group containing the trigger + the number of rows deleted + + + + Delete the cron trigger data for a trigger. + + the DB Connection + the name of the trigger + the group containing the trigger + the number of rows deleted + + + + Delete the cron trigger data for a trigger. + + the DB Connection + the name of the trigger + the group containing the trigger + the number of rows deleted + + + + Delete the base trigger data for a trigger. + + the DB Connection + the name of the trigger + the group containing the trigger + the number of rows deleted + + + + Select the number of triggers associated with a given job. + + the DB Connection + the name of the job + the group containing the job + the number of triggers for the given job + + + + Select the job to which the trigger is associated. + + the DB Connection + the name of the trigger + the group containing the trigger + The load helper. + The object associated with the given trigger + + + + Select the triggers for a job + + the DB Connection + the name of the trigger + the group containing the trigger + + an array of objects + associated with a given job. + + + + + Select the triggers for a calendar + + The DB Connection. + Name of the calendar. + + An array of objects associated with a given job. + + + + + Selects the stateful jobs of trigger group. + + The database connection. + Name of the group. + + + + + Select a trigger. + + the DB Connection + the name of the trigger + the group containing the trigger + The object + + + + Select a trigger's JobDataMap. + + the DB Connection + the name of the trigger + the group containing the trigger + The of the Trigger, never null, but possibly empty. + + + + Select a trigger's state value. + + the DB Connection + the name of the trigger + the group containing the trigger + The object + + + + Select a trigger status (state and next fire time). + + the DB Connection + the name of the trigger + the group containing the trigger + + a object, or null + + + + + Select the total number of triggers stored. + + the DB Connection + the total number of triggers stored + + + + Select all of the trigger group names that are stored. + + the DB Connection + + an array of group names + + + + + Select all of the triggers contained in a given group. + + the DB Connection + the group containing the triggers + + an array of trigger names + + + + + Inserts the paused trigger group. + + The conn. + Name of the group. + + + + + Deletes the paused trigger group. + + The conn. + Name of the group. + + + + + Deletes all paused trigger groups. + + The conn. + + + + + Determines whether the specified trigger group is paused. + + The conn. + Name of the group. + + true if trigger group is paused; otherwise, false. + + + + + Determines whether given trigger group already exists. + + The conn. + Name of the group. + + true if trigger group exists; otherwise, false. + + + + + Insert a new calendar. + + the DB Connection + The name for the new calendar. + The calendar. + the number of rows inserted + IOException + + + + Update a calendar. + + the DB Connection + The name for the new calendar. + The calendar. + the number of rows updated + IOException + + + + Check whether or not a calendar exists. + + the DB Connection + The name of the calendar. + + true if the trigger exists, false otherwise + + + + + Select a calendar. + + the DB Connection + The name of the calendar. + the Calendar + ClassNotFoundException + IOException + + + + Check whether or not a calendar is referenced by any triggers. + + the DB Connection + The name of the calendar. + + true if any triggers reference the calendar, false otherwise + + + + + Delete a calendar. + + the DB Connection + The name of the trigger. + the number of rows deleted + + + + Select the total number of calendars stored. + + the DB Connection + the total number of calendars stored + + + + Select all of the stored calendars. + + the DB Connection + + an array of calendar names + + + + + Select the trigger that will be fired at the given fire time. + + the DB Connection + the time that the trigger will be fired + + a representing the + trigger that will be fired at the given fire time, or null if no + trigger will be fired at that time + + + + + Select the next trigger which will fire to fire between the two given timestamps + in ascending order of fire time, and then descending by priority. + + The conn. + highest value of of the triggers (exclusive) + highest value of of the triggers (inclusive) + A (never null, possibly empty) list of the identifiers (Key objects) of the next triggers to be fired. + + + + Gets the select next trigger to acquire SQL clause. + This can be overriden for a more performant, result limiting + SQL. For Example SQL Server, MySQL and SQLite support limiting returned rows. + + + + + + Insert a fired trigger. + + the DB Connection + the trigger + the state that the trigger should be stored in + The job. + the number of rows inserted + + + + Select the states of all fired-trigger records for a given trigger, or + trigger group if trigger name is . + + The DB connection. + Name of the trigger. + Name of the group. + a List of objects. + + + + Select the states of all fired-trigger records for a given job, or job + group if job name is . + + The DB connection. + Name of the job. + Name of the group. + a List of objects. + + + + Select the states of all fired-trigger records for a given scheduler + instance. + + The DB Connection + Name of the instance. + A list of FiredTriggerRecord objects. + + + + Select the distinct instance names of all fired-trigger records. + + The conn. + + + This is useful when trying to identify orphaned fired triggers (a + fired trigger without a scheduler state record.) + + + + + Delete a fired trigger. + + the DB Connection + the fired trigger entry to delete + the number of rows deleted + + + + Selects the job execution count. + + The DB connection. + Name of the job. + The job group. + + + + + Delete all volatile fired triggers. + + The DB Connection + The number of rows deleted + + + + Inserts the state of the scheduler. + + The conn. + The instance id. + The check in time. + The interval. + + + + + Deletes the state of the scheduler. + + The database connection. + The instance id. + + + + + Updates the state of the scheduler. + + The database connection. + The instance id. + The check in time. + + + + + A List of all current s. +

+ If instanceId is not null, then only the record for the identified + instance will be returned. +

+
+ The DB Connection + The instance id. + +
+ + + Replace the table prefix in a query by replacing any occurrences of + "{0}" with the table prefix. + + The unsubstitued query + The query, with proper table prefix substituted + + + + Create a serialized version of an Object. + + the object to serialize + Serialized object as byte array. + + + + Remove the transient data from and then create a serialized + version of a and returns the underlying bytes. + + The data. + the serialized data as byte array + + + + serialize + + The data. + + + + + Convert the JobDataMap into a list of properties. + + + + + Convert the JobDataMap into a list of properties. + + + + + This method should be overridden by any delegate subclasses that need + special handling for BLOBs. The default implementation uses standard + ADO.NET operations. + + The data reader, already queued to the correct row. + The column index for the BLOB. + The deserialized object from the DataReader BLOB. + + + + Get the names of all of the triggers that are volatile. + + The DB Connection + An array of objects. + + + + Get the names of all of the jobs that are volatile. + + The DB Connection + An array of objects. + + + + This method should be overridden by any delegate subclasses that need + special handling for BLOBs for job details. + + The result set, already queued to the correct row. + The column index for the BLOB. + The deserialized Object from the ResultSet BLOB. + + + + Selects the paused trigger groups. + + The DB Connection. + + + + + Gets the triggers to acquire limit. + + The triggers to acquire limit. + + + + Initializes a new instance of the class. + + the logger to use during execution + the prefix of all table names + The instance id. + The db provider. + + + + Initializes a new instance of the class. + + The logger. + The table prefix. + The instance id. + The db provider. + if set to true [use properties]. + + + + Creates the SQL for select next trigger to acquire. + + + + + Gets the select next trigger to acquire SQL clause. + Firebird specific version with FIRST functionality + + + + + + Conveys the state of a fired-trigger record. + + James House + + + + Gets or sets the fire instance id. + + The fire instance id. + + + + Gets or sets the fire timestamp. + + The fire timestamp. + + + + Gets or sets a value indicating whether [job is stateful]. + + true if [job is stateful]; otherwise, false. + + + + Gets or sets the job key. + + The job key. + + + + Gets or sets the scheduler instance id. + + The scheduler instance id. + + + + Gets or sets the trigger key. + + The trigger key. + + + + Gets or sets the state of the fire instance. + + The state of the fire instance. + + + + Gets or sets a value indicating whether [job requests recovery]. + + true if [job requests recovery]; otherwise, false. + + + + Gets or sets a value indicating whether [trigger is volatile]. + + true if [trigger is volatile]; otherwise, false. + + + + Gets or sets the priority. + + The priority. + + + + Exception class for when a driver delegate cannot be found for a given + configuration, or lack thereof. + + Jeffrey Wescott + + + + + Base class for exceptions thrown by the Quartz . + + + SchedulerExceptions may contain a reference to another + , which was the underlying cause of the SchedulerException. + + James House + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The MSG. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + Initializes a new instance of the class. + + The MSG. + The error code. + + + + Initializes a new instance of the class. + + The cause. + + + + Initializes a new instance of the class. + + The MSG. + The cause. + + + + Initializes a new instance of the class. + + The MSG. + The cause. + The error code. + + + + Creates and returns a string representation of the current exception. + + + A string representation of the current exception. + + + + + + Return the exception that is the underlying cause of this exception. + This may be used to find more detail about the cause of the error. + + The underlying exception, or if there is not + one. + + + + + Get the error code associated with this exception. + This may be used to find more detail about the cause of the error. + + + One of the ERR_XXX constants defined in this class. + + + +

+ Determine if the specified error code is in the + category of errors. +

+
+
+ +

+ Determine if the specified error code is in the + category of errors. +

+
+
+ + + Determine if the specified error code is in the + category of errors. + + + + + Determine if the specified error code is in the + category of errors. + + + + + Determine if the specified error code is in the + category of errors. + + + + + Determine if the specified error code is in the + category of errors. + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + is meant to be used in an application-server + or other software framework environment that provides + container-managed-transactions. No commit / rollback will be handled by this class. + + + If you need commit / rollback, use + instead. + + Jeffrey Wescott + James House + Srinivas Venkatarangaiah + + + + Contains base functionality for ADO.NET-based JobStore implementations. + + Jeffrey Wescott + James House + Marko Lahma (.NET) + + + + The interface to be implemented by classes that want to provide a + and storage mechanism for the + 's use. + + + Storage of s and s should be keyed + on the combination of their name and group for uniqueness. + + + + + + + + James House + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + Called by the QuartzScheduler to inform the that + the scheduler has started. + + + + + Called by the QuartzScheduler to inform the that + it should free up all of it's resources because the scheduler is + shutting down. + + + + + Store the given and . + + The scheduling context. + The to be stored. + The to be stored. + ObjectAlreadyExistsException + + + + returns true if the given JobGroup + is paused + + + + + + + + returns true if the given TriggerGroup + is paused + + + + + + + + Store the given . + + The context. + The to be stored. + + If , any existing in the + with the same name and group should be + over-written. + + + + + Remove (delete) the with the given + name, and any s that reference + it. + + + If removal of the results in an empty group, the + group should be removed from the 's list of + known group names. + + The context. + The name of the to be removed. + The group name of the to be removed. + + if a with the given name and + group was found and removed from the store. + + + + + Retrieve the for the given + . + + The context. + The name of the to be retrieved. + The group name of the to be retrieved. + + The desired , or null if there is no match. + + + + + Store the given . + + The context. + The to be stored. + If , any existing in + the with the same name and group should + be over-written. + ObjectAlreadyExistsException + + + + Remove (delete) the with the + given name. + + +

+ If removal of the results in an empty group, the + group should be removed from the 's list of + known group names. +

+

+ If removal of the results in an 'orphaned' + that is not 'durable', then the should be deleted + also. +

+
+ The context. + The name of the to be removed. + The group name of the to be removed. + + if a with the given + name and group was found and removed from the store. + +
+ + + Remove (delete) the with the + given name, and store the new given one - which must be associated + with the same job. + + The context. + The name of the to be removed. + The group name of the to be removed. + The new to be stored. + + if a with the given + name and group was found and removed from the store. + + + + + Retrieve the given . + + The context. + The name of the to be retrieved. + The group name of the to be retrieved. + + The desired , or null if there is no + match. + + + + + Store the given . + + The context. + The name. + The to be stored. + If , any existing + in the with the same name and group + should be over-written. + If , any s existing + in the that reference an existing + Calendar with the same name with have their next fire time + re-computed with the new . + ObjectAlreadyExistsException + + + + Remove (delete) the with the + given name. + + + If removal of the would result in + s pointing to non-existent calendars, then a + will be thrown. + + The context. + The name of the to be removed. + + if a with the given name + was found and removed from the store. + + + + + Retrieve the given . + + The context. + The name of the to be retrieved. + + The desired , or null if there is no + match. + + + + + Get the number of s that are + stored in the . + + The context. + + + + + Get the number of s that are + stored in the . + + The context. + + + + + Get the number of s that are + stored in the . + + The context. + + + + + Get the names of all of the s that + have the given group name. +

+ If there are no jobs in the given group name, the result should be a + zero-length array (not ). +

+
+ The CTX. + Name of the group. + +
+ + + Get the names of all of the s + that have the given group name. +

+ If there are no triggers in the given group name, the result should be a + zero-length array (not ). +

+
+
+ + + Get the names of all of the + groups. +

+ If there are no known group names, the result should be a zero-length + array (not ). +

+
+
+ + + Get the names of all of the + groups. +

+ If there are no known group names, the result should be a zero-length + array (not ). +

+
+
+ + + Get the names of all of the s + in the . + +

+ If there are no Calendars in the given group name, the result should be + a zero-length array (not ). +

+
+
+ + + Get all of the Triggers that are associated to the given Job. + + + If there are no matches, a zero-length array should be returned. + + + + + Get the current state of the identified . + + + + + + + + + + Pause the with the given name. + + + + + Pause all of the s in the + given group. + + + The JobStore should "remember" that the group is paused, and impose the + pause on any new triggers that are added to the group while the group is + paused. + + + + + Pause the with the given name - by + pausing all of its current s. + + + + + Pause all of the s in the given + group - by pausing all of their s. +

+ The JobStore should "remember" that the group is paused, and impose the + pause on any new jobs that are added to the group while the group is + paused. +

+
+ + +
+ + + Resume (un-pause) the with the + given name. + +

+ If the missed one or more fire-times, then the + 's misfire instruction will be applied. +

+
+ + +
+ + + Resume (un-pause) all of the s + in the given group. +

+ If any missed one or more fire-times, then the + 's misfire instruction will be applied. +

+
+
+ + + Gets the paused trigger groups. + + The context. + + + + + Resume (un-pause) the with the + given name. +

+ If any of the 's s missed one + or more fire-times, then the 's misfire + instruction will be applied. +

+
+
+ + + Resume (un-pause) all of the s in + the given group. +

+ If any of the s had s that + missed one or more fire-times, then the 's + misfire instruction will be applied. +

+
+
+ + + Pause all triggers - equivalent of calling + on every group. +

+ When is called (to un-pause), trigger misfire + instructions WILL be applied. +

+
+ +
+ + + Resume (un-pause) all triggers - equivalent of calling + on every group. +

+ If any missed one or more fire-times, then the + 's misfire instruction will be applied. +

+ +
+ +
+ + + Get a handle to the next trigger to be fired, and mark it as 'reserved' + by the calling scheduler. + + The context. + If > 0, the JobStore should only return a Trigger + that will fire no later than the time represented in this value as + milliseconds. + + + + + + + Inform the that the scheduler no longer plans to + fire the given , that it had previously acquired + (reserved). + + + + + Inform the that the scheduler is now firing the + given (executing its associated ), + that it had previously acquired (reserved). + + null if the trigger or it's job or calendar no longer exist, or + if the trigger was not successfully put into the 'executing' + state. + + + + + Inform the that the scheduler has completed the + firing of the given (and the execution its + associated ), and that the + in the given should be updated if the + is stateful. + + + + + Supports the persistence. + + + + + + Initializes a new instance of the class. + + + + + Gets the connection and starts a new transaction. + + + + + + Called by the QuartzScheduler before the is + used, in order to give it a chance to Initialize. + + + + + + + + Called by the QuartzScheduler to inform the that + it should free up all of it's resources because the scheduler is + shutting down. + + + + + Removes all volatile data. + + + + + Removes all volatile data. + + + + + Will recover any failed or misfired jobs and clean up the data store as + appropriate. + + + + + Will recover any failed or misfired jobs and clean up the data store as + appropriate. + + + + + Store the given and . + + SchedulingContext + Job to be stored. + Trigger to be stored. + + + + returns true if the given JobGroup + is paused + + + + + + + + returns true if the given TriggerGroup + is paused + + + + + + + + Stores the given . + + + The to be stored. + + If , any existing in the + with the same name & group should be over-written. + + + +

+ Insert or update a job. +

+
+
+ + + Check existence of a given job. + + + + + Store the given . + + + The to be stored. + + If , any existing in + the with the same name & group should + be over-written. + + + if a with the same name/group already + exists, and replaceExisting is set to false. + + + + + Insert or update a trigger. + + + + + Check existence of a given trigger. + + + + + Remove (delete) the with the given + name, and any s that reference + it. + + + + If removal of the results in an empty group, the + group should be removed from the 's list of + known group names. + + + The name of the to be removed. + The group name of the to be removed. + + if a with the given name & + group was found and removed from the store. + + + + + Delete a job and its listeners. + + + + + + + Delete a trigger, its listeners, and its Simple/Cron/BLOB sub-table entry. + + + + + + + + Retrieve the for the given + . + + The name of the to be retrieved. + The group name of the to be retrieved. + The desired , or null if there is no match. + + + + Remove (delete) the with the + given name. + + + +

+ If removal of the results in an empty group, the + group should be removed from the 's list of + known group names. +

+ +

+ If removal of the results in an 'orphaned' + that is not 'durable', then the should be deleted + also. +

+
+ The name of the to be removed. + The group name of the to be removed. + + if a with the given + name & group was found and removed from the store. + +
+ + + + + + Retrieve the given . + + The name of the to be retrieved. + The group name of the to be retrieved. + The desired , or null if there is no match. + + + + Get the current state of the identified . + + + + + + + + + + Gets the state of the trigger. + + The conn. + The CTXT. + Name of the trigger. + Name of the group. + + + + + Store the given . + + The name of the calendar. + The to be stored. + + If , any existing + in the with the same name & group + should be over-written. + + + if a with the same name already + exists, and replaceExisting is set to false. + + + + + Remove (delete) the with the given name. + + + If removal of the would result in + s pointing to non-existent calendars, then a + will be thrown. + + The name of the to be removed. + + if a with the given name + was found and removed from the store. + + + + + Retrieve the given . + + The name of the to be retrieved. + The desired , or null if there is no match. + + + + Get the number of s that are + stored in the . + + + + + Get the number of s that are + stored in the . + + + + + Get the number of s that are + stored in the . + + + + + Get the names of all of the s that + have the given group name. + + + If there are no jobs in the given group name, the result should be a + zero-length array (not ). + + + + + Get the names of all of the s + that have the given group name. + + + If there are no triggers in the given group name, the result should be a + zero-length array (not ). + + + + + Get the names of all of the + groups. + + + + If there are no known group names, the result should be a zero-length + array (not ). + + + + + Get the names of all of the + groups. + + + + If there are no known group names, the result should be a zero-length + array (not ). + + + + + Get the names of all of the s + in the . + + + If there are no Calendars in the given group name, the result should be + a zero-length array (not ). + + + + + Get all of the Triggers that are associated to the given Job. + + + If there are no matches, a zero-length array should be returned. + + + + + Pause the with the given name. + + + + + + Pause the with the given name. + + + + + + Pause the with the given name - by + pausing all of its current s. + + + + + + Pause all of the s in the given + group - by pausing all of their s. + + + + + + Determines if a Trigger for the given job should be blocked. + State can only transition to StatePausedBlocked/StateBlocked from + StatePaused/StateWaiting respectively. + + StatePausedBlocked, StateBlocked, or the currentState. + + + + Resume (un-pause) the with the + given name. + + + If the missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Resume (un-pause) the with the + given name. + + + If any of the 's s missed one + or more fire-times, then the 's misfire + instruction will be applied. + + + + + + Resume (un-pause) all of the s in + the given group. + + + If any of the s had s that + missed one or more fire-times, then the 's + misfire instruction will be applied. + + + + + + Pause all of the s in the given group. + + + + + + Pause all of the s in the given group. + + + + + + Pause all of the s in the + given group. + + + + + + Resume (un-pause) all of the s + in the given group. +

+ If any missed one or more fire-times, then the + 's misfire instruction will be applied. +

+
+ +
+ + + Pause all triggers - equivalent of calling + on every group. +

+ When is called (to un-pause), trigger misfire + instructions WILL be applied. +

+
+ + +
+ + + Resume (un-pause) all triggers - equivalent of calling + on every group. + + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Resume (un-pause) all triggers - equivalent of calling + on every group. +

+ If any missed one or more fire-times, then the + 's misfire instruction will be applied. +

+
+ +
+ + + Get a handle to the next N triggers to be fired, and mark them as 'reserved' + by the calling scheduler. + + + + + + Inform the that the scheduler no longer plans to + fire the given , that it had previously acquired + (reserved). + + + + + Inform the that the scheduler has completed the + firing of the given (and the execution its + associated ), and that the + in the given should be updated if the + is stateful. + + + + + Get a list of all scheduler instances in the cluster that may have failed. + This includes this scheduler if it is checking in for the first time. + + + + + Create dummy objects for fired triggers + that have no scheduler state record. Checkin timestamp and interval are + left as zero on these dummy objects. + + List of all current s + + + + Cleanup the given database connection. This means restoring + any modified auto commit or transaction isolation connection + attributes, and then closing the underlying connection. + + + + This is separate from closeConnection() because the Spring + integration relies on being able to overload closeConnection() and + expects the same connection back that it originally returned + from the datasource. + + + + + + Closes the supplied connection. + + (Optional) + + + + Rollback the supplied connection. + + (Optional) + + JobPersistenceException thrown if a SQLException occurs when the + connection is rolled back + + + + + Commit the supplied connection. + + The CTH. + if set to true opens a new transaction. + JobPersistenceException thrown if a SQLException occurs when the + + + + Execute the given callback in a transaction. Depending on the JobStore, + the surrounding transaction may be assumed to be already present + (managed). + + + This method just forwards to ExecuteInLock() with a null lockName. + + + + + + Execute the given callback having aquired the given lock. + Depending on the JobStore, the surrounding transaction may be + assumed to be already present (managed). This version is just a + handy wrapper around executeInLock that doesn't require a return + value. + + + The name of the lock to aquire, for example + "TRIGGER_ACCESS". If null, then no lock is aquired, but the + lockCallback is still executed in a transaction. + + + + + + Execute the given callback having aquired the given lock. + Depending on the JobStore, the surrounding transaction may be + assumed to be already present (managed). + + + The name of the lock to aquire, for example + "TRIGGER_ACCESS". If null, then no lock is aquired, but the + lockCallback is still executed in a transaction. + + + + + Execute the given callback having optionally aquired the given lock. + This uses the non-managed transaction connection. This version is just a + handy wrapper around executeInNonManagedTXLock that doesn't require a return + value. + + + The name of the lock to aquire, for example + "TRIGGER_ACCESS". If null, then no lock is aquired, but the + lockCallback is still executed in a non-managed transaction. + + + + + + Execute the given callback having optionally aquired the given lock. + This uses the non-managed transaction connection. + + + The name of the lock to aquire, for example + "TRIGGER_ACCESS". If null, then no lock is aquired, but the + lockCallback is still executed in a non-managed transaction. + + + + + Get or set the datasource name. + + + + + Gets the log. + + The log. + + + + Get or sets the prefix that should be pre-pended to all table names. + + + + + Set whether string-only properties will be handled in JobDataMaps. + + + + + Get or set the instance Id of the Scheduler (must be unique within a cluster). + + + + + Get or set the instance Id of the Scheduler (must be unique within this server instance). + + + + + Get or set whether this instance is part of a cluster. + + + + + Get or set the frequency at which this instance "checks-in" + with the other instances of the cluster. -- Affects the rate of + detecting failed instances. + + + + + Get or set the maximum number of misfired triggers that the misfire handling + thread will try to recover at one time (within one transaction). The + default is 20. + + + + + Gets or sets the database retry interval. + + The db retry interval. + + + + Get or set whether this instance should use database-based thread + synchronization. + + + + + Whether or not to obtain locks when inserting new jobs/triggers. + Defaults to , which is safest - some db's (such as + MS SQLServer) seem to require this to avoid deadlocks under high load, + while others seem to do fine without. + + + Setting this property to will provide a + significant performance increase during the addition of new jobs + and triggers. + + + + + The time span by which a trigger must have missed its + next-fire-time, in order for it to be considered "misfired" and thus + have its misfire instruction applied. + + + + + Don't call set autocommit(false) on connections obtained from the + DataSource. This can be helpfull in a few situations, such as if you + have a driver that complains if it is called when it is already off. + + + + + Set the transaction isolation level of DB connections to sequential. + + + + + Whether or not the query and update to acquire a Trigger for firing + should be performed after obtaining an explicit DB lock (to avoid + possible race conditions on the trigger's db row). This is + is considered unnecessary for most databases (due to the nature of + the SQL update that is performed), and therefore a superfluous performance hit. + + + + + Get or set the ADO.NET driver delegate class name. + + + + + set the SQL statement to use to select and lock a row in the "locks" + table. + + + + + + Get whether the threads spawned by this JobStore should be + marked as daemon. Possible threads include the + and the . + + + + + + Get whether to check to see if there are Triggers that have misfired + before actually acquiring the lock to recover them. This should be + set to false if the majority of the time, there are are misfired + Triggers. + + + + + + Get the driver delegate for DB operations. + + + + + Get whether String-only properties will be handled in JobDataMaps. + + + + + Indicates whether this job store supports persistence. + + + + + + + Implement this interface to provide the code to execute within + the a transaction template that has no return value. + + + + + + Implement this interface to provide the code to execute within + the a transaction template. If no return value is required, execute + should just return null. + + + + + + + + An interface for classes wishing to provide the service of loading classes + and resources within the scheduler... + + James House + + + + Called to give the ClassLoadHelper a chance to Initialize itself, + including the oportunity to "steal" the class loader off of the calling + thread, which is the thread that is initializing Quartz. + + + + + Return the class with the given name. + + + + + Finds a resource with a given name. This method returns null if no + resource with this name is found. + + name of the desired resource + + a java.net.URL object + + + + + Finds a resource with a given name. This method returns null if no + resource with this name is found. + + name of the desired resource + + a java.io.InputStream object + + + + + Helper class for returning the composite result of trying + to recover misfired jobs. + + + + + Initializes a new instance of the class. + + if set to true [has more misfired triggers]. + The processed misfired trigger count. + + + + + Gets a value indicating whether this instance has more misfired triggers. + + + true if this instance has more misfired triggers; otherwise, false. + + + + + Gets the processed misfired trigger count. + + The processed misfired trigger count. + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + + + Called by the QuartzScheduler to inform the that + it should free up all of it's resources because the scheduler is + shutting down. + + + + + Gets the non managed TX connection. + + + + + + Execute the given callback having optionally aquired the given lock. + Because CMT assumes that the connection is already part of a managed + transaction, it does not attempt to commit or rollback the + enclosing transaction. + + + + + + + The name of the lock to aquire, for example + "TRIGGER_ACCESS". If null, then no lock is aquired, but the + txCallback is still executed in a transaction. + + Callback to execute. + + + + Utility class to keep track of both active transaction + and connection. + + + + + Initializes a new instance of the class. + + The connection. + The transaction. + + + + Gets or sets the connection. + + The connection. + + + + Gets or sets the transaction. + + The transaction. + + + + is meant to be used in a standalone environment. + Both commit and rollback will be handled by this class. + + Jeffrey Wescott + James House + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + + + For , the non-managed TX connection is just + the normal connection because it is not CMT. + + + + + + Execute the given callback having optionally aquired the given lock. + For , because it manages its own transactions + and only has the one datasource, this is the same behavior as + . + + + The name of the lock to aquire, for example "TRIGGER_ACCESS". + If null, then no lock is aquired, but the lockCallback is still + executed in a transaction. + + Callback to execute. + + + + + + + + + Exception class for when there is a failure obtaining or releasing a + resource lock. + + + James House + + + + An exception that is thrown to indicate that there has been a failure in the + scheduler's underlying persistence mechanism. + + James House + + + +

+ Create a with the given message. +

+
+
+ + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + +

+ Create a with the given message + and error code. +

+
+
+ +

+ Create a with the given message + and cause. +

+
+
+ +

+ Create a with the given message, + cause and error code. +

+
+
+ + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + This is a driver delegate for the MySQL ADO.NET driver. + + Marko Lahma + + + + Initializes a new instance of the class. + + the logger to use during execution + the prefix of all table names + The instance id. + The db provider. + + + + Initializes a new instance of the class. + + The logger. + The table prefix. + The instance id. + The db provider. + if set to true [use properties]. + + + + Gets the select next trigger to acquire SQL clause. + MySQL version with LIMIT support. + + + + + + Exception class for when a driver delegate cannot be found for a given + configuration, or lack thereof. + + Jeffrey Wescott + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + This is a driver delegate for the Oracle database. + + Marko Lahma + + + + Initializes a new instance of the class. + + the logger to use during execution + the prefix of all table names + The instance id. + The db provider. + + + + Initializes a new instance of the class. + + The logger. + The table prefix. + The instance id. + The db provider. + if set to true [use properties]. + + + + Creates the SQL for select next trigger to acquire. + + + + + Gets the select next trigger to acquire SQL clause. + Oracle version with rownum support. + + + + + + This is a driver delegate for the PostgreSQL ADO.NET driver. + + Marko Lahma + + + + Initializes a new instance of the class. + + The log. + The table prefix. + The instance id. + The db provider. + + + + Initializes a new instance of the class. + + The log. + The table prefix. + The instance id. + The db provider. + if set to true [use properties]. + + + + Gets the select next trigger to acquire SQL clause. + PostgreSQL version with LIMIT support. + + + + + + Conveys a scheduler-instance state record. + + James House + + + + Gets or sets the checkin interval. + + The checkin interval. + + + + Gets or sets the checkin timestamp. + + The checkin timestamp. + + + + Gets or sets the scheduler instance id. + + The scheduler instance id. + + + + Internal in-memory lock handler for providing thread/resource locking in + order to protect resources from being altered by multiple threads at the + same time. + + James House + + + + Grants a lock on the identified resource to the calling thread (blocking + until it is available). + + True if the lock was obtained. + + + Release the lock on the identified resource if it is held by the calling + thread. + + + + + Determine whether the calling thread owns a lock on the identified + resource. + + + + + Gets the thread locks. + + The thread locks. + + + + Whether this Semaphore implementation requires a database connection for + its lock management operations. + + + + + + + + + This is a driver delegate for the SQLiteDelegate ADO.NET driver. + + Marko Lahma + + + + Initializes a new instance of the class. + + the logger to use during execution + the prefix of all table names + The instance id. + The db provider. + + + + Initializes a new instance of the class. + + The logger. + The table prefix. + The instance id. + The db provider. + if set to true [use properties]. + + + + Gets the select next trigger to acquire SQL clause. + SQLite version with LIMIT support. + + + + + + A SQL Server specific driver delegate. + + Marko Lahma + + + + Initializes a new instance of the class. + + the logger to use during execution + the prefix of all table names + The instance id. + The db provider. + + + + Initializes a new instance of the class. + + The logger. + The table prefix. + The instance id. + The db provider. + if set to true [use properties]. + + + + Creates the SQL for select next trigger to acquire. + + + + + Gets the select next trigger to acquire SQL clause. + SQL Server specific version with TOP functionality + + + + + + Internal database based lock handler for providing thread/resource locking + in order to protect resources from being altered by multiple threads at the + same time. + + James House + + + + Initializes a new instance of the class. + + The table prefix. + The select with lock SQL. + + + + Execute the SQL select for update that will lock the proper database row. + + + + Provide thread/resource locking in order to protect + resources from being altered by multiple threads at the same time using + a db row update. + + + Note: This Semaphore implementation is useful for databases that do + not support row locking via "SELECT FOR UPDATE" type syntax, for example + Microsoft SQLServer (MSSQL). + + + + + Initializes a new instance of the class. + + + + + Execute the SQL that will lock the proper database row. + + + + + + + + This implementation of the Calendar excludes a set of days of the year. You + may use it to exclude bank holidays which are on the same date every year. + + + + Juergen Donnerstag + + + + This implementation of the Calendar may be used (you don't have to) as a + base class for more sophisticated one's. It merely implements the base + functionality required by each Calendar. + + + Regarded as base functionality is the treatment of base calendars. Base + calendar allow you to chain (stack) as much calendars as you may need. For + example to exclude weekends you may use WeeklyCalendar. In order to exclude + holidays as well you may define a WeeklyCalendar instance to be the base + calendar for HolidayCalendar instance. + + + Juergen Donnerstag + James House + + + + An interface to be implemented by objects that define spaces of time during + which an associated may fire. + + + Calendars do not define actual fire times, but rather are used to limit a + from firing on its normal schedule if necessary. Most + Calendars include all times by default and allow the user to specify times to + exclude. As such, it is often useful to think of Calendars as being used to + exclude a block of time, as opposed to include + a block of time. (i.e. the schedule "fire every five minutes except on Sundays" could be + implemented with a and a which excludes Sundays) + + James House + Juergen Donnerstag + + + + Determine whether the given UTC time is 'included' by the + Calendar. + + + + + Determine the next UTC time that is 'included' by the + Calendar after the given UTC time. + + + + + Gets or sets a description for the instance - may be + useful for remembering/displaying the purpose of the calendar, though + the description has no meaning to Quartz. + + + + + Set a new base calendar or remove the existing one. + Get the base calendar. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The base calendar. + + + + Initializes a new instance of the class. + + The time zone. + + + + Initializes a new instance of the class. + + The base calendar. + The time zone. + + + + checks whether two arrays have + the same length and + for any given place there are equal elements + in both arrays + + + + + + Get the base calendar. Will be null, if not set. + + + + + Check if date/time represented by timeStamp is included. If included + return true. The implementation of BaseCalendar simply calls the base + calendars IsTimeIncluded() method if base calendar is set. + + + + + + Determine the next UTC time (in milliseconds) that is 'included' by the + Calendar after the given time. Return the original value if timeStamp is + included. Return 0 if all days are excluded. + + + + + + Gets or sets the time zone. + + The time zone. + + + + Gets or sets the description given to the instance by + its creator (if any). + + + + + Set a new base calendar or remove the existing one + + + + + + Constructor + + + + + Constructor + + The base calendar. + + + + Return true, if day is defined to be exluded. + + + + + Redefine a certain day to be excluded (true) or included (false). + + + + + Determine whether the given UTC time (in milliseconds) is 'included' by the + Calendar. +

+ Note that this Calendar is only has full-day precision. +

+
+
+ + + Determine the next UTC time (in milliseconds) that is 'included' by the + Calendar after the given time. Return the original value if timeStampUtc is + included. Return 0 if all days are excluded. +

+ Note that this Calendar is only has full-day precision. +

+
+
+ + + Get or the array which defines the exclude-value of each day of month. + Setting will redefine the array of days excluded. The array must of size greater or + equal 31. + + + + + This implementation of the Calendar excludes the set of times expressed by a + given CronExpression. + + + For example, you could use this calendar to exclude all but business hours (8AM - 5PM) every + day using the expression "* * 0-7,18-23 ? * *". +

+ It is important to remember that the cron expression here describes a set of + times to be excluded from firing. Whereas the cron expression in + CronTrigger describes a set of times that can + be included for firing. Thus, if a has a + given cron expression and is associated with a with + the same expression, the calendar will exclude all the times the + trigger includes, and they will cancel each other out. +

+
+ Aaron Craven +
+ + + Initializes a new instance of the class. + + a String representation of the desired cron expression + + + + Create a with the given cron expression and + . + + + the base calendar for this calendar instance + see BaseCalendar for more information on base + calendar functionality + + a String representation of the desired cron expression + + + + Create a with the given cron expression and + . + + + the base calendar for this calendar instance + see BaseCalendar for more information on base + calendar functionality + + a String representation of the desired cron expression + + + + + Determine whether the given time is 'included' by the + Calendar. + + the time to test + a boolean indicating whether the specified time is 'included' by the CronCalendar + + + + Determine the next time that is 'included' by the + Calendar after the given time. Return the original value if timeStamp is + included. Return 0 if all days are excluded. + + + + + + + Returns a that represents the current . + + + A that represents the current . + + + + + Sets the cron expression for the calendar to a new value. + + The expression. + + + + Returns the object representation of the cron expression that defines the + dates and times this calendar excludes. + + + + + This implementation of the Calendar excludes (or includes - see below) a + specified time range each day. + + + For example, you could use this calendar to + exclude business hours (8AM - 5PM) every day. Each + only allows a single time range to be specified, and that time range may not + * cross daily boundaries (i.e. you cannot specify a time range from 8PM - 5AM). + If the property is (default), + the time range defines a range of times in which triggers are not allowed to + * fire. If is , the time range + is inverted: that is, all times outside the defined time range + are excluded. +

+ Note when using , it behaves on the same principals + as, for example, WeeklyCalendar defines a set of days that are + excluded every week. Likewise, defines a + set of times that are excluded every day. +

+
+ Mike Funk + Aaron Craven +
+ + + Create a with a time range defined by the + specified strings and no baseCalendar. + and + must be in the format "HH:MM[:SS[:mmm]]" where: +
    +
  • + HH is the hour of the specified time. The hour should be + specified using military (24-hour) time and must be in the range + 0 to 23. +
  • +
  • + MM is the minute of the specified time and must be in the range + 0 to 59. +
  • +
  • + SS is the second of the specified time and must be in the range + 0 to 59. +
  • +
  • + mmm is the millisecond of the specified time and must be in the + range 0 to 999. +
  • +
  • items enclosed in brackets ('[', ']') are optional.
  • +
  • + The time range starting time must be before the time range ending + time. Note this means that a time range may not cross daily + boundaries (10PM - 2AM) +
  • +
+
+
+ + + Create a with a time range defined by the + specified strings and the specified baseCalendar. + and + must be in the format "HH:MM[:SS[:mmm]]" where: +
    +
  • + HH is the hour of the specified time. The hour should be + specified using military (24-hour) time and must be in the range + 0 to 23. +
  • +
  • + MM is the minute of the specified time and must be in the range + 0 to 59. +
  • +
  • + SS is the second of the specified time and must be in the range + 0 to 59. +
  • +
  • + mmm is the millisecond of the specified time and must be in the + range 0 to 999. +
  • +
  • + items enclosed in brackets ('[', ']') are optional. +
  • +
  • + The time range starting time must be before the time range ending + time. Note this means that a time range may not cross daily + boundaries (10PM - 2AM) +
  • +
+
+ The base calendar for this calendar instance see BaseCalendar for more + information on base calendar functionality. +
+ + + Create a with a time range defined by the + specified values and no baseCalendar. Values are subject to + the following validations: +
    +
  • + Hours must be in the range 0-23 and are expressed using military + (24-hour) time. +
  • +
  • Minutes must be in the range 0-59
  • +
  • Seconds must be in the range 0-59
  • +
  • Milliseconds must be in the range 0-999
  • +
  • + The time range starting time must be before the time range ending + time. Note this means that a time range may not cross daily + boundaries (10PM - 2AM) +
  • +
+
+ The range starting hour of day. + The range starting minute. + The range starting second. + The range starting millis. + The range ending hour of day. + The range ending minute. + The range ending second. + The range ending millis. +
+ + + Create a with a time range defined by the + specified values and the specified . Values are + subject to the following validations: +
    +
  • + Hours must be in the range 0-23 and are expressed using military + (24-hour) time. +
  • +
  • Minutes must be in the range 0-59
  • +
  • Seconds must be in the range 0-59
  • +
  • Milliseconds must be in the range 0-999
  • +
  • + The time range starting time must be before the time range ending + time. Note this means that a time range may not cross daily + boundaries (10PM - 2AM) +
  • +
+
+ The range starting hour of day. + The range starting minute. + The range starting second. + The range starting millis. + The range ending hour of day. + The range ending minute. + The range ending second. + The range ending millis. +
+ + + Create a with a time range defined by the + specified s and no + baseCalendar. The Calendars are subject to the following + considerations: +
    +
  • + Only the time-of-day fields of the specified Calendars will be + used (the date fields will be ignored) +
  • +
  • + The starting time must be before the ending time of the defined + time range. Note this means that a time range may not cross + daily boundaries (10PM - 2AM). (because only time fields are + are used, it is possible for two Calendars to represent a valid + time range and + rangeStartingCalendar.after(rangeEndingCalendar) == true) + +
  • +
+
+ The range starting calendar. + The range ending calendar. +
+ + + Create a with a time range defined by the + specified s and the specified + . The Calendars are subject to the following + considerations: +
    +
  • + Only the time-of-day fields of the specified Calendars will be + used (the date fields will be ignored) +
  • +
  • + The starting time must be before the ending time of the defined + time range. Note this means that a time range may not cross + daily boundaries (10PM - 2AM). (because only time fields are + are used, it is possible for two Calendars to represent a valid + time range and + rangeStartingCalendarUtc > rangeEndingCalendarUtc == true) +
  • +
+
+ The range starting calendar. + The range ending calendar. +
+ + + Create a with a time range defined by the + specified values and no baseCalendar. The values are + subject to the following considerations: +
    +
  • + Only the time-of-day portion of the specified values will be + used +
  • +
  • + The starting time must be before the ending time of the defined + time range. Note this means that a time range may not cross + daily boundaries (10PM - 2AM). (because only time value are + are used, it is possible for the two values to represent a valid + time range and rangeStartingTime > rangeEndingTime) +
  • +
+
+ The range starting time in millis. + The range ending time in millis. +
+ + + Create a with a time range defined by the + specified values and the specified . The values + are subject to the following considerations: +
    +
  • + Only the time-of-day portion of the specified values will be + used +
  • +
  • + The starting time must be before the ending time of the defined + time range. Note this means that a time range may not cross + daily boundaries (10PM - 2AM). (because only time value are + are used, it is possible for the two values to represent a valid + time range and rangeStartingTime > rangeEndingTime) +
  • +
+
+ The range starting time in millis. + The range ending time in millis. +
+ + + Determine whether the given time is 'included' by the + Calendar. + + + + + + + Determine the next time (in milliseconds) that is 'included' by the + Calendar after the given time. Return the original value if timeStamp is + included. Return 0 if all days are excluded. + + + + + + + + Returns the start time of the time range of the day + specified in . + + + a DateTime representing the start time of the + time range for the specified date. + + + + + Returns the end time of the time range of the day + specified in + + + A DateTime representing the end time of the + time range for the specified date. + + + + + Returns a that represents the current . + + + A that represents the current . + + + + + Sets the time range for the to the times + represented in the specified Strings. + + The range starting time string. + The range ending time string. + + + + Sets the time range for the to the times + represented in the specified values. + + The range starting hour of day. + The range starting minute. + The range starting second. + The range starting millis. + The range ending hour of day. + The range ending minute. + The range ending second. + The range ending millis. + + + + Sets the time range for the to the times + represented in the specified s. + + The range starting calendar. + The range ending calendar. + + + + Sets the time range for the to the times + represented in the specified values. + + The range starting time. + The range ending time. + + + + Gets the start of day, practically zeroes time part. + + The time. + + + + + Gets the end of day, pratically sets time parts to maximum allowed values. + + The time. + + + + + Checks the specified values for validity as a set of time values. + + The hour of day. + The minute. + The second. + The millis. + + + + Indicates whether the time range represents an inverted time range (see + class description). + + true if invert time range; otherwise, false. + + + + This implementation of the Calendar stores a list of holidays (full days + that are excluded from scheduling). + + + The implementation DOES take the year into consideration, so if you want to + exclude July 4th for the next 10 years, you need to add 10 entries to the + exclude list. + + Sharada Jambula + Juergen Donnerstag + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The base calendar. + + + + Determine whether the given time (in milliseconds) is 'included' by the + Calendar. +

+ Note that this Calendar is only has full-day precision. +

+
+
+ + + Determine the next time (in milliseconds) that is 'included' by the + Calendar after the given time. +

+ Note that this Calendar is only has full-day precision. +

+
+
+ + + Add the given Date to the list of excluded days. Only the month, day and + year of the returned dates are significant. + + + + + Removes the excluded date. + + The date to remove. + + + + Returns a of Dates representing the excluded + days. Only the month, day and year of the returned dates are + significant. + + + + + This implementation of the Calendar excludes a set of days of the month. You + may use it to exclude every 1. of each month for example. But you may define + any day of a month. + + + + Juergen Donnerstag + + + + Initializes a new instance of the class. + + + + + Constructor + + The base calendar. + + + + Initialize internal variables + + + + + Return true, if mday is defined to be exluded. + + + + + Redefine a certain day of the month to be excluded (true) or included + (false). + + + + + Check if all days are excluded. That is no day is included. + + boolean + + + + + Determine whether the given time (in milliseconds) is 'included' by the + Calendar. +

+ Note that this Calendar is only has full-day precision. +

+
+
+ + + Determine the next time (in milliseconds) that is 'included' by the + Calendar after the given time. Return the original value if timeStamp is + included. Return DateTime.MinValue if all days are excluded. +

+ Note that this Calendar is only has full-day precision. +

+
+
+ + + Get or set the array which defines the exclude-value of each day of month + Setting will redefine the array of days excluded. The array must of size greater or + equal 31. + + + + + This implementation of the Calendar excludes a set of days of the week. You + may use it to exclude weekends for example. But you may define any day of + the week. + + + + Juergen Donnerstag + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The base calendar. + + + + Initialize internal variables + + + + + Return true, if wday is defined to be exluded. E. g. + saturday and sunday. + + + + + Redefine a certain day of the week to be excluded (true) or included + (false). Use java.util.Calendar's constants like MONDAY to determine the + wday. + + + + + Check if all week ays are excluded. That is no day is included. + + + + + Determine whether the given time (in milliseconds) is 'included' by the + Calendar. +

+ Note that this Calendar is only has full-day precision. +

+
+
+ + + Determine the next time (in milliseconds) that is 'included' by the + Calendar after the given time. Return the original value if timeStamp is + included. Return DateTime.MinValue if all days are excluded. +

+ Note that this Calendar is only has full-day precision. +

+
+
+ + + Get the array with the week days. + Setting will redefine the array of days excluded. The array must of size greater or + equal 8. java.util.Calendar's constants like MONDAY should be used as + index. A value of true is regarded as: exclude it. + + + + + A singleton implementation of . + + + Here are some examples of using this class: +

+ To create a scheduler that does not write anything to the database (is not + persistent), you can call : +

+
+            DirectSchedulerFactory.Instance.CreateVolatileScheduler(10); // 10 threads 
+            // don't forget to start the scheduler: 
+            DirectSchedulerFactory.Instance.GetScheduler().Start();
+            
+

+ Several create methods are provided for convenience. All create methods + eventually end up calling the create method with all the parameters: +

+
+            public void createScheduler(String schedulerName, string schedulerInstanceId, ThreadPool threadPool, JobStore jobStore, string rmiRegistryHost, int rmiRegistryPort)
+            
+

+ Here is an example of using this method: +

+
+            // create the thread pool 
+            SimpleThreadPool threadPool = new SimpleThreadPool(maxThreads, Thread.NORM_PRIORITY); 
+            threadPool.Initialize(); 
+            // create the job store 
+            JobStore jobStore = new RAMJobStore(); 
+            jobStore.Initialize();
+            
+            DirectSchedulerFactory.Instance.CreateScheduler("My Quartz Scheduler", "My Instance", threadPool, jobStore, "localhost", 1099); 
+            // don't forget to start the scheduler: 
+            DirectSchedulerFactory.Instance.GetScheduler("My Quartz Scheduler", "My Instance").start();
+            
+
> + Mohammad Rezaei + James House + + +
+ + + Provides a mechanism for obtaining client-usable handles to + instances. + + + + James House + + + + Returns a client-usable handle to a . + + + + + Returns a handle to the Scheduler with the given name, if it exists. + + + + + Returns handles to all known Schedulers (made by any SchedulerFactory + within this app domain.). + + + + + Initializes a new instance of the class. + + + + + Creates an in memory job store () + The thread priority is set to Thread.NORM_PRIORITY + + The number of threads in the thread pool + + + + Creates a proxy to a remote scheduler. This scheduler can be retrieved + via . + + SchedulerException + + + + Same as , + with the addition of specifying the scheduler name and instance ID. This + scheduler can only be retrieved via . + + The name for the scheduler. + The instance ID for the scheduler. + + SchedulerException + + + + Creates a scheduler using the specified thread pool and job store. This + scheduler can be retrieved via DirectSchedulerFactory#GetScheduler() + + + The thread pool for executing jobs + + + The type of job store + + SchedulerException + if initialization failed + + + + + Same as DirectSchedulerFactory#createScheduler(ThreadPool threadPool, JobStore jobStore), + with the addition of specifying the scheduler name and instance ID. This + scheduler can only be retrieved via DirectSchedulerFactory#getScheduler(String) + + The name for the scheduler. + The instance ID for the scheduler. + The thread pool for executing jobs + The type of job store + + + + Creates a scheduler using the specified thread pool and job store and + binds it to RMI. + + The name for the scheduler. + The instance ID for the scheduler. + The thread pool for executing jobs + The type of job store + The idle wait time. You can specify "-1" for + the default value, which is currently 30000 ms. + The db failure retry interval. + + + + Creates a scheduler using the specified thread pool and job store and + binds it to RMI. + + The name for the scheduler. + The instance ID for the scheduler. + The thread pool for executing jobs + The type of job store + + The idle wait time. You can specify TimeSpan.Zero for + the default value, which is currently 30000 ms. + The db failure retry interval. + + + + Returns a handle to the Scheduler produced by this factory. +

+ you must call createRemoteScheduler or createScheduler methods before + calling getScheduler() +

+
+ + SchedulerException +
+ + + Returns a handle to the Scheduler with the given name, if it exists. + + + + + Gets the log. + + The log. + + + + Gets the instance. + + The instance. + + +

+ Returns a handle to all known Schedulers (made by any + StdSchedulerFactory instance.). +

+
+
+ + + An implementation of the interface that remotely + proxies all method calls to the equivalent call on a given + instance, via remoting or similar technology. + + + + + James House + + + + This is the main interface of a Quartz Scheduler. + + + + A maintains a registry of + s and s. Once + registered, the is responsible for executing + s when their associated s + fire (when their scheduled time arrives). + + + instances are produced by a + . A scheduler that has already been + created/initialized can be found and used through the same factory that + produced it. After a has been created, it is in + "stand-by" mode, and must have its method + called before it will fire any s. + + + s are to be created by the 'client program', by + defining a class that implements the interface. + objects are then created (also by the client) to + define a individual instances of the . + instances can then be registered with the + via the %IScheduler.ScheduleJob(JobDetail, + Trigger)% or %IScheduler.AddJob(JobDetail, bool)% method. + + + s can then be defined to fire individual + instances based on given schedules. + s are most useful for one-time firings, or + firing at an exact moment in time, with N repeats with a given delay between + them. s allow scheduling based on time of day, + day of week, day of month, and month of year. + + + s and s have a name and + group associated with them, which should uniquely identify them within a single + . The 'group' feature may be useful for creating + logical groupings or categorizations of s and + s. If you don't have need for assigning a group to a + given s of s, then you can use + the constant defined on + this interface. + + + Stored s can also be 'manually' triggered through the + use of the %IScheduler.TriggerJob(string, string)% function. + + + Client programs may also be interested in the 'listener' interfaces that are + available from Quartz. The interface provides + notifications of executions. The + interface provides notifications of + firings. The + interface provides notifications of events and + errors. + + + The setup/configuration of a instance is very + customizable. Please consult the documentation distributed with Quartz. + + + + + + + + + + + + returns true if the given JobGroup + is paused + + + + + + + returns true if the given TriggerGroup + is paused + + + + + + + Get a object describiing the settings + and capabilities of the scheduler instance. + + + Note that the data returned is an 'instantaneous' snap-shot, and that as + soon as it's returned, the meta data values may be different. + + + + + Return a list of objects that + represent all currently executing Jobs in this Scheduler instance. + + +

+ This method is not cluster aware. That is, it will only return Jobs + currently executing in this Scheduler instance, not across the entire + cluster. +

+

+ Note that the list returned is an 'instantaneous' snap-shot, and that as + soon as it's returned, the true list of executing jobs may be different. + Also please read the doc associated with - + especially if you're using remoting. +

+
+ +
+ + + Get the names of all groups that are paused. + + + + + Get the global that has + the given name. + + Global job listener's name + + + + + Get the global that + has the given name. + + Global trigger listener's name + + + + + Starts the 's threads that fire s. + When a scheduler is first created it is in "stand-by" mode, and will not + fire triggers. The scheduler can also be put into stand-by mode by + calling the method. + + + The misfire/recovery process will be started, if it is the initial call + to this method on this scheduler instance. + + + + + + + + Calls after the indicated delay. + (This call does not block). This can be useful within applications that + have initializers that create the scheduler immediately, before the + resources needed by the executing jobs have been fully initialized. + + + + + + + + Temporarily halts the 's firing of s. + + +

+ When is called (to bring the scheduler out of + stand-by mode), trigger misfire instructions will NOT be applied + during the execution of the method - any misfires + will be detected immediately afterward (by the 's + normal process). +

+

+ The scheduler is not destroyed, and can be re-started at any time. +

+
+ + +
+ + + Halts the 's firing of s, + and cleans up all resources associated with the Scheduler. Equivalent to + . + + + The scheduler cannot be re-started. + + + + + + Halts the 's firing of s, + and cleans up all resources associated with the Scheduler. + + + The scheduler cannot be re-started. + + + if the scheduler will not allow this method + to return until all currently executing jobs have completed. + + + + + + Add the given to the + Scheduler, and associate the given with + it. + + + If the given Trigger does not reference any , then it + will be set to reference the Job passed with it into this method. + + + + + Schedule the given with the + identified by the 's settings. + + + + + Remove the indicated from the scheduler. + + + + + Remove (delete) the with the + given name, and store the new given one - which must be associated + with the same job (the new trigger must have the job name & group specified) + - however, the new trigger need not have the same name as the old trigger. + + + The name of the to be replaced. + + + The group name of the to be replaced. + + + The new to be stored. + + + if a with the given + name and group was not found and removed from the store, otherwise + the first fire time of the newly scheduled trigger. + + + + + Add the given to the Scheduler - with no associated + . The will be 'dormant' until + it is scheduled with a , or + is called for it. + + + The must by definition be 'durable', if it is not, + SchedulerException will be thrown. + + + + + Delete the identified from the Scheduler - and any + associated s. + + true if the Job was found and deleted. + + + + Trigger the identified + (Execute it now) - the generated trigger will be non-volatile. + + + + + Trigger the identified + (Execute it now) - the generated trigger will be volatile. + + + + + Trigger the identified + (Execute it now) - the generated trigger will be non-volatile. + + the name of the Job to trigger + the group name of the Job to trigger + + the (possibly ) JobDataMap to be + associated with the trigger that fires the job immediately. + + + + + Trigger the identified + (Execute it now) - the generated trigger will be volatile. + + the name of the Job to trigger + the group name of the Job to trigger + + the (possibly ) JobDataMap to be + associated with the trigger that fires the job immediately. + + + + + Pause the with the given + name - by pausing all of its current s. + + + + + Pause all of the s in the + given group - by pausing all of their s. + + + The Scheduler will "remember" that the group is paused, and impose the + pause on any new jobs that are added to the group while the group is + paused. + + + + + + Pause the with the given name. + + + + + Pause all of the s in the given group. + + + The Scheduler will "remember" that the group is paused, and impose the + pause on any new triggers that are added to the group while the group is + paused. + + + + + + Resume (un-pause) the with + the given name. + + + If any of the 's s missed one + or more fire-times, then the 's misfire + instruction will be applied. + + + + + Resume (un-pause) all of the s + in the given group. + + + If any of the s had s that + missed one or more fire-times, then the 's + misfire instruction will be applied. + + + + + + Resume (un-pause) the with the given + name. + + + If the missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + Resume (un-pause) all of the s in the + given group. + + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Pause all triggers - similar to calling + on every group, however, after using this method + must be called to clear the scheduler's state of 'remembering' that all + new triggers will be paused as they are added. + + + When is called (to un-pause), trigger misfire + instructions WILL be applied. + + + + + + + + Resume (un-pause) all triggers - similar to calling + on every group. + + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Get the names of all the s in the given group. + + + + + Get all s that are associated with the + identified . + + + + + Get the names of all the s in the given + group. + + + + + Get the for the + instance with the given name and group. + + + + + Get the instance with the given name and + group. + + + + + Get the current state of the identified . + + + + + + + + + + + Add (register) the given to the Scheduler. + + Name of the calendar. + The calendar. + if set to true [replace]. + whether or not to update existing triggers that + referenced the already existing calendar so that they are 'correct' + based on the new trigger. + + + + Delete the identified from the Scheduler. + + Name of the calendar. + + true if the Calendar was found and deleted. + + + + + Get the instance with the given name. + + + + + Get the names of all registered . + + An array of calendar names. + + + + Request the interruption, within this Scheduler instance, of all + currently executing instances of the identified , which + must be an implementor of the interface. + + +

+ If more than one instance of the identified job is currently executing, + the method will be called on + each instance. However, there is a limitation that in the case that + on one instances throws an exception, all + remaining instances (that have not yet been interrupted) will not have + their method called. +

+ +

+ If you wish to interrupt a specific instance of a job (when more than + one is executing) you can do so by calling + to obtain a handle + to the job instance, and then invoke on it + yourself. +

+

+ This method is not cluster aware. That is, it will only interrupt + instances of the identified InterruptableJob currently executing in this + Scheduler instance, not across the entire cluster. +

+
+ + + + true is at least one instance of the identified job was found and interrupted. + + + +
+ + + Add the given to the 's + global list. + + + Listeners in the 'global' list receive notification of execution events + for ALL s. + + + + + Add the given to the 's + list, of registered s. + + + + + Remove the given from the 's + list of global listeners. + + + true if the identifed listener was found in the list, and removed. + + + + + Remove the identifed from the 's + list of global listeners. + + Global job listener's name + true if the identifed listener was found in the list, and removed + + + + Remove the identifed from the 's + list of registered listeners. + + + true if the identifed listener was found in the list, and removed. + + + + + Get the non-global that has + the given name. + + + + + Add the given to the 's + global list. + + + Listeners in the 'global' list receive notification of execution events + for ALL s. + + + + + Add the given to the 's + list, of registered s. + + + + + Remove the given from the 's + list of global listeners. + + + true if the identifed listener was found in the list, and removed. + + + + + Remove the identifed from the 's + list of global listeners. + + The name. + true if the identifed listener was found in the list, and removed. + + + + Remove the identifed from the + 's list of registered listeners. + + + true if the identifed listener was found in the list, and removed. + + + + + Get the non-global that + has the given name. + + + + + Register the given with the + + + + + Remove the given from the + . + + true if the identifed listener was found in the list, and + removed. + + + + + Returns the name of the . + + + + + Returns the instance Id of the . + + + + + Returns the of the . + + + + + Reports whether the is in stand-by mode. + + + + + + + Reports whether the has been Shutdown. + + + + + Set the that will be responsible for producing + instances of classes. + + + JobFactories may be of use to those wishing to have their application + produce instances via some special mechanism, such as to + give the opertunity for dependency injection. + + + + + + Get the names of all known groups. + + + + + Get the names of all known groups. + + + + + Get the names of all registered s. + + + + + Get a List containing all of the s in + the 'sglobal list. + + + + + Get a Set containing the names of all the non-global + s registered with the . + + + + + Get a List containing all of the + s in the 'sglobal list. + + + + + Get a Set containing the names of all the non-global + s registered with the . + + + + + Get a List containing all of the + s registered with the . + + + + + Whether the scheduler has been started. + + + Note: This only reflects whether has ever + been called on this Scheduler, so it will return even + if the is currently in standby mode or has been + since shutdown. + + + + + + + + Construct a instance to proxy the given + RemoteableQuartzScheduler instance, and with the given + . + + + + + returns true if the given JobGroup + is paused + + + + + + + returns true if the given TriggerGroup + is paused + + + + + + + Get a object describiing the settings + and capabilities of the scheduler instance. +

+ Note that the data returned is an 'instantaneous' snap-shot, and that as + soon as it's returned, the meta data values may be different. +

+
+ +
+ + + Calls the equivalent method on the 'proxied' . + + + + + Get the global that has + the given name. + + + + + + + Get the global that + has the given name. + + + + + + + Get the names of all groups that are paused. + + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Get the names of all registered . + + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Remove the identifed from the 's + list of global listeners. + + + + true if the identifed listener was found in the list, and removed + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Remove the identifed from the 's + list of global listeners. + + The name. + + true if the identifed listener was found in the list, and removed. + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Returns the name of the . + + + + + Returns the instance Id of the . + + + + + Gets or sets the remote scheduler address. + + The remote scheduler address. + + + + Returns the of the . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Gets a value indicating whether this instance is paused. + + true if this instance is paused; otherwise, false. + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equialent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Set the that will be responsible for producing + instances of classes. +

+ JobFactories may be of use to those wishing to have their application + produce instances via some special mechanism, such as to + give the opertunity for dependency injection. +

+
+ + + SchedulerException +
+ + + Whether the scheduler has been started. + + + + Note: This only reflects whether has ever + been called on this Scheduler, so it will return even + if the is currently in standby mode or has been + since shutdown. + + + + + + + + Holds references to Scheduler instances - ensuring uniqueness, and + preventing garbage collection, and allowing 'global' lookups. + + James House + Marko Lahma (.NET) + + + + Binds the specified sched. + + The sched. + + + + Removes the specified sched name. + + Name of the sched. + + + + + Lookups the specified sched name. + + Name of the sched. + + + + + Lookups all. + + + + + + Gets the singleton instance. + + The instance. + + + + Responsible for creating the instances of + to be used within the instance. +

+ This implementation does not re-use any objects, it simply makes a new + JobRunShell each time is called. +

+
+ James House +
+ + + Initialize the factory, providing a handle to the + that should be made available within the and + the s within it, and a handle to the + that the shell will use in its own + operations with the . + + + + + Called by the to obtain instances of + . + + + + + Called by the to return instances of + . + + + + + An implementation of the interface that directly + proxies all method calls to the equivalent call on a given + instance. + + + + + James House + + + + returns true if the given JobGroup + is paused + + + + + + + returns true if the given TriggerGroup + is paused + + + + + + + Get a object describiing the settings + and capabilities of the scheduler instance. +

+ Note that the data returned is an 'instantaneous' snap-shot, and that as + soon as it's returned, the meta data values may be different. +

+
+ +
+ + + Calls the equivalent method on the 'proxied' . + + + + + + + + + Get the global that has + the given name. + + + + + + + Get the global that + has the given name. + + + + + + + Construct a instance to proxy the given + instance, and with the given . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Get the names of all registered . + + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Remove the identifed from the 's + list of global listeners. + + + + true if the identifed listener was found in the list, and removed + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Remove the identifed from the 's + list of global listeners. + + The name. + + true if the identifed listener was found in the list, and removed. + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Request the interruption, within this Scheduler instance, of all + currently executing instances of the identified , which + must be an implementor of the interface. + + +

+ If more than one instance of the identified job is currently executing, + the method will be called on + each instance. However, there is a limitation that in the case that + on one instances throws an exception, all + remaining instances (that have not yet been interrupted) will not have + their method called. +

+

+ If you wish to interrupt a specific instance of a job (when more than + one is executing) you can do so by calling + to obtain a handle + to the job instance, and then invoke on it + yourself. +

+

+ This method is not cluster aware. That is, it will only interrupt + instances of the identified InterruptableJob currently executing in this + Scheduler instance, not across the entire cluster. +

+
+ + + true is at least one instance of the identified job was found and interrupted. + UnableToInterruptJobException if the job does not implement + + +
+ + + Returns the name of the . + + + + + Returns the instance Id of the . + + + + + Returns the of the . + + + + + Whether the scheduler has been started. + + + + Note: This only reflects whether has ever + been called on this Scheduler, so it will return even + if the is currently in standby mode or has been + since shutdown. + + + + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' , + passing the associated with this + instance. + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + + + + + An implementation of that + does all of it's work of creating a instance + based on the contenents of a properties file. + + +

+ By default a properties are loaded from App.config's quartz section. + If that fails, then the "quartz.properties" + file located (as a embedded resource) in Quartz.dll is loaded. If you + wish to use a file other than these defaults, you must define the system + property 'quartz.properties' to point to the file you want. +

+ +

+ See the sample properties that are distributed with Quartz for + information about the various settings available within the file. +

+ +

+ Alternativly, you can explicitly Initialize the factory by calling one of + the methods before calling . +

+ +

+ Instances of the specified , + , classes will be created + by name, and then any additional properties specified for them in the config + file will be set on the instance by calling an equivalent 'set' method. For + example if the properties file contains the property 'quartz.jobStore. + myProp = 10' then after the JobStore class has been instantiated, the property + 'MyProp' will be set with the value. Type conversion to primitive CLR types + (int, long, float, double, boolean, enum and string) are performed before calling + the property's setter method. +

+
+ James House + Anthony Eden + Mohammad Rezaei + Marko Lahma (.NET) +
+ + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The props. + + + + Initialize the with + the contenents of a Properties file. + +

+ By default a properties file named "quartz.properties" is loaded from + the 'current working directory'. If that fails, then the + "quartz.properties" file located (as a resource) in the org/quartz + package is loaded. If you wish to use a file other than these defaults, + you must define the system property 'quartz.properties' to point to + the file you want. +

+
+
+ + + Creates a new name value collection and overrides its values + with system values (environment variables). + + The base properties to override. + A new NameValueCollection instance. + + + + Initialize the with + the contenents of the given Properties object. + + + + + + + + Returns a handle to the Scheduler produced by this factory. + + + + If one of the methods has not be previously + called, then the default (no-arg) method + will be called by this method. + + + +

+ Returns a handle to the Scheduler with the given name, if it exists (if + it has already been instantiated). +

+
+
+ + + Returns a handle to the default Scheduler, creating it if it does not + yet exist. + + + + + +

+ Returns a handle to all known Schedulers (made by any + StdSchedulerFactory instance.). +

+
+
+ + + Inspects a file and compares whether it's "last modified date" has changed + since the last time it was inspected. If the file has been updated, the + job invokes a "call-back" method on an identified + that can be found in the + . + + James House + + + + + A marker interface for s that + wish to have their state maintained between executions. + + + instances follow slightly different rules from + regular instances. The key difference is that their + associated is re-persisted after every + execution of the job, thus preserving state for the next execution. The + other difference is that stateful jobs are not allowed to Execute + concurrently, which means new triggers that occur before the completion of + the method will be delayed. + + + + + + James House + Marko Lahma (.NET) + + + + The interface to be implemented by classes which represent a 'job' to be + performed. + + + Instances of this interface must have a + no-argument constructor. provides a mechanism for 'instance member data' + that may be required by some implementations of this interface. + + + + + + James House + Marko Lahma (.NET) + + + + Called by the when a + fires that is associated with the . + + + The implementation may wish to set a result object on the + JobExecutionContext before this method exits. The result itself + is meaningless to Quartz, but may be informative to + s or + s that are watching the job's + execution. + + The execution context. + + + + Initializes a new instance of the class. + + + + + Called by the when a + fires that is associated with the . +

+ The implementation may wish to set a result object on the + JobExecutionContext before this method exits. The result itself + is meaningless to Quartz, but may be informative to + s or + s that are watching the job's + execution. +

+
+ The execution context. + + +
+ + + Gets the last modified date. + + Name of the file. + + + + + Gets the log. + + The log. + + + + Interface for objects wishing to receive a 'call-back' from a + . + + James House + + + + + Ãnforms that certain file has been updated. + + Name of the file. + + + + Built in job for executing native executables in a separate process. + + Matthew Payne + James House + Steinar Overbeck Cook + + + + Required parameter that specifies the name of the command (executable) + to be ran. + + + + + Optional parameter that specifies the parameters to be passed to the + executed command. + + + + + Optional parameter (value should be 'true' or 'false') that specifies + whether the job should wait for the execution of the native process to + complete before it completes. + +

Defaults to .

+
+
+ + + Optional parameter (value should be 'true' or 'false') that specifies + whether the spawned process's stdout and stderr streams should be + consumed. If the process creates output, it is possible that it might + 'hang' if the streams are not consumed. + +

Defaults to .

+
+
+ + + Optional parameter that specifies the workling directory to be used by + the executed command. + + + + + Initializes a new instance of the class. + + + + + Called by the when a + fires that is associated with the . +

+ The implementation may wish to set a result object on the + JobExecutionContext before this method exits. The result itself + is meaningless to Quartz, but may be informative to + s or + s that are watching the job's + execution. +

+
+ +
+ + + Gets the log. + + The log. + + + + Consumes data from the given input stream until EOF and prints the data to stdout + + cooste + James House + + + + Initializes a new instance of the class. + + The enclosing instance. + The input stream. + The type. + + + + Runs this object as a separate thread, printing the contents of the input stream + supplied during instantiation, to either Console. or stderr + + + + + An implementation of Job, that does absolutely nothing - useful for system + which only wish to use s + and s, rather than writing + Jobs that perform work. + + James House + + + + Do nothing. + + + + + A Job which sends an e-mail with the configured content to the configured + recipient. + + James House + Marko Lahma (.NET) + + + The host name of the smtp server. REQUIRED. + + + The e-mail address to send the mail to. REQUIRED. + + + The e-mail address to cc the mail to. Optional. + + + The e-mail address to claim the mail is from. REQUIRED. + + + The e-mail address the message should say to reply to. Optional. + + + The subject to place on the e-mail. REQUIRED. + + + The e-mail message body. REQUIRED. + + + + Executes the job. + + The job execution context. + + + + Holds a List of references to SchedulerListener instances and broadcasts all + events to them (in order). + + + This may be more convenient than registering all of the listeners + directly with the Scheduler, and provides the flexibility of easily changing + which listeners get notified. + + + + James House + + + + Construct an instance with the given List of listeners. + + The initial List of SchedulerListeners to broadcast to. + + + + Holds a List of references to JobListener instances and broadcasts all + events to them (in order) - if the event is not excluded via filtering + (read on). + + +

+ The broadcasting behavior of this listener to delegate listeners may be + more convenient than registering all of the listeners directly with the + Trigger, and provides the flexibility of easily changing which listeners + get notified. +

+ +

+ You may also register a number of Regular Expression patterns to match + the events against. If one or more patterns are registered, the broadcast + will only take place if the event applies to a job who's name/group + matches one or more of the patterns. +

+
+ + + + + + James House +
+ + Construct an instance with the given name. + + (Remember to add some delegate listeners!) + + @param name the name of this instance + + + Construct an instance with the given name, and List of listeners. + + @param name the name of this instance + @param listeners the initial List of JobListeners to broadcast to. + + + + If one or more name patterns are specified, only events relating to + jobs who's name matches the given regular expression pattern + will be dispatched to the delegate listeners. + + + + + + If one or more group patterns are specified, only events relating to + jobs who's group matches the given regular expression pattern + will be dispatched to the delegate listeners. + + + + + + Holds a List of references to TriggerListener instances and broadcasts all + events to them (in order) - if the event is not excluded via filtering + (read on). + + +

+ The broadcasting behavior of this listener to delegate listeners may be + more convenient than registering all of the listeners directly with the + Trigger, and provides the flexibility of easily changing which listeners + get notified. +

+ +

+ You may also register a number of Regular Expression patterns to match + the events against. If one or more patterns are registered, the broadcast + will only take place if the event applies to a trigger who's name/group + matches one or more of the patterns. +

+
+ + + + + + James House +
+ + + The interface to be implemented by classes that want to be informed when a + fires. In general, applications that use a + will not have use for this mechanism. + + + + + + James House + + + + Called by the when a + has fired, and it's associated + is about to be executed. +

+ It is called before the method of this + interface. +

+
+ The that has fired. + + The that will be passed to the 's method. + +
+ + + Called by the when a + has fired, and it's associated + is about to be executed. +

+ It is called after the method of this + interface. +

+
+ The that has fired. + The that will be passed to + the 's method. + Returns true if job execution should be vetoed, false otherwise. +
+ + + Called by the when a + has misfired. +

+ Consideration should be given to how much time is spent in this method, + as it will affect all triggers that are misfiring. If you have lots + of triggers misfiring at once, it could be an issue it this method + does a lot. +

+
+ The that has misfired. +
+ + + Called by the when a + has fired, it's associated + has been executed, and it's method has been + called. + + The that was fired. + + The that was passed to the + 's method. + + + The result of the call on the 's method. + + + + + Get the name of the . + + + + + Construct an instance with the given name. + + (Remember to add some delegate listeners!) + + the name of this instance + + + + Construct an instance with the given name, and List of listeners. + + the name of this instance + the initial List of TriggerListeners to broadcast to + + + + If one or more name patterns are specified, only events relating to + triggers who's name matches the given regular expression pattern + will be dispatched to the delegate listeners. + + + + + + If one or more group patterns are specified, only events relating to + triggers who's group matches the given regular expression pattern + will be dispatched to the delegate listeners. + + + + + + Keeps a collection of mappings of which Job to trigger after the completion + of a given job. If this listener is notified of a job completing that has a + mapping, then it will then attempt to trigger the follow-up job. This + achieves "job chaining", or a "poor man's workflow". + + +

+ Generally an instance of this listener would be registered as a global + job listener, rather than being registered directly to a given job. +

+

+ If for some reason there is a failure creating the trigger for the + follow-up job (which would generally only be caused by a rare serious + failure in the system, or the non-existence of the follow-up job), an error + messsage is logged, but no other action is taken. If you need more rigorous + handling of the error, consider scheduling the triggering of the flow-up + job within your job itself. +

+
+ James House +
+ + + A helpful abstract base class for implementors of . + + +

+ The methods in this class are empty so you only need to override the + subset for the events you care about. +

+ +

+ You are required to implement + to return the unique name of your . +

+
+ +
+ + + Initializes a new instance of the class. + + + + + Called by the when a + is about to be executed (an associated + has occured). +

+ This method will not be invoked if the execution of the Job was vetoed + by a . +

+
+ + +
+ + + Called by the when a + was about to be executed (an associated + has occured), but a vetoed it's + execution. + + + + + + + Called by the after a + has been executed, and be for the associated 's + method has been called. + + + + + + + Get the for this class's category. + This should be used by subclasses for logging. + + + + + Get the name of the . + + + + + + Construct an instance with the given name. + + The name of this instance. + + + + Add a chain mapping - when the Job identified by the first key completes + the job identified by the second key will be triggered. + + a Key with the name and group of the first job + a Key with the name and group of the follow-up job + + + + A helpful abstract base class for implementors of + . + + +

+ The methods in this class are empty so you only need to override the + subset for the events + you care about. +

+ +

+ You are required to implement + to return the unique name of your . +

+
+ +
+ + + Get the for this + class's category. This should be used by subclasses for logging. + + + + + Get the name of the . + + + + + + Logs a history of all job executions (and execution vetos) via common + logging. + + +

+ The logged message is customizable by setting one of the following message + properties to a string that conforms to the syntax of . +

+

+ JobToBeFiredMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Job's Name.
1StringThe Job's Group.
2DateThe current time.
3StringThe Trigger's name.
4StringThe Triggers's group.
5DateThe scheduled fire time.
6DateThe next scheduled fire time.
7IntegerThe re-fire count from the JobExecutionContext.
+ The default message text is "Job {1}.{0} fired (by trigger {4}.{3}) at: + {2, date, HH:mm:ss MM/dd/yyyy" +

+

+ JobSuccessMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Job's Name.
1StringThe Job's Group.
2DateThe current time.
3StringThe Trigger's name.
4StringThe Triggers's group.
5DateThe scheduled fire time.
6DateThe next scheduled fire time.
7IntegerThe re-fire count from the JobExecutionContext.
8ObjectThe string value (toString() having been called) of the result (if any) + that the Job set on the JobExecutionContext, with on it. "NULL" if no + result was set.
+ The default message text is "Job {1}.{0} execution complete at {2, date, + HH:mm:ss MM/dd/yyyy} and reports: {8" +

+

+ JobFailedMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Job's Name.
1StringThe Job's Group.
2DateThe current time.
3StringThe Trigger's name.
4StringThe Triggers's group.
5DateThe scheduled fire time.
6DateThe next scheduled fire time.
7IntegerThe re-fire count from the JobExecutionContext.
8StringThe message from the thrown JobExecution Exception. +
+ The default message text is "Job {1}.{0} execution failed at {2, date, + HH:mm:ss MM/dd/yyyy} and reports: {8" +

+

+ JobWasVetoedMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Job's Name.
1StringThe Job's Group.
2DateThe current time.
3StringThe Trigger's name.
4StringThe Triggers's group.
5DateThe scheduled fire time.
6DateThe next scheduled fire time.
7IntegerThe re-fire count from the JobExecutionContext.
+ The default message text is "Job {1}.{0} was vetoed. It was to be fired + (by trigger {4}.{3}) at: {2, date, HH:mm:ss MM/dd/yyyy" +

+
+
+ + + Provides an interface for a class to become a "plugin" to Quartz. + + + Plugins can do virtually anything you wish, though the most interesting ones + will obviously interact with the scheduler in some way - either actively: by + invoking actions on the scheduler, or passively: by being a , + , and/or . +

+ If you use to + Initialize your Scheduler, it can also create and Initialize your plugins - + look at the configuration docs for details. +

+

+ If you need direct access your plugin, you can have it explicitly put a + reference to itself in the 's + as part of its + method. +

+
+ James House +
+ + + Called during creation of the in order to give + the a chance to Initialize. + + + At this point, the Scheduler's is not yet +

+ If you need direct access your plugin, you can have it explicitly put a + reference to itself in the 's + as part of its + method. +

+
+ + The name by which the plugin is identified. + + + The scheduler to which the plugin is registered. + +
+ + + Called when the associated is started, in order + to let the plug-in know it can now make calls into the scheduler if it + needs to. + + + + + Called in order to inform the that it + should free up all of it's resources because the scheduler is shutting + down. + + + + + Called during creation of the in order to give + the a chance to Initialize. + + + + + Called when the associated is started, in order + to let the plug-in know it can now make calls into the scheduler if it + needs to. + + + + + Called in order to inform the that it + should free up all of it's resources because the scheduler is shutting + down. + + + + + Called by the when a is + about to be executed (an associated has occurred). + + This method will not be invoked if the execution of the Job was vetoed by a + . + + + + + + + Called by the after a + has been executed, and be for the associated 's + method has been called. + + + + + + + Called by the when a + was about to be executed (an associated + has occured), but a vetoed it's + execution. + + + + + + + Logger instance to use. Defaults to common logging. + + + + + Get or sets the message that is logged when a Job successfully completes its + execution. + + + + + Get or sets the message that is logged when a Job fails its + execution. + + + + + Gets or sets the message that is logged when a Job is about to Execute. + + + + + Gets or sets the message that is logged when a Job execution is vetoed by a + trigger listener. + + + + + Get the name of the . + + + + + + Logs a history of all trigger firings via the Jakarta Commons-Logging + framework. + + +

+ The logged message is customizable by setting one of the following message + properties to a string that conforms to the syntax of . +

+ +

+ TriggerFiredMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Trigger's Name.
1StringThe Trigger's Group.
2DateThe scheduled fire time.
3DateThe next scheduled fire time.
4DateThe actual fire time.
5StringThe Job's name.
6StringThe Job's group.
7IntegerThe re-fire count from the JobExecutionContext.
+ + The default message text is "Trigger {1}.{0} fired job {6}.{5} at: {4, + date, HH:mm:ss MM/dd/yyyy" +

+ +

+ TriggerMisfiredMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Trigger's Name.
1StringThe Trigger's Group.
2DateThe scheduled fire time.
3DateThe next scheduled fire time.
4DateThe actual fire time. (the time the misfire was detected/handled)
5StringThe Job's name.
6StringThe Job's group.
+ + The default message text is "Trigger {1}.{0} misfired job {6}.{5} at: + {4, date, HH:mm:ss MM/dd/yyyy}. Should have fired at: {3, date, HH:mm:ss + MM/dd/yyyy" +

+ +

+ TriggerCompleteMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Trigger's Name.
1StringThe Trigger's Group.
2DateThe scheduled fire time.
3DateThe next scheduled fire time.
4DateThe job completion time.
5StringThe Job's name.
6StringThe Job's group.
7IntegerThe re-fire count from the JobExecutionContext.
8IntegerThe trigger's resulting instruction code.
9StringA human-readable translation of the trigger's resulting instruction + code.
+ + The default message text is "Trigger {1}.{0} completed firing job + {6}.{5} at {4, date, HH:mm:ss MM/dd/yyyy} with resulting trigger instruction + code: {9" +

+
+ James House +
+ + + Called during creation of the in order to give + the a chance to Initialize. + + + + + Called when the associated is started, in order + to let the plug-in know it can now make calls into the scheduler if it + needs to. + + + + + Called in order to inform the that it + should free up all of it's resources because the scheduler is shutting + down. + + + + + Called by the when a + has fired, and it's associated + is about to be executed. +

+ It is called before the method of this + interface. +

+
+ The that has fired. + The that will be passed to the 's method. +
+ + + Called by the when a + has misfired. +

+ Consideration should be given to how much time is spent in this method, + as it will affect all triggers that are misfiring. If you have lots + of triggers misfiring at once, it could be an issue it this method + does a lot. +

+
+ The that has misfired. +
+ + + Called by the when a + has fired, it's associated + has been executed, and it's method has been + called. + + The that was fired. + The that was passed to the + 's method. + The result of the call on the 's method. + + + + Called by the when a + has fired, and it's associated + is about to be executed. +

+ It is called after the method of this + interface. +

+
+ The that has fired. + The that will be passed to + the 's method. + +
+ + + Logger instance to use. Defaults to common logging. + + + + + Get or set the message that is printed upon the completion of a trigger's + firing. + + + + + Get or set the message that is printed upon a trigger's firing. + + + + + Get or set the message that is printed upon a trigger's mis-firing. + + + + + Get the name of the . + + + + + + This plugin catches the event of the VM terminating (such as upon a CRTL-C) + and tells the scheuler to Shutdown. + + + James House + + + + Called during creation of the in order to give + the a chance to Initialize. + + + + + Called when the associated is started, in order + to let the plug-in know it can now make calls into the scheduler if it + needs to. + + + + + Called in order to inform the that it + should free up all of it's resources because the scheduler is shutting + down. + + + + + Determine whether or not the plug-in is configured to cause a clean + Shutdown of the scheduler. +

+ The default value is . +

+
+ +
+ + + Attribute to use with public properties that + can be set with Quartz configuration. Attribute can be used to advice + parsing to use correct type of time span (milliseconds, seconds, minutes, hours) + as it may depend on property. + + + + + + Initializes a new instance of the class. + + The rule. + + + + Gets the rule. + + The rule. + + + + Possible parse rules for s. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This plugin loads XML file(s) to add jobs and schedule them with triggers + as the scheduler is initialized, and can optionally periodically scan the + file for changes. + + + The periodically scanning of files for changes is not currently supported in a + clustered environment. + + James House + Pierre Awaragi + + + + Initializes a new instance of the class. + + + + + + + + + + + Called during creation of the in order to give + the a chance to initialize. + + The name. + The scheduler. + SchedulerConfigException + + + + Called when the associated is started, in order + to let the plug-in know it can now make calls into the scheduler if it + needs to. + + + + Helper method for generating unique job/trigger name for the + file scanning jobs (one per FileJob). The unique names are saved + in jobTriggerNameSet. + + + + Called in order to inform the that it + should free up all of it's resources because the scheduler is shutting + down. + + + + + Gets the log. + + The log. + + + + Comma separated list of file names (with paths) to the XML files that should be read. + + + + + Whether or not jobs defined in the XML file should be overwrite existing + jobs with the same name. + + + + + The interval at which to scan for changes to the file. + If the file has been changed, it is re-loaded and parsed. The default + value for the interval is 0, which disables scanning. + + + + + Whether or not initialization of the plugin should fail (throw an + exception) if the file cannot be found. Default is . + + + + + Whether or not the XML should be validated. Default is . + + + + + Whether or not the XML schema should be validated. Default is . + + + + + A uses all of the + types that are found in this package in its attempts to load a class, when + one scheme is found to work, it is promoted to the scheme that will be used + first the next time a class is loaded (in order to improve perfomance). + + + This approach is used because of the wide variance in class loader behavior + between the various environments in which Quartz runs (e.g. disparate + application servers, stand-alone, mobile devices, etc.). Because of this + disparity, Quartz ran into difficulty with a one class-load style fits-all + design. Thus, this class loader finds the approach that works, then + 'remembers' it. + + James House + + + + Called to give the ClassLoadHelper a chance to Initialize itself, + including the oportunity to "steal" the class loader off of the calling + thread, which is the thread that is initializing Quartz. + + + + + Return the class with the given name. + + + + Finds a resource with a given name. This method returns null if no + resource with this name is found. + + name of the desired resource + + a java.net.URL object + + + + Finds a resource with a given name. This method returns null if no + resource with this name is found. + + name of the desired resource + + a java.io.InputStream object + + + + + that names the scheduler instance using + just the machine hostname. +

+ This class is useful when you know that your scheduler instance will be the + only one running on a particular machine. Each time the scheduler is + restarted, it will get the same instance id as long as the machine is not + renamed. +

+ +
+ + +
+ + + An IInstanceIdGenerator is responsible for generating the clusterwide unique + instance id for a nodde. +

+ This interface may be of use to those wishing to have specific control over + the mechanism by which the instances in their + application are named. +

+ +
+ +
+ + Generate the instance id for a + + + The clusterwide unique instance id. + + + + + Generate the instance id for a + + The clusterwide unique instance id. + + + + A that uses either the loader of it's own + class. + + + + + James House + + + + Called to give the ClassLoadHelper a chance to Initialize itself, + including the oportunity to "steal" the class loader off of the calling + thread, which is the thread that is initializing Quartz. + + + + Return the class with the given name. + + + Finds a resource with a given name. This method returns null if no + resource with this name is found. + + name of the desired resource + + a java.net.URL object + + + + Finds a resource with a given name. This method returns null if no + resource with this name is found. + + name of the desired resource + + a java.io.InputStream object + + + + + A JobFactory that instantiates the Job instance (using the default no-arg + constructor, or more specifically: ), and + then attempts to set all values in the 's + onto bean properties of the . + + + + + + + James Houser + Marko Lahma (.NET) + + + + The default JobFactory used by Quartz - simply calls + on the job class. + + + + James House + Marko Lahma (.NET) + + + + A JobFactory is responsible for producing instances of + classes. + + + This interface may be of use to those wishing to have their application + produce instances via some special mechanism, such as to + give the opertunity for dependency injection. + + + + + James House + + + + Called by the scheduler at the time of the trigger firing, in order to + produce a instance on which to call Execute. + + +

+ It should be extremely rare for this method to throw an exception - + basically only the the case where there is no way at all to instantiate + and prepare the Job for execution. When the exception is thrown, the + Scheduler will move all triggers associated with the Job into the + state, which will require human + intervention (e.g. an application restart after fixing whatever + configuration problem led to the issue wih instantiating the Job. +

+ +
+ + The TriggerFiredBundle from which the + and other info relating to the trigger firing can be obtained. + + SchedulerException if there is a problem instantiating the Job. + the newly instantiated Job + +
+ + + Called by the scheduler at the time of the trigger firing, in order to + produce a instance on which to call Execute. + + + It should be extremely rare for this method to throw an exception - + basically only the the case where there is no way at all to instantiate + and prepare the Job for execution. When the exception is thrown, the + Scheduler will move all triggers associated with the Job into the + state, which will require human + intervention (e.g. an application restart after fixing whatever + configuration problem led to the issue wih instantiating the Job. + + The TriggerFiredBundle from which the + and other info relating to the trigger firing can be obtained. + the newly instantiated Job + SchedulerException if there is a problem instantiating the Job. + + + + Called by the scheduler at the time of the trigger firing, in order to + produce a instance on which to call Execute. + + +

+ It should be extremely rare for this method to throw an exception - + basically only the the case where there is no way at all to instantiate + and prepare the Job for execution. When the exception is thrown, the + Scheduler will move all triggers associated with the Job into the + state, which will require human + intervention (e.g. an application restart after fixing whatever + configuration problem led to the issue wih instantiating the Job. +

+
+ The TriggerFiredBundle from which the + and other info relating to the trigger firing can be obtained. + the newly instantiated Job + SchedulerException if there is a problem instantiating the Job. +
+ + + Sets the object properties. + + The object to set properties to. + The data to set. + + + + Whether the JobInstantiation should fail and throw and exception if + a key (name) and value (type) found in the JobDataMap does not + correspond to a proptery setter on the Job class. + + + + + Get or set whether a warning should be logged if + a key (name) and value (type) found in the JobDataMap does not + correspond to a proptery setter on the Job class. + + + + + This class implements a that + utilizes RAM as its storage device. +

+ As you should know, the ramification of this is that access is extrememly + fast, but the data is completely volatile - therefore this + should not be used if true persistence between program shutdowns is + required. +

+
+ James House + Sharada Jambula + Marko Lahma (.NET) +
+ + + Initializes a new instance of the class. + + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + Called by the QuartzScheduler to inform the that + the scheduler has started. + + + + + Called by the QuartzScheduler to inform the that + it should free up all of it's resources because the scheduler is + shutting down. + + + + + Store the given and . + + The scheduling context. + The to be stored. + The to be stored. + + + + Returns true if the given job group is paused. + + + Job group name + + + + + returns true if the given TriggerGroup is paused. + + + + + + + + Store the given . + + The scheduling context. + The to be stored. + If , any existing in the + with the same name and group should be + over-written. + + + + Remove (delete) the with the given + name, and any s that reference + it. + + The scheduling context. + The name of the to be removed. + The group name of the to be removed. + + if a with the given name and + group was found and removed from the store. + + + + + Remove (delete) the with the + given name. + + The scheduling context. + The name of the to be removed. + The group name of the to be removed. + + if a with the given + name and group was found and removed from the store. + + + + + Store the given . + + The scheduling context. + The to be stored. + If , any existing in + the with the same name and group should + be over-written. + + + + Remove (delete) the with the + given name. + + The scheduling context. + The name of the to be removed. + The group name of the to be removed. + + if a with the given + name and group was found and removed from the store. + + Whether to delete orpahaned job details from scheduler if job becomes orphaned from removing the trigger. + + + + Replaces the trigger. + + The scheduling context. + Name of the trigger. + Name of the group. + The new trigger. + + + + + Retrieve the for the given + . + + The scheduling context. + The name of the to be retrieved. + The group name of the to be retrieved. + + The desired , or null if there is no match. + + + + + Retrieve the given . + + The scheduling context. + The name of the to be retrieved. + The group name of the to be retrieved. + + The desired , or null if there is no match. + + + + + Get the current state of the identified . + + + + + + + + + + + Store the given . + + The scheduling context. + The name. + The to be stored. + If , any existing + in the with the same name and group + should be over-written. + If , any s existing + in the that reference an existing + Calendar with the same name with have their next fire time + re-computed with the new . + + + + Remove (delete) the with the + given name. +

+ If removal of the would result in + s pointing to non-existent calendars, then a + will be thrown.

+
+ The scheduling context. + The name of the to be removed. + + if a with the given name + was found and removed from the store. + +
+ + + Retrieve the given . + + The scheduling context. + The name of the to be retrieved. + + The desired , or null if there is no match. + + + + + Get the number of s that are + stored in the . + + + + + Get the number of s that are + stored in the . + + + + + Get the number of s that are + stored in the . + + + + + Get the names of all of the s that + have the given group name. + + + + + Get the names of all of the s + in the . +

+ If there are no ICalendars in the given group name, the result should be + a zero-length array (not ). +

+
+
+ + + Get the names of all of the s + that have the given group name. + + + + + Get the names of all of the + groups. + + + + + Get the names of all of the groups. + + + + + Get all of the Triggers that are associated to the given Job. +

+ If there are no matches, a zero-length array should be returned. +

+
+
+ + + Gets the trigger wrappers for job. + + Name of the job. + Name of the group. + + + + + Gets the trigger wrappers for calendar. + + Name of the cal. + + + + + Pause the with the given name. + + + + + Pause all of the s in the given group. +

+ The JobStore should "remember" that the group is paused, and impose the + pause on any new triggers that are added to the group while the group is + paused. +

+
+
+ + + Pause the with the given + name - by pausing all of its current s. + + + + + Pause all of the s in the + given group - by pausing all of their s. +

+ The JobStore should "remember" that the group is paused, and impose the + pause on any new jobs that are added to the group while the group is + paused. +

+
+
+ + + Resume (un-pause) the with the given name. + + + If the missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + Resume (un-pause) all of the s in the + given group. +

+ If any missed one or more fire-times, then the + 's misfire instruction will be applied. +

+
+
+ + + Resume (un-pause) the with + the given name. +

+ If any of the 's s missed one + or more fire-times, then the 's misfire + instruction will be applied. +

+
+
+ + + Resume (un-pause) all of the s + in the given group. +

+ If any of the s had s that + missed one or more fire-times, then the 's + misfire instruction will be applied. +

+
+
+ + + Pause all triggers - equivalent of calling + on every group. +

+ When is called (to un-pause), trigger misfire + instructions WILL be applied. +

+
+ +
+ + + Resume (un-pause) all triggers - equivalent of calling + on every trigger group and setting all job groups unpaused />. +

+ If any missed one or more fire-times, then the + 's misfire instruction will be applied. +

+
+ +
+ + + Applies the misfire. + + The trigger wrapper. + + + + + Get a handle to the next trigger to be fired, and mark it as 'reserved' + by the calling scheduler. + + + + + + Inform the that the scheduler no longer plans to + fire the given , that it had previously acquired + (reserved). + + + + + Inform the that the scheduler is now firing the + given (executing its associated ), + that it had previously acquired (reserved). + + + + + Inform the that the scheduler has completed the + firing of the given (and the execution its + associated ), and that the + in the given should be updated if the + is stateful. + + + + + Sets the state of all triggers of job to specified state. + + Name of the job. + The job group. + The internal state to set. + + + + Peeks the triggers. + + + + + + + + + The time span by which a trigger must have missed its + next-fire-time, in order for it to be considered "misfired" and thus + have its misfire instruction applied. + + + + + Gets the fired trigger record id. + + The fired trigger record id. + + + + Returns whether this instance supports persistence. + + + + + + + Comparer for triggers. + + + + + Possible internal trigger states + in RAMJobStore + + + + + Waiting + + + + + Acquired + + + + + Executing + + + + + Complete + + + + + Paused + + + + + Blocked + + + + + Paused and Blocked + + + + + Error + + + + + Helper wrapper class + + + + + The key used + + + + + Job's key + + + + + The trigger + + + + + Current state + + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + + Serves as a hash function for a particular type. is suitable for use in hashing algorithms and data structures like a hash table. + + + A hash code for the current . + + + + + Gets the trigger + + The trigger + + + + Scheduler exporter that exports scheduler to remoting context. + + Marko Lahma + + + + Service interface for scheduler exporters. + + Marko Lahma + + + + Binds (exports) scheduler to external context. + + + + + + Unbinds scheduler from external context. + + + + + + Registers remoting channel if needed. This is determined + by checking whether there is a positive value for port. + + + + + Gets or sets the port used for remoting. + + + + + Gets or sets the name to use when exporting + scheduler to remoting context. + + + + + Sets the channel type when registering remoting. + + + + + + Sets the used when + exporting to remoting context. Defaults to + . + + + + + A that simply calls . + + + + James House + + + + Called to give the ClassLoadHelper a chance to Initialize itself, + including the oportunity to "steal" the class loader off of the calling + thread, which is the thread that is initializing Quartz. + + + + Return the class with the given name. + + + + Finds a resource with a given name. This method returns null if no + resource with this name is found. + + name of the desired resource + + a Uri object + + + + Finds a resource with a given name. This method returns null if no + resource with this name is found. + + name of the desired resource + + a Stream object + + + + + The default InstanceIdGenerator used by Quartz when instance id is to be + automatically generated. Instance id is of the form HOSTNAME + CURRENT_TIME. + + + + + + + + + Generate the instance id for a + + The clusterwide unique instance id. + + + + This is class is a simple implementation of a thread pool, based on the + interface. +

+ objects are sent to the pool with the + method, which blocks until a becomes available. +

+ +

+ The pool has a fixed number of s, and does not grow or + shrink based on demand. +

+
+ James House + Juergen Donnerstag +
+ + + The interface to be implemented by classes that want to provide a thread + pool for the 's use. + + + implementation instances should ideally be made + for the sole use of Quartz. Most importantly, when the method + returns a value of 1 or greater, + there must still be at least one available thread in the pool when the + method is called a few moments (or + many moments) later. If this assumption does not hold true, it may + result in extra JobStore queries and updates, and if clustering features + are being used, it may result in greater imballance of load. + + + James House + + + + Execute the given in the next + available . + + + The implementation of this interface should not throw exceptions unless + there is a serious problem (i.e. a serious misconfiguration). If there + are no available threads, rather it should either queue the Runnable, or + block until a thread is available, depending on the desired strategy. + + + + + Determines the number of threads that are currently available in in + the pool. Useful for determining the number of times + can be called before returning + false. + + + The implementation of this method should block until there is at + least one available thread. + + the number of currently available threads + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + Called by the QuartzScheduler to inform the + that it should free up all of it's resources because the scheduler is + shutting down. + + + + + Gets the size of the pool. + + The size of the pool. + + + + Create a new (unconfigured) . + + + + + Create a new with the specified number + of s that have the given priority. + + + the number of worker s in the pool, must + be > 0. + + + the thread priority for the worker threads. + + + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + Terminate any worker threads in this thread group. + Jobs currently in progress will complete. + + + + + Run the given object in the next available + . If while waiting the thread pool is asked to + shut down, the Runnable is executed immediately within a new additional + thread. + + The to be added. + + + + Creates the worker threads. + + The thread count. + + + + + Terminate any worker threads in this thread group. + Jobs currently in progress will complete. + + + + + Gets or sets the number of worker threads in the pool. + Set has no effect after has been called. + + + + + Get or set the thread priority of worker threads in the pool. + Set operation has no effect after has been called. + + + + + Gets or sets the thread name prefix. + + The thread name prefix. + + + + Gets or sets the value of makeThreadsDaemons. + + + + + Gets the size of the pool. + + The size of the pool. + + + + A Worker loops, waiting to Execute tasks. + + + + + Create a worker thread and start it. Waiting for the next Runnable, + executing it, and waiting for the next Runnable, until the Shutdown + flag is set. + + + + + Create a worker thread, start it, Execute the runnable and terminate + the thread (one time execution). + + + + + Signal the thread that it should terminate. + + + + + Loop, executing targets as they are received. + + + + + This is class is a simple implementation of a zero size thread pool, based on the + {@link org.quartz.spi.ThreadPool} interface. + + + The pool has zero s and does not grow or shrink based on demand. + Which means it is obviously not useful for most scenarios. When it may be useful + is to prevent creating any worker threads at all - which may be desirable for + the sole purpose of preserving system resources in the case where the scheduler + instance only exists in order to schedule jobs, but which will never execute + jobs (e.g. will never have Start() called on it). + + Wayne Fay + + + + Initializes a new instance of the class. + + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + Shutdowns this instance. + + + + + Called by the QuartzScheduler to inform the + that it should free up all of it's resources because the scheduler is + shutting down. + + + + + + Execute the given in the next + available . + + + + + The implementation of this interface should not throw exceptions unless + there is a serious problem (i.e. a serious misconfiguration). If there + are no available threads, rather it should either queue the Runnable, or + block until a thread is available, depending on the desired strategy. + + + + + Determines the number of threads that are currently available in in + the pool. Useful for determining the number of times + can be called before returning + false. + + + the number of currently available threads + + + The implementation of this method should block until there is at + least one available thread. + + + + + Gets the log. + + The log. + + + + Gets the size of the pool. + + The size of the pool. + + + + A simple class (structure) used for returning execution-time data from the + JobStore to the . + + + James House + + + + Initializes a new instance of the class. + + The job. + The trigger. + The calendar. + if set to true [job is recovering]. + The fire time. + The scheduled fire time. + The previous fire time. + The next fire time. + + + + Gets the job detail. + + The job detail. + + + + Gets the trigger. + + The trigger. + + + + Gets the calendar. + + The calendar. + + + + Gets a value indicating whether this is recovering. + + true if recovering; otherwise, false. + + + + Returns the UTC fire time. + + + + + Gets the next UTC fire time. + + The next fire time. + Returns the nextFireTimeUtc. + + + + Gets the previous UTC fire time. + + The previous fire time. + Returns the previous fire time. + + + + Returns the scheduled UTC fire time. + + + + + DateTime related utility methods. + + + + + Assumes that given input is in UTC and sets the kind to be UTC. + Just a precaution if somebody does not set it explicitly. + This only works in .NET Framework 2.0 onwards. + + The datetime to check. + DateTime with kind set to UTC. + + + + Assumes that given input is in UTC and sets the kind to be UTC. + Just a precaution if somebody does not set it explicitly. + + The datetime to check. + DateTime with kind set to UTC. + + + + Manages a collection of IDbProviders, and provides transparent access + to their database. + + + James House + Sharada Jambula + Mohammad Rezaei + + + + Private constructor + + + + + Adds the connection provider. + + Name of the data source. + The provider. + + + + Get a database connection from the DataSource with the given name. + + a database connection + + + + Shuts down database connections from the DataSource with the given name, + if applicable for the underlying provider. + + a database connection + + + + Gets the db provider. + + Name of the ds. + + + + + Get the class instance. + + an instance of this class + + + + + An implementation of that wraps another + and flags itself 'dirty' when it is modified. + + James House + + + + Create a DirtyFlagMap that 'wraps' a . + + + + + Create a DirtyFlagMap that 'wraps' a that has the + given initial capacity. + + + + + Create a DirtyFlagMap that 'wraps' a that has the + given initial capacity and load factor. + + + + + Creates a new object that is a copy of the current instance. + + + A new object that is a copy of this instance. + + + + + When implemented by a class, removes all elements from the . + + + The is read-only. + + + + + When implemented by a class, determines whether the contains an element with the specified key. + + The key to locate in the . + + if the contains an element with the key; otherwise, . + + + is . + + + + When implemented by a class, removes the element with the + specified key from the . + + The key of the element to remove. + + is . + + The is read-only. + -or- + The has a fixed size. + + + + + When implemented by a class, returns an + for the . + + + An for the . + + + + + When implemented by a class, adds an element with the provided key and value to the . + + The to use as the key of the element to add. + The to use as the value of the element to add. + is . + + An element with the same key already exists in the . + + + The is read-only. + -or- + The has a fixed size. + + + + + When implemented by a class, copies the elements of + the to an , starting at a particular index. + + The one-dimensional that is the destination of the elements copied from . The must have zero-based indexing. + The zero-based index in at which copying begins. + + is . + + is less than zero. + + + is multidimensional. + -or- + + is equal to or greater than the length of . + -or- + The number of elements in the source is greater than the available space from to the end of the destination . + + The type of the source cannot be cast automatically to the type of the destination . + + + + Clear the 'dirty' flag (set dirty flag to ). + + + + + Determines whether the specified obj contains value. + + The obj. + + true if the specified obj contains value; otherwise, false. + + + + + Gets the entries as a set. + + + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + if the specified is equal to the + current ; otherwise, . + + + + + Serves as a hash function for a particular type, suitable + for use in hashing algorithms and data structures like a hash table. + + + A hash code for the current . + + + + + Gets keyset for this map. + + + + + + Puts the value behind a specified key. + + The key. + The val. + + + + + Puts all. + + The t. + + + + Determine whether the is flagged dirty. + + + + + Get a direct handle to the underlying Map. + + + + + Gets a value indicating whether this instance is empty. + + true if this instance is empty; otherwise, false. + + + + Gets or sets the with the specified key. + + + + + + When implemented by a class, gets the number of + elements contained in the . + + + + + + When implemented by a class, gets an containing the values in the . + + + + + + When implemented by a class, gets an containing the keys of the . + + + + + + When implemented by a class, gets a value indicating whether the + is read-only. + + + + + + When implemented by a class, gets a value indicating whether the + has a fixed size. + + + + + + When implemented by a class, gets an object that + can be used to synchronize access to the . + + + + + + When implemented by a class, gets a value + indicating whether access to the is synchronized + (thread-safe). + + + + + + Utility class for file handling related things. + + + + + Resolves file to actual file if for example relative '~' used. + + File name to check + Expanded file name or actual no resolving was done. + + + + object representing a job or trigger key. + + Jeffrey Wescott + + + + + Utility class for storing two pieces of information together. + + Jeffrey Wescott + + + + Test equality of this object with that. + + object to compare + true if objects are equal, false otherwise + + + + Serves as a hash function for a particular type. is suitable for use in hashing algorithms and data structures like a hash table. + + + A hash code for the current . + + + + + Get or sets the first object in the pair. + + + + + Get or sets the second object in the pair. + + + + Construct a new key with the given name and group. + + + + the name + + + the group + + + +

+ Return the string representation of the key. The format will be: + <group>.<name>. +

+ +
+ the string representation of the key + +
+ + + Get the name portion of the key. + + the name + + + +

+ Get the group portion of the key. +

+ +
+ the group + +
+ + + Wrapper class to access thread local data. + Data is either accessed from thread or HTTP Context's + data if HTTP Context is avaiable. + + Marko Lahma (.NET) + + + + Retrieves an object with the specified name. + + The name of the item. + The object in the call context associated with the specified name or null if no object has been stored previously + + + + Stores a given object and associates it with the specified name. + + The name with which to associate the new item. + The object to store in the call context. + + + + Empties a data slot with the specified name. + + The name of the data slot to empty. + + + + Utility methods that are used to convert objects from one type into another. + + Aleksandar Seovic + + + + Convert the value to the required (if necessary from a string). + + The proposed change value. + + The we must convert to. + + The new value, possibly the result of type conversion. + + + + Determines whether value is assignable to required type. + + The value to check. + Type of the required. + + true if value can be assigned as given type; otherwise, false. + + + + + Instantiates an instance of the type specified. + + The type to instantiate. + + + + + Sets the object properties using reflection. + + The object to set values to. + The properties to set to object. + + + + This is an utility class used to parse the properties. + + James House + + + + Initializes a new instance of the class. + + The props. + + + + Gets the string property. + + The name. + + + + + Gets the string property. + + The name. + The default value. + + + + + Gets the string array property. + + The name. + + + + + Gets the string array property. + + The name. + The default value. + + + + + Gets the boolean property. + + The name. + + + + + Gets the boolean property. + + The name. + if set to true [defaultValue]. + + + + + Gets the byte property. + + The name. + + + + + Gets the byte property. + + The name. + The default value. + + + + + Gets the char property. + + The name. + + + + + Gets the char property. + + The name. + The default value. + + + + + Gets the double property. + + The name. + + + + + Gets the double property. + + The name. + The default value. + + + + + Gets the float property. + + The name. + + + + + Gets the float property. + + The name. + The default value. + + + + + Gets the int property. + + The name. + + + + + Gets the int property. + + The name. + The default value. + + + + + Gets the int array property. + + The name. + + + + + Gets the int array property. + + The name. + The default value. + + + + + Gets the long property. + + The name. + + + + + Gets the long property. + + The name. + The def. + + + + + Gets the TimeSpan property. + + The name. + The def. + + + + + Gets the short property. + + The name. + + + + + Gets the short property. + + The name. + The default value. + + + + + Gets the property groups. + + The prefix. + + + + + Gets the property group. + + The prefix. + + + + + Gets the property group. + + The prefix. + if set to true [strip prefix]. + + + + + Get all properties that start with the given prefix. + + The prefix for which to search. If it does not end in a "." then one will be added to it for search purposes. + Whether to strip off the given in the result's keys. + Optional array of fully qualified prefixes to exclude. For example if is "a.b.c", then might be "a.b.c.ignore". + Group of that start with the given prefix, optionally have that prefix removed, and do not include properties that start with one of the given excluded prefixes. + + + + Reads the properties from assembly (embedded resource). + + The file name to read resources from. + + + + + Reads the properties from file system. + + The file name to read resources from. + + + + + Gets the underlying properties. + + The underlying properties. + + + + An implementation of that wraps another + and flags itself 'dirty' when it is modified, enforces that all keys are + strings. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The initial capacity. + + + + Initializes a new instance of the class. + + The initial capacity. + The load factor. + + + + Gets the keys. + + + + + + Adds the name-value pairs in the given to the . +

+ All keys must be s, and all values must be serializable. +

+
+
+ + + Adds the given value to the 's + data map. + + + + + Adds the given value to the 's + data map. + + + + + Adds the given value to the 's + data map. + + + + + Adds the given value to the 's + data map. + + + + + Adds the given value to the 's + data map. + + + + + Adds the given value to the 's + data map. + + + + + Adds the given value to the 's + data map. + + + + + Adds the given serializable object value to the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Object representing a job or trigger key. + + James House + + + + Construct a new TriggerStatus with the status name and nextFireTime. + + The trigger's status + The next UTC time the trigger will fire + + + + Return the string representation of the TriggerStatus. + + + + + Gets or sets the job key. + + The job key. + + + + Gets or sets the key. + + The key. + + + + Get the name portion of the key. + + the name + + + + Get the group portion of the key. + + the group + + + + Wraps a . + + Chris Bonham + + + + Gets or sets the name of the calendar. + + The name of the calendar. + + + + Gets or sets the name of the class. + + The name of the class. + + + + Gets or sets the calendar. + + The calendar. + + + + Gets or sets a description for the instance - may be + useful for remembering/displaying the purpose of the calendar, though + the description has no meaning to Quartz. + + + + + + Set a new base calendar or remove the existing one. + + + + + + Wraps a and . + + Chris Bonham + James House + + + + Adds a trigger to this bundle. + + The trigger. + + + + Removes the given trigger from this bundle. + + The trigger. + + + + Gets or sets the job detail. + + The job detail. + + + + Gets or sets the triggers associated with this bundle. + + The triggers. + + + + Gets the name of the bundle. + + The name. + + + + Gets the full name. + + The full name. + + + + Gets a value indicating whether this is valid. + + true if valid; otherwise, false. + + + + Parses an XML file that declares Jobs and their schedules (Triggers). + + +

+ The xml document must conform to the format defined in + "job_scheduling_data.xsd" +

+ +

+ After creating an instance of this class, you should call one of the + functions, after which you may call the + function to get a handle to the defined Jobs and Triggers, which can then be + scheduled with the . Alternatively, you could call + the function to do all of this + in one step. +

+ +

+ The same instance can be used again and again, with the list of defined Jobs + being cleared each time you call a method, + however a single instance is not thread-safe. +

+
+ Chris Bonham + James House + Marko Lahma (.NET) +
+ + + XML Schema dateTime datatype format. +

+ See + http://www.w3.org/TR/2001/REC-xmlschema-2-20010502/#dateTime +

+
+
+ + + Constructor for JobSchedulingDataProcessor. + + + + + Constructor for JobSchedulingDataProcessor. + + whether or not to validate XML. + whether or not to validate XML schema. + + + + Process the xml file in the default location (a file named + "quartz_jobs.xml" in the current working directory). + + + + + Process the xml file named . + + meta data file name. + + + + Process the xmlfile named with the given system + ID. + + Name of the file. + The system id. + + + + Process the xmlfile named with the given system + ID. + + The stream. + The system id. + + + + Process the xml file in the default location, and schedule all of the + jobs defined within it. + + + + + Process the xml file in the given location, and schedule all of the + jobs defined within it. + + meta data file name. + The scheduler. + if set to true overwrite existing jobs. + + + + Process the xml file in the given location, and schedule all of the + jobs defined within it. + + Name of the file. + The system id. + The sched. + if set to true [over write existing jobs]. + + + + Add the Jobs and Triggers defined in the given map of + s to the given scheduler. + + The job bundles. + The sched. + if set to true [over write existing jobs]. + + + + Returns a for the job name. + + The name. + + a for the job name. + + + + + Returns an from the fileName as a resource. + + Name of the file. + + an from the fileName as a resource. + + + + + Schedules a given job and trigger (both wrapped by a ). + + job wrapper. + + if the Job or Trigger cannot be added to the Scheduler, or + there is an internal Scheduler error. + + + + + Schedules a given job and trigger (both wrapped by a ). + + The job. + The sched. + if set to true [local over write existing jobs]. + + if the Job or Trigger cannot be added to the Scheduler, or + there is an internal Scheduler error. + + + + + Adds a scheduled job. + + The job. + + + + Adds a calendar. + + The sched. + calendar bundle. + SchedulerException if the Calendar cannot be added to the Scheduler, or + + + + Adds a detected validation exception. + + The exception. + + + + Resets the the number of detected validation exceptions. + + + + + Throws a ValidationException if the number of validationExceptions + detected is greater than zero. + + + DTD validation exception. + + + + + Gets or sets whether to overwrite existing jobs. + + + + + Gets the log. + + The log. + + + + Returns a of scheduled jobs. +

+ The key is the job name and the value is a + containing the and . +

+
+ a of scheduled jobs. + +
+ + + Helper class to map constant names to their values. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Reports JobSchedulingDataProcessor validation exceptions. + + Chris Bonham + + + + Constructor for ValidationException. + + + + + Constructor for ValidationException. + + exception message. + + + + Constructor for ValidationException. + + collection of validation exceptions. + + + + Gets the validation exceptions. + + The validation exceptions. + + + + Returns the detail message string. + + + + + An exception that is thrown to indicate that there has been a critical + failure within the scheduler's core services (such as loss of database + connectivity). + + James House + + + + Create a with the given message. + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + Provides a parser and evaluator for unix-like cron expressions. Cron + expressions provide the ability to specify complex time combinations such as + "At 8:00am every Monday through Friday" or "At 1:30am every + last Friday of the month". + + +

+ Cron expressions are comprised of 6 required fields and one optional field + separated by white space. The fields respectively are described as follows: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Name Allowed Values Allowed Special Characters
Seconds 0-59 , - /// /
Minutes 0-59 , - /// /
Hours 0-23 , - /// /
Day-of-month 1-31 , - /// ? / L W C
Month 1-12 or JAN-DEC , - /// /
Day-of-Week 1-7 or SUN-SAT , - /// ? / L #
Year (Optional) empty, 1970-2099 , - /// /
+

+ The '*' character is used to specify all values. For example, "*" + in the minute field means "every minute". +

+

+ The '?' character is allowed for the day-of-month and day-of-week fields. It + is used to specify 'no specific value'. This is useful when you need to + specify something in one of the two fields, but not the other. +

+

+ The '-' character is used to specify ranges For example "10-12" in + the hour field means "the hours 10, 11 and 12". +

+

+ The ',' character is used to specify additional values. For example + "MON,WED,FRI" in the day-of-week field means "the days Monday, + Wednesday, and Friday". +

+

+ The '/' character is used to specify increments. For example "0/15" + in the seconds field means "the seconds 0, 15, 30, and 45". And + "5/15" in the seconds field means "the seconds 5, 20, 35, and + 50". Specifying '*' before the '/' is equivalent to specifying 0 is + the value to start with. Essentially, for each field in the expression, there + is a set of numbers that can be turned on or off. For seconds and minutes, + the numbers range from 0 to 59. For hours 0 to 23, for days of the month 0 to + 31, and for months 1 to 12. The "/" character simply helps you turn + on every "nth" value in the given set. Thus "7/6" in the + month field only turns on month "7", it does NOT mean every 6th + month, please note that subtlety. +

+

+ The 'L' character is allowed for the day-of-month and day-of-week fields. + This character is short-hand for "last", but it has different + meaning in each of the two fields. For example, the value "L" in + the day-of-month field means "the last day of the month" - day 31 + for January, day 28 for February on non-leap years. If used in the + day-of-week field by itself, it simply means "7" or + "SAT". But if used in the day-of-week field after another value, it + means "the last xxx day of the month" - for example "6L" + means "the last friday of the month". When using the 'L' option, it + is important not to specify lists, or ranges of values, as you'll get + confusing results. +

+

+ The 'W' character is allowed for the day-of-month field. This character + is used to specify the weekday (Monday-Friday) nearest the given day. As an + example, if you were to specify "15W" as the value for the + day-of-month field, the meaning is: "the nearest weekday to the 15th of + the month". So if the 15th is a Saturday, the trigger will fire on + Friday the 14th. If the 15th is a Sunday, the trigger will fire on Monday the + 16th. If the 15th is a Tuesday, then it will fire on Tuesday the 15th. + However if you specify "1W" as the value for day-of-month, and the + 1st is a Saturday, the trigger will fire on Monday the 3rd, as it will not + 'jump' over the boundary of a month's days. The 'W' character can only be + specified when the day-of-month is a single day, not a range or list of days. +

+

+ The 'L' and 'W' characters can also be combined for the day-of-month + expression to yield 'LW', which translates to "last weekday of the + month". +

+

+ The '#' character is allowed for the day-of-week field. This character is + used to specify "the nth" XXX day of the month. For example, the + value of "6#3" in the day-of-week field means the third Friday of + the month (day 6 = Friday and "#3" = the 3rd one in the month). + Other examples: "2#1" = the first Monday of the month and + "4#5" = the fifth Wednesday of the month. Note that if you specify + "#5" and there is not 5 of the given day-of-week in the month, then + no firing will occur that month. If the '#' character is used, there can + only be one expression in the day-of-week field ("3#1,6#3" is + not valid, since there are two expressions). +

+

+ +

+

+ The legal characters and the names of months and days of the week are not + case sensitive. +

+

+ NOTES: +

    +
  • Support for specifying both a day-of-week and a day-of-month value is + not complete (you'll need to use the '?' character in one of these fields). +
  • +
  • Overflowing ranges is supported - that is, having a larger number on + the left hand side than the right. You might do 22-2 to catch 10 o'clock + at night until 2 o'clock in the morning, or you might have NOV-FEB. It is + very important to note that overuse of overflowing ranges creates ranges + that don't make sense and no effort has been made to determine which + interpretation CronExpression chooses. An example would be + "0 0 14-6 ? * FRI-MON".
  • +
+

+
+ Sharada Jambula + James House + Contributions from Mads Henderson + Refactoring from CronTrigger to CronExpression by Aaron Craven +
+ + + Field specification for second. + + + + + Field specification for minute. + + + + + Field specification for hour. + + + + + Field specification for day of month. + + + + + Field specification for month. + + + + + Field specification for day of week. + + + + + Field specification for year. + + + + + Field specification for all wildcard value '*'. + + + + + Field specification for not specified value '?'. + + + + + Field specification for wildcard '*'. + + + + + Field specification for no specification at all '?'. + + + + + Seconds. + + + + + minutes. + + + + + Hours. + + + + + Days of month. + + + + + Months. + + + + + Days of week. + + + + + Years. + + + + + Last day of week. + + + + + Nth day of week. + + + + + Last day of month. + + + + + Nearest weekday. + + + + + Calendar day of week. + + + + + Calendar day of month. + + + + + Expression parsed. + + + + + Constructs a new based on the specified + parameter. + + + String representation of the cron expression the new object should represent + + + + + + Indicates whether the given date satisfies the cron expression. + + + Note that milliseconds are ignored, so two Dates falling on different milliseconds + of the same second will always have the same result here. + + The date to evaluate. + a boolean indicating whether the given date satisfies the cron expression + + + + Returns the next date/time after the given date/time which + satisfies the cron expression. + + the date/time at which to begin the search for the next valid date/time + the next valid date/time + + + + Returns the next date/time after the given date/time which does + not satisfy the expression. + + the date/time at which to begin the search for the next invalid date/time + the next valid date/time + + + + Returns the string representation of the + + The string representation of the + + + + Indicates whether the specified cron expression can be parsed into a + valid cron expression + + the expression to evaluate + a boolean indicating whether the given expression is a valid cron + expression + + + + Builds the expression. + + The expression. + + + + Stores the expression values. + + The position. + The string to traverse. + The type of value. + + + + + Checks the next value. + + The position. + The string to check. + The value. + The type to search. + + + + + Gets the expression summary. + + + + + + Gets the expression set summary. + + The data. + + + + + Skips the white space. + + The i. + The s. + + + + + Finds the next white space. + + The i. + The s. + + + + + Adds to set. + + The val. + The end. + The incr. + The type. + + + + Gets the set of given type. + + The type of set to get. + + + + + Gets the value. + + The v. + The s. + The i. + + + + + Gets the numeric value from string. + + The string to parse from. + The i. + + + + + Gets the month number. + + The string to map with. + + + + + Gets the day of week number. + + The s. + + + + + Gets the time from given time parts. + + The seconds. + The minutes. + The hours. + The day of month. + The month. + + + + + Gets the next fire time after the given time. + + The UTC time to start searching from. + + + + + Creates the date time without milliseconds. + + The time. + + + + + Advance the calendar to the particular hour paying particular attention + to daylight saving problems. + + The date. + The hour. + + + + + Gets the time before. + + The end time. + + + + + NOT YET IMPLEMENTED: Returns the final time that the + will match. + + + + + + Determines whether given year is a leap year. + + The year. + + true if the specified year is a leap year; otherwise, false. + + + + + Gets the last day of month. + + The month num. + The year. + + + + + Creates a new object that is a copy of the current instance. + + + A new object that is a copy of this instance. + + + + + Sets or gets the time zone for which the of this + will be resolved. + + + + + Gets the cron expression string. + + The cron expression string. + + + + Helper class for cron expression handling. + + + + + The value. + + + + + The position. + + + + + A concrete that is used to fire a + at given moments in time, defined with Unix 'cron-like' definitions. + + +

+ For those unfamiliar with "cron", this means being able to create a firing + schedule such as: "At 8:00am every Monday through Friday" or "At 1:30am + every last Friday of the month". +

+ +

+ The format of a "Cron-Expression" string is documented on the + class. +

+ +

+ Here are some full examples:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Expression Meaning
"0 0 12 * * ?"" /> Fire at 12pm (noon) every day" />
"0 15 10 ? * *"" /> Fire at 10:15am every day" />
"0 15 10 * * ?"" /> Fire at 10:15am every day" />
"0 15 10 * * ? *"" /> Fire at 10:15am every day" />
"0 15 10 * * ? 2005"" /> Fire at 10:15am every day during the year 2005" /> +
"0 * 14 * * ?"" /> Fire every minute starting at 2pm and ending at 2:59pm, every day" /> +
"0 0/5 14 * * ?"" /> Fire every 5 minutes starting at 2pm and ending at 2:55pm, every day" /> +
"0 0/5 14,18 * * ?"" /> Fire every 5 minutes starting at 2pm and ending at 2:55pm, AND fire every 5 minutes starting at 6pm and ending at 6:55pm, every day" /> +
"0 0-5 14 * * ?"" /> Fire every minute starting at 2pm and ending at 2:05pm, every day" /> +
"0 10,44 14 ? 3 WED"" /> Fire at 2:10pm and at 2:44pm every Wednesday in the month of March." /> +
"0 15 10 ? * MON-FRI"" /> Fire at 10:15am every Monday, Tuesday, Wednesday, Thursday and Friday" /> +
"0 15 10 15 * ?"" /> Fire at 10:15am on the 15th day of every month" /> +
"0 15 10 L * ?"" /> Fire at 10:15am on the last day of every month" /> +
"0 15 10 ? * 6L"" /> Fire at 10:15am on the last Friday of every month" /> +
"0 15 10 ? * 6L"" /> Fire at 10:15am on the last Friday of every month" /> +
"0 15 10 ? * 6L 2002-2005"" /> Fire at 10:15am on every last friday of every month during the years 2002, 2003, 2004 and 2005" /> +
"0 15 10 ? * 6#3"" /> Fire at 10:15am on the third Friday of every month" /> +
+

+ +

+ Pay attention to the effects of '?' and '*' in the day-of-week and + day-of-month fields! +

+ +

+ NOTES: +

    +
  • Support for specifying both a day-of-week and a day-of-month value is + not complete (you'll need to use the '?' character in on of these fields). +
  • +
  • Be careful when setting fire times between mid-night and 1:00 AM - + "daylight savings" can cause a skip or a repeat depending on whether the + time moves back or jumps forward.
  • +
+

+
+ + + + Sharada Jambula + James House + Contributions from Mads Henderson +
+ + + The base abstract class to be extended by all triggers. + + +

+ s have a name and group associated with them, which + should uniquely identify them within a single . +

+ +

+ s are the 'mechanism' by which s + are scheduled. Many s can point to the same , + but a single can only point to one . +

+ +

+ Triggers can 'send' parameters/data to s by placing contents + into the on the . +

+
+ + + + + + + James House + Sharada Jambula +
+ + + The default value for priority. + + + + + Remove all s from the . + + + + + Create a with no specified name, group, or . + + + Note that the , and + the and properties + must be set before the can be placed into a + . + + + + + Create a with the given name, and default group. + + + Note that the and + properties must be set before the + can be placed into a . + + The name. + + + + Create a with the given name, and group. + + + Note that the and + properties must be set before the + can be placed into a . + + The name. + if , Scheduler.DefaultGroup will be used. + + + + Create a with the given name, and group. + + The name. + if , Scheduler.DefaultGroup will be used. + Name of the job. + The job group. + ArgumentException + if name is null or empty, or the group is an empty string. + + + + + Add the specified name of a to + the end of the 's list of listeners. + + Name of the listener. + + + + Remove the specified name of a + from the 's list of listeners. + + true if the given name was found in the list, and removed + + + + + This method should not be used by the Quartz client. +

+ Called when the has decided to 'fire' + the trigger (Execute the associated ), in order to + give the a chance to update itself for its next + triggering (if any). +

+ +
+ + +
+ + + This method should not be used by the Quartz client. + + +

+ Called by the scheduler at the time a is first + added to the scheduler, in order to have the + compute its first fire time, based on any associated calendar. +

+ +

+ After this method has been called, + should return a valid answer. +

+
+ + The first time at which the will be fired + by the scheduler, which is also the same value + will return (until after the first firing of the ). + +
+ + + This method should not be used by the Quartz client. + + + Called after the has executed the + associated with the + in order to get the final instruction code from the trigger. + + + is the that was used by the + 's method. + is the thrown by the + , if any (may be null). + + + One of the members. + + + + + + + + + + Used by the to determine whether or not + it is possible for this to fire again. +

+ If the returned value is then the + may remove the from the . +

+
+
+ + + Returns the next time at which the is scheduled to fire. If + the trigger will not fire again, will be returned. Note that + the time returned can possibly be in the past, if the time that was computed + for the trigger to next fire has already arrived, but the scheduler has not yet + been able to fire the trigger (which would likely be due to lack of resources + e.g. threads). + + + The value returned is not guaranteed to be valid until after the + has been added to the scheduler. + + + + + + + Returns the previous time at which the fired. + If the trigger has not yet fired, will be returned. + + + + + Returns the next time at which the will fire, + after the given time. If the trigger will not fire after the given time, + will be returned. + + + + + Validates the misfire instruction. + + The misfire instruction. + + + + + This method should not be used by the Quartz client. +

+ To be implemented by the concrete classes that extend this class. +

+

+ The implementation should update the 's state + based on the MISFIRE_INSTRUCTION_XXX that was selected when the + was created. +

+
+
+ + + This method should not be used by the Quartz client. +

+ The implementation should update the 's state + based on the given new version of the associated + (the state should be updated so that it's next fire time is appropriate + given the Calendar's new settings). +

+
+ + +
+ + + Validates whether the properties of the are + valid for submission into a . + + + + + Return a simple string representation of this object. + + + + + Compare the next fire time of this to that of + another. + + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + + Serves as a hash function for a particular type. is suitable for use in hashing algorithms and data structures like a hash table. + + + A hash code for the current . + + + + + Creates a new object that is a copy of the current instance. + + + A new object that is a copy of this instance. + + + + + Get or sets the name of this . + + If name is null or empty. + + + + Get the group of this . If , Scheduler.DefaultGroup will be used. + + + if group is an empty string. + + + + + Get or set the name of the associated . + + + if jobName is null or empty. + + + + + Gets or sets the name of the associated 's + group. If set with , Scheduler.DefaultGroup will be used. + + ArgumentException + if group is an empty string. + + + + + Returns the 'full name' of the in the format + "group.name". + + + + + Gets the key. + + The key. + + + + Returns the 'full name' of the that the + points to, in the format "group.name". + + + + + Get or set the description given to the instance by + its creator (if any). + + + + + Get or set the with the given name with + this Trigger. Use when setting to dis-associate a Calendar. + + + + + Get or set the that is associated with the + . +

+ Changes made to this map during job execution are not re-persisted, and + in fact typically result in an illegal state. +

+
+
+ + + Whether or not the should be persisted in the + for re-use after program restarts. +

+ If not explicitly set, the default value is . +

+
+
+ + + Returns an array of s containing the names of all + s assigned to the , + in the order in which they should be notified. + + + + + Returns the last UTC time at which the will fire, if + the Trigger will repeat indefinitely, null will be returned. +

+ Note that the return time *may* be in the past. +

+
+
+ + + Get or set the instruction the should be given for + handling misfire situations for this - the + concrete type that you are using will have + defined a set of additional MISFIRE_INSTRUCTION_XXX + constants that may be passed to this method. +

+ If not explicitly set, the default value is . +

+
+ + + + +
+ + + This method should not be used by the Quartz client. +

+ Usable by + implementations, in order to facilitate 'recognizing' instances of fired + s as their jobs complete execution. +

+
+
+ + + Returns the date/time on which the trigger must stop firing. This + defines the final boundary for trigger firings 舒 the trigger will + not fire after to this date and time. If this value is null, no end time + boundary is assumed, and the trigger can continue indefinitely. + + Sets the date/time on which the trigger must stop firing. This defines + the final boundary for trigger firings 舒 the trigger will not + fire after to this date and time. If this value is null, no end time + boundary is assumed, and the trigger can continue indefinitely. + + + + + The time at which the trigger's scheduling should start. May or may not + be the first actual fire time of the trigger, depending upon the type of + trigger and the settings of the other properties of the trigger. However + the first actual first time will not be before this date. + + + Setting a value in the past may cause a new trigger to compute a first + fire time that is in the past, which may cause an immediate misfire + of the trigger. + + + + + Tells whether this Trigger instance can handle events + in millisecond precision. + + + + + The priority of a acts as a tie breaker such that if + two s have the same scheduled fire time, then Quartz + will do its best to give the one with the higher priority first access + to a worker thread. + + + If not explicitly set, the default value is 5. + + + + + + + Gets a value indicating whether this instance has additional properties + that should be considered when for example saving to database. + + + If trigger implementation has additional properties that need to be saved + with base properties you need to make your class override this property with value true. + Returning true will effectively mean that ADOJobStore needs to serialize + this trigger instance to make sure additional properties are also saved. + + + true if this instance has additional properties; otherwise, false. + + + + + Create a with no settings. + + + The start-time will also be set to the current time, and the time zone + will be set the the system's default time zone. + + + + + Create a with the given name and default group. + + + The start-time will also be set to the current time, and the time zone + will be set the the system's default time zone. + + The name. + + + + Create a with the given name and group. + + + The start-time will also be set to the current time, and the time zone + will be set the the system's default time zone. + + The name. + The group. + + + + Create a with the given name, group and + expression. + + + The start-time will also be set to the current time, and the time zone + will be set the the system's default time zone. + + The name. + The group. + The cron expression. + + + + Create a with the given name and group, and + associated with the identified . + + + The start-time will also be set to the current time, and the time zone + will be set the the system's default time zone. + + The name. + The group. + Name of the job. + The job group. + + + + Create a with the given name and group, + associated with the identified , + and with the given "cron" expression. + + + The start-time will also be set to the current time, and the time zone + will be set the the system's default time zone. + + The name. + The group. + Name of the job. + The job group. + The cron expression. + + + + Create a with the given name and group, + associated with the identified , + and with the given "cron" expression resolved with respect to the . + + The name. + The group. + Name of the job. + The job group. + The cron expression. + The time zone. + + + + Create a that will occur at the given time, + until the given end time. +

+ If null, the start-time will also be set to the current time, the time + zone will be set the the system's default. +

+
+ The name. + The group. + Name of the job. + The job group. + The start time. + The end time. + The cron expression. +
+ + + Create a with fire time dictated by the + resolved with respect to the specified + occuring from the until + the given . + + The name. + The group. + Name of the job. + The job group. + The start time. + The end time. + + + + Clones this instance. + + + + + + Returns the next time at which the is scheduled to fire. If + the trigger will not fire again, will be returned. Note that + the time returned can possibly be in the past, if the time that was computed + for the trigger to next fire has already arrived, but the scheduler has not yet + been able to fire the trigger (which would likely be due to lack of resources + e.g. threads). + + + The value returned is not guaranteed to be valid until after the + has been added to the scheduler. + + + + + + + Returns the previous time at which the fired. + If the trigger has not yet fired, will be returned. + + + + + + Sets the next fire time. +

+ This method should not be invoked by client code. +

+
+ The fire time. +
+ + + Sets the previous fire time. +

+ This method should not be invoked by client code. +

+
+ The fire time. +
+ + + Returns the next time at which the will fire, + after the given time. If the trigger will not fire after the given time, + will be returned. + + + + + + + Used by the to determine whether or not + it is possible for this to fire again. +

+ If the returned value is then the + may remove the from the . +

+
+ +
+ + + Validates the misfire instruction. + + The misfire instruction. + + + + + This method should not be used by the Quartz client. +

+ To be implemented by the concrete classes that extend this class. +

+

+ The implementation should update the 's state + based on the MISFIRE_INSTRUCTION_XXX that was selected when the + was created. +

+
+ +
+ + +

+ Determines whether the date and (optionally) time of the given Calendar + instance falls on a scheduled fire-time of this trigger. +

+ +

+ Equivalent to calling . +

+
+ The date to compare. + +
+ + + Determines whether the date and (optionally) time of the given Calendar + instance falls on a scheduled fire-time of this trigger. +

+ Note that the value returned is NOT validated against the related + ICalendar (if any). +

+
+ The date to compare + If set to true, the method will only determine if the + trigger will fire during the day represented by the given Calendar + (hours, minutes and seconds will be ignored). + +
+ + + Called when the has decided to 'fire' + the trigger (Execute the associated ), in order to + give the a chance to update itself for its next + triggering (if any). + + + + + + + Updates the trigger with new calendar. + + The calendar to update with. + The misfire threshold. + + + + Called by the scheduler at the time a is first + added to the scheduler, in order to have the + compute its first fire time, based on any associated calendar. +

+ After this method has been called, + should return a valid answer. +

+
+ + + the first time at which the will be fired + by the scheduler, which is also the same value + will return (until after the first firing of the ). + +
+ + + Gets the expression summary. + + + + + + Gets the next time to fire after the given time. + + The time to compute from. + + + + + NOT YET IMPLEMENTED: Returns the time before the given time + that this will fire. + + The date. + + + + + Gets or sets the cron expression string. + + The cron expression string. + + + + Set the CronExpression to the given one. The TimeZone on the passed-in + CronExpression over-rides any that was already set on the Trigger. + + The cron expression. + + + + Returns the date/time on which the trigger may begin firing. This + defines the initial boundary for trigger firings the trigger + will not fire prior to this date and time. + + + + + + Get or sets the time at which the CronTrigger should quit + repeating - even if repeastCount isn't yet satisfied. + + + + + Sets the time zone for which the of this + will be resolved. + + + If is set after this + property, the TimeZone setting on the CronExpression will "win". However + if is set after this property, the + time zone applied by this method will remain in effect, since the + string cron expression does not carry a time zone! + + The time zone. + + + + Returns the last UTC time at which the will fire, if + the Trigger will repeat indefinitely, null will be returned. +

+ Note that the return time *may* be in the past. +

+
+
+ + + Tells whether this Trigger instance can handle events + in millisecond precision. + + + + + + The interface to be implemented by s that provide a + mechanism for having their execution interrupted. It is NOT a requirment + for jobs to implement this interface - in fact, for most people, none of + their jobs will. + + +

+ The means of actually interrupting the Job must be implemented within the + itself (the method of this + interface is simply a means for the scheduler to inform the + that a request has been made for it to be interrupted). The mechanism that + your jobs use to interrupt themselves might vary between implementations. + However the principle idea in any implementation should be to have the + body of the job's periodically check some flag to + see if an interruption has been requested, and if the flag is set, somehow + abort the performance of the rest of the job's work. An example of + interrupting a job can be found in the java source for the class + Quartz.Examples.Example7.DumbInterruptableJob. It is legal to use + some combination of and + synchronization within and + in order to have the method block until the + signals that it has noticed the set flag. +

+ +

+ If the Job performs some form of blocking I/O or similar functions, you may + want to consider having the method store a + reference to the calling as a member variable. Then the + impplementation of this interfaces method can call + on that Thread. Before attempting this, make + sure that you fully understand what + does and doesn't do. Also make sure that you clear the Job's member + reference to the Thread when the Execute(..) method exits (preferrably in a + block. +

+
+ + + James House +
+ + + Called by the when a user + interrupts the . + + void (nothing) if job interrupt is successful. + + + + Scheduler constants. + + + + + A (possibly) usefull constant that can be used for specifying the group + that and instances belong to. + + + + + A constant group name used internally by the + scheduler - clients should not use the value of this constant + ("MANUAL_TRIGGER") for thename of a 's group. + + + + + A constant group name used internally by the + scheduler - clients should not use the value of this constant + ("RECOVERING_JOBS") for thename of a 's group. + + + + + A constant group name used internally by the + scheduler - clients should not use the value of this constant + ("FAILED_OVER_JOBS") for thename of a 's group. + + + + + A constant key that can be used to retrieve the + name of the original from a recovery trigger's + data map in the case of a job recovering after a failed scheduler + instance. + + + + + + A constant key that can be used to retrieve the + group of the original from a recovery trigger's + data map in the case of a job recovering after a failed scheduler + instance. + + + + + + A constant key that can be used to retrieve the + scheduled fire time of the original from a recovery + trigger's data map in the case of a job recovering after a failed scheduler + instance. + + + + + + Holds state information for instances. + + + instances are stored once when the + is added to a scheduler. They are also re-persisted after every execution of + instances. +

+ instances can also be stored with a + . This can be useful in the case where you have a Job + that is stored in the scheduler for regular/repeated use by multiple + Triggers, yet with each independent triggering, you want to supply the + Job with different data inputs. +

+

+ The passed to a Job at execution time + also contains a convenience that is the result + of merging the contents of the trigger's JobDataMap (if any) over the + Job's JobDataMap (if any). +

+
+ + + + + James House +
+ + + Create an empty . + + + + + Create a with the given data. + + + + + Adds the given value as a string version to the + 's data map. + + + + + Adds the given value as a string version to the + 's data map. + + + + + Adds the given value as a string version to the + 's data map. + + + + + Adds the given value as a string version to the + 's data map. + + + + + Adds the given value as a string version to the + 's data map. + + + + + Adds the given value as a string version to the + 's data map. + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the + . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Gets the date time. + + The key. + + + + + Gets the value behind the specified key. + + The key. + + + + + Conveys the detail properties of a given instance. + + + Quartz does not store an actual instance of a type, but + instead allows you to define an instance of one, through the use of a . +

+ s have a name and group associated with them, which + should uniquely identify them within a single . +

+

+ s are the 'mechanism' by which s + are scheduled. Many s can point to the same , + but a single can only point to one . +

+
+ + + + + James House + Sharada Jambula +
+ + + Create a with no specified name or group, and + the default settings of all the other properties. +

+ Note that the , and + properties must be set before the job can be + placed into a . +

+
+
+ + + Create a with the given name, default group, and + the default settings of all the other properties. + If , Scheduler.DefaultGroup will be used. + + + If name is null or empty, or the group is an empty string. + + + + + Create a with the given name, and group, and + the default settings of all the other properties. + If , Scheduler.DefaultGroup will be used. + + + If name is null or empty, or the group is an empty string. + + + + + Create a with the given name, and group, and + the given settings of all the other properties. + + The name. + if , Scheduler.DefaultGroup will be used. + Type of the job. + if set to true, job will be volatile. + if set to true, job will be durable. + if set to true, job will request recovery. + + ArgumentException if name is null or empty, or the group is an empty string. + + + + + Validates whether the properties of the are + valid for submission into a . + + + + + Add the specified name of a to the + end of the 's list of listeners. + + + + + Remove the specified name of a from + the 's list of listeners. + + true if the given name was found in the list, and removed + + + + Return a simple string representation of this object. + + + + + Creates a new object that is a copy of the current instance. + + + A new object that is a copy of this instance. + + + + + Determines whether the specified detail is equal to this instance. + + The detail to examine. + + true if the specified detail is equal; otherwise, false. + + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + if the specified is equal to the + current ; otherwise, . + + + + + Checks equality between given job detail and this instance. + + The detail to compare this instance with. + + + + + Serves as a hash function for a particular type, suitable + for use in hashing algorithms and data structures like a hash table. + + + A hash code for the current . + + + + + Get or sets the name of this . + + + if name is null or empty. + + + + + Get or sets the group of this . + If , will be used. + + + If the group is an empty string. + + + + + Returns the 'full name' of the in the format + "group.name". + + + + + Gets the key. + + The key. + + + + Get or set the description given to the instance by its + creator (if any). + + + May be useful for remembering/displaying the purpose of the job, though the + description has no meaning to Quartz. + + + + + Get or sets the instance of that will be executed. + + + if jobType is null or the class is not a . + + + + + Get or set the that is associated with the . + + + + + Set whether or not the the should re-Execute + the if a 'recovery' or 'fail-over' situation is + encountered. +

+ If not explicitly set, the default value is . +

+
+ +
+ + + Whether or not the should not be persisted in the + for re-use after program + restarts. +

+ If not explicitly set, the default value is . +

+
+ if the should be garbage + collected along with the . + +
+ + + Whether or not the should remain stored after it is + orphaned (no s point to it). +

+ If not explicitly set, the default value is . +

+
+ + if the Job should remain persisted after + being orphaned. + +
+ + + Whether or not the implements the interface . + + + + + Gets or sets an array of s containing the names of all + s assigned to the , + in the order in which they should be notified. Setting the array + clears any listener names that were in the list. + + + + + A context bundle containing handles to various environment information, that + is given to a instance as it is + executed, and to a instance after the + execution completes. + + +

+ The found on this object (via the + method) serves as a convenience - + it is a merge of the found on the + and the one found on the , with + the value in the latter overriding any same-named values in the former. + It is thus considered a 'best practice' that the Execute code of a Job + retrieve data from the JobDataMap found on this object NOTE: Do not + expect value 'set' into this JobDataMap to somehow be set back onto a + 's own JobDataMap. +

+ +

+ s are also returned from the + + method. These are the same instances as those past into the jobs that are + currently executing within the scheduler. The exception to this is when your + application is using Quartz remotely (i.e. via RMI) - in which case you get + a clone of the s, and their references to + the and instances have been lost (a + clone of the is still available - just not a handle + to the job instance that is running). +

+
+ + + + + + James House +
+ + + Create a JobExcecutionContext with the given context data. + + + + + Increments the refire count. + + + + + Returns a that represents the current . + + + A that represents the current . + + + + + Put the specified value into the context's data map with the given key. + Possibly useful for sharing data between listeners and jobs. +

+ NOTE: this data is volatile - it is lost after the job execution + completes, and all TriggerListeners and JobListeners have been + notified. +

+
+ + + + +
+ + + Get the value with the given key from the context's data map. + + + + + + + Get a handle to the instance that fired the + . + + + + + Get a handle to the instance that fired the + . + + + + + Get a handle to the referenced by the + instance that fired the . + + + + + If the is being re-executed because of a 'recovery' + situation, this method will return . + + + + + Gets the refire count. + + The refire count. + + + + Get the convenience of this execution context. + + +

+ The found on this object serves as a convenience - + it is a merge of the found on the + and the one found on the , with + the value in the latter overriding any same-named values in the former. + It is thus considered a 'best practice' that the Execute code of a Job + retrieve data from the JobDataMap found on this object. +

+ +

NOTE: Do not expect value 'set' into this JobDataMap to somehow be + set back onto a 's own JobDataMap. +

+ +

+ Attempts to change the contents of this map typically result in an + illegal state. +

+ +
+
+ + + Get the associated with the . + + + + + Get the instance of the that was created for this + execution. +

+ Note: The Job instance is not available through remote scheduler + interfaces. +

+
+
+ + + The actual time the trigger fired. For instance the scheduled time may + have been 10:00:00 but the actual fire time may have been 10:00:03 if + the scheduler was too busy. + + Returns the fireTimeUtc. + + + + + The scheduled time the trigger fired for. For instance the scheduled + time may have been 10:00:00 but the actual fire time may have been + 10:00:03 if the scheduler was too busy. + + Returns the scheduledFireTimeUtc. + + + + + Gets the previous fire time. + + The previous fire time. + + + + Gets the next fire time. + + The next fire time. + + + + Returns the result (if any) that the set before its + execution completed (the type of object set as the result is entirely up + to the particular job). + + +

+ The result itself is meaningless to Quartz, but may be informative + to s or + s that are watching the job's + execution. +

+ + Set the result (if any) of the 's execution (the type of + object set as the result is entirely up to the particular job). + +

+ The result itself is meaningless to Quartz, but may be informative + to s or + s that are watching the job's + execution. +

+
+
+ + + The amount of time the job ran for. The returned + value will be until the job has actually completed (or thrown an + exception), and is therefore generally only useful to + s and s. + + + + + An exception that can be thrown by a + to indicate to the Quartz that an error + occured while executing, and whether or not the requests + to be re-fired immediately (using the same , + or whether it wants to be unscheduled. + + + Note that if the flag for 'refire immediately' is set, the flags for + unscheduling the Job are ignored. + + + + + James House + + + + Create a JobExcecutionException, with the 're-fire immediately' flag set + to . + + + + + Create a JobExcecutionException, with the given cause. + + The cause. + + + + Create a JobExcecutionException, with the given message. + + + + + Initializes a new instance of the class. + + The message. + The original cause. + + + + Create a JobExcecutionException with the 're-fire immediately' flag set + to the given value. + + + + + Create a JobExcecutionException with the given underlying exception, and + the 're-fire immediately' flag set to the given value. + + + + + Create a JobExcecutionException with the given message, and underlying + exception, and the 're-fire immediately' flag set to the given value. + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + Creates and returns a string representation of the current exception. + + + A string representation of the current exception. + + + + + + Gets or sets a value indicating whether to unschedule firing trigger. + + + true if firing trigger should be unscheduled; otherwise, false. + + + + + Gets or sets a value indicating whether to unschedule all triggers. + + + true if all triggers should be unscheduled; otherwise, false. + + + + + Gets or sets a value indicating whether to refire immediately. + + true if to refire immediately; otherwise, false. + + + + Misfire instructions. + + + + + Instruction not set (yet). + + + + + Use smart policy. + + + + + Misfire policy settings for SimpleTrigger. + + + + + Instructs the that upon a mis-fire + situation, the wants to be fired + now by . +

+ NOTE: This instruction should typically only be used for + 'one-shot' (non-repeating) Triggers. If it is used on a trigger with a + repeat count > 0 then it is equivalent to the instruction + . +

+
+
+ + + Instructs the that upon a mis-fire + situation, the wants to be + re-scheduled to 'now' (even if the associated + excludes 'now') with the repeat count left as-is. This does obey the + end-time however, so if 'now' is after the + end-time the will not fire again. + + +

+ NOTE: Use of this instruction causes the trigger to 'forget' + the start-time and repeat-count that it was originally setup with (this + is only an issue if you for some reason wanted to be able to tell what + the original values were at some later time). +

+
+
+ + + Instructs the that upon a mis-fire + situation, the wants to be + re-scheduled to 'now' (even if the associated + excludes 'now') with the repeat count set to what it would be, if it had + not missed any firings. This does obey the end-time + however, so if 'now' is after the end-time the will + not fire again. + +

+ NOTE: Use of this instruction causes the trigger to 'forget' + the start-time and repeat-count that it was originally setup with. + Instead, the repeat count on the trigger will be changed to whatever + the remaining repeat count is (this is only an issue if you for some + reason wanted to be able to tell what the original values were at some + later time). +

+ +

+ NOTE: This instruction could cause the + to go to the 'COMPLETE' state after firing 'now', if all the + repeat-fire-times where missed. +

+
+
+ + + Instructs the that upon a mis-fire + situation, the wants to be + re-scheduled to the next scheduled time after 'now' - taking into + account any associated , and with the + repeat count set to what it would be, if it had not missed any firings. + + + NOTE/WARNING: This instruction could cause the + to go directly to the 'COMPLETE' state if all fire-times where missed. + + + + + Instructs the that upon a mis-fire + situation, the wants to be + re-scheduled to the next scheduled time after 'now' - taking into + account any associated , and with the + repeat count left unchanged. + + +

+ NOTE/WARNING: This instruction could cause the + to go directly to the 'COMPLETE' state if all the end-time of the trigger + has arrived. +

+
+
+ + + misfire instructions for CronTrigger + + + + + Instructs the that upon a mis-fire + situation, the wants to be fired now + by . + + + + + Instructs the that upon a mis-fire + situation, the wants to have it's + next-fire-time updated to the next time in the schedule after the + current time (taking into account any associated , + but it does not want to be fired now. + + + + + misfire instructions for NthIncludedDayTrigger + + + + + Instructs the that upon a mis-fire situation, the + wants to be fired now by the + + + + + + Instructs the that upon a mis-fire situation, the + wants to have + nextFireTime updated to the next time in the schedule after + the current time, but it does not want to be fired now. + + + + + A trigger which fires on the Nth day of every interval type + , or + that is not excluded by the associated + calendar. + + + When determining what the Nth day of the month or year + is, will skip excluded days on the + associated calendar. This would commonly be used in an Nth + business day situation, in which the user wishes to fire a particular job on + the Nth business day (i.e. the 5th business day of + every month). Each also has an associated + which indicates at what time of day the trigger is + to fire. +

+ All s default to a monthly interval type + (fires on the Nth day of every month) with N = 1 (first + non-excluded day) and set to 12:00 PM (noon). These + values can be changed using the , , and + methods. Users may also want to note the + and + methods. +

+

+ Take, for example, the following calendar: +

+ + July August September + Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa + 1 W 1 2 3 4 5 W 1 2 W + W H 5 6 7 8 W W 8 9 10 11 12 W W H 6 7 8 9 W + W 11 12 13 14 15 W W 15 16 17 18 19 W W 12 13 14 15 16 W + W 18 19 20 21 22 W W 22 23 24 25 26 W W 19 20 21 22 23 W + W 25 26 27 28 29 W W 29 30 31 W 26 27 28 29 30 + W + + Where W's represent weekend days, and H's represent holidays, all of which + are excluded on a calendar associated with an + with n=5 and + intervalType=IntervalTypeMonthly. In this case, the trigger + would fire on the 8th of July (because of the July 4 holiday), + the 5th of August, and the 8th of September (because + of Labor Day). +
+ Aaron Craven +
+ + + Indicates a monthly trigger type (fires on the Nth included + day of every month). + + + + indicates a yearly trigger type (fires on the Nth included + day of every year). + + + + + Indicates a weekly trigger type (fires on the Nth included + day of every week). When using this interval type, care must be taken + not to think of the value of as an analog to + . Such a comparison can only + be drawn when there are no calendars associated with the trigger. To + illustrate, consider an with + n = 3 which is associated with a Calendar excluding + non-weekdays. The trigger would fire on the 3rd + included day of the week, which would be 4th + actual day of the week. + + + + + Create an with no specified name, + group, or . This will result initially in a + default monthly trigger that fires on the first day of every month at + 12:00 PM (n = 1, + intervalType=, + fireAtTime="12:00"). + + + Note that , , + , and , must be + called before the can be placed into + a . + + + + + Create an with the given name and + default group but no specified . This will result + initially in a default monthly trigger that fires on the first day of + every month at 12:00 PM (=1, + intervalType=, + fireAtTime=12:00"). +

+ Note that and must + be called before the can be placed + into a . +

+
+ the name for the +
+ + + Create an with the given name and + group but no specified . This will result + initially in a default monthly trigger that fires on the first day of + every month at 12:00 PM (=1, + intervalType=, + fireAtTime=12:00"). +

+ Note that and must + be called before the can be placed + into a . +

+
+ the name for the + + the group for the + +
+ + + Create an with the given name and + group and the specified . This will result + initially in a default monthly trigger that fires on the first day of + every month at 12:00 PM (=1, + intervalType=, + fireAtTime="12:00"). + + The name for the . + The group for the . + The name of the job to associate with the . + The group containing the job to associate with the . + + + + Returns the next UTC time at which the + will fire. If the trigger will not fire again, will be + returned. + + +

+ Because of the conceptual design of , + it is not always possible to decide with certainty that the trigger + will never fire again. Therefore, it will search for the next + fire time up to a given cutoff. These cutoffs can be changed by using the + property. The default cutoff is 12 + of the intervals specified by intervalType. +

+

+ The returned value is not guaranteed to be valid until after + the trigger has been added to the scheduler. +

+
+ the next fire time for the trigger + +
+ + + Returns the previous UTC time at which the + fired. If the trigger has not yet + fired, will be returned. + + the previous fire time for the trigger + + + + Returns the first time the will fire + after the specified date. + + +

+ Because of the conceptual design of , + it is not always possible to decide with certainty that the trigger + will never fire again. Therefore, it will search for the next + fire time up to a given cutoff. These cutoffs can be changed by using the + property. The default cutoff is 12 + of the intervals specified by intervalType. +

+

+ Therefore, for triggers with intervalType = + , if the trigger + will not fire within 12 + weeks after the given date/time, will be returned. For + triggers with intervalType = + + , if the trigger will not fire within 12 + months after the given date/time, will be returned. + For triggers with intervalType = + + , if the trigger will not fire within 12 + years after the given date/time, will be returned. In + all cases, if the trigger will not fire before , + will be returned. +

+
+ The time after which to find the nearest fire time. + This argument is treated as exclusive 舒 that is, + if afterTime is a valid fire time for the trigger, it + will not be returned as the next fire time. + + + the first time the trigger will fire following the specified date + +
+ + + Called when the has decided to 'fire' the trigger + (Execute the associated ), in order to give the + a chance to update itself for its next triggering + (if any). + + + + + Called by the scheduler at the time a is first + added to the scheduler, in order to have the + compute its first fire time, based on any associated calendar. +

+ After this method has been called, + should return a valid answer. +

+ +
+ the first time at which the will be fired + by the scheduler, which is also the same value + will return (until after the first + firing of the ). + +
+ + + Called after the has executed the + associated with the in order + to get the final instruction code from the trigger. + + + The that was used by the + 's method. + + + The thrown by the + , if any (may be ) + + one of the Trigger.INSTRUCTION_XXX constants. + + + + + Used by the to determine whether or not it is + possible for this to fire again. + ' + +

+ If the returned value is then the + may remove the from the + +

+
+ + A boolean indicator of whether the trigger could potentially fire + again. + +
+ + + Indicates whether is a valid misfire + instruction for this . + + Whether is valid. + + + Updates the 's state based on the + MisfireInstruction that was selected when the + was created +

+ If the misfire instruction is set to MISFIRE_INSTRUCTION_SMART_POLICY, + then the instruction will be interpreted as + . +

+
+ a new or updated calendar to use for the trigger + +
+ + + Updates the 's state based on the + given new version of the associated . + + A new or updated calendar to use for the trigger + the amount of time that must + be between "now" and the time the next + firing of the trigger is supposed to occur. + + + + + Calculates the first time an with + intervalType = IntervalTypeWeekly will fire + after the specified date. See for more + information. + + The time after which to find the nearest fire time. + This argument is treated as exclusive 舒 that is, + if afterTime is a valid fire time for the trigger, it + will not be returned as the next fire time. + + the first time the trigger will fire following the specified + date + + + + + Calculates the first UTC time an with + intervalType = will fire + after the specified date. See for more + information. + + + The UTC time after which to find the nearest fire time. + This argument is treated as exclusive 舒 that is, + if afterTime is a valid fire time for the trigger, it + will not be returned as the next fire time. + + the first time the trigger will fire following the specified date + + + + Calculates the first time an with + intervalType = will fire + after the specified date. See for more + information. + + + The UTC time after which to find the nearest fire time. + This argument is treated as exclusive 舒 that is, + if afterTime is a valid fire time for the trigger, it + will not be returned as the next fire time. + + the first time the trigger will fire following the specified + date + + + + + Gets or sets the day of the interval on which the + should fire. If the Nth + day of the interval does not exist (i.e. the 32nd of a + month), the trigger simply will never fire. N may not be less than 1. + + + + + Returns the interval type for the . + + + Sets the interval type for the . If + , the trigger will fire on the + Nth included day of every month. If + , the trigger will fire on the + Nth included day of every year. If + , the trigger will fire on the + Nth included day of every week. + + + + + + + + Returns the fire time for the as a + string with the format "HH:MM[:SS]", with HH representing the + 24-hour clock hour of the fire time. Seconds are optional and their + inclusion depends on whether or not they were provided to + . + + + + + Returns the for the + . + + +

+ Because of the conceptual design of , + it is not always possible to decide with certainty that the trigger + will never fire again. Therefore, it will search for the next + fire time up to a given cutoff. These cutoffs can be changed by using the + property. The default cutoff is 12 + of the intervals specified by intervalType" />. +

+

+ Because of the conceptual design of , + it is not always possible to decide with certainty that the trigger + will never fire again. Therefore, it will search for the next + fire time up to a given cutoff. These cutoffs can be changed by using the + method. The default cutoff is 12 + of the intervals specified by intervalType". +

+

+ In most cases, the default value of this setting (12) is sufficient (it + is highly unlikely, for example, that you will need to look at more than + 12 months of dates to ensure that your trigger will never fire again). + However, this setting is included to allow for the rare exceptions where + this might not be true. +

+

+ For example, if your trigger is associated with a calendar that excludes + a great many dates in the next 12 months, and hardly any following that, + it is possible (if is large enough) that you could run + into this situation. +

+
+
+ + + Returns the last UTC time the will fire. + If the trigger will not fire at any point between + and , will be returned. + + the last time the trigger will fire. + + + + Tells whether this Trigger instance can handle events + in millisecond precision. + + + + + + Sets or gets the time zone in which the will be resolved. + If no time zone is provided, then the default time zone will be used. + + + + + + + Gets or sets the trigger's calendar week rule. + + The trigger calendar week rule. + + + + Gets or sets the trigger's calendar first day of week rule. + + The trigger calendar first day of week. + + + + An exception that is thrown to indicate that an attempt to store a new + object (i.e. , + or ) in a + failed, because one with the same name and group already exists. + + James House + + +

+ Create a with the given + message. +

+
+
+ + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + +

+ Create a and auto-generate a + message using the name/group from the given . +

+ +

+ The message will read:
"Unable to store Job with name: '__' and + group: '__', because one already exists with this identification." +

+
+
+ +

+ Create a and auto-generate a + message using the name/group from the given . +

+ +

+ The message will read:
"Unable to store Trigger with name: '__' and + group: '__', because one already exists with this identification." +

+
+
+ + + An exception that is thrown to indicate that there is a misconfiguration of + the - or one of the components it + configures. + + James House + + + + Create a with the given message. + + + + + Create a with the given message + and cause. + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + Holds context/environment data that can be made available to Jobs as they + are executed. + + + James House + + + + Create an empty . + + + + + Create a with the given data. + + + + + Instructs Scheduler what to do with a trigger and job. + + + + + Instructs the that the + has no further instructions. + + + + + Instructs the that the + wants the to re-Execute + immediately. If not in a 'RECOVERING' or 'FAILED_OVER' situation, the + execution context will be re-used (giving the the + abilitiy to 'see' anything placed in the context by its last execution). + + + + + Instructs the that the + should be put in the state. + + + + + Instructs the that the + wants itself deleted. + + + + + Instructs the that all + s referencing the same as + this one should be put in the state. + + + + + Instructs the that all + s referencing the same as + this one should be put in the state. + + + + + Instructs the that the + should be put in the state. + + + + + Describes the settings and capabilities of a given + instance. + + James House + + + + Initializes a new instance of the class. + + Name of the scheduler. + The scheduler instance. + The scheduler type. + if set to true, scheduler is a remote scheduler. + if set to true, scheduler is started. + if set to true, scheduler is in standby mode. + if set to true, scheduler is shutdown. + The start time. + The number of jobs executed. + The job store type. + if set to true, job store is persistent. + The thread pool type. + Size of the thread pool. + The version string. + + + + Returns a formatted (human readable) string describing all the 's + meta-data values. + + +

+ The format of the string looks something like this: +

+            Quartz Scheduler 'SchedulerName' with instanceId 'SchedulerInstanceId' Scheduler class: 'Quartz.Impl.StdScheduler' - running locally. Running since: '11:33am on Jul 19, 2002' Not currently paused. Number of Triggers fired: '123' Using thread pool 'Quartz.Simpl.SimpleThreadPool' - with '8' threads Using job-store 'Quartz.Impl.JobStore' - which supports persistence.
+            
+

+
+
+ + + Return a simple string representation of this object. + + + + + Returns the name of the . + + + + + Returns the instance Id of the . + + + + + Returns the class-name of the instance. + + + + + Returns whether the is being used remotely (via remoting). + + + + + Returns whether the scheduler has been started. + + + Note: may return even if + returns . + + + + + Reports whether the is in standby mode. + + + Note: may return even if + returns . + + + + + Reports whether the has been Shutdown. + + + + + Returns the class-name of the instance that is + being used by the . + + + + + Returns the type name of the instance that is + being used by the . + + + + + Returns the number of threads currently in the 's + + + + + Returns the version of Quartz that is running. + + + + + Returns the at which the Scheduler started running. + + null if the scheduler has not been started. + + + + + Returns the number of jobs executed since the + started.. + + + + + Returns whether or not the 's + instance supports persistence. + + + + + A concrete that is used to fire a + at a given moment in time, and optionally repeated at a specified interval. + + + + + + James House + Contributions by Lieven Govaerts of Ebitec Nv, Belgium. + Marko Lahma (.NET) + + + + Used to indicate the 'repeat count' of the trigger is indefinite. Or in + other words, the trigger should repeat continually until the trigger's + ending timestamp. + + + + + Create a with no settings. + + + + + Create a that will occur immediately, and + not repeat. + + + + + Create a that will occur immediately, and + not repeat. + + + + + Create a that will occur immediately, and + repeat at the the given interval the given number of times. + + + + + Create a that will occur immediately, and + repeat at the the given interval the given number of times. + + + + + Create a that will occur at the given time, + and not repeat. + + + + + Create a that will occur at the given time, + and not repeat. + + + + + Create a that will occur at the given time, + and repeat at the the given interval the given number of times, or until + the given end time. + + The name. + A UTC set to the time for the to fire. + A UTC set to the time for the + to quit repeat firing. + The number of times for the to repeat + firing, use for unlimited times. + The time span to pause between the repeat firing. + + + + Create a that will occur at the given time, + and repeat at the the given interval the given number of times, or until + the given end time. + + The name. + The group. + A UTC set to the time for the to fire. + A UTC set to the time for the + to quit repeat firing. + The number of times for the to repeat + firing, use for unlimited times. + The time span to pause between the repeat firing. + + + + Create a that will occur at the given time, + fire the identified and repeat at the the given + interval the given number of times, or until the given end time. + + The name. + The group. + Name of the job. + The job group. + A set to the time for the + to fire. + A set to the time for the + to quit repeat firing. + The number of times for the to repeat + firing, use RepeatIndefinitely for unlimited times. + The time span to pause between the repeat firing. + + + + Validates the misfire instruction. + + The misfire instruction. + + + + + Updates the 's state based on the + MisfireInstruction value that was selected when the + was created. + + + If MisfireSmartPolicyEnabled is set to true, + then the following scheme will be used:
+
    +
  • If the Repeat Count is 0, then the instruction will + be interpreted as .
  • +
  • If the Repeat Count is , then + the instruction will be interpreted as . + WARNING: using MisfirePolicy.SimpleTrigger.RescheduleNowWithRemainingRepeatCount + with a trigger that has a non-null end-time may cause the trigger to + never fire again if the end-time arrived during the misfire time span. +
  • +
  • If the Repeat Count is > 0, then the instruction + will be interpreted as . +
  • +
+
+
+ + + Called when the has decided to 'fire' + the trigger (Execute the associated ), in order to + give the a chance to update itself for its next + triggering (if any). + + + + + + Updates the instance with new calendar. + + The calendar. + The misfire threshold. + + + + Called by the scheduler at the time a is first + added to the scheduler, in order to have the + compute its first fire time, based on any associated calendar. +

+ After this method has been called, + should return a valid answer. +

+
+ + The first time at which the will be fired + by the scheduler, which is also the same value + will return (until after the first firing of the ). + +
+ + + Returns the next time at which the will + fire. If the trigger will not fire again, will be + returned. The value returned is not guaranteed to be valid until after + the has been added to the scheduler. + + + + + Returns the previous time at which the fired. + If the trigger has not yet fired, will be + returned. + + + + + Set the next UTC time at which the should fire. + This method should not be invoked by client code. + + + + + Set the previous UTC time at which the fired. + This method should not be invoked by client code. + + + + + Returns the next UTC time at which the will + fire, after the given UTC time. If the trigger will not fire after the given + time, will be returned. + + + + + Returns the last UTC time at which the will + fire, before the given time. If the trigger will not fire before the + given time, will be returned. + + + + + Computes the number of times fired between the two UTC date times. + + The UTC start date and time. + The UTC end date and time. + + + + + Determines whether or not the will occur + again. + + + + + Validates whether the properties of the are + valid for submission into a . + + + + + Get or set thhe number of times the should + repeat, after which it will be automatically deleted. + + + + + + Get or set the the time interval at which the should repeat. + + + + + Get or set the number of times the has already + fired. + + + + + Returns the final UTC time at which the will + fire, if repeatCount is RepeatIndefinitely, null will be returned. +

+ Note that the return time may be in the past. +

+
+
+ + + Tells whether this Trigger instance can handle events + in millisecond precision. + + + + + + All trigger states known to Scheduler. + + + + + Indicates that the is in the "normal" state. + + + + + Indicates that the is in the "paused" state. + + + + + Indicates that the is in the "complete" state. + + + "Complete" indicates that the trigger has not remaining fire-times in + its schedule. + + + + + Indicates that the is in the "error" state. + + +

+ A arrives at the error state when the scheduler + attempts to fire it, but cannot due to an error creating and executing + its related job. Often this is due to the 's + class not existing in the classpath. +

+ +

+ When the trigger is in the error state, the scheduler will make no + attempts to fire it. +

+
+
+ + + Indicates that the is in the "blocked" state. + + + A arrives at the blocked state when the job that + it is associated with is a and it is + currently executing. + + + + + + Indicates that the does not exist. + + + + + Convenience and utility methods for simplifying the construction and + configuration of s. + + + Please submit suggestions for additional convenience methods to either the + Quartz user forum or the developer's mail list at + source forge. + + + + James House + + + + Constant indicating last day of month. + + + + + Milliseconds in minute. + + + + + Milliseconds in hour. + + + + + Seconds in day. + + + + + Milliseconds in day. + + + + + Initializes a new instance of the class. + + + + + Set the given 's name to the given value, and its + group to the default group (). + + the tigger to change name to + the new trigger name + + + + Set the given 's name to the given value, and its + group to the given group. + + the tigger to change name to + the new trigger name + the new trigger group + + + + Make a trigger that will fire every day at the given time. +

+ The generated trigger will not have its name, group, + or end-time set. The Start time defaults to 'now'. +

+
+ the hour (0-23) upon which to fire + the minute (0-59) upon which to fire + the new trigger +
+ + + Make a trigger that will fire every day at the given time. +

+ The generated trigger will not have its group or end-time set. + The Start time defaults to 'now'. +

+
+ the trigger's name + the hour (0-23) upon which to fire + the minute (0-59) upon which to fire + the newly created trigger +
+ + + Make a trigger that will fire every week at the given day and time. +

+ The generated trigger will not have its name, group, + or end-time set. The Start time defaults to 'now'. +

+
+ (1-7) the day of week upon which to fire + the hour (0-23) upon which to fire + the minute (0-59) upon which to fire + the new trigger +
+ + + Make a trigger that will fire every week at the given day and time. +

+ The generated trigger will not have its group, + or end-time set. The Start time defaults to 'now'. +

+
+ the trigger's name + the day of week upon which to fire + the hour (0-23) upon which to fire + the minute (0-59) upon which to fire + the newly created trigger +
+ + + Make a trigger that will fire every month at the given day and time. +

+ The generated trigger will not have its name, group, + or end-time set. The Start time defaults to 'now'. +

+

+ If the day of the month specified does not occur in a given month, a + firing will not occur that month. (i.e. if dayOfMonth is specified as + 31, no firing will occur in the months of the year with fewer than 31 + days). +

+
+ (1-31, or -1) the day of week upon which to fire + the hour (0-23) upon which to fire + the minute (0-59) upon which to fire + the newly created trigger +
+ + + Make a trigger that will fire every month at the given day and time. +

+ The generated trigger will not have its group, + or end-time set. The Start time defaults to 'now'. +

+

+ If the day of the month specified does not occur in a given month, a + firing will not occur that month. (i.e. if dayOfMonth is specified as + 31, no firing will occur in the months of the year with fewer than 31 + days). +

+
+ the trigger's name + (1-31, or -1) the day of week upon which to fire + the hour (0-23) upon which to fire + the minute (0-59) upon which to fire + the newly created trigger +
+ + + Make a trigger that will fire times, waiting + between each fire. + + + The generated trigger will not have its name, group, + or end-time set. The Start time defaults to 'now'. + + the newly created trigger + + + + Make a trigger that will fire times, waiting + between each fire. +

+ The generated trigger will not have its name, group, + or end-time set. The Start time defaults to 'now'. +

+
+ the trigger's name + the new trigger +
+ + + Make a trigger that will fire every second, indefinitely. +

+ The generated trigger will not have its name, group, + or end-time set. The Start time defaults to 'now'. +

+
+ the new trigger +
+ + + Make a trigger that will fire every second, indefinitely. +

+ The generated trigger will not have its group, + or end-time set. The Start time defaults to 'now'. +

+
+ the trigger's name + the new trigger +
+ + + Make a trigger that will fire every N seconds, indefinitely. +

+ The generated trigger will not have its name, group, + or end-time set. The Start time defaults to 'now'. +

+
+ the number of seconds between firings + the new trigger +
+ + + Make a trigger that will fire every N seconds, with the given number of + repeats. +

+ The generated trigger will not have its name, group, + or end-time set. The Start time defaults to 'now'. +

+
+ the number of seconds between firings + the number of times to repeat the firing + the new trigger +
+ + + Make a trigger that will fire every N seconds, with the given number of + repeats. +

+ The generated trigger will not have its group, + or end-time set. The Start time defaults to 'now'. +

+
+ the trigger's name + the number of seconds between firings + the number of times to repeat the firing + the new trigger +
+ + + Make a trigger that will fire every minute, indefinitely. +

+ The generated trigger will not have its name, group, + or end-time set. The Start time defaults to 'now'. +

+
+ the new trigger +
+ + + Make a trigger that will fire every minute, indefinitely. +

+ The generated trigger will not have its group, + or end-time set. The Start time defaults to 'now'. +

+
+ the trigger's name + the new trigger +
+ + + Make a trigger that will fire every N minutes, indefinitely. +

+ The generated trigger will not have its name, group, + or end-time set. The Start time defaults to 'now'. +

+
+ the number of minutes between firings + the new trigger +
+ + + Make a trigger that will fire every N minutes, with the given number of + repeats. +

+ The generated trigger will not have its name, group, + or end-time set. The Start time defaults to 'now'. +

+
+ the number of minutes between firings + the number of times to repeat the firing + the new trigger +
+ + + Make a trigger that will fire every N minutes, with the given number of + repeats. +

+ The generated trigger will not have its group, + or end-time set. The Start time defaults to 'now'. +

+
+ the trigger's name + the number of minutes between firings + the number of times to repeat the firing + the new trigger +
+ + + Make a trigger that will fire every hour, indefinitely. +

+ The generated trigger will not have its name, group, + or end-time set. The Start time defaults to 'now'. +

+
+ the new trigger +
+ + + Make a trigger that will fire every hour, indefinitely. +

+ The generated trigger will not have its group, + or end-time set. The Start time defaults to 'now'. +

+
+ the trigger's name + the new trigger +
+ + + Make a trigger that will fire every N hours, indefinitely. +

+ The generated trigger will not have its name, group, + or end-time set. The Start time defaults to 'now'. +

+
+ the number of hours between firings + the new trigger +
+ + + Make a trigger that will fire every N hours, with the given number of + repeats. +

+ The generated trigger will not have its name, group, + or end-time set. The Start time defaults to 'now'. +

+
+ the number of hours between firings + the number of times to repeat the firing + the new trigger +
+ + + Make a trigger that will fire every N hours, with the given number of + repeats. +

+ The generated trigger will not have its group, + or end-time set. The Start time defaults to 'now'. +

+
+ the trigger's name + the number of hours between firings + the number of times to repeat the firing + the new trigger +
+ + + Returns a date that is rounded to the next even hour above the given + date. +

+ For example an input date with a time of 08:13:54 would result in a date + with the time of 09:00:00. If the date's time is in the 23rd hour, the + date's 'day' will be promoted, and the time will be set to 00:00:00. +

+
+ the Date to round, if the current time will + be used + the new rounded date +
+ + + Returns a date that is rounded to the previous even hour below the given + date. +

+ For example an input date with a time of 08:13:54 would result in a date + with the time of 08:00:00. +

+
+ the Date to round, if the current time will + be used + the new rounded date +
+ + + Returns a date that is rounded to the next even minute above the given + date. +

+ For example an input date with a time of 08:13:54 would result in a date + with the time of 08:14:00. If the date's time is in the 59th minute, + then the hour (and possibly the day) will be promoted. +

+
+ The Date to round, if the current time will be used + The new rounded date +
+ + + Returns a date that is rounded to the previous even minute below the + given date. +

+ For example an input date with a time of 08:13:54 would result in a date + with the time of 08:13:00. +

+
+ the Date to round, if the current time will + be used + the new rounded date +
+ + + Returns a date that is rounded to the next even second above the given + date. + + the Date to round, if the current time will + be used + the new rounded date + + + + Returns a date that is rounded to the previous even second below the + given date. +

+ For example an input date with a time of 08:13:54.341 would result in a + date with the time of 08:13:00.000. +

+
+ the Date to round, if the current time will + be used + the new rounded date +
+ + + Returns a date that is rounded to the next even multiple of the given + minute. +

+ For example an input date with a time of 08:13:54, and an input + minute-base of 5 would result in a date with the time of 08:15:00. The + same input date with an input minute-base of 10 would result in a date + with the time of 08:20:00. But a date with the time 08:53:31 and an + input minute-base of 45 would result in 09:00:00, because the even-hour + is the next 'base' for 45-minute intervals. +

+ +

+ More examples: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Input TimeMinute-BaseResult Time
11:16:412011:20:00
11:36:412011:40:00
11:46:412012:00:00
11:26:413011:30:00
11:36:413012:00:00
11:16:411711:17:00
11:17:411711:34:00
11:52:411712:00:00
11:52:41511:55:00
11:57:41512:00:00
11:17:41012:00:00
11:17:41111:08:00
+

+ +
+ + the Date to round, if the current time will + be used + + + the base-minute to set the time on + + the new rounded date +
+ + + Returns a date that is rounded to the next even multiple of the given + minute. +

+ The rules for calculating the second are the same as those for + calculating the minute in the method + . +

+
+ The date. + The second base. + +
+ + + Returns a list of Dates that are the next fire times of a + . + The input trigger will be cloned before any work is done, so you need + not worry about its state being altered by this method. + + The trigger upon which to do the work + The calendar to apply to the trigger's schedule + The number of next fire times to produce + List of java.util.Date objects + + + + Returns a list of Dates that are the next fire times of a + that fall within the given date range. The input trigger will be cloned + before any work is done, so you need not worry about its state being + altered by this method. +

+ NOTE: if this is a trigger that has previously fired within the given + date range, then firings which have already occured will not be listed + in the output List. +

+
+ The trigger upon which to do the work + The calendar to apply to the trigger's schedule + The starting date at which to find fire times + The ending date at which to stop finding fire times + List of java.util.Date objects +
+ + + Translate a date and time from a users timezone to the another + (probably server) timezone to assist in creating a simple trigger with + the right date and time. + + the date to translate + the original time-zone + the destination time-zone + the translated UTC date + + + + Gets the offset from UT for the given date in the given timezone, + taking into account daylight savings. + + the date that is the base for the offset + the time-zone to calculate to offset to + the offset + + + + This functions determines if the TimeZone uses daylight saving time + + TimeZone instance to validate + True or false depending if daylight savings time is used + + + + An exception that is thrown to indicate that a call to + failed without interrupting the Job. + + + James House + + + + Create a with the given message. + + + + + Create a with the given cause. + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + +
+
diff --git a/lib/Quartz20/mono/3.5/C5.dll b/lib/Quartz20/mono/3.5/C5.dll new file mode 100644 index 0000000000000000000000000000000000000000..2130d1fa206f3d5b518d8863687feda53fa93395 GIT binary patch literal 272384 zcmeFa37lM2l|TOay;twm)}2&$r>aRHodDew^{RRcOA;UfWDQ$b#O|;OBw$$bpc+t9 z6q}-`5F7bN`OHZC(iN5k*?J?Fkxud1sPa2$X0|9t-a zN$T$Bo_o%{=bn4+@=n?Ca?7zS%fZ${NX<9q0ASSf3WA| zFDyUnIh$vfT~!Y+tzUTMvWqX=vL(D`*+rX{)vw*MZ1a|7$DDTNvMa-lo5p&3v-=y+ z>yNdplY1O1Jnq5cquRb}^)1i!q%CV1u<|r^+gkXS!G9z%JyQL);*AKwpRRQi(h+~| zq7>S7WXiG@%D^UVBYZ*} zvaGRdHa+hegzp+Q?OLXIC$g})&mODK)-Oh+;07Em{ImAuPwVeUU_VyhbVZ1a#MJ`M zq=7X$C*RRbPX1j*y5f(x*;dNhxYoATKiOktB)0Xlewk(6)C$h)d-rP^&p&Zw`nE@2 zyw^*r-*-R$`6s{qo@bvvdf)i2Hw(3jy^Cxeyt<%48=&fH`clIl9*|_P~M<2Rm!nO_pc0HC= zu&)I}mt?)F?}Z0iR<=^i*0CNogh1`LJG1Gkmkvt^JnkdC2VKUt7F!D| zR+bH2YKH-fFSW~6y4hl7gWagXTg|K67-M{~a-1EG!{=O3^JbstSl-skz=UIs0tVPo zuuJ6$q-v3o+JaGgb`s%{Y?H7&C!B&)`FLBl>N3slge&5rQd`Zp2c=x)>~>u2@F0Rg zoo#gw?V;|2weDoLR^6beLA#^w^G)4->e`MQ9!fwLnfL{9d@5YYgf^TO?*XS(ic>OM z3#Zjj1E<3XsGS~5_fYrYT6Z#AtL`J7M%`=Tx(|r@!SKR8RKAvFK54h*Yt??_)2RI@ zsa^X*tNvwss2^fN>QClt)&GpAQU5W7^spU5%x9~kcB&K}$I>Y$gt*VzZYhN1f$M}P z(hb+)w{nBYUyS3Ue42i~N$;~A18+{etMzn&7u73x%t<%!09Wvulb%wzPAZw+hEJj# z_`L+9bbtl|z9&r-BfNcIK;8EI4A^8r4W7U&sm*AI7QGgU96 z?eZ!LdyzGKPz2kyAYcux2rU=%MaX*LsfaLW{;Um6h2vX`m$%?RoMAR2j)apB2GdGu z#|uwGMAa?jb{5S9fJV0_fMSJHfN8gHEjyqE6aBso=8_JWIoG?H!~p1h4Cp74pxs@I zm@G9!I3F<9g1-lxYi@BKoJ-wt9>844c^xWLp?o@89iD+7yKyFdS1hs{XTcrbwIXL1 zoAlb*V4yhrO!%^%-8dU=lRxl3i~ec)IS0rZxB>v@$3a~wqlIh*1m{O$8E`arI}+f zWmAoi{}lox=*JB_+ZwX$#R_jq;oVN=R<^2=U_09I7Tud9du2;R5ovZcXRxR4fw_@T zm0!cVB2Fk1oF#~7C;#09CzAoY(Z2c3W=|4L7-62Efg{DfUS^SHI-dC#}7k9|2 zuWFYncGYoecCliIS0l!e-!Tc-CCpz5UkmMW$w;;uI_k?+H+kVKQhoVd@hqKA@=+`H zQ{gk}YHL(Vg;;H5Yw6-Z{)vx)R0j92l@NY6!?9d$i9$QPmSvvlsN3g+*CA}n@6=kY zZJ;+;Qs|Z8JK#D6H+*hf%?5x)k_^nppI9fMs*f0U_Qws-wTk;dAHeh}n3P>eCBO`@ zU|$5rkr2T2DHuD1u*p_WbJRWFfLjpkS6HCnJiFk9&qpT5xMM7LZ*{vur;2UTQgVDl5g_bT2WD0&E-Jb~?thkqfLZ&nwUXLJh3BZ5anJ+8^w1p9p z>|O(fV7yRJFj*AK_UFPTVGI^>#mNPXDdb8s0w_pIshN$)kx_A`TV-K%o!z(vNmXz58iwr=fmNDr5+vl9q|)WMtz;L|E2FxiQIKPmqrc3N zQGNk(-1I_b+ZV&@R>@yP{_sWgB8Qm=RUcraSq1(#CUBj<^VR_?l-_F~k6sMOK;Smk zO1N(PL#lLei}{`V8WrnXNfm1+7SWy;b-px^>)D%qX_XahjQZP@ zwdN}I@3I?0in#y0loYY;Yk>F?(=A?xs3zm1PNXFy=c$@A>Or@&G}he0$HUP6UPIFW z3BAEkOJ=KP=jC@U_DZpM{%%q{FRB1}>H~inPN-0QIW30P)Vila*z)?L&h8T-Sk1;5zm z`P+9C{8DN?ezjnQC0lR+)PPAB(g5QDOuFRa$AHNcG63TNOs3T50#3%jkv4f2^f{{^ zZA!Vq5_k5sKrgESugRY0dQCD5lL48B$$(DhfJi2}o`5RZ;XTOdOqX8=hr-hVPcB4# z{IeZRcBjktGM5x_g!WRadNsPO{+apf*Ca;<5P3$~{1vzZ`w-5p zMCFzr{vG^SR2_z~Zh3-spSxm_CoL{c<~@T4M};P9(lm1AJy)@250A=@L!h(qakj}m zPwAIZ`b8Nh1|r{zQdAwY?m%H=rK7Tc^|LS{lHwl?RGC?_-u0H)# z&3F@eKP7#wNoG1w5+@1}E4_YSf{n;r_R`}yKkX{w!9l*GE$}i^PBCyYo;EaC;$$XD zzL%LyIq8|eRESa>5I~BW;_3_7UPu%ui>}Vs(R{bmdh;h$AEf-lqFdyjEkssfIgOz~ z(&Zd!O5RUT_xj#=CZm}q>>&tOR#xqWQplVWo|l=xl$NgcYJ@-GWxNSY4tt@`Q17}F z^#Cz5CaUKr2SjjqtAkA1Uil4xm`@+er8>HmSQ6-By0?OYQ|t4>`;jAnB0|^bDIaO? zsM=2ltrO1GeoEO48D|xVL#g=y3c}$e3Qg^ebc#Z3+b+TmPuQTzi8ji^tfq3P6cU?m zW;Hv+_!c~srdzDVw<%3u6=@yp3(!Sw5Cy)aT&Pf-Cl~RRL7}-0iC~d4(2GJ*fgE8J zh$VVav2v=(<&@va;?!C|K=O711S^rZrl4eiEM%6P=QimYO{!+oV&aDnvUGN+B6Gxv zD9^vByiqd7GUy(xD}ecnD7)o%;dj&+p1~1PdPG3#R>K-hCq$rI@KX3 ze2*!CD&oRe4&5fybHeu`*$E%Q@3cakal`i!B27M}vQ3i@`-~^D3U(sX=3?)BID-tF zO-FKhH~auR171+W8u)|o-j0Rmk_VRKM--1inTiKeejz2D7^14Tkjf!5g-Y$SkSN$i zLlC6SKAx%dR6Jigx3BZInXohSPuM0YQ=D94dubz4%zSO9olL6yA%Ko#)s(gRibz&D z)>)wCUeexUk*9i6G@C<5XTF>>WnzGzleVL}9)u%V zge|lgC_UcwB&&Bl>8@IS&Mz*y*9Re(>t0`Ve5^r~W;@bIVdfp_^5rI~xNEL?=2A;W=!Yi1n* zG#9ZRb6eV)?Xj$72^w!9je9DCSnC(Dre{xI1#QY2gu=-{cprWS zGQov~jA%5R&g`)>?Sd=nCxGLLh+Gakb3qjg!UMI zGGIU}6i|_-zKIHCGJF*#!we=vvyGXl?wtw0iu9~k^tNp-e+}NUiwY1Z&E%o(y%RA5 zDKj;cW;E;-2mIjVLQ3TBK)R4BsLmn^OTjCo#p6Ne^DtCk5l5U~{yOnUi6|am2~O`= z)MHlT8eTif&^c3Y_NvQG;Jj+71tH2Ha1y*Rn=Gp5jayq@*P45O09q}VvB;j?=S^cU z(x;%X+UfIVa=|hEcHAG4rvuy2J%eLY&3wrZ6TOEOUHiX81TD6*=l7g;aAuSaKAu_(mzN^NB>A z7hw$SJ9iAAEA2$CWW@miThTrkEh?f?v zE}ez=ilIqHqaaB32@FK0stO3$wO0j~Bv9!cgmG(aMzwtDqN$9Aobq>24n5Yb<_c~> ztvvyTGNl!QuM`JkIMth}rnOA%{qPptj9O+|lZb$?-IhR9y=E0gh(c`zZc0-~ia3h) z70KgYgU9=U-cVZZLb|Gt%Dag^J6i&2iP%Cb$UBfjk(%k{(}MzbC6z6|dP;yTbTvmV zwCw64R{<$d1vkFauAbvLf}*3XccLOaux74pg&Y9rg3nH;y4bU|jmB6O0kD8*)pJ(Y zVFIwL3)^#H0bT8DuQ`p*H+vQ4t?;{Ooy@%{>k2ew|9Sh~?DvopbA6bifOEp{BbZ=3 zO{hb@m&U=5duI6@ZTG`Q;x08sRalZa_yr8c3H^zV>bO#A`0t3uMoDy# z=a$H95dH=UvZ?QA#@`}5YW6hRaQPh)D%+xRuHdExLn#x(W;;?AluPS?xc^X#egFV! z5Sejr=6+8+B;Yq0RK;e`Muw!m4IR|?q!UAqZ$r8W#I!7(ME7I8H=|zB!G%tLiFz|} z%UqpIgwzo#qX|?Dtv?CW3_h-PE9S&EwvF>W@(0Tr%D15JsBJbm?G)U+slTrdj{Uq!i$!I>5F{|4B;Esbm+TYY!nCCd+9YG4RVz zG9x@94tVT9#6X1Kk!Mou3pv<3M7~WIyqRF3Mz&%G-1f?iv?!$1lC0UQgNC$HE=u!4 zt4D^C$k&^|lLMbRPq21Z2K0gjhW@D}{k@eR1^snsK)L0dJK%{a$|y`@3qTGf>}g1> zepT~AJ%+}RF^n);u^$|wslpCZO4y-nO~Q`>2rs%u_Kb+!qN_Qm^8x<%Fly9xpX&Pup_`~&;!01j?!qUY-WN8)+C%BXlJTg&fSTmS;i6cs*RZr0tU?nQTMmm&&H65-fh6tUr|2K_u z8G`@Q<6MNv|3A)mH_mH+&2e7+-#pH3i*`q-IPrQkp5}OegwvcShq85isl6$l;BW}j zGxHL=_GpJ<{(UdBMY?nThw!DHB(CQMiji5IzT?~)L(Kc)?+s3H%zBb?8PZ)%$XMo; zGn$amEd~(?84>Nhe%mg;ISYX^ESzmuJm`z7tGYj{eJq|khrKaDO*{03nyyZGd(4-L^10SEfAM+oAz;{jM#M30 zB5kHc)7G!X6N;!N@r*d}XU~P*s;RyEsn3Nc|F!1AXrUpq3|Al?`O;c&_{t{fLoijF zGv8^%W<5FaokHYG@qZ=u`z##lW0Kv-;5WPzgvJVq{?-s^W|_gna)P7wC0RIRsC`L* zDY606%prg942`xM49Rv2KoF8>H_bd@mZWZ2nhX*q1Jxp}R0`x(9yBv6wr_(po1-IuNpd7akdvlvAk~*Wv}vn)p*RJPzPqTsikwd?0<%R z$X%-NU$L^rV~G=);Q}HARxG5Oj3_VyYdP3`4{~uQQpO-DRb5o>M_TOFe4(OSyB;Xx5dzA!^@DRdr1qj2akPMcKTIJioFXUu9X_RJN+YbZdt@?IUw?wPs zS+4f#{Eq7Uj_Ulq4AAw~}t3N5zJ2JiOLkai*i< zOh?5T(v9FFy3s#}8kv}GiQ3yJn24WSI;N%Uc4$u?3+v}OG2++KZFbyS?|s5r-p2`O1|Zn51KY}H8t zs=L;sqZqN=eOZ0g3L7vfJ&oX1j@n!Ib}j@e*}ki| z9HJ&1LT|3rZ+5M##O|~jV{{zDiUNh0@kXy;xEJ%Os#D9?UxWPR#WD<44kGRo$+#^j zTRT5&w1^sl}P9Mu-QQx+oyg!@+5?i0k*dipu7*Ft*3P=8|tqWelbZJP(F}VMfcUuzM+EP zNG(4)8_;tTgJ=}z{u0_myTO7U*=fu6Tez~#J-2d|nI49!!2LW__ziJt1xF?xJt7Fh zHMapc6E#@~_u?J#;P9CgD@rk$<9+KtQP&jd$G_r8t~rJ({E>Wf9Bz7~w>befGcw>d zC*di$%_%sxJvcIuYOY{Rs(BC`M`Ty^I(5VQP%ln4t;gx4zk?U+ps{1@1~b-*_UyrM zrIhg!j;4BM%l8n(jM@z*cxK;MqN2l3Z)!jMWI*>+py;rY@KF3nOEfGSz~M?nD$G{c z+;=_8I`7@B{Z%y4S|Q_x#3-(LJ7^S4^;@!wn)7{8LL76XRToUyrl+)lorv_oA!#9# z1ndT(j31?_*b*16LexlBnCebG5bSS&=hFt9vBHcrNOgdtV@tq*!<`K!8&lfAO}$sM z6eq6=`hXA_2ncj+2^a_mMhG!QAQ*H$C&kEr6r*D|^jF#uSIoFXvC_=cXQcl+)`vi^ z-O*1w>;GQ*p&7Ck!F1f#4#;&Y*eC7>t{(85pTf9N!rrJCRXGBSAmenay2rlh}Ciyu_5t;;KGq2ZO%F*%J`OH7^@XdyvC*DBq9) z?K}CeXY5`KJrX4vq#LhO)8);09T!+|3qi3;<#O0*o`__0!gX-ec6AfrA1d&fBq&z* zwHpj@{_PQ;L>ry;B%}ljk_m&mda7&e24UX58R+o54+FXW9%PH7cNLi!vV0{OkK#b? zeCJvWl_hcq*?EB8^2y9Oy1;VOHx>EV=cQks1>CVO4%)PE$IdSUsN3K>h>$3U%l_#n zDGP7q#0XW9mw`Nv(kpHz?=&d*qWXtKjfo*A3YJeHWunJo%)whB0Lpo zqc}t~G;>x0FJ6@22(tlj$K`20o^ZBPe{4?v7`M6kM|bY)Vfj%1R*EX2y@T}|dRLK&ai5Cg z<30s5S=6WKEuR4x+NZ=PeTu%gPu+~RAJ)-!^b9`Ah&XeeoZ5+ZSWrwD&E)n0w+yDA=t##?5LkGH>^d zTQ)cU)9AkDPSl|Fg1?RXFPV2cf1>`o75(=tG#&l-nRHUkv*}<)eU=b}{n){*bhz-6 zIpcoJfcE1!y0ah03Ft_x9tL&n25X7CG6UL`45J&GSGBF+saeO=!{szfLywY2q1`Hhv;*+63p9}?&uMeW( zM|98+U6#bz%~*&V&hE{??#4pgN@ixD+gOMOPTVG(BbA2Z^nh#HJ&3Xp^Az2{UEk4L z1KjH=KeFdxNu|h3PuSrBNQ~PFJv`%xa|JCxTm zRXooZUaS?cPhHW1p9HO^w*;%Gf+O8z1;D4t+7t;d+z5YkdutH7{?)_+1vVi*yaYd8 zPjy|2gygBN=MV}FSLXCsxH--cnzVY9=1Mcn(Jqrn-QKlse9CRwU=D+rtF8v$(hAsU z$Ph2Qj0gpL_gf><669lpqSR!gdu>CW@+Z+d4ErC>`9B#1;kGnANk~aGOE$qTPwx*Yi|T~LJy zb{%q1jyl$Tn46DEz-{ez8`7oaih3a}q|5c&ev5RoR|0IZSJ+CqtJ1w*8z~P54cG^9 zz@N_eY5ft+rloIc?uce>M*xET`khi+rY(RlYHqW`TEWHwJ0a`YO4c+s0?gB$YOmI7 z;wx}vgon(IMF~8(ceT7?g$O}43;`B*MvlQ9j;rWR^``_`4=#m9cr|`zgKG!imFu7>`ORQCAMdQNdIoN2fnLCorG?O+m67vfd;v6uuv-pVv z*DwG$l*6+I-kxROX+}O6;L$ry+K|>Iz@pu!9`vFX%=S&JW{MuRH;Y7|NsC4^h&GFfy-p&KcCeU&nP|9ePnT zuAA2IJ?cNs45RBna~UpZINSY8l=EfGJr^nFjl~oqX~25}{;zx#Kd=Kb878>ru{<|U zo6k=~$izXZ*WAk3lH?Aai~I~r&uTU_KOGT<&FkR{*4YgK)B+s6-~~Q02UHF^03{_k z(wj|23`r$;sBzNNXG{L##5+u_BF6bXhh4q_1@zIz8{y-ljU4~j#$NG`xY&%=ggvh4tpKnqKeADfO*7x3MsLA=0;PhV72BKD-qn zv5k%+{|SPhX2=GvH?#qpZd3p1$&7%8GR1exFM?zHO@{c^f+u(BP~4m`j;dGz9p%Ny zgDYpOY8*QdEP|joC3A4ZnJM2!fEw$H)awux+|OJF_@X;1b((6s0gjY8bB{p z^S04Th~s5O5H6K=NH(Kjfk-?P$@%9*X?tt_Q+({kO96pvU8V@4vL<#cgk}6j2bMHH z9_8J?egXKB;7F9B`}V>f?DhxPIum-nfzzjSS8U?;D zi3n1`q>(Vw%{vo`jA_1HBj_~$20y_`njdEX5Q9bEpFU)DPHCfOZep-6bhp*Ti#j($QCUhA2-b>MYz_LYd_{s3|DD!-36pYB4~ z)=j78-SqdlHD^)KQ)<47A>97crvEKNsphNUa7#&wHCVuGDKUZepNr;6M{rI7nzpp_`g1>e0_tnZ@CZYRphZEH8#%tjkG{oC#KqAf5 zCmE#KT1@ECAfye`%EEgHywqeJ!a}KRM6!T|%xO!&z-G(VJ`Xd6u#$z_SjmV^RuUp* zTXen=Ybx;ab%-S|iJ`tv09j_8EMvNZ#h5(nVYUniW_71c(4INqFNRA-v14 zMm@_VV(g!Z zj4EaWoG6VXnn+>oW90_`scL%_p8E#M6iHKGQ}+_uo>JUHGIEZIc=l`0pk^TC$1(U= z;1a6Fm}XFq&Tkh39{+41yW+HMb7FoIfq?gEG((q}P6~FN=}P4{k%T3u{AQ_d0P`sn zSH59fK=Tb`*#6$aY{DQ%##+{1q(v3>WHh~UUL_k1GHsPAe(?)fGS^~0WB;LjRQr$g zkY-yCIVbKRW9vP^$sNb*ZNe2H*|a{>M(UaVYO+oA8&CVwbS#OCbWBfsUB^K#T_+A& zmo}nxs$*T#j^pKRIG)(TagEmL@P)Yqj?UZ{<^&IkrVlD_0;31pFpBVb=H>_=SMC6x zMn0Lh1H|95CEy4kYiF|Cv7mPYym1{i|$NJ@=I6>skcqp#+iuN@( zWu@Z2)T+NcT65c!jpiHzYtoL7cjDaXoP(F)pmH!e`7)g8jCdK&=gV*|Uxs5ID1g3s z8IJvEJK(MtIV9BB)=rIFa7Bwv7s7r*2x>(szZG8dN*p$#CklA~+-*6nSajObCao_DA6a$kFC`R&M#alh0lzk@!U_fy-u zgpS6XMgc~#@J=Rgj|3Qdd~0szxKku$h~ku;3P>3v-Le_FN6H#5Ify`QJjhB~kETfw zkESuPh~xX>>GG0lQd~MJE_JSS<;*4R@u~}VDVq>BZBj-9MlWwoZn)5H9$Z^o`NbTd zIL8TfgD3)r*reFR{6JpIj}}E#m|Z z1F>TyKAREQ$G+M=R(D?L^O0I_d_}7kE!tL@;j-YEnf5X><%a+sFR(4QGdd+?bT&!o zB2FfJA2K~&QCr0et%-*sTgCO(aUZuX#3;ku>B!spvPKX~O!Zi`ckn5;gPd$o!ODPb z@uYuy`UG1tN^K`HHA9w6ec70)x0@wc(dq0CMu_OkYhN+hbXauB%i%`VjB;Swi5}*o z{fbMNGuQ{r2%_GBu_&hS_ais#N4}uGZ8NVa2WJ{83MkyfmIe)^aQ9n2PJs*L=Bk@l z-8Y?Ck@tr(8%BE5qE0CwxsFmu$s}s7l*0~945!}Ur^P62?zHiI@tFzSm}m9_KneoI zD`z0zbk7Xqb51^Y_CswM+1B%r59f7YOE9e@z~bautSYC_)mu`?*JjD{Z+X)oxA9>B z^wak@F?f>8%TE~WlW)7}y9zD2q3y%lSWp$Bx7}=!Ry8w+;NWmivHbUfb4yyZzu$)Q zFv<5fR64f7oC`sD9=*V!eU&=?o^aD1GY27Ui0McXRQ7*#80(oWUPZ8zXc@Ocg&Pi=d?k&<#>)e|bfa3m}t+}*uJM)P{V{Ep|q!l7ZD3_R7O>8u2}r3hwve|e-!XB;<}j^y;Jol5|!@yEfb-; zk!!>YVA>FbG06;jeBMR`nO3Y)I`LSQ*8f=Rb*fLWrd<(F4IPrrQW7}jEQA!^shS6E zeQoIbAfxOhPz8S0T>2``9jN=H?y(LwuRaM}F!_xglti9ednB@1n`WeS3EJXKw-#yB zQy-WQM_7WXJeiS2!>|c*5Gk!4>nPyek|#+WDOdk5cJxmnGjy6R(u8br;s=7HZ{x%n zT>dG2^=%+EPDX-ZVGmWxPZKj~Cgx1ziDrD)m`B}BI<;$;leyoOc|SSHyWwZpoTv8e zkG|d`WGMfFtZNbFmkgc}(}=>TxXU%?`rOu=6o!ab(}XD^Yb0Bo;uk`a<3d<=Gqcb@ zLK%zBq;%$)kk1lhj!S*lU3CwP(1=$Ad7SA5+JnsS6OipyIi_dC<7$u3`+N?yCl7*r z9^tlwAYX_xgeEQV#t(5f2SFq;amIn|JQD4kPK*Pp@ijg`%uW|zC$1&t@pg|V-3p>7 z#vWq=bSMeUpx>(8H}ZFWSc&&|3`|3*81CG6cs%Qh9?Qa97R&co7KjG*AHbviAp$wK z5JS|18os>IgQFRC`HN_wa!X(35qZj2c{osvT*bRQv^ppY@zRTaQVzFhr}>baywQWV zSH_3T*e|F!8yQIJLp`6;*KW#RA~E+(bI&iW2Q>6u9)V->d>MK8&|)`WyU@1UN0~Zx zXCZ}lv5XGCGRq~qn87?kS#xQlpp}wlX1EqobH{5TB?A`UVKS#gXzRfdCBE4{m+tMf zjov@vTRSb<%7Z&fT0FRuB(1j+2F~d5YZ;FCx{-_yeYHp*f-ZRDLuRxVQZi0QU<`yw zBU^n`g_b@zpfoOPlwVDQR^}*-a7pNGatfvKgynpIYado9d}C?tR+xSZl#49&kCRJ*z)c0D=eI-;;%fyWKjI2M%W+Nq5g^^EINcm+F$&?b9~kQr^Z+H|H1f* z1{cTHg&14sP@Wlmb-w9CURtHZYS*>%!Ez(+eUV2YJL0ImeZ%)5WWk!A!uN|%4{iO2 z!ENcsMV_PCzkT1pEP{34KwpbVY^pvc`?-JVw_-eN2L0~b{|UK%7aFYdPX^C%nl(rv z1^F`zuKEsJB6(gwBZF zJ=#Nf&tH^cZHw%~pPAm{K78AxsQ@Nx^*2dDc23!|*J(h#Qity3FG4!hHko#dpDxDmcg(-qJEE`aL~VjkoF^02Vkna5=!G z6|W`4D=VL}%1nJaF@^96ZQcLdXgs<@;Ri=xKHq_2c+Jo?eLcj0PrK0ZuAKtU>MS8{&sw^lL*#ecU_*e^oB(RK*r=gqEwz~%WP1tsy zw)s}DRklp$l&pSa%*8GTJH8(obA4mXHRp~0JEq(xUIP5h!3|@t6wB^OTBWw#pcR=8 z@FiMq>uOq5C~-JOliMu5BeBKThZ&eVhzUv}Dic12I5{VUg{_T~krQu-?7o*JjC-AEKIkFoRl-f+b3Hz=;^+RLb#SKX)^71IZEGLELd>U34mtO@6@;uPj z=t1VMcSd|eBZ}p3(gVKRavc^nD%d#hM_lzrZC7;_jxI1lKAv+QQ;>tM-FO(k;kW1= z6zdxtNf;C(TSc?+b2*GPTi^Ix4*NYnTg$4=eo@<3sEsP7duZobi=V4|Mx5(t*A-i# z>0~n3al;7a3Vlgg4q1L1G5P|8EE3HN8PxCjLI!&vkYkYVym2l3|Kg2|A8=4FN8K<3 zL~msLGf^}BgKfnbxcH3>Hf6pyG9G8S)*Bg5AlUgvhV0&;rUzJMxDz>)LP{&Cv+WIw z@31;~!-772!y&epcEWmW>1a=qS1Op1uT=a9u9Pxf zg0UM+#VZv*h73^EePGA>0NQ_nj57i$u6ZlM@=gUQ#CIwv`SDH#9rLhXbXaAiLHgi~ zhmc7Ec7ssH*D5l$#D)KcC_FYm%JZFyeQ}(bz&l^5AjtuYj@{5-0fzfVN;bx|0h@ZC z+Qj$N2DJ+RuWbYGlK-5ocALL|1H+pMU(evKMVmP)DQ|E$z*+-d>C0B=FLFy-F5j`d z3}0Nnle^Gz?T+Q;p5+d2v0QD&^}AoP3d($ZJs9ww4S3GAZ$=fo&*(frUlw+wUoqPb z*#oy5gf1V>UiOxYzh;$xjiB8i@bKU9vthdO#Y9G2q?G*EK%!KK5}A=8WqyM)ums9& zbg4$JOVX#;C1qa#X9(oaT?ZpS)vUOM(ZxH#w|;ImaZh|P?}^8aPG$rcHDKcYHk)`m ze_(o*&#a%X$Alehi~JT?z{1=79dW$OZqPLi!rd%s*W(n@>&(ewX?OGY%w3P5|7{g^FL5_q*lcHzINk3;h+6KjL0?_k9T_h z0H<=c-C&RpUD0*I|6(lds-vLfQ-bryu5kYJwBhXP3g^kE4F?)amv;3qR_{j&F+!UW zAio2bUyN@fzsp2ygNduU4(~QT8+658Lbsekx)Rk3J@{)&>hA*koZC4w)xQp}Jd`*4 z0zOozXQi-n$~!Z7G08`Pd~iWJOv97qw~rbb_*#4ah{!VHJplFq2Xdl5U+Y^g^(9Mo z)@rVOyr$#Yhmq&Lb$LC~N%Xxg)3$OBHAhX$!;fwyy57NXO`ciixtW8(WQ0Y&7g5y( zycNiybThG*OO*7;?Hl&Mu#W(76-NRK1Uh93Canl|Tm1`}W1VJqW(x>~Ic|Jca6iQj z2TXb0Z#KAHO%8M-2>b?-xw<#6ns7Yc%v|#!tL-heaBAoGBB>TMae1~MUtHHdG0Q&D zL6jn*a;YRud>LEGzH~Jy)L9q^mr$0{ssl^N1QO42rARm=$UGHX_UeL*;l%7>LWu%P z7~sR4d((4>z02DNp4p`gp}m|_j%(3oK2r1Q6?;OZ{%wqg1<_+5Lx`&Xh~s0JK;=Vk zXUuKVXoO9;jMYXxW_dEOZ!)l7GO&L#Fp><6GEjl8nkwhnk+6FO9%9$1c>q&*7VY(D zo8GZG5K-oijg83X<3E%h3pZsJHJJvnT7lDG(J;VIv&z_#BnEu@l;N<(lrg5@{VO=~ z2EhYyH*MmbP2P_oMBI-VG38BRQRm)gmoZ4NKHrJe-Xwgsn>3jP+n!M zzBGqP4ljIWw}SKs!3F6LhQl+^bVIUBI}UK?n(l76%8x^ll;8)ZLoTGO;7ag=X`t^) zmKHeVbaNGBOOhzY5QalMMVoD|W{TaQBegXTW5keTHCzyo4JjgAc*HIrj!ephBj6(! zR6pk3q}y+g`9N6n@PR^oXk{b^~ zq-Y39K!yzG)}I=~pZ${5N{G`gKHM zFVA2Kp1Fb}g1UJOBZefa;fsK5NRfyy$0C#RbK3G!YjK4F;kk43p2w&Nm-89G zB@Ag~*vqM+9rCl8A;uyB`NFx7FJe^JN#|mwfH!m_Eq^29067sSeM}#g!QkA44B-4F z%m=wcc{>aj=l`*P@>z`BYyJ@{qJPK?`Yk#G+F2eXi; zOha#a4jcu8shbJ-RvQ~b(!9aL9ewtS>dPoYG(JO$ppp4!R+2t#d zNk{J%_>yzmD_#-HR6?3(>=I=6u}jGFj9tR(l&J(HW4DDQ$F8)pZR|cr#x6*UdhI5O zBx6_TeHDQ~eJWoq9>Z2jh&m#`xLL-p1NG<$ui?+Nj6&a&nCp^(13}z4<+)6W_zkr& z;`b*Ezoq!k$qxGF@cVg)oR8m314_?_qgV*Pw=%ZWWTNn!VdZy&DViU5eHqO*G_Pm$ zkQ6Zd7QhWD81cJ_Ov>*Y;G2ivgftJo39>uC33(oV6J9632}t3jNWyQSx9}VG>6-|Qe7{*d5#P7sCZK*=-f7-~6xeHCKqu9FA@gB&Wo%-0ZJ%3j zMPh`?w=%4A>upT28+3GTeF-CmB&*?;fNV&SXl{Ke zGAXxS2H(7MD`CyUF9Pk(FT$ROUxe2=w-S)>tA!@{CFr*C3;GLm&)cP5yGa5Gzl75J z5(vhc1nx)%WNwWZvJELhB{b?9uHvJFJ3A9F`wA-|I=MDl3YTj_t$~NtUXBtuF5{>@ z$;uN)yywaLH%}w)E1pK)S9ZyZ8I446!n^RRZH=Suo*VV5xlw-`N3lH~ZT)@uGb84At@J*IV%Q9E;f;Mq8>-dp-!WBn-eb@{?AO4C^8rZNe6XKBj?=Q-WEG?r z3J|^rRy1~)uO;m;d?ixt>b^C8NMwg``1X8cPncuJpwuvSj9i-;!{2R-yOLpdky+Vq z#qaJiMReRj+TaB88{oEo=27;eZb5sn@r(XI?8E)=ql3i`?}vZ(0sP>Q+B!Jbd>$mm zU?xYxH}Z!wP;am_BNI;EPvfOIv1%8L>ElhvG-@6@_;&KK1CJYINHmq43@>0Qy;ob6 zjY{w1^!vVgVe8GzgPkR3_AT(0B?#PUSJ@9P#IAgE{jG$Gx76MSclPc0fi;!LdrjJ8 zxUZ1n_fj=KYz!v9s|DUMrvT-}2=e31FXr-hBHbwMM8FWnXvfq+y~^Sn9z=@RF<0w7 z72K5)<1achdL{-laK+%k0ljx2C$7D{8_w|X1smmKEbl>}G+ll#fm~!a7~E^J50io< z%xHp+<<|kPtEJsdCfdWxu%Sa>xONJ77vbLHLkuGt>AWyc&z(_Sp|1h_AGK7*21d_9b&<=Oeb)Bs^fKV6U(n ze~<8n&CQR%0b51x`~)tptAj@}Y|8(DH10>RI)jnFJwMo+u3izGmX@k<=Sb zbu3lI$04PBleqP{)j|qaqBROTYyVF27F>~7coYdAQ6RGUbnTsP^|Xv;^9H3MO{N4x zZuL+@gSONi?JreC+xl$KBrcOZqLnXjVU*W$^7alsa^XZ@8fCwEAKHvJi!iq21R}RP zH1|BMPgACuEJ}j1w0m!Stc&fHb{TZFX*+@w;#T6T(Q$+E`9ZBI3Ff;3KM4!p`XU*G z7Ez1!t)%#y^3O&a_y_iWlvzzj)9x7cHVq}aoO$T1t?TW!n?ORrTAeL_43%IdHoVX& zf1KWRwzJ>xt^a!Z2bcbEty}&_MqwYxv2c=H{_Hrl$zEp<%{~ez`~-eBl%|)R`IfPB zHZ(cT%!`Tce%oKezYndQ%Del0;q(0ax3!1l>etci^+{yh>J%q(^@ro2y|~Gi%ft8d zU@wyn-d9(WpxGA}C;r7Qe+sb`SZAhS`YslWNCIskC!>|GlJ%vPF$tt=xcw~PtM^{&&8UR_p_sO z%xxcS)j1Zsog^}Lo^{alb2pJharnim)mij=-THRw=*S7H2NsXNha+n&zKq^>)yMe?$ zmwZ1j{4D7nv_L2V5MHL z1aDn&SuUbhDyyY&>80&)tH%M{!xL4WemDo$swrW07$u*m^F+X_toIreQX+bhpQBZW ztS7UK&JLbTJUS}mSP<|_+nIS@x5KaEBDi$8_Uo;Xp_ejhVPbFR1l^ycMa*g zbvj|)&n)pQ^+P!?7fnr5pYxznI*LoD{>YEse2%=u`rY9@OmmN3XEn^CBE&s?^&ism z^T=D8#;f-9_}-L{BTV#aWwxYmuYSEPC}LdTSJ5vIl6HLoWfI>D_#!G!A#r6MKQQw! z8O|5!*o`m2(dT=BxZS3fj!}C$TezY z$ipB5ww8{@Txjm`I#9YlzT{#w37!I;jp4f)Ts4|(6apt>Uc z-+0X~gSShgCq?7;><+sm8pk(U!}msV*0pfX(Ar8`WlK=WL@QlpCi<~`>wmzEsIhuv zR)kC9yeNu@o|#kzQ0$OAi!o*1V%mKpT>*zvUnFHT+LVd`=tF38@EfmxQwmY~nIdiF zsT|yX0%Vzf4^Tcps2O@!-U|Nm6W1bM)7vp6Y)Rw2z?MEdc2fP~-sp*Jd1e%;?Bvq( z8LmPS`6c8xKI8*K<6GNR;RD49ezWJ~cNCwXjcC zMEee(ev_<;aFoMr<&t(VvvI)zGaGT@5>*ty#~I+G*e5X2nSBDz>`wgX0*)_VYl@rF zwC}`ek=+&NI51XEVnIT~DvfJD-NFtR2u`vlftq05fV?3Q zdU_Qn{2n0WoK*c!U`6Q;jF6sux@hl6hyQ{Ee#Anv_%kzSQEBFSl(zmG0oN&C0<%-~0 zd-!ko8R!k_h2HSz^k(n`FK9Y>8MK#F5y}oe$MxlJ&7w!XjW&RFT{gxDUeavlEYv7Q&|9C_PJDWyEcF^?NwvGa;L1XuXmyT$UT&)eDsX3MB4^4llT%Ngp&2tU4f) z8TjtqTVN%D7VmDs4S8>P*~TlI3_<8< z#>?_%jLz$>p!EoUzdGt1m=eQZflzQIt+L%Ij_2wpqCL7YoLj`XV#DUjTOD^YS8v4G za8I@qwCl_u=d{XCp1G#(SIj!wHs^vq2POp;_{u%G@;g$F5I{Yl)z`v)6 z!?w-C3&)1)zX29#yN>Sxj4!kDHgznNw@78HW`*I$Z|HLG=Ko_6JkR(ZyYX9~U){%P z{0=UThvIi?fz$X8#`;dw|!Ggr$ zSPQQKppUxN37D^B?cV4?6xKN|It!*&dCVK9CoNpJvR3YoA1rd1#ctU6UDeMR@d{b0 z7ehoiak9kW>?b0^6n>f>egc@hHH*YQf`*|GQ*=YrhYt%9Rw4@$txeJwA#d$t-HH>L zMjAg&DL&L$T++#lP7E2B#4rOG-7#cJ0>iyJtB`cXP~OudB5i9RMs%)$*tlp7v=n59 zj*B%=7O`9dkxZV`B=UH^hUDVc!yDu%IJt?OY(mOx?O60Sa>yyvsJyXjZt3Q}J)1|q ziapy)hdNQpIuAU55pd{pi)Y{~>PV;^VbAu#Z8D%y#pVL~OHKAqjl!4D<76E;&4q{n z1Iq=tSd0lUtOwZTd_m5Ur%_<`ZMYgC#=2n4^hYQQSTFDR&b2pifhKhrW!IGh~6?;TJZe}~> zR)#oiV+dB7zH1<3-~+=o?;y^2Zf$jcPpRNZyXImHOCwHrc9N>#7NBWanWS~le}NZ7xGeFwa<8@XXAA-1X)(% z>51Z}VV4?MARWJ;ju}sY^k={lK&DrqxDG2FR~}w*(eVp=pq1UX-Z#Ohgm3B816 z(kcExU-uD-^~=8P9lNiM#uPdOz3m;^D^5HZ^*Pi4eTS!uKo=8w^5aeABB08~ zlfDe-<2|`PXk_vsiE;^vG=qr@$4Mu1SI{j&8684ebuk7k4Wk&abg&FC8w>KqBB&ma z{n(bXUW~!fZORaQiWo2Eb5d=lHEc7+rnLdr(IuT9ti;V^8thxvWvqJ(ILJ`MmV;nb zq#~WEE-1L^np;Q(J-%Am%tg>gu%bzP`+=`Unr3*~j7;?)tbW8)pTEU z!iW@o)J8rck^G{KV4wIh4D>OvogZ%W46LbiiF zp8~T8FFfm$aBl-mozjXc?DbG|*2~~I9pA}4&>NINXs=hXfn=|gGBZb;2Rt&~HSO&^Okma`i`uf$R=y z!hnkvCshcUw+&Wz6=6sd6G6F+};nhtfsk z$;cQ=tpa25#?P^6{o)I%TV&^GAZ@me^5~Cw?T?v48sCD4k>yO1?~*w{{3rp<7|db{-Dr9Hz(M7D`DdWNr7zuM8WduhLP_(m|l_u6f& z^W*`Wn+qbFV(Fr(eA9kcVcOHK)Wd=a~#>>s@u!baARfk<9t44~DU`_23%kv#g<$P-&P{()kGI zXm-yZ0|vO1qWLNk^k%*?9O}36WjZJD49=YYJQ!v<5_rBuqf6$ygP03l>lvu~_TBPG z7df;mW4|BOF9YH^1Cu*HW=kHnKf*h4Pw=As`W9H3gy)A!8o6>M>JH$UDxTH8V#0M& zN;(y1<`4@^i#W=P+x8l(%cjy7VQmFGn=Mt^^;4F^o~qE*kPx=@^WRB z=nnV52(V4)CECIYEC%*PGJ1y5AN1Ubi+lLgWmnw{dN`^NK3{8bOQseV3!H_vvqN(( z>5fs8l>$%Lq zW+C*}JeX;;TsNUWx|m^Mf8cm>x8p%b^$qSY$llevpeKXXUKa&D18Qqktddnj`7sN? z8Bt#c2U3Fr-pb#CNO;+WsI2}4{3wVs1VX?7U&_*=SZY>rNI`Rbx|K_s#9X8|H?@$< z(_A|QuCBb?+EPcSad1l3WHUNhIkM0#!EVL+t2vVkTl1GV1F+vp!?EUEXm@RWw?-;O z3SCIj-u(1x4?-fnYK@0Zg0-iTVAX0YhOvGdZM7*Tfv%7SGVuZpyC5bJXWNtn*#1(A zF_#bpE3H-kOj=~6jjM2g&gySpDNEPsPlJIdl`|LKy(mFf+|X!$VD&0 zM9nzzM&gJ@!ClycZ_dd&7z(JmSq(c_aB~Htt0VLlS_ zxI$*tD=^&@GTOoy!QbEB4rw8i&2%D1Xi4(MBhINur(}qK;q_4amMherXy7U~=r@EO_y7ZKeR;m~={i8H(dIF5< zm?Bm^%D%3WViguxkvw4&M4qsb1K#d1YvWzibMQ6Jh}Bq(Mg5#{gp9;g%o}1$aiX2v zScfoqN%$!>*}BGIVZQYv@9LXp`2l_s*A} z-E_WsT0@?&q?>w}wYrg_g9LwepGB)x>Y>l7C+?a?E=t1O-X7%YKaN*pF7;ZO23Eco z-NhL&)2N|z7JWsTM!9a1 z_wL}{x!Zb08y${5r3@vc^(p1(*iq{&W6LxGm7djA_swMSrPCrlrb(5tDrb*8^RBKg z9y`u5;!tKDLepxqRsKo0)Q;N-@kLOLc$c(HS^DKB$Le0 z4$yvtld6^Uh)i`&Ci>#>KG7GCJsTffx(JoS*+d+U14_}SjK2+%WU%VbL`NSwR`5M# zEDo*1tX0=UHmHZKQ}fYU{=A;bi`CDwob3O&rO=J9%D4DB(hWe6)k)0|dnVU5vW*YqMH7`UL ze4K!2jv>ZS0cI;uXCPY|z&GQt*^rwVzz^D=E5LY$v|J&p?H6x(97UU4mU~cIC+X@S zln;z}m0P+QF&*t7a_08zZW$_(gIUBU zy96100Y*LeXnk8VdegO>>t(P*;+}<5E$FZr?EcB5h$-T2u6M~<-X*w^*<~xhDIcOp z@~p`eaHK7&TSh&0@01Tkb~Dq#eBsHB0`2pz^=~MD*Y3(EKf7>n{Z4XBKfCbXIKL26 zuRCq>PI_|G!HFQSSXBluG7(_MmYbx8P{AWkddyf6yvWQDXJN0&1@|apdTn0~8>1QN z2auKX^#inc0X`L;laD{JE8??Nr@+~2?tEa^0bfIe1|@_Ym9szY)UOh%M9~eefUwt? zgh_S-Oj7s&AQtnm9Ku(cT}e*j2<0lc?YI1vYQNIHXv@1mchAEo6-v!n@Bay{-&eKvMhIH&1hW&PIY(SZ9Z;2N_zz{e1& z`OU*4?FF@eR!-$(PT?3D#^ImUb{e3gwu}ES)b_*v{I+-R!rGJPYrDhqcGlm{$9IvL zgSp^%?JG&UJPx~#=e-ak&=sbX83!FsooBqX$`qr0Yu}XR3B{v`7<3l5d^CNG zdImj0KR!|RYJodPci|)Vs=wp|ymu+uKw=vbCn?5pVUx2_J~+tOs&L~osnqoPwO+U8 zK_4hhSMY1}foRjS_7+apg2xN7e#0T1uJgT0{y}Kl#om=!WHkF`;YQTW%LB#91+9_4 z@+Sa^xbX!ZzC|Z9M0Vv@5m)LpLFlvCc1%eUPd-%_Ky4RoN+4FhkEp|OUWs|wO_Be= zwj8LhJ-H2B?J?86qk0rZ_j-;gr1C9XI_nunJ;`LLCjwV{4BsDJ{VSZQ>Pw{uclE&f zk6ROGz;M2x&+He=j!BU2GaFASKg#BxfkkUya?>sFO{Pp`TenUuQzkaf%g2BsGnJiP z^GF|Y%`P?fV_ePODp&7T&OnWH0?HknpYPfiBHiy;U?HE^)LkT1NtRyFI-kKid5iF| zb>!>ihKO!V%dHk~>c{xFjP1{N!I1k@Hv@;)?j8rXd|Zr#7(?2t@5Kiq-170rf-`(D z#o;W-G6Y6ZHFh~GTziTcZ-ec3QvV5C&cKeM$-i;p$Qe8r%99J@IV+!LCr3& zgIie?@#<>O=^mjI(`)u3*rDiaoP?h&=5XIrFM6fdI2n=QDfk)5Re#LWO@mElZY$)C zK?7&3*CY%q<``(6iXZKJ}n_5oG;ZEIbXx?DBg28pNtoNd$4& zyoJ=YgbvK`-6R%>5U)LM(6q~^6V5v$i`k%_Z64Iq%!5t#ei+r{9I`e{Wi0xUb+6!P zWbCiG+BgHbx0>g-SaH^yJrhy5kJW^71f8acR!l2?;j^v07HLNnNX z(!NqGK|S^Qk^_5ZJS~Dn0uUXuKZqa7W{9aCUf0 zqTG8&9&RJBhPOO}pV9iO`_T^Ks(4)W*TKUrZ$Ryd%C|YSrG0Mw zqrk>(5nJ1r3eQ1i2WwK_dKCTY^`KLUw3W?Sk01F9dP+{+9U8lZuu#@0;T4h&{Q$M#ep%0rFq+t#A#L{$tBj;yv9qd_u zK!3YW_&I;uG5xmPF2TkKZwq zDaFbLqx&$Wz60bgUx;{)Vc+^!z}f*=I`~)ZM9|D+YjJ3U3t~`*4}S~d&?wZJ2+kRC z@kYQi$bzQm$f6kI_P8lt1cm!8C?V`4IG>91f;92R>=H1rM9ZkavxJq%v;;eFly=x(ed`q=%*=Rj%DL!CH~ zw_XN(*7a6E*TiCFz05JGiDTg7&89^w7TfEcCOe+JKGl@VPB?_h{tzrf9ws;|kS4iP z<9Qn+Q!inZa!wTqy8Q`D0(=~9KJG(lEzZO;94`$&3psxcxV7YTX5kcPuU{lJ@xXB% zcSksc;0SFrMXw#}eKnr5;$M6f`C?{w^i740^ba|DJxcF7ZDN$}CR{>qgTIb+5J8a7 z^IwW6Xljk;z^%+~#_v|pI%RzU^*kW7mP#4~AIh~PfgzUb{;~rE{gH5Tb z)MO^=kU7}laE@92?4m&8li6F4%x4D89ubZnWb|E8*fc|=>GdYu%e;zkl8;oQ4BrEq z!&lsrjQLupzn!nMj8eW{LvMq>NxlLuc?eC>dZX}A05%B9@K7UIF60t1>s2@6eNgyt z7nQ#r-UeZ+51u6Qs@)1-Lzb+#s){V&X}(DhEH&U0OJ%y0@@k(64p!*3UT_qQyAD}l z_Xp3C;K0+Az$>J-3pAt?sLXcF=fX#xdRp3JA0{03VWycr{6^^Af_G8!+1E2IW-q}Z z18b$>`FU_-COw~#?M!mOcb=K#A6ALbr5s&2wC&!w&8-BRYBuQfxy|e8I?bjyI!JGT zA1_2Tn1zB325x%!^3pBp#rHmtiMQ9JT!Sz}ykpM}NS+pP?&(d!)0+^PPalhOV{#`E zs;X5)VCC=egZqd~wi`F&*FX|45zsD>NK=V$3kyL1jEf{i$qSfRY`&0=$wI`Nw=$x^ z-&FvOX-G=5<*VKcgrdA`Me{|Hm(_?Uu43602cn%V0An_9azCs(#K&_!Qqtt6WNors z@LrRbU*{J5MjFI#q!%j{dNNvK2at&Ck&-K~!wI}7RwTuXk$vS4$X>kn34il8{6G+s zh?s!)OiitUxN#r}HiAr43sczTiAcfS5#W7^T-ULpPqRJny&dkcpI=ZK;tEZ}&ftlgx zrtGTjp6*8N9%KL!#8GfS#O@hkxDiDPx&~B=!odSwQb3Gpe+0G4odYylipx1eUJpIlK@l=LB@j%?y zRvGZH@@QgX5P~11|K{=dUT191%{Gr^056C?4zHaX@xwWY&zN_!L^^kUkv`ijqDzKr z6Ac_eYZGBrm^*FeGaAuRr%ePKxCAGef^{&<8*iKxexlQsYHF%0f%TN%0>8z@Ki1_)O;YPMKe z9?xN_>0BX<%yy9c+Qb9yOlc3r2Ky(%h0ySFJdM!6`Sq)qU*9PGl86b?PFr3{KO;S{ zrh0^c*v+3!E-U~yRmnj$J==FaP>xFEMKJF0Z4Mj5oM|MM%**6p>(_3<542^|o1L~$ zXte#$h{4Y$c#dTqX3XccFen8Vk&+ImH48V@JWbi3u3@3fY5++v!s_QPF}{v@lvOYDJ4Z zD%!6_fL9Yd2*HPns_a>&Fd4}+_?n30NS4;F%qU?8w7dZx7#6~=8mFW?sDVL@LdI_T zqYz9;K(O;aOmrrhABjP|okYc85tYb|@$UXrvi%F3mk@gOFE)hKv%WvT_i6>Dg7%!t z_tA-lw5~&=<+4_<+=I5mO55Rmb|Uuq`_hS+ZnV5wd%^16%h6}$`g?Suiegc5;AgC= z*{dsM&n@djBU;gs(ei#;(fxW=iUo+>{DgU*Pq8SC0*@rO zwO^_XV0TE8@r%N?pDX+v1AP^NA~m1lt-JMV#$X-&8a{DDW$m?i!4&d3hLMs_`bfyP zUe6f7m6(e$BQWqU{QL&6OocA&|(e!Mf zsBJGxHuMA7n{2B;g zeTJ!_Kv|7_OQ?nX%m1g|Egk-y2-(1;Nuqo<`30U<<7Cp6dR|em&Cua<$h)%u(YdvU zP}mN9L2G`VVcMfV4m0zcg{Ls;(teS%8zGp;olF8Hw6HSRgu~OO9C3%$XY)dGHa{97k2UqM|P{n;dnsLHXN84d$>K@;AGBTvCJ>9OsDxpJgSR0%=;z02w&Yt z`HT0V{E5uiW3+tGm=$e8q?6vkfZO~se%X8E(@*g!>fG`@?%YI(zHLEaNh=gCrYQUs zBmsrL%9I!#d}4HbEgk%NI{1xr@Gb_?btP}}?o?=RD)h}%=sy_3tsz>b-U;@tR0^nu zlUQLxB2f^=i1aRIZ~iCq-QQsW>PqHscW1UAzO&MY7Rv_r5CVg`0!FAiN$P%=`PhH? z0_uK`VNi%qxA}dBKx+xX6KCq<4^yEZrIY?R_3o?5y1`xq?vEL%>Hs21)HOg?Q%$MOx z>vxFl{GLfKODBa|fzePl{DEJAJOMQSm<;?W8Tc~;lS|h{ToQ~MbyX>f2&!T1E80CKfSFc1L=x>A4^q~pWzd<*F4Uix#HHlSO2 zuI>vEurJ`7A@aha-5DN-B15TL9P^jad8PIOQzkHRqu9(5kEjbsXr+8B#bcC8t-WSy zlqx0iDfniT#@#;&(~i=WM)6AVKBo?r)|7D#RVJ=#X0a<}z+_{)1Ww~~DImUlPQnwL z8L$hT8T535%>Fp6`O1=}s5E1}Hndtz6&*m@#0KtIUT+NVSQ!0>3BJ5qoIjRiM zzIcQ$ya#$eyy!j9X%5#jWDEXhO4?DuuSkVJbm3!yl-FF#g22{HaDN7S!cIrpl6Dg| zI+#>NI@ktwumcE&WZ?_QvW{Wo;j_7(f&4H_Wf-!`4TKU0|1lkWK|1(C22nZ5EBC0y zp%w$@IcBiHnl`QtUZ6KeEf!;VG3cE`^cWWO^n-wpKM=iMIZSyY3G{m9 zcO-L+-d_!ROZow#h(d?|_#3hrzj-K;x!in&Mpt0+!rImgqR%8{Ew045tOUbS3H>0I zh(E9ry>ggJtVvX&SAH!nuEd|?N-#MqA=yxg2O!)Wx5(7-Vn~f+l50B*3zqspu#7(t z%U(GQmg^E&_R8-_<`~Q0$5=8sv6O5U%Z5c}BF6GOV#%;zsUHN(_`@wgr&kVx<@&({ zn!Nxxk~>E8=P{a0PBbMO(40iLIc2ed3}K1+1ft2Xps61O&G-Y+?3Kf!xgmjOF943@ zj?w&Pj3$#4P041_oF+C<<#BTm+BCZpIfH13(z6!V!|;;i4Gc>q^n+AFn1*}+JL1!6 z6O4{vk)=+?eEwF<=fn8K1QXbOe;}V#xX$Xw%<~`wS`Wq#?8y1SX%hoY)STn%sAOD* z%EzJ)X;e%(P^BjT%>$4izX>l%mcnr2gMbp2A|Jqb`P5o@I^cu3i*WrBH zdOZYz7Chy!Ui@Iu;d^s4BSr=GGGtgULUe0sWE7Q&s9pl-NF)^WkCGh1$%UCPocJK1 z;t!}76WDqQ7l`YH1(&oJldxV#^J(k#Py|}X;0N{M2U{<`Hy_4`QGsph6_?3+DVAwu z6qUGM0toKD75(GzVnE5jW?1T_9|TnV0rg_Mt(OeQxL#O#NWGYZ^?Ep;wqD00(0T-Z zP%nP4_2PST3nNAa_A+ExuU^O~DsjC8&?5mz(0>$O3@Bl%3@1KFz2Xn37Zcce2|tYM zb(^UdldxVV@M-IHA_A>P;|KNP2U{<`H@7lkRA4VdhV>#u(+?wL6qUGM0_Y?p6!cG) z9MTVk!!exrAoYqrpk7R1>m{5iuGc$Fy_kgcdJLboUZ)_?dMtiWFMhD~;(PN{MvMw< zQ?Iy8)=RNWBcrIq^%6jj10eFq1p;(Ci+p&UZH&EoX{5qib{LSu0ZyBrWie4Zf$M@e z-*(OSc+Iy}@-blY@pI37-{CzJUgx`bpuFoO9|I;IKVP#IMkZR`LwR${ZIPU`8uRIMnHGFxD@8SBV_DswddB1r&KFq%wJJbFi zEY|uYy19d?ORaaJ@SP7q;?Z5qKkn}VpG+rt|FR^H=}z+DWl2uyPV&iRNgmssT>Pe*aj96v-7M!J zy7AyE&&NXni0Qh&8+vlWD2Drju`~k^zFf-FdJeTIH|@c0ha=r*7eVg9CV&YN#bND1 z*SRt+SuCjfMmVM&D_-a>I1uxnk29)3B7 z`2|dbg(9C=H$G8P~cq{!@E})Q28rP|0XaP6c|sAVNAC8ZI^tyS9m|O@IEE* z7!-IH#qjPG26SqQ(;k7rpulL}4;a6&Fup7>7#znTCZ#ekcpzHp!7H}ZFKzC-BsYVC z!NvCjgI`$~|0ysS6d0GJVC)-@Ut1VI5Eu*!jHMKeefPTGSQtMO7z_%G*8PC-TMOei z0)s(;u``Bo7G{=95yYV_uXY(E%q`!?j|AG{4Qa&`=w0=~4FQqpO-fqSMIKP=$JVO)uTtEre&UmGQT>Ss+# z`nj1sC}V;2XzxO5+@pi}U2N8G!gCIiqu8tC6Ux5|4=Jqk47|-VZ#>lG zn_*M55QIo*c+&+iZ4zr+W`c%m2bs3q>B$Hw3w_D1Y6+6MWouviUeKb_dM;wcz7|i~ zTIyQ(ESpP!sMRbh9woR1u6c^kOoO{DIM-beX{58Qe?T%9v9;$hJp{k!<0-KfB-GgZ zkoy|uz7OfHHKjCAcg$DUAqX+?dd5m!z047KhNvsN{H$L;J;7mwKkq1BC}skgqiQ!G z$F|x(;`ai;@%-8g2!dnng*{+pab3+I4|d`Ejr>mF0~;kQ>G|PB_yAabR$w{4r!SmN zi65p@u>z&NC;T{N{*~h=@3{*j+Y5022pu3RMif~U@ z_Ct72)`avw2NO}Dl&#myw|N(ll#I&-XeKJ375SNO!$(~(g*GB)CC!Pe15D6nlN?f{ zjVXl^tX~aFRN>bz1XbS8Hie(8xo1SARERh;zlcUMBbp;TJTL|2ZA5eSmTTtEyP@ZPa3c$SI zpQY$r&W@D4ZE(XyXMw;J?gM>qYJJp*TC;-b+S5o=&IbLZAdyC~87;u`oBersQRD=ehahOGRiR@)FcdHi*T62=_V|)4(*p{zwkqCxg{s@b1I| zd-dvk-PK!9Oj0m-0U`j*r}5Kytm#=;4db3Ur}k2SY(AT7WBLMpJZSSlp^X#;r1(T3 zl7h^HFEB$VA{f|wHeZGx_!|tG|AZILuLR!VkJrc`>zuivl<;dvN zZXoN_I!1`oRv)Igd|+FteG3v|@AnEZ=m++aQ4W*2_F8Q5<%ao{cjuIbGH&b1K;)_y zfqB848QF(2%`*|xIBX~*{x_ZW^AMaFO$GHR?!wfnRP5ro#-ArUb*}(0%iFPFHsxVJ z6P~-!+Oe$MS0YEFvh)TlY;^4;jvrdjl$~tQb~nB|=+p!Nw?DO4NeMjH!7;)=Z7z|*iMm;&b`{qaE_)dh`*r@7}M+Qb@WSFOF85r%_^P9CA+nynbP$`vQWh%l24?sYrFW;P|YU-KYEE|-F@_OQ={7J z3~pYg4%|48y7@Y|Fq>4%RfdMM)Ro?HILx0f}%%)kBUs<}%M2JnIi~8>2oLGm~#K$ZEDlg<&W+ z;5Xj@Fz{a`Pt&)qNwuVX@*>$NQpa@N(}h-`3Xw$81+iElKucs;19p{pV5lev<` z-wG5QueA-2)^_}KIL5|rw%nFY0UnG4t~{5^5wBPaPrz2QVah8dGj%gk0?;t&-^@Zb z+1q$J543{_v=5PhD*7>&eOC8gY?sU z3(Ddt=$|da9SfY7;3HIGUh}O&dYRxQqc+2W*TgPZe*AZCV?-_WC_|vGQ9{g=YCPpO z-+`2F^EUi0IL%vu_M+E(3mXEoTZ?%B&7XlZzMO^@kC=vD4M&_Y{lfzi9Q0GHSWseN zRW|HIQL(^brle@vFr@XOK{gGf?|`j_u{}^q#)=|LAsII4EV?kTpO@bsVP*WO5Oteye!sk zLlN|-M}IFmF$OY?A*gd}q77Uyv$p~qtf2H>xo2e-?y^3;ugF~Vqs+x<0?`+oh$rVe zb=1~4R-fyKcQg*e6gUpqlz5uiulWenDix(ygo)G*-Z!&H-Lhght3SAk+ue^0)6-sb zr%9%xwnthH^Xj7Mdah>D@ke#WzY*_*lm=G8;naE?st!LlfuMff1>y<(FNCHPDX}ui@zzF@?2rZ^0-Tpn&d9B-038@=Z3(b4eLn8y z-iD#VhSK^4T0LG3m_j1k9_xfzju+--Xv9xA|^7(3uY!0ke>M>%8{+*qOsu zcaTgj^){7!xv6ajRmyuRo4VpB82FnptVy9>KOqBnPZuWcw8?EJ47$}txUi|c2Qi3< zn19MPcrUz|DjGUwvSzk8i;dQCSdL5ua{lf%!~;RgXP9+H;PhrTK>%-Vzr5M@^E(4qLj%x&PXLJIRsdMwBi z#i`algyu;MoaPpMg!!S`72nRLRQ`A(>LBf5_#*)VyoD?<3vg?yI6@gB4AF$--Kc2L zG{WA4nJ@6TlNNM`6vXyfVB_G=aB}GwbW@n9x{}GQ<-zcriq^p5q4iAEFm5bcwbsSx zKFtqn)zCg(=G7?gam(9BVRls!+L>bgSQlo&9|Hy8)sr4f;wg=qHwo!O^;3zqfznYz zLV|GS-S-=RXr@JtphFfSs10&-N?W;^qfwuj-z8~P}YM>k$&!iWl(^_ z^)&>%4EUho$)0$PR6b=H4*cAMbNw4oprd4}FI>8xFV+tk!g7NIQAJbdEW8>~Qy0%N zBZM?Pu)#F-fttm>)kmqA+ z84KEt%orBGfpq;q-j5Ef?F66K&5zpl^D=D<*E+#v$pm?Z>0Qe~D%EVfYkC|7Ow&ZZ zs(4iTPZ3M7ZejxxOwzapuE3*_DZBYGz-Wk%J5Bg;gvTnl*}*3GM3kUuzFlX(;e1%v z$EX0-|0vWG<2{<|WnRZ_K#hGFZr>8q68X7wSFlP>IHGC97!<4t3#KGS?o`Fx%CHjt z;SEe_lmuLJ8>a#XT#kYFV{L(%Il`44O8AmUh`&dO2aJ8NBwyT*$hQd77IrbAZ)l%` z2bKX&?USg3wpQ7r2R>oVJZF<&VC7&a)WI|d$rM{LC4Xwe5O3_`D8h@^IX484id|Jmc+Wunf(7vR6B%+X_k$wpC%sNwyUwf74W^ z$qb^PL13Ed%V;X?|JbpaT0evL4IJk;7{0nMiRvKBho&g~3wvX~AUZuc^(~)Ph z^*9AE^L=SOT&u{HXwSy$!PL=c(s(&(JDk7qZQHrr$Ja5g(%_<^rA;8?jU5B7&NN1* zBc((0N$d~nt|fmKRlmIwE#@VPpRY5A1=0KrFsB^sXFha)$A927?_{S-@Rk47TtG(X z|Ib`NIL-eI7ceY9+Vai+_w#^>|HC|>@ju4{3%%Tx z8;oT{5UWfj?}q!@Ud{%gYR_=%JLEXk#rJ3GbE+RFWTYfu zGR82Z427^d0iiNgUFyrRxF}a`t$c?r=K(s&s01#iDHB6W2O@Q#fFxmFRWkyA=Cg_l zHm()r{`z4?OQ+ToluO7UEQbQwz%BWc(@Q_v zS9+6B5t2rRR7Ek1w>fhvJ@OpP!BpaC-+f5mmaFw1MRX`pbZ|`z=|%QVP)B5$hxp{`dNjRf4HtO~h6hw+TRwH9n@9AuboouaK zw;Fz$;;L+IM{0Q79-S9TQZRWq7Z4WH1t2Q%L_%VM14z8ckz*2Y4FC{+6*2nf4^N^K7?L01&s z{9HUgNZu?uz{b-R@5Vf&Eh+_F+~B3-A1Oqo*`_+O`FZ@nvlRt!JmkZ$C@R4o8ES0Q zr!n0ausfF3CJQ%via$#3DH_pB$H!@zHBV9APMT1Mj)fgC(BUA8 zYC}*9(n&C;m6YjZtiE_vU;C>pZYTq{41B9K*k!D##?)oB2{sd*QK}o4d_0yRuA0O!i>WakKdd*?Pbe1<}=cVS@p{1 zHy~V}f$p)=Nq@en|nFd8h6x+*=)FfA@cH9bn$}Jygw@w}CZC2m%wI z?eF7f+|kEn8aEN5Bb#`pF@Y|_I9Qkc03WS&nE-`#8K0xFNtduL`ynDD>#|!-MoEgY zBr)x&1s@uu#U^J@blN{6243^Wcr-;2F1vcc7bI1rb*Fy`C#Qlenukokzg`I2M5vg9xlhjB z_)A>WNgJG_QO+uq5r1m0&kPNCoRYQIK_g{*&bF{n(ht|XDbd&^mXda520wM|+@D*{ zQWN#?tOJM01Agr{$ac~Ijs=cf%L8qcD=P!p;Ko}ZWxDtoxweQsM%a=Dl>tAvc{i+m zvs>}28OND3h6A7m3@?Hn$oc>iRz3U}Fu76=V0?hdRR=u4$r(6?MzBEV8G}-`^;_VT z*RGj`KKyqGrmZ5Xu(bU>V$mnEnI|CM=b6vzkX~6&S`@PZ8#c&mFe~4@tV9}{Q;Z;; z`O|}oarRTT_6Gpry&#@ntBfiM0^YvDR-wT+tQUV?H3J%3+iz3YBq1IR{Z0_e7HDWEh_I1Ne##wf$n#!y#x; zgjW}Gf%#S$SMjZZ{ePBVvNuZ5@F!YbtP*vtfaBnqFGcOa+i2KNwR6@V61BwSG!!{L zz8FiyGO|JAlHs!-|LeFY2u6khQqahdPqQF+f4WyFjfOMFKi<;F%lrlaD#W4M36T*G z&Z*dTdM%iNQ;FM%a%Nu4x_xCHkx8&{E$O7rkfTbGP~+HQN(`lda0Y$VXypt-u2v4k zck;wR8;GwPfZeW6Ast!i6eWVtlerjfOD;}aCRY?`a=ER3WbTlcaOeH?sAX*cF*?7v znafZjwlC0U2njrt4_H;qR&nv!D!fAi81OuOUBvZRetQtHjp5{HnK|(-u-~K}$$Y_h z*2ZaKsR)peITLz>uLut8iQuj5n3&Ls3M{br=!ZSkBivBv6^^z^5O8ije1l~m&)Luk zYb8XFgY_u-Bir>;b#Y|-LWgnVq2hVG1?YB$5Zw!|AiE6c$acmb2@80Ims5BrxH&;E z=XOY=TnbM`LWnSn6C_eAgDE3#UxuVm2zyV}S{cAFsS9ju|9CE)x)bA4RtkdLAf&Ku z%By9*8n-E!lh6z2cS1>53hDTzHVgB3VkzrWo=C*t%Kl@d$v~ zKGP+Hjf_IxA~Tp=7fKCB3z~c*#0n`v0M`#w$kNcv!d}}m3rm!$*85EF;(lBpK%oU1 z&iP7lfz)qJ>Pp#}@0nU_Qtc|~I%|yq&etlHgZi3W$zQj)e*d$iS#t)cQN)#kng5{7 z2>mbU`!%62X@>sFhg4tc+~)W#xI#Mt5yuwS?~ls|wKdicZZCUbbg(Y75L^f~&&a}s z+b_V89f)Yz2DbWeyF)o!0d70BKS1Ov`C%!$IE8~hrR+kzFQj9C7Fh~??GEAkL22g- z)U1bK6HrLxmvZYCbL-dd(8?Kc84}t;8S>it!I>{3zf?lI7Iedu2TR_})r#@@K^#0< zEW>x6c8*eB3UOCLhk|ycT&N%5mkR3#dlX$j358Ojl%Kg9J&i+ON;a(oWtntMfS;vV zz-rXc@QVk6{$D5k^KRi_j2-;_;>dpOj~5Nq*AP8D-L9iWiD*cs$_;jk54n(L!qZ~XthaXdMotSFgp;^dHkZx zn&;{~ev@7JQi_fZ{Ub3)Rbp&8AYt7vL0I?mqg;z4 zsodIHB-5NackKdxcaeV9Ziflbbtue3^y0eO3v@+Yg>@#QRd|OH{r*TgR-ZOuv;KiP zN`(7Bg?p37+Tx3Otyx5=U5|s-gkG5f;2F@ttg|MD_QMx*#xWobtrF~tC(tS4TLx}EcJR%!&tsM zqF;qaT-d71@C8ZPXrqPVuvpK4Z99QK+0p%UzDWVtypLxze81Ew-{uv9q&E9@WfI_1*7f^#Bo^e%-^H6)Hjpe#}U zJwLqoH-tKw%DPl4Hx1S4GxX9BdR zNAOrzv}R^6>nbC^bubXY>cFpI4}o1)=z;Y^B8}G??Mg&lMHc<~n}nn6$HBFU*5W>@ zXTfWaA!`wH*zK4LzIn7Jwj#kVj$GK@UoCsX`#t#MFfI31#oXZ5MQ=5P@9} z(sA|{Xj}wS$=yNixJ2wsUkylkFqskzKLRw3oxdlxJh6?cp-jroU%2qZ zS}4sUHm%7ZryhnP>afj<`$FRX`F9)p5TFa>XfVwPV(kF0U?|7 z1bmgr8`A^TI0d&j)TbJslrE!B6h2{6;iE?m9Jjg%OJ4s9_HO?QR?#R4sh3=R3q*6p zA8$rYn8jtmO7z{3%CyPxR(lZ22O7lQZ$6l~Q;xvqH{0=S)b(4@_@tKAD8+DyA+8;c zc?#XSYZqL>%BgB5Ffu0*#=ER~h;~pFMjG%4b#o5MxdW;)0;$B~4it+-7Io#$2<%N6 ze&GmwrQ4jMz@1FylWyCssYW$f{OnJhAfb6sAoDCbK2xy?!LBnE=_u^dDTSMiC$CzI zzEOte{QAI*C?<&Uy7Mp>0B==!JgVv|r9PUrt)@ zZk%7wj8zJEzZg%K_LC$#j1RL`iRc?8qF-NC@(@imqIN1+zy=bmOy%%Kr6W%JOkC-5 z>J~7$p_~O{nzED!m=MtkFa@t%94gp^{ieMB`YJ>+S*d8sg9`y^AM&g6s-Xe>x@tOy zS5rE-d`#1_RWKn)XHSx8jVjg$OM?~v-0I>jrNJsX{osi0^n*sm61M2``x@1`W3>V* zMm=PAsRUZGQ{WA`*(330bDN-08QxoD##bF}dB`o7hlXs0hfRftQQ;x2QaLed#Sn^e zHQFijsHIGJIK*tur{^*XfA=cox#^>sBIKE~GOUakYuowy9UyIVh*MHF4+kB!kA|6- zp_hCo(MMS;*me$Mv{axRAS0NE;wm$Y(=ZIk8Uib|Ga-F(6~V0!XYw($rl8uej9cT5 z^^l&&mZ>=8v(En;bE6aCSnDB3G)iSb>j*;Ij2}#Wl{f@J&=b9)74L3Ji+8!k{<-Fn z$cDXOAFg_i!fOp&zm5R?(Nsj#mP^)I7ffChy=4_z-wA6bt^&%Kc1yZWkW~SM&@iz) zFsWeWax}6Up;eQYe2Me19`kYUJN?kW#=7=Uq(d(9F&b%$xC||VS;uQX9N9jz%WvS| zFVPw~4Z>9f!6pzm+99P4^$3kwgH2^FdU?Dj-9fuylL0ag$7TP3U&cN5wgYBO2h5@a zy4nFf?SQC_jAJlAqJaVL+f1-AdoK7^DMTh;GX-Xt_8j#CX3QJqdbt1`?q$@g8op3} z*pSmc252`{FoweM zNTvO$fu$}vn<7wOqe~vEofK`7LB|$$cOt_|8yUm0K&qdwtEv8aE>|?KxyEWYluG21 zRr_YBSzw&cw#^kVZ?bAKVkDtvQc7$z>d8dgdNBA?fffe|Bt*-;0MB(HAm z5vV>EpxH(N<5bsl@E{~~K#-%g1ot~|(}OGxup!Ad@m2}IG%~ScAY_xzo36leA%V2M z3a|ub`q~YE(?vB+oGl^dR?Rj2^z_MY9vtsGWm&zWB-H( z4)x8{K`oRD8v}X40rLXba0neC74D^CN)?XyqAIhsp}-1p!e#dTC8IpnmGDp$6wz!@ z;FwCwQdts24X0Yme5n9!eW|D`V?i>>#dQ6~ebVovuR<p*0foQ{bH!ZO+yYt(ugGR# zCX)HVisQEREihHv7E_79ms9Oc%;5RN1g4A9K&C3Q`n2oGe_uAe zoMj|zyMTd`sP#xel4~mZNlD1qy7vurnK5PY#gc^vFzmJGrMMjKY{L=(OPNOjTEhwO zQ4>+PKS9YL>xyGhMq=G&v}JCu6{fDtk~%XZ=R{{Hqmy)cV$z(R6q%=aA`885#}w_l zqxK`zi)R##4)Vtgo@fuO)E*6patk4rCThT`=Nlz;biUE#{W}6h<#wmr4!K86wT*h;wGLke&6Cp~n$cQHs#2L57R68O^b!H=V|LUZsE`Pin9z!TlFNB+cFOXUH2)Y5<)OMvV? zb4mYFWUc7m(R!7mRnB=uh{%a5Fwt}HrQoXT6|epvNbG5?Z@-g+IR>lL*e_@leKV>5 z1=*Z%{bf?YG2{~c?Hy_J&G`I@?mbLpj#-N3UT%{71Lb0U zIFvgrG5hhO*?$O?KHo{6qH$`cAY-B-mH+w8$08ccMQJvZ*>G}fcX24z3O^-Y!hd;| z5U%1*MS577J`Rt{^b^6WswLTb`zoq=;=s%18Yb6VK!$8l`AB4SVylLQ2f zHsTo@fc}1^KMOIGB*qx5B5V3_=x)HDL9?IrYRleZ!FaB@1D=PA+NNc{K8V%gBhmCQ zplE&xU&auY9{+vxcprX+d_5Uu22xPpzZ7&0BBw;jF+&+jA$|!isgD`|9cG4HyOOyrVj^hn1junt5ol=Z|L5#Dma1FYR9W~H0JGC%VrKhzxhQ}hS_&$ZO52Mjj%vQTmL?GA7uAj z?GAjXMMcuznIsUr#~PPMLF1I1S!?M|n{;&502m}p z0$Eu}p_0MCCp(>egZRs4=9Ir|M%eQw)?YS3D;*q>DY3qSzwC1ni={({`1_D4z06Ud zLM#Wmy<{RdrCU)tGbhh*;LV(Qmztde8l;8-IZ6vKE^SV}h&VImst ztZ0QiF+}m2gvg2gG4_Qc?~ZTpk`*e`8$fWT4Sch|iW!G}#$QClK|&oJr~7A4zDW7h zTG)0U1|{XMiMvb&jn%awbf~3&fNEaduC~6i73SV&&)|v=7wG$ptTXXJN@BiE~dP z7*BRh6_t%73KhDQsclOb4i~Sv7Q9F8%aee2V`DuD9AUUIjtf8->#3+b1Z&WxZa_`Zx9xrlC-5GXxG!9@J>+z~BB+pj%& zvbl7c8zBx2e;4BUF2wU)i06qoM^aqe?oxh@879#PKwMlpIj}SN#3kI5Z7Bv5tgeC! zT?H4q3NEl&kh|Ib*;SZ~PhrrS1IeI>iIZ`tqog<6 zIDb67Fwk5y16`k^X{0|4DMaeA>B%63L4z7X>J`Pk;)OTyZH3=|tcOyy{FI3#+CWn^3 zfLf)F;2X?wJ8VV|D5;(O#M75f0jT|zzZFZxihdQ;VfqyKdu_lDBT-u}hEMKZ3ccw5n3d8W^i$aH}G4tJ2_BrHCWs1y1Zn8y~Y&JRkzh zU10OUKpzA#*qxG1G8h#zm@a0}Vy$MN+Q5?wOJ9jg;I1)BU{_AkvSfQhg1)7wm{Pi! zk}U?83K*ML!Lb~`=%@~dv9tvW?cuZ#9v=#Ry7!KoRrpcWzj8l9B-R<7^CrMYxL#-+ zwDgj7T@Dx+FLW_(63iI*09s!&S2n**dYyD^8HJeP=byN8?-(i#b@h&+xH*R+0t}@I zFk}hPvv-tB<+yj0V{qjNTsaM{d>?zqaA~-!cMSLF9m7#E!|7s%E!L^tu{GH{R+m;+ z9Me5ygzhe_u434do;DnTU!4ZO+JeU(92;u#0ZaaRFg5GyB5J&ZyjD|}6-MfvJYebJ z=qQQrhU2NH4X5@5^xB5&!>ofR)1hir?oH`LGa2>N1xN=69v7qd1hB-%bSH{dfaQGs zaYpH&qhqKbdj%6~mfpjvB!-M(`1N(zwkk}HEd8$ccVyvGiIxRAH_ZOC*dsY&FZf$< zEu(zl(HicT9Kih&@g?vi#Hd$+3*`-qmy66$0lkQ`slR#^_@D48@MIt+%ouB1>r>z& z#Oaz&{U<N0sjJ#<`ZqMoEKGlx`@DFQtMon&BwGZI^6NT#z}pfxRo@ zmkLii)(I4w1Rp)uyBYW_U5NBL)4}+|N$_(Y3)doWQI1bf`J69zb74a^z1y!X5}x&j zV4tU6iOn^b%M{027xQHogX6ctmjcZQP(MB<_e+QMpdQwQt5M?*qoxl-B2u!JXW z5%M}MykLKNCm!^@fFntlGA7%(3=dai?FPIrh|JxGC@3ShLfh!z)p%cELV90#3Z9b7 zyb_Mn=2v)M5EGrJ;vG8&`~dF@agq%ZJ=+>ry--%M8jgR)4Uv!3NsFm z>pK0E%xQ14`b01DbWA+Im%b>P>dn~c%+wd4xF+@Jdx4AQe%QI~+xjJO0MsbN>|Hpc zZBh~HF(IY|9MOtTLAoX#9EoeT@d^(OY&+rQdSFvFfa!Hr@G0UL8wGRtQQ!mC;cO_t z=EISIfxSU1uW?D(<{ap)ny#|>8LaOBAhGQMi4R8t2GXp>l3xT;H;xl`2mp2>0N}%E z>n}+PPI}% zn^06Y+9n7(^gU~ZZ`fMz&a`Iy?aSgE1vHJtGs~7KWLz&DLH(!`=AM_%Vb4SY=!CI6 z1v|`SVB;o-_2-~6qh6Sw!K$7`FvPC&Y({8U(U(t&IxxXJwLLZ)=`jIyrX*z5gRVulk}V~2~7fQQ-!t<^p+Jgk}e3WgcZPzas{bs zP}%rwy`B-VDRnc^w4#Zf)rl(f7^-XjBgO*mW<(Tq&8$6j&2DBAwE2^alkWCcEAjn| z4Ls?F&LI7Xw>maAagxR&MhJ=-wlY4jewFf`*P^xl%<^#VFhH~a1M&vfZvdqB^Y9Al zCt{wDn6l?qrXh+ZqOW0eb|lz_8?V~eA~5w}+^dEsP9_@DyD{oz5?QWi7Mym1aTssv z#uST_d}S{Ot1_<~3Md}o#A*#nuNRS1im5qPNF(Of&P&&rU36> z6bkek3LKKkAoU+e)W5&KG!WH)?$7u9?QelQ>-r6Bnni`uS048qu3fp!h)BB4q$IZ4 zmJ|YPT>5KHHPcjgGfBNoGqKwD(o9kN_iQNQmT0KyWJ9fx(=?UljG78LZBtF|Otq6# z*0vM-RaZMntwEnu(@dqCM(S*uM(UhyngEKibkndLHVxV)o1q;AwtV5^XEV({6gxNW zaqz{HieqU-ToO659Y>3KT>??VB8r{MM345z*+-2n>lAFgu$W~kGYkkwx@M5i;ka65 z<88Q!Q9J8>!Hp#D#*NgxkGM$-Sv%WhxDk*H^E7TG9M+TT2Wv0j+c@6b+6(!*1-5Em z$7ojH4mUCi4%9ra^)J|cuSrA-#vIHR`Ki+H@fTmuC_B7?w8XK69@_ z+G4(a5gyfi9Zqr1g490q2gkpb46j3K!ehMfjQDUZV=HkB$QX2JkCOQ-${o%-*wns> zIUx%;nWGTTKLe$(G;|;k&>LR_aCH_o*WEBvF{Gu;1?e(g%xE0cVI|CVAwsMRL%fRe zC3uH4!-q5M)?SKdV-V*$n#Y40dNz@~U;61&!9(sL-L$qtm^aBPoeFMEVy~xRH6yU( zBeJ-)a<(473%v|SH{B3N2Ck;`;|m#0=F>LOX3PY(7oaz0KR45i;jOH$8IoSkFw04B zMlIMRk{(37oDc}I{0%-UN}7XG_OqCgAB)+@gs%;)&)VIng}w82_w7Q_kRZNCcQu zXGdI2A)S9>2Ej|eXFII__{WlQUWXOSHge3l+S$q*oox9Wf z&F0`N@KigP{WD_^Rof2-()FR&>AKZ)Ny@qC`J^MSYr9EbG1ey&L#=y+kvD%0@P${j zUyi&9dxjU|gLsmH+{#Z78E?Tu22|&t8ByuH0*|?8A|YI{GbT=9??6Q^Cc+UEYzRqy zBB7Dhv$cP*o$I)=bA``r(#|WHt15_y7%Lc!3T*TZ7NIZ=6w=|y^D!%lw8_jVX_FD% z(k3AqJ~oINW%?*@?nWf#O`=A5Gn+XBvV9-ES=miH<0a&kxa?fyL!78=%K(;+t1WR9 zw){aQ@+mJg1NxYyQ_(nyope`KO3=~krL5dN4+T%%H)pME5~ICUkf9YRk6F4s2FcxW z3o@u$K*31XfDE9qN`MRuNMO%#(m2z+v^nxnmC3D3wSyvjxtDE$ht*_KgJC#=JoY_Z zlHJCp@4l5O!cA*iLN206E}}>-4K$agh~=8cEWIK|n%l`1WIm!uek5lol23!QTf~ZG zE++DyVvyV@wjc{t3#bqgxsV1~xL-u(exL_y~ag2=^mNp^z|O+!Z6IM=+`=BzGE zp1gF%!BK;9JI|KY&$5_H5}QWsXIa$+8%mdEH}@n7kGRmd3p?a?wE?YN5fea&s~-TC zI|3u6Z2Dt1@zIA*zO0<(=1?@uOb#}&!&Ya(ExMSQwBYbPePo0*>FN5Mis0ZBJY>9k zqJzGMbAcWqcr`wc1+WYfAb!lG&|L}E#E>sRKEqLl*D!;D#d*a6e{e57P*$E3v6-|l z)GP!e+i_#yX+X3;SUt(>UsOhGi~-=;G3QY-K{$f`USW3T4Wl{pHv^#3ap+iEPWmQruA$wTk<_CRC(P( z75U{M;FsPq_z6lE!_{V{mZpXCE?ih&@{WS>WG0w@nKXYF)gc)%?Z{~pr{FrzWSg+c zsfbucN+i32$<(1+GV!oT6!r6xaaWLHy^^v8c+qMCH9|G(Ozk53EXN8ziz58Y{Q~nt zFb^#UdV2yUi;t_jV5@6Iv$(!CrmMmxdKo4r-c+(aXpa!Dae% z6>$jSb%+EX@Ks91QXzwPN{4e)_ogath-upSzE=DOmMZl7`&N88-0ps{?~1>k70;Q< z!i-!g;N+^!3#?Pj=uf0hWse6#4$M-Q zNIB_zbzF$8>k@P=?U!sGu1f01*-uBLiX<*wRg>Z8*H&mH0yOzDuxur+(Q3MXM$S%O9L>pogKYTkkW}rpmcGp5{i@cFz&AE^Ys>?5jRA|-`#^Wr zzB+q$4>HOsBt=+}=nKh4h+A#nM8_K0FlN)D>>z2_>_jQpg4uteiDEAM_iLhMFz;6r zab$Nj5jwNgIUfkxgd88z6P16d_Nhg69PLBaiG9e`OSgd6;(ivyilFMq0#ROTCvYQT z+tO{4f@>|2uxk%s^d>C6Me!kfBI9eWd;`AAMg?WJEhs;S@+)W$?g1BMn!tTN?KdKs zUSr~Ic@@xH>k1bgEz-U`tW0OUErmLMVD0YVW?f7!fxqz+P=jII>v>Vp2|ymMy$PTi z4*bEM2S+*UYHub2X;tK{j2d&+xwW_OEuoZ@FPA%RwstFOLq+86oO47GiLE|jsl3J& zr@yH(G1st8{-XK=0wHye&EhmhpXh?!7;uMmQNW~vf06BCtNp2k5z2(PTzLm4dwa=o}_lIv~EZL{=N2fZL`G4ozHlauPO z9zo_sD7PTxGSX|kjRkAc%Je0^T;5&5gzzlXydvF1e2c;8LoW0#d4+0!{U{F(Bi@G; zIg?V6G%2&1GCNvqHgM@F{OB*O9Yhn$G1{<@MDE>&)}4<48M8OwWg5$9=O>m-&_ohB zd*!fMy0DKvusdG^s%u<{Y$%af78wvyzx3K?V>gTmz*vOk$<)5Hv;1Xw$L?Fv%*+1O z)jzE?kgl)k&-L!~>AD(eELl$-Gd$a!DkrL6&nz-_mgR}+wQ?SCung`MD6Nk8kj{bG z%E<%fH1Yu6>EnkTv41t3kaL+=pEX^oTLC7+e6~!HP(q!)d76QjRtxlRQ$a%j_p)jjKIsD4-Luu zFyJ&*5|7FhymEj^O4&iU@k{pxm!`G-^#}MlxQkv1<}|?N1tu3BlYtLkuLDR-tviUUgWQEV~4M$OSE}0ME$s zwz_B>Ic+)`y5GGMr5w(#np2d?yrxf}3I)MiG8=4XzKrb}(iZ-fq^5eQC~>I0lf;Mq z7Ybqr-cmo7)4SQI=XgBmb$oixQG&y7w!Zj_LSt-o3jKmgfbAjPe;w4`1-K^Krq!EL z4JJYD-7J}Rl|BpQz;S`-s+P}98~Zp7N;w#8QchS2O*vtr98^}mYH{Y$HI1`T{sKTL z8fs~Vps_UzV|+Nbb=4d8cz&{~mAI-=sVv;|VH6^_fD1yl`o0!ygW4d548o@-Q0^+w z!KH7K;Xv;$#7>(^({f=8=sWX0_qq!z(-6eAphd^?`^g%61M&)Alre-GdG6#KQ<)xc zs($lAyqo0Y)p?uN$^wQb$9z(pNmxN?*l-fPea%caDp&cL=UZ6DKgPZ1)cPycuDf6s z^>_}^vu!6$NHYQU*AyLn^@SlF8w(HN6~=L_evw0#vhSI`tGxCe?c=OF+EwWk`|}WK zaB?}*H7J?O$y@5!FtfjU=EvQ^%VjfIR>AMC(i6! z-xaoJG@#Fx77?Ce$2prPG1UA;c!^8&chfeDu)Jj>g}hKi7_y=h)INq-*`e05VK--d z^xl9Ek%ZbfXT>(TuLu+bfgrl-LJ?5k9R`c2B{5fk=M^#Umts1k9Cm0!tUbHBAPy7Z z!Q3-*OMojum$@Fug4@EXR=U@^Ft_&X>yHGV9leCVReH0h8}~D=Vi1{SyOdXgCVUg% zfLMJiyy31r`^IX?H#v6ToUu^fOduwpqf;tauLKPkU1=hX*SoYan^Q{Add$4mg3&N< zZ@i5o5r)xhw)ie6+UD%XLkQ%1nI#@?V z4uB2?${SU>po2RCg@ZeTOgTUI3RXGYiPh1BP;sH+2cJ zPrn&n`e5iIB5IKSHdTjDJD}EVpXv9+>Va3zPFVD<5_H2WjnTq;?F-=)hp_gq}Szh9rSa0S>UMw-e zu9`GXFHcohpt=&uexm}JB29scu$vMxdQlU;?msT%qOn)N7Xq$RwSs;nEd{3uGfcXIHe4TOfzXn~a0-GTA1Z;qNNom_UwWFNlWgr7( za9STaGp4me6p~lIMXe%rtLsI#>cfoRSd6zmgfE@jS>UNQPJ+-i-oaRyd-H4a!^yzE zG4LS$;x@m75}ol74Jbd66d2cGWpo*L#mxhPTRP&thpvlIxE(0$ zL|4YWtE_~$xomx$m|!5VI&Sk5_`R1TpIk8sI&q3P;QTSAKE-k(;(VH+m^hzFef;Uw@to-IXf-%PhhI{YoD#QvKhbW{AZh`bs~IEoQzpr6u~YH85qe%QRpE#HTc@`Th-rVS>XI3t$MC zr|O9KJ3cI`4oP7Hk0PaQ;4Yw%=md8&Xus`cAZosErb7Rb&iAd<$Nyx=Liu*;6Shg? zPjzCl*>rs`+x$*4pZMsAyXP56tgmJu{`Otw!}-zg@d;8sQOS+TSeT5V_#0XDaVEgJ zwZ6~v>E=Uji@481Wc_v$cr46w%$?@7A0S)zo#wS4BC_!JxzoJ%Bfye9FVxYTKd$|l zxB?H#tK6TNrYxb?kk@{KZ|3~5AXkm=G_U=X`Jy|`Yd=G<>rV69&zZ!YKd$`(AvvF2 z`=z{1F0CtIl7)Mo{N<-RwQqqcIHksE)`8AQR&~f+I}G0u|0}}Uf|-ji&7FvB{+dxB zs>EEzL1P0CFl{Pdp29Dbsoe~XnYf;C+P^{GLLleF97JA<|J(7u-okz#zoDSt;-RpS zJKy;oW2^G9z6qZh7KeYG-^b~lHUolL=MRh?kqp)R-cgg+WE9E!y-w|qNL0!14V>Da z@OBq=Ww?IzfXWMAKvXjs%npQv?z97FT#kA;@&1L>gS#`wvKCk|$p3M|BV=AWr0e04 zjI&1JfkuRP%>^I{>5Kgz(wCLSAwE-ksU42_Xf3NGr#%M-4+OBw{WFr&E|)~|MWXr( z0UYF3TRS)$C}aIqVsM`NEXGhrdpbHh+)b6Pya%5ezC6bFVBTI^dnU@jEhMMo)Z6^4 zQ4xO+21lPnH+LYiQKHJz-w8GE+RmPK$J_b~GE#mDi6g`10^f;=Yd205JsNfT&*469)TGK@i%y}L2@!_5tr zd_1m(D*Mj-m?D?^~;H_u?#Uw>r|fvVDxX2Jl}A7>t~~u{*&>`>0wykG zh_LBGqRf|F435tztlBUGTQs0>Y8MkV;}^qCTVJ@H)l3h$0HOn5vDo2`oE{{xm8#%_ zlvm};E(XUpMWh;Ga3w|?Mw)-#P9<(2g{wB#8$`QsHk8}J2Zw(`;D)Paa_+6UoxBNkWu?6esdRCLuT zYh28>CZ~SnNv&kk(5NjKR|$+xDm3fkN=M32a2=N91RbWt47ILyFkgTl=QiG5BYRTS z&LK=z?TqrFhy7lQhFQnMc_YAH59e{#Qb-Wpk(X!gkH(XKNnL{9dI>ULj%_JovM|`E z*dt6duDf8$b?f;kq{>Fc$(7^lhl#vGTp)Jt6pQasIj@gnH`t2+#dLkH(5j2rqpFP& z^Yo_EsE~OSJVvMx7`j_5aPw=5ee2YbpuW{LX?n4`_cROqDp#2biZyy1&21FPpv?z=_@RbQP*Xr`pNgT z-2@pp&sJ=V^^l^orZ+l5H&%PH|l=R8jc5bebEBbf?0!1B-qDf2gmF#(~Ee(5N!i>tu(COEPR2ORc4;5lZ748 zQ%}%ATbbFRFVP3sx{ZCGF&iOIL%LC!B6E zTF;x&=@!A75N30-a}$CZO5vHXp0R@tiekXqoi^0l`Njcmdm2xtJ%itwRc?Ehv4Pt@ z49{`5{XjnUnRp^j{2(U2r#|igkq6@)VufsTcNj=ULegE^nPa3$hYa%wZkzcC1h2$- z{!NIavclEl{1W_?qgQJhsMp58s-43L)2mT3pkx;x@W*2MA%ulCW!p9}ICTy`0bZSqiJdKUGx!mAT`TwKMX&eWAW1)qNF*FX$0a(7sSyv zvx1#23Jmz1d7pvHR_m?^u5B9nHYsO6O6`Tln`X2U=A932?H;9)rn?4}?zA5Fhm|xyI&z#*Z9?{>?a}ts~LDv2qWrH&T#K zMv}4Y#6TK^$vV6nyS$6}%Enu>TqA{*jbYGc@2TTb0x}P(7$!~@67f~B<1TYVgrUBW zg=Uu*+Fc^qh#%fE_cmy(48Gwl1`+O|2hd&==H5e(I5b|7y1~m*{$|is0>iu06@^ru zAfZ&WXPGxrS0Pnnl~^@akq(yUUxUVhBV@MtJf-jwrWOWVted&RT>Oa;S2pcoel zfwr*eC&i!yO_LPY7%(p~9C6|sLFScszS#H$eBi)c7%i{raLktUVMZ0;{g)vMIMYJ_ zgunwWYe7EYsDbI1=!t))fmAO9GDbF?1#j-SL9u>9P#)+#L~+mJLFt}8kRm#VX}Le$ z!~M#}w?sIjM^o;D?pN=$>oGZqS;kOC4QIq$@G*cY-gu)`m$`6*CP1g)@B7y8slzSSeIvCADg(?r2y8V`!RT z-0I-=pJT64+Z!kIuFU!`>HD23wN|D>Q2JnQ>aIv3cqppYV82z@w(xmIpZEQg-0D%+ zgS^gG$W~irK%E5lh;#n13`}RMvJ!mubskjSAzfele4MSiIOrnptVs!Q93W<7I9nB< zEkrq=mQoK)ab^ba$Gz&=gHG1l=z{bfu41e%dO>Xg(2CC1{;0%UC|o0_EF&k$vamg8 zLMbhmlhK(I2BO&Hq>c&9a=LfH-4~W1*M{_VTn|mH;+nt7tfx-$dE%HT2Dsv=?N}f=dsK6g{j@~YI8xfd5ti=dX1-AywBN?9EO+4<+PUzzdPxJUND>PZ0z;3gBaMC90<`>ItmKl6`E{X!y{KH>_a>vAUZAV z1}e{8iI+QSzwbsI`Oq{+HkMYa{E4DTD(u}KuS$K2fKU5-7rUDz%C;M6!wiw~IBl9G|g4@uEp=iz=U#BYja^nJ>)Jp^{lh#$7nrA}!B zur82B$TiQyb`91ZDiL;x&|zf;B0NPaE9Vx1O?8a5gqgd{uX#f=q1fX|F>R|R;>BKJ zrM8OB4|r8Of7*!$5->TIX{{m0pMWCXH#cSSv;mwWb=9V7Y9s6VV^H=r`3oc@NK<-N=D-$hvlBE;DYN&r6U4-Mf( zMOH>P7m-=}1DAlg6d+j`rL#sW4YT}vmmO|u^q8%lQXS7KZl~1exOP&$UdKhG>|1ox zqn97ZqAo}-N>EaRNeubqz6G8X@aji7^MEV7GKanW^c2kQbY6=xW`x8f@X z9=s^Cp!pY*Y%-_Jqi2|9kXJPY(l!~64|i+g!M-{ivJoS1^|AzE64qyl>XfguzZsrD-ybbR*_}^IeR`tP#=^m%o3e-b`XlX2!rI)j=5skEO49m?z zbAJTMaN>{HZ2C3dkrTdpl|R5*T=U{YNCPhDHQ8qp$)sLPCT)&IG?JNxfUM=Ry3q9| z*10PFpc}~&cv0tM*Hl*N(I}WyI2(R}OG|gDGg#xG)0+fDcUeUZU3x9e(=^C!>I2`) z&0pc83qhPvI?SI9^#cG;mev{a*{bIB*-It*KjoUTqG7KvC1IfQX+BFanp zF+11?rX<=2*l6gppkcR^6XqeTqXexlS%~)LMYKIb+I0XekRTrH>x-yX{B`a^=vqtp z`PYC2LL;Dx6TJ6S0s!-~hqBNrq=uMQ7?<3wsBFN+ZYwDpC5mNGlX$M1O)0L1+ z`&5(+VUu59q7RxMdKFtf+h_sF-tK3;Xv<>DiH2 zDko+Tge3$CFa`D^NEacHghL;X|5C4prdabUhefZ}m#Fg^rYawnkBWL>>HE=w*Q3ZU z^N1YZcgv8mde0lHj27GzEqHM`ZPU|3{d~7<+4qFR(_(nV-Y4%!En)Q%K((7|Zb%muKR9C(uhhU4Yo`uWSXJKUsqqTf| zA1$cG1!?1;9KB>$hCC6>MIwiG;x9;xETU}s2$W4(ERnOiM8+9Y*d@~ZOl@j6XO6nk zo-y?@U&07Gc;D-{PXYGMDM)dV_RVjSRtDLy-hf^!jVyc=*Umr^l+4F8UWWRb)F6&o zmDs1dRASN!zWl=V!7%RCCf(QVn7;!QZNVKR{24aS1cc@o-r?&p5y;h-;I83f)Dfza z({+IWy&NONigze04_RAJOxrK#;xoSRvB)F4mFY&#q%8Sj58ONyMb#^iDFl`T@h((; zsc{)G@$9|(CH+P8O#CCqm)6rBqqWpdPD{X8-I_!(>|MH z1}CL@^<8c2VtrkAOT%?S?JTqk4%Qa-R*bsy>wEJdd!1kfO$i2v_PsTk@rT)SweazY zzK8$4%F{M%oejtslT-^8hKs{=M*?kI{b_+wwB{Oh)7pMc782UTm0T~K+A%KlaE}J4 z#(X%D7k%1jKdNN3hcch%Vl|se75%(>Ty$)5-JzZ#-*g3~-bOK*ldCmcMG74sF5Re> zbI`HjK<6U#YB}iGAn=JjZ>|(hf8U2sa|o8W{$c_3lRg27SNZ@vm`cBZZk0U7D%sQz z)ppQpv^TxH);U5d$wfpGL>q!Sp#$y&%2~H9b8q?oczYK(ovJ9OkqQbMA~g^BQT93@Jh0fW*hL+wv4p9 zG%NlR`6(?NZkjx1D7~iGlj+LdG+3pAU5JuN{k5ja$C@wr2Nuw3UhzaR2a8LuA|-|` zD;z>T8(Jp!rKLEiN-Ho?@J482i!ZOX4ZUsbo-$ z$I>cLoQ-jQ%pXoRm0m-NPaXOZ__g(a^mZw<9epUY|8ZWBHZ9bcyNgcS(VbUl)&FjC z@U4uKZ#uzjqpjG+jG?lR!#aO$vBr#qrI>FymHfv0Jx`#^wrfcmlSY_dp$`_=X&YKM z@bj;Q72GzC4#HOiU2&tk;Miy@O1z0O>q$F7FQCnx$b!wg*rkBNgc?f%)VrqJ8C%qG zCA`J`@R^L}xbBVn(y;|^x}jE#=-tE?ylA(RwxP+RQS^e#D$m3szG_l43$xg`5 zfiP?qO!za zK|wu6QOEg{x)+MBkUU}jvW-i0XS7`(krj}*f>_#{ZC696d>pWg7g9dDlb!!Q&mU_u zuNXM_H;}iY#UL?yLzBH?3GJa#SCG9YlV5}EiLXKMZ0U)!l+C?OKerhx{y$`_aCOEC z+p_yV#0?gOqH)8|{~yK8xc@zFPFx~w!Tew2##NIkEeifF-|$LWB(C6`zqXmEm*eR> zPJTYGpA|F=H?1xCD7F9}Q4)dQ^guy4D)5^=AF6rVV~wp}IMjeP<^RDyEv$dAuooNk zkM*4O4-2CHVZndlpBw+1`04PU!hN1t|H^2QR9yqK-9tg6 zcg>T0d2K9M=GHQKj8{j>0I@_e-KTShL?E()5Kv%LVB1*+cPg?k&* zoqRNa3AmU%hPRaP#f^T;st`@wg+`6WK{rp?$m%bNH@q=;7_4M0}%Pr(hophQf#Z$>tQevqsr;#5&Qm*t%rqRn$=hFZ( zFRri(yCWl|(0q&`zZs1{@YXMdK^k`hN~e<&;^{@+@Empj8gifJ9HZ$(`N0nOQmwI3 zGsu{ee;cXdu|gVHGe0y62BIEsx=p<48{N$qV@98r^!WFU2*v@-u18??v9E=ik}IdUmx;yp`XNWchT&iH1Ymo*f^28XB>| z{5!~g9$S=9+Tv`}=s(E5I?;G>DIV;!h}bO0a)fF}gO_DDGD)b8kk#|si^XA9PCo6@XvW^n->Yw3+?Cdzj{zHzBq zP~Dap`}e`8rudk{akP&FhvS;o*iVA;ik@8I8Du+sc!A=@&7VszPZTTi?Y(HM(1&-b zHJ-?!n)`x|bBH28(ff}MNo*bC5G8eIayC>PE=Fu%OhQX2>OsomW4@+-X)G-bQSPVB z${{YX*a}M1tD|r~Q~q6KGUMd_(iehc^iqoT{JZHr>Jgx#l3n`?V;;ipfIw4%Nz4Ptt5o8uLArl%HUM|!I) zr-xgL%;)s*O7RLi+L0#;a!C&aZYz4ny1nM{4i!*)AS^S^EhK^AwR@UjpeK~N5FP2X zuDC_Hv=M#Oo78lV#a6b9pao5y(<7Z-!U2Xm=qwvb68&)8WR@Zi(aA{mioF$shBuU# zuwN2?!3{?9pwYF*%ID*`mdgp&e->OTU4U11QR-eimOypwVj?_BHx`yGq+ja6mD~p& zb2a78iImqo^$xjn3dcD+QUdEoy-WeIws7@QNXw<{M#&fd$mx>KsTfb4z%3(82hjQci;gDF+T=@wWezwZ<;lsays6ZcvsVx&k_F{ zUqW2Nm$i>~hvn9nd~zCLIp*XvUd+6QmcDD;7>AH@S~v=4r`u53${6!Jy~NpR#3-Ge zMgZvSG@_F)S3r7>a=1^9eG-La?o^ng)d}p^h@-Q6>`z{!k!$9^`vSMShwL5*U-sU_ zsLWiu{~@-P{l-1^0E3&3^4LR?4rEBq%XiC@N*DZa4e{2SQk)BVc z!VfKIbnDqi+-N%4K31ReW^*O5bJThmv-M0B?Ky4B^~?r(86W0520ilFU6k=Q(0<;w zZ;%ekAP_qxFOgbeZQ@6Gz*b8&WVV%h83t&a6d0-5yuAWpM(L~g5iJNq>1%jV0=3;ma#Q_~`bLVh$+XI}W2uqXy7a zvSn@C(B6jVTdn|KCsA8E)qw!xxwMiLDy~QbF0TJ6HS$W}acU%}`oqX6wgUg|?TR{wYnEwyl3$=BSaUib?Mq zWU7Y83Qv?(=;Rl)g<9Mw5Bhli(Ch+kzUJhr&MBuJpHnuGSK7weoPuYYQ)>M$IVH~Kl(>x3 zU#!k4aQehK#io0_P51Z{<&*@QymX+mI@jRNo#nst>9wSX=cvC8)QkTDGh3wD8^@O$j-I_ZUBB)VPa$CiO&1 zr;)(U|C~ndk#_3;O{aGb&$*UP4IT?gU)p>@a&bojh{rX^d0<~(svn6>3jU^mu{wC+dwsK?U<$+iH1h{qiAtIwjh^A+oNtF zc>&(WxZbET06ozAa(XO%pA>Z8@LSy$!9{AU#(ZFZOW*|jTVtG50&mdq@e+8Lw_MT2 zB$(qxtBjU;P6<3%NH_7-)PXQq9eE$H{@xPk?s(uoaIbc!7^ifW#8aCfNP$8Gn6` zVr%ue95LK_Q$MK${*bjEB-p2f=x={UztZ2vxFnVO26P1wWj}a~JuQ!jKN)2rq0^%dPN1WI zpo4C$V*A;8u@V=Q!J_uI8s|saOhX}p%S~%J7#sPV0dRObREjXCgfL2~;aA%tvR|o1 zge7fvA;5p}E(LP>KkImj@fA$Z_IVF5xXnTH_r`IHz_- zOB=CC*1e>>v}EgEGTdYPxJf|9!)P+aN>iw~a-PEpz8dcEIkTw2)?~)!h?3~58W}F| z0(P++pW#xY8IC#`@WhESTy=KJChPw;J4&va$ejb&)&4KJD$NEyEiWx%gBLkLWT)H6 zPXD*L3Yp=*$yLyomzH6(MaI&v_-&UnmUa#d{`(As%v zSvH_qCkSXA>qMP@pR2fKIWAWPbx1~Yo2#;|d)awub*+1KPn@gjS!unKF&n{k`6Oi4 zU>X9+MiMSz5w6WK8}S9b4Q3<0BsgX^f-+{OUfnur?wQcHQi;d4Y*y5)be%%lNM+dX+-b(^is25(khwWH8`iwxt-~E z3Gu2ki93xLHJBKGR23&*y!iRJn0f@i=~gPk_KPkh{G9%GAPo=3kYDKk7xYYi=I=$# zq9G#sPt+#x#2NLY_Q}xY6Dy(g)ylX>;(YaP+_R+q z5Vwug-}y~A9`E-myieojWR2&Xc<9MvwM9JMoX*noSslV}Ci3%iR%fw#H>(e@`V#AT zn{C+2Z@yyndsYv#+CSlf1YZqHfFE8*PSqXZ5YzS95(;Tpw?i=0WY$ zq(Kv3-Pd$RQ(ry9>U*qy&uXX{-siG<8moO-9mVQ&Rv%(@eKXkhO|uW0y`g?>Mpurg z{N~~2zUs>A(B_a%V)dz_51RREYtb9j_w!odeVrE2*@mBousXd3++EDiYgzSL;>}4d zp}#q+eOSGe)f-zP6th@e(HeR_XZ0&qYq!ChQ&=6%>cTdNhh_ZS{8UIkV)Z*#e`578 ztADWSwuPQpR+CxHWVKsc_^PxW)Z18H*$!cOu^se(NGfF_$vr45<+;f;$6KFD2k1eP zRLaj6vAM}?E>R6)S|Bu-bv{d! zr4rQ;rniae6J5RxS~BR4EL#)rA`0WJjsZjgf*&32PuKKIZEc=jT zPZE8=vI8W0o<8NVja`Vi^~s+DsD6dd>QT+wk?5eKh+2{CC3UH4>LRq~5oHmzbZK@{ z^&y>SsbT6e7v?S@@@OB=Wvp`u>71v=szGi!rQZ!i9?=lG9x7Rt5_KWEnrSN0xwKbw z44YdZG?r<#&^V^|g~l`O6Pm~rHrAF&O!b6rVrnT=#?)D8GSlTkQ?%Xm|hW@%Ty^ekLhipg-jm^J;1b8XerYdLXR@-5_+6zuh5e&a@Kw# zMSgjPNqd%FU|**bbtKt~oGP|#mZ@ChQOxJiD9TeaR0F1yndYcMgL2!BsHa+>S{bBf zCzjo>IM)%{v{${NT6;*%%ZbiXud4GsMdfxBk*D4gn#A;h8p-DFAnK=fsF_Sln7&eX zFg?e#OU-7gBwDX`tGVpLHlp)YmAaeh7oi1AsUa&{#MDS=2~!85hnac`E%#84t|s!x z&XpcY<5;G>>Pe=lLaUhW6?%r!FnTv$sm+#dkHdkMWKEy_{woE^$cUg9h&}Noh%Cui?VcBpY`o%Qg$qhoV%n+Rb!O?ejFzK_U7O6H#mo z!tk^DiDk8g=p#R5XA#pOb(rluQ|LFQVxpJSFN!{}LwV_HqO*ux>Qp7GNv!h-5o&f@ z{{B!QAFkidGNr>lO59!4rzLOb1Rtrnh-8D6qtjVtThXwd;a9guVSPK3ZI5F0EH?Kf znd?a37@zH<+*-1uw^E`bO`z$*aVF$rn z1Ck9^-SyQWhupL6$_08g&Bi3F79{gj4UIn&sdUb;gV?es#X{`!nCTwl#JK>vejGt)rbm1!T-CAvFPS{(dx zslJe@9n)pHS6Gt^mlIt{y_bu_@b&dX9o6N!AL}e<8mfndtJ7$dem7iQCr{AtGub-1 zTz?iuXm6*U=43rX?_{zy^zC{N+hS|z+4@H|XH)DheV~S&_vxcymwdK>HvfC-5gm#F zy-QbtdFlzB%(S2-=oy{C^cK?^on3=o(hX{udtEnSx~dh-{ZluuA$wQ1VS0`RW1jj@ zpU!0M+^Rb>^=u85UHdy{vOo}=_kdOrIndVV9@BxvfTSP)dQPT)R?+^>CKF~@YP+cE@1TmR+q8*Ox-_7 z&)T{nT6wMDH(Tn)Ci;F+y`sdvWo_&2P3T+Jk=5?34rFyWtK(R`nbn!3x(a!~Rg3HG zq+Z>!dgqayd+IGAb#J{`QuncHLp>(vktD6g=fH2b%w-asE)w z`Xm}DpM?Ad`)SUE%+lAlSw#-_S--CmPr`HElOSzK`n5X!q}P)vhx4;d&8{bnqL}YN zdZI2~Os2FN{eP+7=9cdDVbN+v&TLkTEB|?VD-SaT3u5gzPi3Xd@`QZ zvidN48>{!!-xv7#MSf#r?C*U3YJD%omI$rht6!U*KdWCrs?8e{l3LO8H}yM^`g48c zlNrgK={ek>FR7^whLKvk!6Z@}H<(RodHMoUTQq=wE^e@ap6|_ik5uF? zi=xlNlJI<09?GwM9+5XKl}7e?@m>pc3#l|WkvBf}B=uC@uc;~O*}SwgsI6JOnAHia z-pA@1R^MfHKdY$`=s$(kzN}7+MB}hQ+GCNvWiRAGtz`8hQnhN5^=!mdJM*fNU8-I2 zdOc4xH*snPW6*LYuY z-?BX^D4Vt{+fr%U*6SNLqCL?l-3SHhzy_?o(RgevSAEDT(gJmIDd~jSsJllS<4xlR zXj#hBAA>zqT3e`aKJsB2t2wNm#p;!;-b8AOnwh_g?0hyat~S(sR=d!rZ(u*(4CXht z*7nt7`OE436ZuHZXIVwtr#S|w{?A8ww;>vnvx0OUTQjewHz%r@Um}~2t(jNQo2SVJ znz`kg`5kiW`1%>rX#IQ#9sf8{{R}@$&w;zg*3ZZ5|B%BHts9RwwKX65cd(wnud(mQ zLXC~EcsWo{RAa-Q|EiOzSdVQ&=dQi1#CE0`W4MfuWSiB*R(`G>R9Qr`o8*-rF&UD z-0~@Uqgt)2f4t7uVtiGv73^usYI|1CCG~inO&j>?B6;7kkqsC8d3qyXZETfG_PpDw z8@=D&9K9ff8q!%L9ehelQiq?ifThtmf%G+cf0U)6)>c~6YpX*2E8c4Zo!i-i>3LbLRvFE-)et+Y}bsj zx5&<2Y<54ZM_G+&54UQOdc0dGecv@folrC0>a+f)?QQHmMY%DWPxf^@R{w+T*HMmr zg4E+}u73vg22X>#`KQ7D)~Br|^-O-#oz;P?4ml06J%*nr(KAgI&|jtJB=n(K;?23B zyH#?+r9=%+0`1gw5{9|7JCI%M9TAm1`U8ECFw+eMw1>!g3^JWK-=*ml(V0v{Qxih<6PLQYNW`|ZBEnj#wey_B zC)|X9iir{f8j-lxO$z8HBCMa{uQK7T#0ochlAtnSapD^_=&{7Ns>xfM_ZywZy20eC>qI9~rGZ*1gj8v$J`|nrB$b&wwNGS7hsLU21M33PAzxj{ zv{7#-olVp*ks&n;)O|uo%|i8#==_0nHdT8>hV*N$>NK==BK?Zg`Ai#Wim1%AP*(~? zlBbzg>K>tn$+Jxx^&Ha_)hcnex9x-RA zE<%IJmQHGr(6z}=nt#9${n@a2mG7e_b3^Z_wH(y=tL>*u3i)>OI~X( zRIgi7Wyvp_i`08ew)9`5K4F?lb-^bjOQOASN=;Q26casFSD`nPN4mY#S|*s=XL>0< zile5eW+{hEZ*`bu^HjT(Bc`t!QUF`#ss1U+Ua^YMDmcZUzAEJncYwN3=%$oL-T*a> zX``N|bTVPbodBiDUz7P;BZUvh!WG#m2;C>JxDt z<_1M=VRM7jXDr*P(^AhN*)FS7!+KKB_@m5_foG z*%ZuOnYP2bA)ry@!nhh#<>6Kc{8f76NH)O&QDEh~zo`qk8qWOoGS z5Qb_xH!|DY8OV@(<^+V?6A#jhCG@=to{8!2GGA|&6c78xT zBbok!fciz|8@eln|0ur@-51bxkp}*vfF?$o`ws*(IdY~S-D^y_AkxcU638l&J+m~R zsT70NH1`;~KQh9vmMx9k=sz5odyMFjC?%|pO!glQs3P))TTSm$%m?Is7P-AzC(#Ih zS=5}jBXW=bSPfd}KOWG(B1`<00ev4C={^zAA#$N6J>^%^QPTNjpz~;ConK8ReWd$T zAT#L|en4DHt%}Mx&j;jnN}q3@j>^1q(mnG`l-OJ~A)f{0ok!-Ljq3Dzk-61sSPQ(U z45PQUT8(2WSC6Ob&}wxn(?*51>Us5~$et!&Kd)XA8CtdH)n1XkoE{TeLp!%%XSv#x zo)KE7`U<^6v|h~=`XD_o^s+iA^l^Ig&?~BQD{Jn9^tPc2b+^#x>F0$i)i7-3BRjuN z9~OFBZ57&^J~8y3>Po9eko}lGHT1q}OKUMw+v;Y(E}gqq)F|QmRROYt&HOhN}j_(Q?sKQUsQ8nI1dL^~=4MOOZ)Y4NdX|y@D^%5cUF0%9%A@nEe=zRfIdD*(-c{U8_ zdDPQ`gwVUl(c=QD@^bYeA+%ieb%cikmAWFi%4?t>7D9g_Pq)3mhJ9{YLAa6Lc%gLx zZDV6?dRW=3RBjvVnM{=$eT~LCx2KgYC3E?DWiM+E{iP;4(i^l}qg6XuuV$*$=yern zzL=TP552BJo!`frL$9k)_YgwAr%-S1%QEiIH`QNQQW)7Z)w_i->S?NZ!>6iL80R$8 z*~QjQ^go;FZkA%uZ*8v67eY_9x$Yr4(Kl_b2Qlr|XdjC7)k0_=TIlOVC)$7(dZG~8 zfR=g+Q@MI0qrz>ecMOE<v&=Qf~=-o-R8Jg)Yva2I`qiR#GO^N4Z=Aq;3Oo(i9% zFAS*2J68{5f_ra-yXi@nL+35(r`m_id3ya|ODgM-IbTn?!cy(5_rn+J=0iZ0F&O9c z)OaT1F;`FBl4Z8s_S7A$P9Agh)JvG`*tfS{&IH%L3isA^u4G%n7&jK{Q-#puEY>}Q zFy1WILo9J_E!GEzvN_J5#X9*aOQ=JNbvGvKmtx)1%6N2EtS@6iyc`Y}>+6_y>!DdH zroTR7b*iCR1H%J!WEkw67ao}vA2U$b6PiGDsV-!yRMWEFa0ls`LKx`}(yN$uYs?7@ z(#2Q9mfae20$1n}OmMwn%$0hI$cAP$iy5YS42RB2cKvESj0vuHh#9U&3r!#zq02-k zT)$Q)Tw~3_^=owpChPjOy4DEDtn1h7LMFIg95Y6D7unFPAu%`V0VAy~2>Wu&>E9CM5IuY)bn`FPB&x;|4Sw+Pd9o+YmJr|S+vsP$*)NkXXgZ_|qcs`75vk?Yyl z8nyl`-C78>{vGsq1_2=j#0abZ(^`g<%7S#H8>)B&0p`O1-?-4@Heve*t zgO#B!pQrQ3F)7Sa&DYBg4;hGv2z6+M9NvGwsx<6&LA3rgHT_*7Gs<>xV@rYVQa1bRJ+=a*124i%P7o z(IPC?-7RUbz~BBZq&=OMiLbUbjU2$!-T$0pKTu0Z!@80SRC_^KFn0f zJ pT&eXn;&YkKx5RO_Ob-+p+*_tU78y$aGQC#_t=cjjxw+cc%XASF>Yg`amg#G) zjO(5i`ZgidJuCD>La2LI=rxu&CRXSjWz}}B&_{&e`U>5n95P$?tkA_wm0b6%&^I!b zhc{5kS)pf$4C9;?dcKwMIA?`^RA_Tnk@tjtpJ}5)d_Jl71$4+fsfSF4dv-*$O3z{{ zR~Qkk()WuDBcfG$wa7lpTH`&f4-0)o^o%~8r!O|rSZ20)R(EA8SKnvNHqYs`LceD1 z_txmbDR2)Xn?q);-Yn!%d;5YObgPx+QlIZdojui3>x?5Y8}wKqjBH-kh0`FjrT-P( zI-q^#6@5lPMc%9W{D2n6yrwT@vLl;~`c@%~Y&PoWgfOz%s4Ijpve~FV5W>jjb^W;z zMmDeO`04OVWei3(mHKKSjBGaP5tevlvq>*!vLl-}^&XL7Wb?K@Qw>t^0(-%Oc>di*pGGRnN}x8He2-qA&hLc z>K#HD*=*IP%(6N$ve~Lv31MXOncgCVk{*`|*QVJx#vhwfloVld9xrjso3 z$Yz^v9MA}VyKXOpk}b-p{&B2rbYr`t5+Kyu-TiZfgr#px^Yv_khY3#vQ-wTJu?^ zP=6lL(=G8xV$hhW1D~y@k*oDY{q8%FrGu zXV)Sog*sU~cR#?y?U8oo3!y#I&O%EX?U8mi3Zcz$oWdnASFW5ohm7ltV6wHT=Zs~l z5K+l5XBv|oTZElCLTE)}ock>C*do?>KnP=tSZBTH#MmO%DO?IW?bssTX)lDaMS|1a z5|1sCoH0TeTO>Q>LKs`5IQIx)Y?10bEQGN|#CcW-V~cd>6()=d>cwU_Uo+Wyx0ds5 zKt-{&oXA7)8DvFXmeY_4EoHaZI!?ofA+uwIY-f)U#t8MC6^}&C9S-L@F9tN<)OR*B z+0jb_CzmHZZ4bAB(?tmV$cE0fOz4UCiEZdCWkUaRaBQBlQfLBEV`shSME|;pQ)?Mq zw>{iKr;rI@Sm!r$I*V*_?XuYB&SimYq}#$79ne10!nsp)PRp7X+tPVRXlT|$v8^1~ zPq`og>oTnadLeCHY&D%5IUH^i$S_0RHlUt$Hh9%Epw26?)ikuuKdXu6(hr9N8LjSo z6pQnA)^*fGr$xy_Nv$T-3^;$xI=zbIy|JeUgwlUTK$sn=rY(tkW6um^TM`e%b_!@z z+8?oBU?T1Rw|6JE}~ z4u6m^G_I%9UT6>=MFy zf3fo;lU@HSb`l?B*JF^j{hV5ss9ri8?&lN>Asq%d2Za#V1D#rrvpJgm*&BO_(@zL- zeVH@V5|22SHTI-mowS2*Dn)&-=)l}=$mUffmA5Fw<) zaOWW*q{9ejZ9rb!wa$J^G0210JAViv4_@!2t+ZiB9=zUZD1>}{y)#Y-`FgZ-yAbmA zSZ9GHo_`tZJYtFa&|{rvgwTf`>%1(4KJ-}UZA;XLUKBUh`BcbBSWdKC2xS_#p0Lk6 zj4f_-Vp&$M`n6gYd!zFs6H54zxbaTsC!uqeP%>-uz6KXI&eu7iNgt1I! z{6y#Nr`QE*JF7$!Q-D%KfB7$!O%leKfA6R|QL6_hwbo{rkt$1QQn zEU}#>&MYC=S>h}df}JJN&?fY(lNTS5cYB>han*F!F?9bi^hixgc&bkG8n&#j)3ye^ zMN}Gf&)Z6Lb3oq`l?QaBPS^Nb0t#n$jh_-wD$%V0)hC)7P*HZ@_-O&1l080tW3G{wn?+XARTt z7{tVU=Vc+p?tJG{OB(Sq-}z1m@p7-DpF#TV)`*w;oOB_?%l%FhA;imKr-KmUWr=g4 z5aQ)QXRr|BWvO$65K{9YXR;7d^C9O>A*AL*&LSbC=0nb7LWs|YoY#a9pUa((gb<&P zIo}H*K36#USsMn#=SnA02=Ten$reI}#XjfEV46yER()ch4^m}vWL@kUXQ`Eux%h;&&T28YCnY0cos;`qw5(*u zuX8#u?dEyKbTd!;TxP%OI-doIJXI* z{B3aN3!(gNa2^(Ods2ENY;cm-RQqg$Q)r3D?;D(UOgr^Y*%_qsEGGD~A5k|k2Yrto$!7@-AMLfKs~budRqb-kiD`7A=iBr z$dKzk4hXq!tJ8~P5czC*!l%w?iBHVpYoy?sjLJB~IJz&cB3^w%eUULP*=~ zj=Rp52c*MxCtV2Xu-(ZPLON`Bnh7BtwmYpYaUHVVIa6dvhwaV?A*92X&H^E%!%k7w3o&#)gNT zq!&3=c-`q&Cshbz!(W|jrrkWI{MDHxgmLk2&Ke<%eSdde62d6?i1T_tRo)-Y+d>!@ zA9X$qsLE6BXF}+aIquGYsyx@-BZQHu=l&psQL^tI5<+h+O?sV}U14pDb2AsnC~7bsuD!7oJr2Ktig!+{$>TMXI}!$?mjBbzcF#zR z%tvOp-w7S63ktskzm%&#>K1t!?rI@ZFEugKUH-C_?M>g|)p19>VhJmu+3r>*8@_D! zn}GJ2YJCcFmsD)qRuDzAy#NC>&E!0i-Jl~?GF5JEm{=I$3lK5On4R#;n* z&ziflH(J6tpvc{4iRZRkxM#g?Whi4U+zW*;|I*U!DTFfC((NyVT;9?hVu^dBt=z&l z*cP50Y2|jc#5uW@d!7(-ax3=&OPrHixkH%j>cA=Pbs|IFZS59svOYuJZR5tj37V>s z>t!dlam$$OTuB@ESth&VvyHo+2{n6f()p=1$2qy3yE~wLrk$(aVmmo)+q>CJHt(M9 zc4eAJy^_I+r@KppR@EDsc$WJX(;W3;y>W@1-6JAeOi`{ksjdY9MvjVC}EOxsEG}7(o_6(>Z zv7b92ppkBW_lkfj68pO&0vhQKaK{EzkvPCD4QQl0(7iRFio}8L9RblEWOrUb6^WO) zivt?zUg|Cjs3P%F7qQ}U>~2b=ua7WQ>PXH=_ws<+re3j;#DEDESoPGQoLW6V7m$Ratdk{${O@$zUuopL%R ztvJTq%0L#$>5}whK!}%T0_v30Gifaom3Oau&KhrBKz(!iCA|>PV3Ms5=#=cslW@&D z{wlqW*&~u(3aA^&UI}PoWJ1!b0ZoqFp7dHk!*lZDH@d4h@7fjcjqYluayp^@deTOB zr_j?xue*sKz`b&{hH`SHdjXTJQ7YX*0j={Z-BAI375|1?w8ffxE$8E;f4cpd?E39n z?sOrn-@fIp7M+`Os*>Jvb3cPQ8vD|W{Cn;-OtuZ!?2c!`3UQV9zPn0vqDA=7efx83 zj{Ewq*#?@Uw&xs3`pDhNRIaLW!pWbyv%g@S+yZTL?_#QqK?}6aohLHPac*-LS>iT) zn|oLYZTNO~*q7Elw9{X>n}pD!f9dWBsLI>n?%!c`q7DDb4eyK+^~>EULTJOkakm6i zvH z?+*Ol5?cEo+_#00U-r98ey}p+mml4w`z@jEKj2m{*?nCH-A{$k_8)W)icYls2VM0e z%$3tu6bh1mcE>Pb2j710kXz1F8G{wgU)(8Hrm;Tui@Qq9eU{ZG`LNsOC+j*^%YJiv z3t_eFclU0la)njkBks%tRwvfZ{&2m6OuTM?)XiqHeOhgrFxeFxZCZ#<%*|-i!IH-4 zOqX|l%sNjwWOZV!rp-nnjMZGz`xh(2 zSdG?6g)mkNnSqC`3}dwzGf4=evskl82qU*Rvt9^ewRp2l2=zpQN&3~=f_fs+6bYf8 zNH#-+Fgi;yidbz-%wp*g@*u9oG3a*tXW>bizz6H~c*Hn&T1L$g8d?NoON-IG~EeMy5NLLcW|oZQ6ZI#%{Y?p4W6&3-yl37va$Z%S@u4jXIdH>r0gw>51I-eFsstdWC>wb zrJJd1iANgU%o4gCh0O6tqnlYTgb{5w^97SF{oTxNE92R;Zsq`!4PQ4Crn?f5LlA@K znI4wNXFn#NXFg@J?bt=;2O+d$7nxryv7HwgMdzoHLl)P6)Vs*^5qgy3rKh=0=xL@Y zOtzNlX;v{=fA%zMt&C%$r>PJ^O!PEw2_YtWn$1iILt;u#Q$n{~!1Xuk_e<(!Zey}( z)WGoS>q1|XX^Hb$U(=8YcD|R;*R*27ib@~%V$(%*;so=>=KMfs ze8R=%648lse8mRe`9qGx-q2z*iOHV0EjBZRcm>WZ5S=(7{#UTJU_1nM5_ z^}EX4CxjEJSDD9za3Xb>StEoKsaKmyA)H9P#%vM7-s}kN?38C*c&WyFhr%uP2av|)L8E5Vk!c5|g=6)gcbjF(%LYU>4U^WP$r!&F4CxqV9 z1hZWT{lSUmTOsrZOUy4q=nqaZZnlm2Q8aH;YLbM|AH3Pr38=~|GmVANADnDj1ytqT zV$KjkKkHU=o)CI@Q_aOf=nqaaR|uicH_eO^!d%I8GszP7ey5umLRfX4ZsrN0FFf5m zWQpsZ>1LHB?w3zDYnW`me1>^RWax?CW?mPYcYeMKRJzzc-!d&`8W|t7=(jPVlgfN%>sL?q#me5;UW)g)k&RJ%%gwU5- zZW;-pFZGydDTKb%3e!;tJ=~S%JR$UOSDK53(5GE#h6tfgyV6`|iPs-ino=ek*DKAf zOm)FfRz9H~OUcrx1FhtIQ`t=s7-Zz7ayt@fmYa2tCKu z#>urYf$_?7CRqsMmFG>4B_3(4HBFi9NMoI8AIJ`Q>&yjW4&#m&%|IcHG}fEpLKtam zFyn+Uws^@*X0l;_#oWeZ!~TkSkO^UbFy$5VHWSW9tVns)>}A@`XW%xPUxaw4s4*vT zh+=rBs7VpxouZ~LQ)LYA6g9ab3IdDl!3I*(|xxm9#xhv^4qju7^ZZZV66a3by_^F%Ju!HVN@gQL{yecZ!-FLcCMdMC#j=UW%QfrmGO|6g3kp*`1=MT!?pynmd>(?M_j1 zpP0iLxNYX8fM}yikc}*Q`Ps8L*{EUTVyx` z_l;Q^&{O_5W|a{3jqWz<16t?rHk*X7Z?wv638=!aGCM5s7My~b&1{fXTA ztw|O_Zl%=;A>`KYOg@v%tv{F|rl|_2pMEeMgs>-Zzv(K3J&F5GZz1eS{Lu_zvZIL~ z&0r>*=YKR4nCvdZAI+^o*oF9$nPZ7}As#Sy3t<=H0rRlv#4f}GCX$B`*h`*VELfD1)yBQ{gU5I~}u|n8|_@^mjLP>o+<*1p> zWY^V{cfSzInDSOw(uf!Btr0@JI9>%4Z22t3@jeuDXhmIbhYoK{a|75R3Y>kV!Vz4?TwA~ zx(K0P5bt%j#OtZ?UO$nc7ZmSZC4|0Bf_H-u_JbvQQvx~=o9x{sg#BQt-ok*qxQO?l z5cY#*ddr2dAFQ_bR6t%_9q)M|^h)Y^6-;(qT+d5oviq#+d7m*MuB%dVyuH>Ow@10& zFGAQ;lk5FviTBjxdNGY{S;3x~`d%#|?5Sz!H5S62nnqq5A?&Hi_c{woTJvD{iokG}CQ|QeT!k(H!?{OjQscGSD5W=3C zmfrh9*i&P)x&_?wQ`# zVh&@cv%J_Q@XIY>jGa1p{9Pp4zq=x-ZR$U~i>-|4jMTHeaYXQ0(}wfiZr+_j9f;2J zmWwSIb9MLL6T+D5eDA0w^-fan)C;`qldUZS8b0A(=@Nx7hn!=mDaB-a#>kF_#Ef;Z*FZt zeBS8IB!W4l=6LTBA*AL6Z;R+eYEJZ87Flyh%@S`2Q8eZ!d8I;#`BHDC=tRulT=&0`nJ)drHy@H(&yNWU_3yVsM+?nIyEjjbV@<=s|8cBi*8kc~2Tdau=x&GB{x zvK!1C@8=q_yFE(0U@bCASc|+oJWphmx=qdU=&XUx{ z0m0lu$C!IKkVSHypfw!p7r3`Bb$LKAxAGWsPXscUdnzE9dpaPPd+r!>^hE{^EyDL^ z>e_(X<4rDO*YCteo5fIG1;WccD9D>u$RjHf2xu<~aj)G0zS|*%o z=$Ev~+s0%|>YLuK8nQRNgw`-;Wp8`w0Xb=Jdo7u)E$?_|1(cBXp4TJLInsUKD`v9i zuHW|tF~MiG(%$#RiMeT6^@wg38k*H0?E~*tChO}h-W-uluH8Isi?@Wy`s`zGIg@qa zV{a7`Txg&6u~#YPre&Q;^q$brtS)JvcpnK(u6tetzkjZD_gz24hQuycLdUhgY0H!Uk6aj*A{(9o=f z{83r()Q zH|-~{Ba^lBpm#Qtwez5N0Tb-}Iqje~M9fXg`kiQ`5S?6){OpYpnp`_R@{2c_$=dm= zcN>$n^H*;!6YR{4{OT8(H*by5}1S%ckq6GFdxaKZ^-=4v4sZ5fkF` za-w!ZL$iiPjDLpE(8)1h{@U+_J=XS&YL4)|0XdvE$ddIX+lG@ZjZ$H zvze?dasJYP*7gQes(*A$d1(#{T@uWsI95%Nj6icB6(AU zE^TeRA zIP2Wj&+o+k@mCAs9P~Nlj{ z{f~t(yVc$I&w-tlJiFE1j|gFQtGnMo2(w$~`-MUnd7tkO6vFJ*1%7Tg_k|WN2s2ot{N+NJ!Me^rEQA@X>-}eY!kj$^J;wi($?mSb z!QWJkMG4|g#)uOQ~fQNHm7f{@G9j$>%!p<1X zB+mA8Eosao&h}@E40k2X^&b$zOyXVsD$$9%lJ4<85yDL3JpUUZ%p}hDe-*+^;sQTB zgx%AaNnGe>3SlPkKEELo`s^Lk7y0Kf+4}PV|H6QJq(9(~52(mn;!kHn`!_uOL4W#{ zaKWBuUg~!rY6<6=ANG^30@=3eQNJ!zd3anSy1~(JCp3jxgh&00Epa=x%pb~RTc^kT zJ4J?@I3DvCiwv#PWBywrdpUh=`s4m?p-t(P=_~y@!{BA`yhQ^`WnAX=<{@)@q*ubxRrgKep1FO{!F3!8#T|U@YOX| zwl}>~Mx{SiXnCWx>6`qOLO-TonDM5+euUNOWn7W*uD^1mrPdjvGB*3&ueF3$?R|eU z6H;ZL`M}>i3No8UANo6(XkSpHNf{sdL$0&tUT(A?;}d`N^_D7$w)&AVmOgFtP{ybJ z-D53P5q;)=bOXrVe)ze+gUROd&;14CSjH8xQ(LrB;Tv@u2^(5ZcCr{_LBq3~l2f|ELh!#$WvK%`D@#@vxsEgx2t| zpDTox^00pklfC`$uzz1bBm7_eC#_Dt{qT4Hm4FudNBsTe)^)UvfBHivTSD7-)X$y* z!tIA2XB_n(xfNtvN-wmUsgiF$^g^|!T61VA{ZM{D>wG`7WjbWI{qX0EQ0V;`Rwvrc z*wBuED*V{c@Y~o0UI&T`O<}6!-I58RZ9-^86GMB1(26F7+TCvLL@Syc>d$0b(bQ0x zmGSL|kxUwDLS}CvX%Je)RH?BR(lFF@wv}PeY{Sr`Io1~Jm}nSUJ=e<67UzX} z++}5Gi~kRM?*blGb+wQ0nK^ULJ}`kK;JQX%aUYnTI?3grkvpgk!Cs_;&I;zLCx#;b>$Y<%|`M zM&{AZPlTh9d5lvj9F5H5oC}1bk$Jpx8FN>ujH0(P%bh0-$7|TboEO@;qU;IIF6PW$ z>=BN>oAb^m93J7E%$yl5j&ROm&a8cpaAq+_>-UM-M>xM=j%EVKfm_)g?)>bdoNevg zjI5)bPnn~!zc%~F4h{uF-f8T=F?*78)4hgMc{gSsL0WJUfZyui=-ZJFj=mk~;ON_tc8-5T+`+Bu@ltjNH#y_2?27gn8oTYv zKBb-8mi}4xY3eUp7=JNKKODLH4gbIZV;-Ok+#?woe+Zg3IDS;Hm4 zzc-xb1ejZ(<`vy$PjliAklO;a0Niw^@*%_36_xsDI0uAV0&b>r^TXt3YRD|-ckSF- zdzN!gJ6GzT?X2zKa?W)cn4`M1J!OuQ{|IUMh`&9rawZB#rCa4x3P+_|<=iVAm2Q>u zjN$lAXqB^BIC`^O<-8;uor_xKyu#cIe6~oH^GD&RpQv)S8K2yvR5>_ujq`qI-uRrk z&b9T1TTwJA=OSl=a1VmJ#QBuDk37`B{LI<#82L0ca-OqUII5BJoY#b-8adB-!*JZ! z&2s`za5(PW<~ha8(YMm4p&S@Kr7OFi_=h|n8TcFk#os+Y`!4Yp91J$Kk=fYQ6;C!7cCt#jrrp9#WlC%$(73y)&$xEA?OROl;@Y+BZ1IwR5F8H#%px zbK6sHcB0IE~M_=3Bztg|OgQ=qW1Ukf9L<;3J2Qo&Inf5ERXCbGJ>_J)Zo<(wrB6HO z2}kp#xD##Xa6W@mveo#c`O-$`-ga)cf0I-8hH<0$(hE-In}(xV&}OH$(Qq{HdC_SS zj%GSroNt&jzXy8B@&1u~zTlym&Pz@g<}ey!rt^}MVcd8R;$^47xbckTW#={H#=pIK z*=dw;^vkc89qTR9X}&ORa8j8wz0E65;%#!H9f_^JSDl{QOgd?Fdfgc#9QB{CI}Zv+ z{pagWqj1!JzV3|O&f&QKeBC)hI9g@B?o4OSd_TC=nPuE~?!DEyP&k@Go zbksX0Ej0ITbfzz-z4sGDkU7Bw(rbn=WyD-bG~r&rQvSpV&P~N`Df=c;b@|`d!~NUoh}ERJmIMBe&gf|M|Bt1cnU{f zV|(>T;b^7k)khhQ`!k>Zk+{)n(5I&gN2@`fo+cdiZkE1CIO;?E`j^7dYRT5u2}ga1 ztrrVNeUGj07LIyFM?WeY^@>`r6OMXCS3ld%?e=%kFA7J!VnDyv&h7T6=(mKUUa`A= zubtcNPt{GrQ4f}`KNgPq$R2v1aI}id&|e5gJ!Xbhe=_xq=3trHCmhYeGPNxneIuBu zdk9B!uuPq0IG%%L>R!Up%qmM43P<0`W$RO!GrwlZ)@KMuzh=qSXBnR^eY=&dX9`DO z`{d{ggrhHda`h#`(HA{=`f}mutDT-YDja>a6V$&Jj=s$4rEd_9zRc;ZZxfEbzUiZv z3P)exg!FRZ=nI>CeZO$@g-u`muyFMIl>+^=a5Pse&@T%|bHxI^&2aqtl>)t6IQsoc zKiwi6{eGpN_P%fGHT{02zfKj7e!o(r`v^zBUm2hW3rD|L8K}nz$7^jpNjO>`4bmqI zM`uqB(zBQ|E5#xD62tLX>O=Gb@kuMGQhkGP^y`FDy^J~2>krp=8#n%K(r|sR_@rM( z4c8l)Gb6%q{YME$_XiBuJA|W^_XxeqaJ=#^(;o>(EAKMhB0g#5U8ZLys9em~wWIVU z!qLimw5~NAue`_VRl?EAdz@Y?9Id>^>sN%Mm3O(`Asnr|C+Lrbqm}pJ`g7svS6X51 z*-5d}YIjLaSi_3H7jWaz+Ac@vTy~=|?g8saUCbPG6i+U!EMLCkaP2Nncmw&onI-)(o>ne!vv#2l^W|C;k- zecVT+^JaBN@!!Gy)Np)b+$8-Tb7mJ{lKzl63YU>PNq@y0eHrkCf0EAFOwyQa-6=GInr`m?s58Q2}fFv z(=Q80u^+Gh#2l5&S{vU-C;2={A58K&Rj2-$Qf*>5S?4fEG0e?9Sr1{(g*#2(oD}YK{UmdyRh_9{Vvf>@GduJf#*J4*XXD4lISqwQR&|4jWfb1(25vr=yoj^;#_I%6+|dx5{{K1< DUP$wm#uw^Tg;I z`LlJCaP*D*Ir`>i4#%t3bM(ER7>@dhbMz+RsP&(tTbMKL{T$tD+<0&89KHQh4#zn< zN597$ow~3&_Z;2jGjhW>1mGfiv~YCl!ZiJJ=1gv<>4ojwT6>ya($0Mln69ILGg_YO zvn_X~zMna>`!ic_6OK|nTc@@dpLFWNY`x(N;>@WF=WFLn;>_Ip0-eE}Id!2*Phrl? z#4pt6ePzPY`sgAZV~$Q;*pvHH{ZOlkflghh)(;(IpZrvQt{-L2oVxIH{kXW%FZX_~ zHyDn0kbkaozA-V-*ngS6RyZ2_FV}w-j>i7^=wG~?2U-#RLI*vDqp|;&x~!es?Y}}l zBpi+XQLVhjC+#3F(5EqHPF=W4*ZIh8f%1e7=3b+h1dLA_`>)menKP#@T&q)4j2q1o zuGMkjXkM^TH*_~{G@H3jm!}$zR>{B7RcVH!RdStfOg9|OkZ#Z;dk|+Put9sXATlsR+i!eYHBi+m#Q#hH0abST?|qnYC!`gX(ddyA#|A?D1loA1<5 zF=txGo%(t4NoO$Jsb4o7?}Oc`3v-N4TF2d~YnWT0=nRHCb+fq9s_sr5&NV)1Rd=Ue z!kjsS;ZCjdj2rDbz)d*Xb%^QWp2m%K9sZzK3rD*SD|BhlxY4e|J^BRUXrE!F{;6=h z2cd5gj&>dH(+>$pdnNblUBb~`$trF2GCFCmWQ`sp9PKkapf6?4>`y#^9U=0$(?k0c z59(`#qy348^-au~GZ-Gxq25L(?Q+!Xhx!-P!tt3hIuJ5$w5PK{mk38Y8Bghl zgrl8|r*$~r_@teTxZcRz0zQM`S-s70d}w~8B`!SJkJ zQ9wTF42Jx?XZ6d4#F;Y~HtKEd+{SJjb)=v1NoO!@(mRBED>OLo1+DrUw?Bmr%X>+0 zD>B^PP(|MBx~bUcq%#=)sB;DoXZ8-?(xuFqGZ@~|#RJJrR^Ivq=I9KD^Ygap_n4zI z7@~Ra=`MpH`xH~vliPW`hI6FZg5PF>5KIfG%Rt~VT? z!SI1@V$S>;{saA);rRFVALuWHqu<+qp!MLkv@Fj1Kt~M6@$J%=4B`0r_x8K=wal3_ z7VbmmZsf#z9jz-=fc zZh?BP&jxTGF=zIEKhiD2(QNG_T|SJ%@tMUR=`eE?!<%^@=^Mq3)&YC<9l}w#z4{MH z;r8mg4acMJUVUIxTUt(r&y3NAqtSP-9>tvLU-s$=#*N=%?A6CIN2BQCyuCVNI6md! zV|{PC+s?d?^)NpA+>D!_=^qP67Do1LjPP z{9GR}KDmZ`uCorO_{{J4KG$L9Os)G||HN=y>ps^f3rBV0bG@So!H~|ohn@_swAgSo zyZ>B|5pE9Z(&xIxaPHore(Q7HDsDy#E(T{UbSlW_dZOXDMt-hOWR7xF>i=B-l(_}! zqEhUm=mV#ia1_IS{raiQaSZ$QHpB7B5&QM~!ch$S^-l3gC!6foe`U_ZuwO5l)uHq6 zdh_fKoqyM_8IE=SUB4w9>HNFiCO%2$-}Q&g8J&OEOE2%xc|hMgzeDE%{gB~U=K=ks zaHR8qJ|I3x=K<~i1%)#@59kc$7O1Wx=K8+SsaJHw@P+=+a9k2!=)Z^?mGu|8ML3G# z3%y@_QVd^c->*7i_(Ffm+)h5T<4gTelw)9>U+O0f$Ep5OKO-FJ{8B$FK1t`7`c>vk zs=w4~jl!SN`IX*aIQJJLmUjJ0ZxT03=U2KxIMVr*4)B@irbd3HbD1+bztY9bEl}H0 z60Q0s!h|y~A+smNGxi$Y~Nc%EQ;XSvZQ}YhCiNNejjBwI0iyiQ#KKiMa(TedJu< zL7m_es7)yy)Jy6+@^Dbc499smsP7eyVmPS(EIuiQgZgvkObiFL#b-yGmh+8%ojDW3 zH~QMgJ7V}o-()zB;Tyd~IEvvLy-j>l4BzMvnKLnbqg$B6%maB)ZtW8trKH?3PnsC0 zl$0Ab9LJ#CNy1SK%Dq;6QVhzyjX4v8a#t|7KrKTI9(U989Wi*^))!0+)W3LKYqN2q z=iqU>3P&+`+!Vuc|Kf4;m@_eW+|_(WohcWus~S6WdR=WePPNzVE*$Cfx@qE*Qtfqn zGiP*q-Edc0p%|S$cY1f`xE=Z2^9{#3eQvdIq|@gv5TB&e=ib1a(dlzr#&+nm+}Fn$ zoh2w;%iU%;)@ix#3r9LFcc=IyotFDo=8R6uExxTor{7ileaKEuCpJzE$2$FPci~8< z-%S&rq|@*AX3psJyXC7oblUDk<{JXmX}dp{FAC@x+3pp>kxtu2%y?;Yg?B{#AUEPRIR>;9HG6NBq+br*LkuiwoR>*AhiIM&(4oh}^d?BdQ8pQN*kdogoHXBW4W zXL3eoSND3Jt?hJwGVTv~UESLZ$2z;ZONAqyUEMpyC+Y0!u42yU?CQSA^E0C};I8NS znMr5B-Do)08E_kfBb@8vwXs2B3{a!GC^$FuyD?~OMCSFaihogUR;_o?}r-%TxPZu6O(i|?14 zbawV{+XwIyF=a?k->ZzghC^Ko>J!N#PVEY&xme$|<<$7^EcqeY+MYh;)TGMP zKx0qNyNTV%JNrzQpO;H%GiBQ*|HqOwoR?&6CUz5-dCJM<)25A5o1F5_K24o5a`W7c zBw0gp?vmvu)LNvit%Sep>XmkC+Q_q<3!+~2BHIs@X45W+dew*g^gBzovxbq}LJi%; z5|b*El4SdCj(0End0%Q5mG)m)LjH~2C#}A-WFPz7$2Dp{>^^l+BovnHKBWgznRf&A zsx<5v_*4d{rLrOMvmaahn9|OJyscGIO4|Ayl6zGjb}a<8)Id-Vr`D?uV|z#G`BbkW z@>2lnQKn>$V?U|pUU|<*lk5=!x)i7>mc{4o7umSn>y1`lHX2= z(U9z#Z2v9vc$A^Zxo)#}Zp-BVP_5pyaZ}p4T(3IYO*?ASPuh|t#(%P_soTk|;CEaC zM$$pe=-^RzagLIysiohQB$tv`osG8RQ!{u>r1JN2`Fm7|$DP%ED4iy*lXwLDJ*VM5 zjw{(t60dp`)TcJEYjR&rVZDmV-;6$%I+e9;bQqE%nj=kY>}m_i#>=?fW2U8x51|L!14-Uo%Y|>s-?gHAa{ijsL%MI(>tvKA8T* zxF)ARxqUr$h$o)hlRwCHAX#%;-)`F4cjHQq*R*cxyS&o7ez#xssIEw@S7mdWlY3N3 zvqvST{7}8CX+b8Z$-S$Qo02hhN=b6dYHQuey{LK0rWeiUR3(>K+w&zoo%_tr64Q&C zo-la~P1a*tZgMQi_W#Y^FF94lZc5Ljr*r9MZsV)2jO@Fn8 zpZ)-L9crFzlKuO8Etv(e|8fpHf#*d>v3+EcoMK0B%#w~Yc-3T<|AeX3N%2X2g>h{Q zn=DDTQ%mXaNp_n5oGf}eyLO}`*{4a>52q%l$vHB)NKS1>PCe=xE}4EvTidAjZ9Ap2 z!#~+67nMo5__k|DF23vY+vVK(30^pu!kYA4!KpITq{p=GA7*b$gNdFTZ1Y7pPa=&-TZdny0^(?L@umDYhGWe~=_?Wlm-Iucz~IybJZJ?@uSC z)~ieklhYaJv=Q~H&1^Tcb7?=0lzWtEWrmtQVKd8L%LCT>M( zn-*Re(pCwE+3V`ucl(dX-syB(EJPl=TBbwXHIe!|p=tmLd)QAFQEm zP0?8otu_3t%|4{I|CELq4LkR`hmxBWx|xTYo@6}N5JNlnEwmE%ss!&*Q+vc74*dJ@ zZ3&IbKjyH>?bP@=f#u1)7PUdII*G%c4Qi<_=y}@O-7Jg}6P+Q#w+V-TL zWqa}{{2EK%VQOY>KYXR|{XRcron~ccY9QI$*5Jn{y+<%L+|bVR%;dKipR>;7T`con zqw}h{V_a^_ds|)o=UeNy+hdy^%8Q95y@2ed2Q$>9Cpn$Q&%a~#cpqw}rOb@?0j@KL zYHKF7hiWfoFY!=e4<&z;W26?;);pPJ{q4S`qXs6sns-koUb7py0Bf5)!Nsa(#cgiTzx^X^~UN}tLqd2Md?B1|o6^FytvV~?V3_1zEauMT;#opg5i z|L^W;n3X=Q(P(W>`v3J+vl)HH_yV9*kz+Bh5xLbO0Vrbqp^SY z%Y<)#r9l0Ihu02XWmZqgY54y2kxAP|u0I`iAFoFay*}#j*_J!f@c+$FuW(yu<+Q+cz@=GY9z3`?CK(y)XN} z`Hswtp~*G5?X51&oy=DaX5=FKp}*KMKL6d{?R?5D+I-2=%B|S!_O#7`JJS3^zUtY| z`>4t9n)~qDKabb%7Jl7hsT6*5WO8R{SN`(HQ1eVp8JaW@ZJQgLHHGOjlh-53YmE;3 zf4=r<`zq3`kqtGa_iai~c`iS@|4L3i*RW5sHZg1P&i3SQdyLLxiSciqep^kWvFU&6 z9rt&0`oq5Sq4eN;39g@JrEI?NG5ey)cC&Mp{I!o+QzwtP<_n*mtc_?}9qx%%(Du!t zk(=^K_DOpe9z{OCOR1F1DzY;*<2AhpY5TgPL*nH(Yv2B^rZ1<;#6Gy)?nAt!p|iw1 zHPgQ6t%pzEdL*aZwA}wHk5mGKkvpFn&T+MsL+AV&38lyE=Zs_jCe0?N-_2uk-rL@V z9coAAP;#2FczCa}ZKvhmv72PxYya!-PpM{pcjqlx(z$j2V@YzmHqY8nQ`()WahMnUz|y{Ui=`4r`$ODC{usY&N;iH~mKPcSPp<+m11!tu-Z&2;WUZ z+fGz+?8$yQe_zyDVn#Pp-waLOWiq)-)@k}iLpztlq59-Qm-#<_YIDEUZ<8PM98F3( zKSv`mrT4GX2D! z;ZTy~`JSm8oqd}9^Nw%+J*ujkr{&w?WlomZ~x86^`AF%rrf?=dekBg^@fh# z1A6(Lk%xEr+U859muTBJCJq02TW97x|JUBuZR5An$@Tx=_x>(aN+Z<&4N7lFy($GW zs5GppY+6^r1YpweHnJOx4U+;BfJsvtyaw;W&4tW`%vD)1HcX1@qI$!0g9*T-!DPYM zFe$1l+`7W8E8M!mtt;HR!mTUZ0+0t_53oG|OoPb;*B_=EOH&|AVc9^S4MQ$NVEV&k z!VHAz4MYE=F%2dQ#)e5z-PLfIAu#=6GGPY7^oHpM6M#vB$%3(AQdFuM1v4CG2uy#N zOqkv<-CzPRX)swZy^`oRo-+bgZANul<-+bgZANum4FCY5yp)Vi$@}Vyu`ueKb2z5S8045FEE>uP85>>3` z!OVwAfeFB*!DK@Fl`!*Q=EJ1G1Ypu&G7;l^m=rZg-2ih74A}!PX{rSAmmtm($Vwn9 zfow2z4Ti442saq=!H^GTc_wmp2h5c)^I+z~q`(AV(qJ;xP<5v&RrkQ$0+WK$cm(DK zm;g)~%snu-z@(@$&@zN7L+;8DwhXB(Lz$EzO=a+32LEL!lQN{Q4E{%|buhzWhQRcP z$%GjQ(;KE6OaLYgCJV-fNx>7j1LjJYc`)-~NEU!egUM8*p=&gBjYjyB#4F%nTaqn5oRXB%tV-(2s0C5W+Kc?gqevj zGZAJc!puUs&qBCaDEnCmI}2fFA?z%KorSQo5Ox;A&O+E(2s;a5XCdq?gq@APVK&0e zM!4AsHyhz*Biw9+nT;^B5oR{R%tn~mC_8HTv(a*AqlV3f?%B{Y8+y(~pK&h2oQp8$ zBFwo6b1uT13-@#3eje)Sd8nu7p`M<{d;pjRld0yQ9n69I9JtSc`y9B>fsQ$Fp9A;H z)IN1N%zT(%sQs!&eW`w_4yr4Z*Yhi7d!nj~XMyVGxl*Nju2NZ^T9xOyTJ`o^qxyP& zt@?YeRRcW>)ez5hYPjb&YLur=jq_ZuCU|a8M|y5lKl0q9j`7^Aj`Q52PV(G}wA_lc z+={f^iWqN2T5d&JZbe#dMOto0dEJikx*g?pJId>Jl-KPn?+xq*6M#vB$%5$x(+_3< z%s7~VFg8pIVmZaL47!#<*D~l@23^abYZ-JcLpd&ku4T}*47!#<*D~l@23^abYZ-Jc zgRW)JwG6sq>I~0vgjtR-%MoTd!YoIa<#1mP_j{oC9=P2D{vPH7z%-alwNjn!Sqb-* za9;`cm2h7P9V_9!67Kh_>7G@nU#n2RRw1pckk(a5>nem<1@~1*$123V3gK5F+$w}y zg}7Hi*DB~*gFLQ5xHSm32I1Bq+!};igD`6lW(~ruL6|iNvj%xwgFLQ59@ij`YoL1# z^sIrN2hmSIh`#wjwg-S|>QQxxryk}pn8#tBfO!&T9qQsbjAQE%$2!EZ4soo5|8KF)j=(1uAtN_xX|g9*T- z!DPYMFez#y^lpUSjnKOZvQ3a}f@~A>z0~utKM(u!@bd!f)bqXo`)1fT!@e2z7h!)9 z_7`E_0{a%&x4{0A`pEkd>@UIovfA%`8TOZ9Z-Ar$_6FErf&3NNUxEEq*k6VHRoGvH zpVwf24ffYze;xMMVc!b-R@k?~{s!!C!2Sm8Z^Hg2>~F%}2zw*!jj;a__CLb@N7&zj z{Vmwvg8gm8^)~Ep!@dpjZLn{HeLL*iVc!n>JL+ujJFve4`@4|83;VmU=i;oe^L!;Z z@9M|?YPF|FslNiZk1n=OR8`p zAA6AfB$jVXod!GUnc`ucp0eQ8Db=0{!J9yjf&D&p7S55lk59b1PqpIIk+FQbSH6eN z6CD7$vD+}FW0@YobTZQunV!yc8q+yUF9uDwFK7D#wl4&Ad)^LO>i<0`?o?wMRCHcf zfN!$MVCpJzEmW6xKgX)}-Cod=R;Yf7lbQ=vZTIsaA=hdjoz`6Kqf?rzeT%wJ)73sY zqq*8gXERs(R&^hfPV{h4I-j}PN9QtE`{<_oY9F1vT+GFwO!V-iPHm! z(iviPzL}-DX?4ESOE1FNn(qxIN@so5`RGKDEv&f^cV|3lWpL>&@-0l=Xf5*HpV|nz zj_IP*m#w8-dP{xB;;hz1zPljb%3;e?M%qrKoXU1PBpbVx;Wsi(RvAth*l9I+>2zFI z{bbmw!Aj0uCEp-f?V%GWo4j=0q zE~|Z$GY;t0zQ%5QyOgQ-p}$Oh!*py~E9_^arTWX%>qy%kHE-C)V3|5DEdUAKMK_Vp zfvZs`r|*QFBs2L=t{QbDBsFSm+WGz(XqfNc!?~#UEy#S|uJ_R$er0ND+FW0~?+=-c zR=qEh`L?~mHzSwmdAS$qdf)w-9;e=SA={+(s*CEz5Y{ z4qA(IQA6OmJH6gVH>x)Ao$>X)Z!*?GGu>BM?~7%nBCM6U(QfdP{su3d0^i^@5<0`U z95H?XKcTGUNY(wg+jb%(l$TZAe}?Bm=k?bpI;X$hN4Eo%b4@GbdS0gJRQ`J3Gnp>J z(mA<>YHI2-lu08_*R4l>?*W|$`686Y+tw6lZU&_^RKUJjPqC;)R9O3R_gjnbd>304 z7Tr}j#iFxxE3DkSt$LB~rBr(2e6yOO(;ca9%=JyN=%oKC7M)*P@5{iA4uy)&U9YsL z->9_0rSIF7)(6Ah2K{6hNvMCQM7*U)=XAtX@1y%8P`ePe-bXh?c)Y2@?U3s&9v%p} z>eqRjeQDm&!_z}V^H`n_c{KGI_@@)}Nq!2up2>7tsNT0Zi&98=toPAbx1XsahHv(L zrlt(P60TI{^=Ro-Cn@jsKDuQg*L%kBI=E7<^Z7}+-k%P?B~)U~&AnQeAk8>^&+}9; zrP~0wE(ujwf5y|Vu(mUOndwtZA7Xk>?mAszEd!m&VP{(OED9~^foED&LuOi(k`??k zS8)GUZk?3(zFlsO%-d;|TLYL5WqN8}BP8Lxx8ZsWXcd=m6-xMnP?fcM_)e?JdSW=q zsf4SzgsZJc-bK3FnvvI{T{Sze5_a6^?oz(`=5JM-h7ZWEVLvtOr^dP!1zZC^L)g#B z`E~4C$F6nkT4((>ufnZ^pPB5ZHh(GNYPMD|onqadcaux@yO`eZu7>@9Ucq&2g++C8 zwKb^cMW}UDS66`E1If^yEt=}>-KcfsX9|}U`MC#v=!vYb_>Moch>I-Jxfn5W-L|M_ z+h9@8HpQa;yii@3`hc|wezxW`fIa~Eoq3PDmXGcSXykHhM7gc(+i2}Yxiwm9#9G)7 z41W;xeU?xeHd=H}W1~f*SR?eH7xK}wn*uxKj_TefoSyWQOZSQIw?0$3Blh(*cZ-wV zTd)H@UxF+3x0^5{+V5}T*qadhb8eH>dj!TWYcSJsOeZs?*qb=U9oA!c&$&A+8i{sT z527aQ;99Z6qFT|++M2Bs5vmzF2NyK+({JXm4c-NrZ@UfNr_h2Lymgrgw}s29mCLHZ zOXE(1mqwfhFO4q^-oNJE1Uuc7-r%L1#~ZwK<9LIY?iO$G(nvu)7)huEHlfDe1v!l! zn-tx5-r%J^zrjnrz2#3$IU6l*X^*E18oYF0H-&1p0)C_6iY%)O+3#{Q{8WYwUb+>% z1u38FYr&JKWXq%e}d9Ly)E?j>xtQmKh*PW zH|VDxBj~4IBIu`HBIv&-w;X9$23msjU~Wm}13RU&%un^LoaH5c%43P2dW?yFYC#kI z)M}`o?AmXle|Fx!r(Bfr&jH!=S7r4&B8hH)qXkyo+$bdgt7yxnU;9g^;p}b#B=(HwO#5Vd9fRn zPiwzwKi%K5!B1_rna8hcF56~BXYe-jDa0-OtT*|u>Dkh?fz#jUr%|lYA1*zt{|?Sq zqyN#Gs-L57@MJ3)r-F z3)r-F3)plHdcdZ81OhglN*=K3H1dE=r;umZj|cY!c3?bx!atEqDQIsFS}BD#m3g5Z zE)5nH+O)DLv}t7#wCRqKLYqpd(5Cf8p-rV-h%}VqgPeV7C-^I%Cy-Lf+Dhzqf)i4L z{A5cwY>=OOke_%N$5Mt^rWTdi7mv(ME3;>hyhxX^{xX}+LoH+dWvssv>(feq6*T`S z#j>+{Ed!-ewQOox<*cn7+Nz7n?OX74%I)h$4hN;DQ*P7Qr{%1zoV7LcthfxP;xFx5 z=2^ycL(egRGSACQw=w;gX=~3(kn14Pbf$fomIhCOq%3$@U?Oz(Nh!ms`8r6BfusyK z-Q5|O0{Q7FmWSGx#WychK=OcP@y!($KbgKsc(U1>Ur#y&{NCLtJZ#MB-z8I zjm5P#%>-)gEi8F+`vV%}ZVH!I6tnU9UUp?g3wTdW@RaZG%m> ze{ZsB-MY!9wd!h{=GYB3^{$OJ^{zW?8U=RPGzu(Kf9rj3w-dd6M;$xxMDM^+Ck~|k zXRfc=zP?W*?&I#3j~Rl!q|Z*+3-d|REC259E%xd@L>~riwy)~*0O+-S9s#`!KAVy9 z4+70L%@CTop0{$jwc39faCi4sl-u*Et#+cAd_LFbEl7?Zm7CVe<<`Q_x79wAB~*sZ z_N9o$awes`ni^o*0{!Ug>@J)hN?Wr{ccV1hwV}qmQiur8_5@?V8X8$mw>7W}9w>Xy!h=*`_-on(gI%Hb8O<%5$PKweN=R z6P?+8cc-R#&K-4xp6K}DI?hW7p`L$=lgpBP zmQX85L#>#m%bg4QKA&37`pcb*`(li6E@K+S3Z&e*j_GZEo8gCQeg&RIx3mgpJ>(S* zjW`vYy9(#ozJACl%@v%}3eF?^Baao%=Dw$Qhbv02g7aI!`K@$b>zkXl)bmc?L1~rH zoDVzoDoc^J*HUIWGz!mzJdm=&^I_lev>@+r26@)E0<*^vX;pB=ywTx#qr>w?hv$tB z&l??{H#$6TbZGao%AwuMDu?Hg4$UE}9NNRIa%c}Th#ljtptRExRCM=SP|=-lK}C1H z1r^=#7UW%peBMP|fplVh=lQ(vgp^IN|0tzg(Y|Di!TcR4QuS zm5OGSmC%XRCEr{+g~z@DYJ1iZdNuS+Nvrqhf>Y9}6y2*>rRYAz6&{*_*R$rCW(Nj7 z&raLmNiR4rt=dDawHl)~QEIc*9-2p0duSe2jZvE@&7-P4G>@wG&`hbC@1d>cJ8`Np z`unX7(0OrMwUb*=lU9o{eOmWgjOJCK)W&Q1KHpjoweDIEwd-2k_<1?(biYs))|Hgu!_r>Nj2&`Bw)Ko?{#0UcJ*h@Cpxv8h#b(`c=tyFqJN zTdkU(G1RVAbdxC2si3s}s#SC^XRV_9IBON%wOOm)$@mTI@31S~sadONbylnB4$WFc ztFu~855@j_#7n7N&9jjjhtgT=oLcZy+9KYeUBt0Bpfnz^8a=n?y_RN~Su4-#EzD1z z!uHUaJ>y*(S<=Y!e9J>m*1~#WZx^C}gX^S}chc${nx~cVEM*a552P#w{ZUG_FILb$ z{c`V^(U%Ur9BZ^ohX%3JNW1hq3x=i_!oGxd-3yORUjhG7s|1oYkQ`T7nO-jTXyL5% z)$CdZ$xCp3r0~M@iEOWOb{CeTjr@fv#Z~3(DC$RgPt+w zPeZqOGy3d?ea@J_z|SS{vsOJ7JXO~_5BB>aeS?#Mn!gbH{F{9@GrgVZ@0s4m^mL{V zGhNH{S*AxAyP7v9z4TdiHB-{_teTsbUb+cS@Pj}D=vuqMp<9g_VPA}!bqC}zerkx*4(+t7Vlp~^dK|*^zmZsev zOY?4zrX3z~ZMK5q^NOs(OtRnQ?!Y|ifDUp>3bjcC&4L1O#rUpix5v`AWM*Yrn)(?_ z(>{--sVA{C?ekcgdJ;?19*BiI%{GG44v(d2hX=RNVvc8N>f0@7<9lh5{u1avKeI&B z4o``u9Ue>54i8d}85+W3ePL3-PNDbt~z-(-|%+SMu1w5wC1X;-I2-;-O3c$a~ea~{h;Pk^1$Hc|5~BFoD;N97z# z1)k|unH9RKKgMf*f))G(EA;Jo_hwcicYC{3=v(@~l{r(>%yXumkvkv$FU*_|$=Pg= zusx&bEy(HJP=$UYvl*^bt1D6Rq+wbAp;;CBnf^;aKg&EGl%8V+p8gEjUx2(424 z$$S#=Qdw1?j@4yWaUHAXI#!|QXZ|{UqV>p_jlPN2Gh_Tn^T@1=pn+;j1=o-o&f`qo zwWxP?jdqIg7EIH=Wi8~*@Xu={k@qU1yln5kJgY_*u)P-bvqI17Pifl?d9HWsm>Ww; zf4Yrw$h-sTq32bhY1T?P-HFs*)Z=TUd{<^ZQbIMeLepEP3jJvRnk*`ZqHL6K)&p5} zoVE&mMb-wkH(Pa@N^cR%>-Z@w;?yqXP)oVA>-br$z;isHmvX+Aa{3o(O8+8Gc^yBI zrSe4fW*(VUC2_r*>4BYUJDx1Y(23R`x!kCpYC$M%ruX)z=Wa@s)=CxJ${L}eHoK8)dn4M^jj*dcqPcm$gJx>W zm0U6v+)_}lxaQCtV~3{s^9~&@y()8uet*n-(B?5Dp?UHSgr#RqyK{JsSv{bQ-rzKG zOR3=YSi$YFf?E)!`BV6(R=G*f%^jb;iDPfn^e(1R)4P~PZjX)J9vjgf=OLZTK%3cT zGwa#F`kT4LnptOqJ}K|2%mz*GUm7&63mUi%G-#S*H|TKQe7GJ1+QK<%L5_YqrbTY2DPS@5~zy$&w=SUk4g+sb9))skAfPaOsg_Gu%9+ zEyFElN@>e*js7n~ry%V5qH{p!6n&E&fShhsnpbq2-KrNbrJgY8UfS!IIYF0F8+89v zbQA2Pf#~)WwzC9lWRk;9GuWU@GuWU@GuWW(?YR~20{)tD^thn=anTa^q52kdslEkW zswY90`o^G3<5bY4UOnj2&S433F3Bl#iwfR$%iIN-_vJKrsYW$;Y1Z1{rI~7jmu9L& zr`l!k{|Nk0`)csgOtryFGgZ7tz)Y1Wy+@##D)#L$N5xwY+}cj>5y%hS;7)I5iPHSJ zhSvf$ycTHi(vCrcm(~;wUfzxI(#&%cuO=G2^wztOcNYtJMN`NtnnGUD;Cl?LVhVXh zQ^+eCe64}EQH6?bqMpd>mok_37%BafUm7FITpH8M_|DHVmuh<%mr|KaBT<>lBautJ zTp5>PnM-3vc;*MsFp zFuj85EYK+~-KD%oEgoAueyex+*x}=+xR3VhnmYwCqHlq{IJbiB&G=dadykMDomEpNXOm(S` z-Z3rpt-)^9Qs1LYDZfj7)UKEMo-8KHJB?go)l_0uwcCVNQ|*4r^c$wsf~sA29LaN- zlAaou_StG(+GneAX)mkRrG2(qw^#nE+*)^aAEFO~*0{9KR^wjVryh3NFRDSxKM2&g zG+V3TR#wMpsB`}^U{!7%QgTCHolE;{H7?x&T<6k0TOFR@MY`5~1@bz#FH%zL(yXA) z9XyU)O{y+MjEi7joL9@`Q|r=hTP>%s#--i18kct4YF)Y=v(}}4sn(@?GizMhZL8t> zR^!rcTa8P-L5)khZ8a|42V8@EZ3dQ9 z8m_&R>$Ub$rYkrXD>#KKI1MYftX6Q2mU3K6UCPT+F0s|{xj2u$_lTlQ=ziQ9^c$lP zBh4xiBW|#*ho3hgryaH$mv-1{T-sr)acRwtd@-e!dyPwL_6_jA6aK01s^Pw?hWoA> zmv-1{T-sr)acK=+EjBmv+e-_y*Aim-fdNv4%ygVG(Os#2Oa4 zZ=x10;;@TY8|nN!>QoT?h`>vpit9njYI@EvaP_*J<( z+>zt!LBr!QXK<%5tz_DZ>CEw%MR1GQ;a1)#w{3$ z+HKq5(r()Zmv-AWaNTRdGdh^pJx3N6`m2@Y;~_^6zFQtSkQ+&<)HPR!$F_)90|I? zb2Mn&GpUxMfChc(pdnv2XrV6%TI|aQO>n3t4)tda z)$Ds9L#uL&{DdvCPqawSB#ZP+u}H%S*3U9=1B*pz`_!VewOE_8ZFRsZM@p2RQeycJ zrrE08Kcd?Z+>-aPiVP(Dn;H@({7U#;f+IXvv;1A*dwQlZU*MU?ILK4O_@>f~<2^Sp z_V5_JFRPai4@2*BM;=U@<1x5Ua2N0bt0hPm!jrqtYxn}eqXZ`d$$f_KyL{pgM`TiX zpI>;vg+TIupWqfj*EaIWf(r%j6Wk)WN6_ae^={U|G#AL}2Oi~uM^O?V5}Yg;5sV5h z6ueI`F1SZsr!Z4}%k=u0v30YEB;u;5WZDzC}HM+6rN-Y1w4+#~3AGkPWq-X}OG&BzxD z?hzc2F8&1<3hogs=ppF?Qu-DOE*JS0;r9p*$T0rq2yO&YzIO@E!0-EszY0kCTP}P- zHrh?;obg8i$$f_4RXIu>iF?Q1bsMdjQkY{9wj(K@G8OOf*S>Q3Hop< z7Kaz4-~Lj5j}m@{;2e=(CH!*1`$WD`_$|Wk5`K^HKAdbo@wh-3r-e{2+k3V3N949PjHK1LNFAP@&QtM!@}Pu zm=N3}7|u8Tqk{Jd;wOomK36a#I6yEg7!jN!7!`~QZV^lf?h#Z4l7GRl;AFvwU{o+B z7#BFVkAb!5d{ssun5nL#^rOkbS@i#{>A&4K*nDByg1Q!Z!5p)L`e-S}XiQ&V7F~PWC zLJ&XwWc?w*uwXIm^K7#55Q#sm|B z_;H=7$AVG8m|#Ls9VO`&j0i>rV}fzPgrJ%z;eIUf2u9oZNk$$QObAAPV&pNwxL`ss zbe!lDj0q+L)$ztXEEo}t3C0Bzg6ahEFBlPw391v#xE=>myH_U}j0(mD!>1T|L@+8C z6O0Qc1o1Ov))x}Q&xj3wp24tSL@+8C7fc9-=7@j6h+tGOCKwk?2;xWh=J^Xo1!ID7 zL3M$oOE4@L5sWhS9uU4zsRFELB9|HeQNg%iLNIi>q*pK|m=IL+B|gEhU_>w`m=ILI zF#aQgF~PWCLQvI+Ucsr{!7s(7!`~QCIs;lV)MKNBZ5)ExL`ss_ABE*E|?Hh zQPCq97K{i+1!ID7!GvIFfe9ZLj0i>rV}fzPgkbne6D}$kXIwToAsD@i+?NfGF&<2d z)*AmY!FU^gwUNgK6N0g8j9mTNU`Q}57!iyMs%yocU`#MBs1_RcuwYa$CKzv%-y`ky zA%h7)^|0YXf?>gkVEi#j@8bp|PZ&%HVq=4!w_0m3Di{-t3x?N8c)_S3e)?BZ5)ExFCK$%>KfH5y7ZnOb|aUHu?m^f)T-}U`#MBm=FwYk$40nf>FV^U_uZ- z_BH7ej0wgC6N30Tv+*Yw5sV7P1ml7U!BB&Q6O0PR1mlAES+vQwU_>w~m=MHIrj0+r zh+tGOE|?I+&#Ku!ehO{E35EqDf-%9kAbu{*{=zXX9*{m5LA1N zJR%qu4DS`WU{o+682Z?_#{}bos@cfHf0gipQNfsCTreT1J~947f^orwp!!tY1;c`I z!GxgtO#BIk1*3v7!MI>T5C?ylb|4rLj0wgC6N1>}HU0&|f-%9kU_vm|V*G~%BZ4u( zxL`t1eJ=h5qk=KPxL`ssv|rMrJ*Hg=hPntZ7!!;OCfcy8@uva?BZ4^e#N<;jA{Z5n z3nm1^-HrdKU`#MBm=IK{#$Q-4Di{+~Y2q#z5sV7P1ml7U!En07FBlh8J&Zgg7!`~O z#sw3Cp$v&%Fe(@mjATkYf-%9kU_uaw#hCIF3=2jCqk=KPgrLfnaDrjMh+tGOCa7{G zy@F9j%*zDBx#YfVaD);2LwUx3L@?UM_cZdTU`#OF%gAGbalwQj4#VMmMg(JmalvpO zaTkmUCImwv;~o}_2qu76d9j|#Hy9R-2*w2Cf}y_RPcSMN6HEwV5yE=If)T-(U|diY z8h;_ds9;PmA*lL^KEa4!OfW8p!-6>8kYGeGDwq&dMWRnIA{ZA;2!@KqpI}TdE~o}b ze1cKIm|#K>2N-d>B7#xDxL`ssJV^Wr#suSnszl-wj0i>r~EEpAx2_^(_ zxRQBZf)T-(U|diQmG}iCf>FV^U_vldDtZN@f-%8_pc-cUMFgXQalwROXt?MTj0(mC z6M|}l_!Eo>#suSns?7Kc3DVhJ92^`TJSKQi@a5p!!QH_? zuU@?hdkyO~rB_w2U-i1J*Q#FYd+q3@dUxwRwD%Fcf7JW5-qU-p?49WSx89*XrF|y# zIjPUNeHQe&r_b|!8vA_Qr?pRU=)BP7p=(2{La&7Oh5jD$cImH8tk1jr=_@d$~i+@|Zw)pwt4~su3P8o3IfU^fI7_fN2T?6(EC>nUwz>^1_ zIq-^sO9t*7s0QT@I)2a@gXRvpWYE=vwhn3;G`Xaq2W&te|PwY!@G|dI^wtyzZh}JR(q5RCY|+Ib|1=ttfk?Y;T!6 zGH+zRk@t?=J+l9(%SZiY)ZL>V8THhtw?=(B${jsy^u*B@jlO*Jt)sV%?lWf8m@~&* zF=pkMhsV4;=BqJX#%7EiGIr|Nv&LRA_Li|r$F3Ut)Yyix+sA%9_Or2iT+ea+#vMCu z>bS~rv&PkoTR3jzxWu?`#$7f3*73g^fA{#!koVJu(uBT^I=~cW={xB7(C&$2{R^CPpF%)Y{JS3>n6N5K_8xe_=v;LIegCHzc~Er z!!6W5zjAPX7M*67hHam0Riz4Wg4R&fOSk(CsGdE$-vT2~SL3tI&;9V(v-<;}gS$ThdUW^4|6$n9`eOx@1{2H90!oQVPv1gHk4e>Wg_Ir> zZ?uq7X!JZ%NGUXF_#t|d!zSxY*3&t^-%YbAQyZn)RpGk^MJKOz#W|vM4rmI>w>#Q9 zol=^niXf$vLkHpfu)}cj=LDQYb-3!Sj#7Qpk5x!bQu%5MUa6c7U$fxrVpXE5)nN5= zHAG#GR|mgP!?D3trlM-3T7a$fg*eaZ25d1d#tDeG;pt9S58(8`dYlIM7&JeQ6ZzKS)V&wfdFn+q2aCy{<2NL+LoLKj~s`R{o)8{s;i04I|GPgy|^t_~IdtO%Oc^cIDo>x?r=T&u~ z=QZ_H&+9nVZL6yGyrJfK-c*-)8r6KyA61R#Ep>(GZ58!wQ&)Pnt6I-HIC^V-%gw0SIX#7>8HS+OpX7K(WaqP#$XncOl z&bj`6%_a>-r_p9Kn^YyI+-NpA+M7cu%*matl?vyc4|-khJ)ovEI+wGNo6_1ss=RE!p$%Q?i2`F`2a7#NilJ75Vmz#MC$0F;pEGnO#owqO5?Jj+(wj|p-r!BcPb#_e-n`}?6U59Gv#*fKwa=wz=sfp3}H0kf0 zum4^RG&Q_)eM@ewKfLalw3#|^UGAsp)cOYWAbKp*xlC_l`Y_Yym^LxBGstH#(_@%c zF})S^f3vNby7YB_sv$qTRR6U;Dw5sSdnb0Dcq^>{KUY*FvK z+BGECG}FF1*Q?~boBEdA|99@~lSd7s|4=D3CH(y@qH~?>-0rT+_2yEY>CJRJ)6vF{#nQvbG|?W(es?e@^f4*kjU zWP7roACiWv$~tuZF#jFtIh6mk<369zmi`Vu_<|Sr6{O;>0lH1Y#=QlpnCV)Ob^-Nb z2JDA~ZU?|uzMx)}0a+?$z!b6@j2AOs7f7>YI>EmSBy_EIS|eh}9SJX`o)rvkPFKf#1exH67HeF5 zubQuhK{C}p9Fmhjy;wbrfaGMH@~Kq?s2Ar|kA(d+Ki#x&I;dAI!m2{6GyG#9ITO^Y zZc}3+Im=HsESwGMRZH=44oVECH=@Kqy;ubt2Kx;E1jwg@dU1~a;aF+j1&W;d!*HDi z>cv{&2uRNL9|_5Mpt#8ts~@lWJ!q;r-#-zqb3naV!yFC!h5jEwei5iwt-u;7RbA|# z1o=-vy;#FchU8NJF_2sW>cu(D$HHEXlMzzY&p^F+A^Q_Z=J}6<LjlTl&UxNO>_TD_cuBzGt-}mI^4w;&PLQ9kO zmQE?qG))Hz9iVdqoov!l5h=IHO>^x{Zn!sT8xTlaXHoHqfQZWTp%0bkLq$WH5zX zHLR#a4=_nU51WU*h*u_hfv*C@FR(?jfVGi*fX7Gr0NWyYz*8a@04|Lb0oO)`0M|th zpxup;VZ=8G?1)^1`0FAU1E%psbq~9-Lx5e8BY?g5mb!<%)ms7Ij_;^L9wP4q{BY!5 zfS-!I2k>)|_X6IGuczaez0{A^I67kG$y)wYxdF6n=_u_zm_L6|LWtD&@lvM-HD4PH{v#buV zt*ilXVcA5$Rb|Hk?kt-Ocy`$oz+20j03R%y2KZ3fbijwpW&r-6Y!={)Wpe;u!k4T) z^NX^R0BfW30B1($1I~>u0Bnga1Z<5i23!<91#ofnRKO+CWq`|~D*#tTPY2u(T?M!? zx(2X4x(;wtbOYelXggqM^en)g(anIbk8TA#FZvq5-O&!fzUU6X{^;3&`RHo_FNwYm za3uPAz(dj9fLBJ-fLBGk0I!Z_06!4j3;6M97Vx&{KEV5;eSr5z^MDUTF93WpS_FJ5 zIuwC4Mh_tVw7_Sh!-zi@y$JZ{0X_4r=*56PiCzl$)94|QU}gDR0jtX2 z4p>wEPL!Geh~KO%e;44S^7jBXmcJLUsr-G&oeBt>SpI&%RQXka)5|{qctZIH0h`M| z1h}O9BY>yitKXivvHV{EZz=y6;BDpq3V28PCjjp+{}kY(<^Klwbosvne!KiLfZs3w z9N-VjKM(j)`7MCIF8>nXAIfh9oEZBm;IXmW0b62U2b>@KCVI6Xb|>Pk0^4GDBfc

1F|)Dz0oTVK1l$mN7;t0kQNVLzj{{y1dlIk^dm8XS>{-A|V$TC!8v8cjq1b<- zp2L7x9kK5s{!g**BmQ22H^p8+{4=p10ROqz4-x;Yz?)+~2IdQ~p8)fDfw#n7Lj0cC z&jIg^{SxrL*slSfjr|tz`?22x{vq}UKokEHU?lz*z+^n)d8Q&>23Qp@_adem5Sk<& z2b>vC0?vw80?v+C1D+J00N5I@16&Yq0DT)E<00B(vm0d9^@ z1MG-T2keZ`0NfFu1$a(;4r+KEpl7o2xqxqop9FYWd>-IO;`0Hoi!T8DM0_FOC*z9& zKNUX(@C)%%0dI*fLk(YwuR#2Z0>2tR9hlnyJ#%|}72y5xHGmJq*8x5l-vIbrydCiQ z_*sDe72gc_yZBbX-^X7A_`mTEz(2%y0RAO@HlRto7O*<;I>4I5>j5Vub^}gJqyc9p zx&UV-GJtaud(nC`AXa@M3%EG34{%AM4{&)R4|qo60>HJ2B4B%B2yk2C0AOcg81S`; zivVArxES!f#HE0}i9>)FCXN7Jlz21X8xwB@ydv>-!1pKK3HYJJy8y3Cya({M#CriB zOS}*8>BRd1zm>QO@IMkC0DK|wLBRh`dRyUjcuU z_yph|6Q2V7Q{vwM|D5=Dz)12lfYIdV04tK82dqxs0$7*)65uh(TLF(teiiWe z$*%*ZlHUZJnY&P(18*qVG0aAERcz*CZs0-lz99B^gwNx)UfrvcX` zp9S2Qd>(L9^4ox0lm7|Wk^C;;&gAz2&q=-j`1<4z0MAeU5U?xxW5Ax|PXM#YmjH9g zp9AKTzXU8Ke+@X4{4LT$ zZ!!sZMY0m`s$@0bHOUEpA4>8+v|X2M0OYQr!aRhXLIZ4H1K^vyIN)2nB;eb;O2Bt` z{0*+lya|Bs_V`;`Z64|W$>VQuUEv)Ec%?TP@M>=g;58n9m+M+@8a(BjKhZFqs67vDi2WFSqgWO%F8~E3n!9+Q{$jboF zH6KRqxsd9U06&V{*PBlZyb<{G%*}~1c#HoF$~|UDG6_HN%w##v{4W8_n2!SXm}4sN z1#MGb5eJM`5OZurCE%nA{?^a&6%zm(EBJdpQ!5$(Qx*KJpA#yM1Dshg8E|&R6u{;R z{?^Zl71MAJ@IO`MfWNDX1O9JS67Y{zm4JV)ss=RG69Bzx{^m`zx&bg&&ELsMR38Ue zQ9T*3s(K1wO*MZHr?z?;b`+Cp_`5bWHF3b&nj~O-O(ozlHPwK})=U7rqq-dM_?ia5 z#v1uuoSNehPt{BYJfUU^;LIBSF3#+lY1mP8)|B&iXC}-5OiY*sSTSJ^;MxgEz&#Vn zaZ|FqmT+xt9B_SY5^y69egDmzSr{#H$A?QwuRYbOKl zs+|IOPAz|{=G@w8falegVQ2CHYQELHh&pdIE9)5Vsha`VTQ>{v4Rv$OSIwvE<^tYS zcM{-d>*nFL&#wvm3h=j?+kn5#e7SDE`I`9;)bI`S8^CXx1b(#joA~y^Nq|-L^UNKl z9`QR&ZG9PFO+9}Z=9v1c0FRa2N%iv)KOUv-G$#Omr%8eSPBRm^cbeJAz0))!_bziX z@OPOO(A;HOk$abEL+)K>5pwS~D-pljoQB-H&2r@4ZI*)mZgU25?=fcrbC21G+;&b#W*2hrHRmArKC=gy`^@>cCArU>2g>_QH*#_N zgWUT~4w(B*e|=x{elq~d`%MA4_nSfFK430H?gQqHsQCeN334AWBglOKU%i`)UEJG{ z`=EIT%06f=L+*p--N=2=T#np_@O_N=fL9~;A#)9KA2L^h{vq>W5_#AQ{H{U|;ljf($ebW34xlfv3Aoof0E95?DeuLbn%%6dI%KQ4AGi6HSvc}bouW#&W{BvV@(~hQe)90G* zZ+fih*{1l^YJxtHub8hKc2d3T6$V>+J)18HSHs*AEhd$FPeV(^w&>+ z!}QCie_;B*PJeRx_olz@gsv0rKB0QXlo?BAY@e}v#w{~mnDN^gvu9pE^TwH9ntA8U z$gHMWvu2$ld@iW>19PB zr)o)h~|+<)TRPQ3iY|30bjz;POWFD}`8%AKdoUHXxww=VtW(%Gk;b?Wy|HK%>%v@f0Z_0yg@?YF0$x@^_5Ez5Q- zd*`x$Uv|r~+m}7M?BI%#6`x!2ofVT-Zd>`;mFD!5PA{Gw9l@ar{_+oD?UWM$;R*YH zBIa7$0^;@-zRfZ4N9e2YH$dsF&{s)8YEOXgFays_JSXC$?<71Y&-w(cW%uEX=s zcs`2fU+~<3)$mC?H^R<+8W!m*usC1Ea~q!9@q7)>*YWT-&%OzG2gYzG`g|99em6X+ zd(iiLF@pQh>-*8`2hi&WakBal{GW%><44d}{;Jnw=;h<+*Ar;-NwoYF+I$+n#r6#B z-?OOuIkfgXTH~LnxkmVvuwjJ_t87?f!&)2G+wd409&5u%Hay;jjW(QW!;}qAu;EM_ z&bDE*4NtV;$u`8Vg-ZWgZP;eRC1yhvC18m;6Zfuo_r#``B29T%YR(b-X%>H)#h(Uz z8S+mvub2Ggw!W1%Ji~^oZMfEk>utEvhG!bS-D~h0c6+3rO*XyBrnlJi7MtE?)7xx% zyG?Jm=}w#OM4J8YGzX>Loff~-(!n>CcHx~${y8>%j!mCy)92dsc{Y8XO`nhcv)||2 z^d6hP$ELe&ez#5c*!&)w?zQ88gT=qW;&V2gv*~_IH(Y-C8-CJ;H`?&iHoVD(pS9u5HvEDO zzi7iR+wdzkyv>GRv*9;vc!v$|vf({8yw8RY*zh46K4SU*h~@udHvO1QKV|8jvEg$z z{FV*BXT$%p;eXrkMH~LehW}&3pW5&x^L^Ze8@#Ec>-iTp{FM!p5zTM1;dC3$j;OrP zj!@pC=0qEwETJ*25v{MyhKp>t#D+_4c$y8D+i;}~&#>WY8?LqCdK+%C;T9Wiv*C6d zcG_^K4R_h_92=f%!}AbQzR$D$-fhQsKE_AB?6F~&&F{A5GB({~)4dW#@#d9|J7>dw zgsi_m@*Amdz@`UmdeGACx8Xq>UTDKN+VBz^j@a<94c}zLx7hG)HhhN-FSFshZFsp2 z|H+0|*m=AHrmwZ>4_o>V+w^s|y^q@P zdI_WE<2L^Wi~pnzZ?xg35we|6Te_Pp{UtHUHzYRZN!&`0mRU6)J!*AMhbxAEZ%Z77pc&ZKiZ1}#UwsW^l-*3|o z+OWMs`OsdW{Mk{V{AsAteowUFaW)?#|0Ns#(uNc36n~rzC)=>8Zco)iu_cXtk-M4>;Hj_r@YFja zOB#QU_|Flp@Rl@QP)7Wc##zxjXFU?Dn|(XN&zCQ0{CfGFvlhngYFdovPSkN#{H~^N zb;G zuBLy-b5ivZ{MP1M@E+}3%zJQ?dpS<<{t5B-;kg3OO?Ym>JFH*E`>S8UyQ_~N{UV+p z;`s@lpW=B5&(HAu9M3QC{1VTv@cbIj@A3REomTaN6w-TgnbqlH=KKY~oA!?0 z`~jj&`9}im|1(r?bV(`g~z~rZ2xgvnrR{nC|b+WeO&!z*4ra z%@$B&raNdEt@_x2-ZkjxgB)8^N9KZ|On+CV+ts}8;9#b|m_^4~V?fW8Ps~Jne|P3! zrkl}C+2Ww&52m~JG4h(BjEr+rwtruy+h%XccW2DDd@)N-tjYHcqzf3ELztb}%mFvx zvE7w{_z=Z-8 z4^?KDxc2J;2e(Vrd&C1uJmG{JAr^q37p=|Z=!#ZUsh zD8;EBvbeE=8_)+6r84VRx9?cYswhG3koFcTz5{b4rt+ymc zWUzC1AVc06Nv+Q1MYUoP9~>^hP|{Wn3TjnhZxLf4W=(zwVoX`K$Thi4x&T%?l(7h` zroAfkBn+9FHNDK~wkjFb27IzbgDkdKT-A-K9EDR;HVWI`U(8U=mC{<$Rf7TA*R>1G z7HWrd?&z4U=;7K-F0&VFDnx}*6kO6UF}F4=4 zH8@zv?im`)m^Il#*HA89aN3lDqW)coCD}|7r^u^E~ZGP zn7Z9`E-;;KsNKyBGCLQV&P8~;c&DOE{7uNVtBB1|0B9YoHxxJq!ji6ZanNZ)vkE33 z_8!K55k5KR#;evglu|<@R={>xhGSPNZis>j*^n6wne{H(8ZiOm@!7S2K7;4saxGor zBgjOxbY>1>nlR)2dsh!-bKTIQmf0|Q`?E~b1vGmzgS*M#khfM8B)ppJezjyplkV=` z9Za@0Wu_n-t8p?$k*ld3humh6JTQ5VE`)Ie&eDZRe4HaHTFVzE@^OyHw~k?|07!w9fUv~K!(nXctWPDH`BH6>})QlJv0UG zokOknit{oCZ9BDPD3`N~ND78J8Khn3e2m|B9~1OhP*4tVfjfJ%MQs>qE#oJ(z^LS^ zK_9VWpd0>+pIp`5?Z>q!r>HZp>%?^V8y#~X?TZYePT>27ii7L17j#3}Y|~KrJYsT}xPH}|&aK-`b{qzd zK`Hydg)uqC$5;-qAF>~jb<7@ViX4#LWzpYn+QGQ(XK^*Q%TV8Rq9|>6C}KOH2e81X z5%LGZg@bxR1=$SFVg}RM{-RSgn!=Q8MA!0;{w(ajtTx%Dj56Pjm_6W-wiehWyCyVH zl)o0B(rEYnwC-wB0RvtxHU@{wzbFj%tPE(%OfT(7v}*=*WnL_ zi?c$kG>8IYA`^mYU%%B9na7BF&=8 zcT6`Oa`1&mf(C-j2`Q+W?8zP^8;h%OpyxEY!>!Kr>TTskO#~nT*~86hp1X~ zeRK@>cl8$X{V+h?Rys>iuc8vtZ_npdxc!8>J+DyQI!WVE(bdpCl37Qk;BuE$eN>90 zu|gVf8tdo{I8}Aj`c+ttUV#`bdE?gTZWcHhW z?gm6AcXwxc(%24*B&@Y@yPtyE(7a8V9%@f0WRpX59aM%XWcT)J%%U{kp-ZSG(dHMi zNiJEnTg81@oMUzmE`*y^US&eFX0 zFqwnU-_UTG++f-a_Gb3byW<)Q^rv`vC^3j@8TxxBVE3oh6TpM9BOHw3pWmQL};Kq64xL$K-WC{Cp1ibU(cE(PfU=;xx@WKfT8 zTQ+C=<>YTL!x;UB&FO;>D*%@8~YPXGD>?k)Tnwqg=@Avp<#S}Ut-&?mO$-cPfT7$;YSKSFhyz%g<7yaFoiC8~DyW zdOKvL!X-pp`_jdIW=|IDlAz1r%4Dx3Da2j9Fthze&ue2)$doB_7P#Wiys2N8dd+4ThNSmE<4ud^iwx39GL%H&q z!1SZvB`9_q(`MkY7JA^mqn7*uyJPH2AKaAb-#geV$Y3s{8-fcCVDbOeyYStvHGK!V z%ogZlJ>4}OP+@TVh!Mc!@FF_3Kfe!7;;JG|Z>C6%E%7z!Ty76GQf75#Z?@l(L6_Q? zXiixdehi{1afG}-D)z#T7ii4)k6`IG$+}cT(=Sp>Q** zjBE@_h(fNliTmVhgQMWdgRv!m6=Q;sN)40Aal&t>CrclE6Gq^(gL%%O?1SiZ55e{b zuY=#JnoLPUlo7x?|JS^2XD#jf&;!sh% zv^BPtS0MEpc?CKMHFir1UuD&!$U=w2EpB3Rx*B0t_8VG_U=PDXZW>=4Ch>Y0hP)RZ zjfClvVM zq_VQ)t>4Y%rFID00i9WDRaX;Foe;NY8$EDIgB)Br26RyF&Yi(=nrpbzkFgSmHv@R# z2yS%|rih1N^u2JnqdO*?^x(Q?Fbhv$xV;~?3Ibx((J`Cyc%_H0aiw7haE75fAYNU8 zW_xA;CLjJ6`01ERAK&tqZvLL3Jy0w=28j0Kz^mDzO|(%xs1l{9m$lkch%@hN*f*8k6%VIV#SIC9FY-b%t zPRv!X-9ESrt93B53L8?c2b?*j4JH_z6%UM_G3_UPSY9q;L%3IDv}gwNd-H~-nJCh! zxu7@Ozju$lk3%uprQ!k&43_x5~IWX88zzbbq20*sJ z^tYKJ_KCs;>R6a2Do@pXV2{%T>6}OtbEpzv`Q?07eH^embZm-sjm1pX7BYkM>Cren zdIYrl_#gO%A+!w8h7p53*!bfEV0O&Xyy_ir6YPK^eMZQhNV zBy2MW7n*~Mpfv~5d<6kZMQ6lEus*6P;g~(#m3RlS;1jp!vQ-Cnuwie5YcW_DUZ8{~j*vS-=J*xKn8WVDHh{iSVKok2y0P>z&l(-X zX){^Zn`MB*263ktI?qP8%!HDqYaiP_`x-BIwwMX%2Dr)xaRf_+(}OoBpinW@eK=4^ zYJRLCN$%y4A&WPsX6M zjsa`}3ab%S7cnW=rxf>^3}(9z-0mKLLF}W;hl_KJhlj}A9OlST*$ehSQ{zw=g;9}P zY;x7lu0YTM+pwT$KWR2`XoPLn?p(Gn>l7&01y{iVSrOpj9$_)Lud$wd-dG*V>TI+t zgE3@_Y8LviSCN&`4gyp*)F*C&IiN4d=&_YR@f*3o@%8Y1`v=CXRZ)IU%Vcm9p^~x+ zdzijGx#7<2U@jA=7>8b)DRvdI^0w&MOqijb>|VTO#%Ufe8_ek+9-9GO*ge!0QfRI< z?s??6acr4R92{i&(uI9vv(`XP@FMKkjGcVxa=f0wTBe6PvU|trG~^pM`Ju|zZ0evT z$z@@0gC;B^*Jjgu`*Dns?JDB@Y|qf%z4Y1xGQ~l%@GdNttYg1b@~jta;R@Vpc|{02 zx1);(B~}cov(|xR$l8n=eqs)5Ily|A4H1P`9vy z%U9-h@210pp>*Q3Dc#-P4dkNTy9fD}!19#~ckd3Y=5nr^m5X=pUVxlacJJo0XhXDb zH|`c;xO2k`U(L8|m)!1CXDw6Mn1xLW$%q}Cc8lslW8ocm2(vle5B1jV4+8HWcR;<$ z-F+|xP6p(-4-5#s#Km_m{M~I(B0%X~T}zi7&{^4_Kd@0-B8Liq8}R z!4b1Mo_xRyS%`P*g!}+s7m@3(ql(rT9T?8ZuAA70MFc^^{{ zL01H)+1x?Z*lB+-(sLGubyJu1o)janoGr@4w?^;hoU3Le`x{O1CF zS?rY-B+kyD`Gm3CV9%GIb@I-Yqt@uY%&_f~TWK6vu+kR&-`aAE?^SjfC+Qr!E2W$U zLtNjMmh|n^SKBvK>sL8O%-uVZ;g=nQ%iG|5l;`wgJJ%I-jv6gsobUX<(j=kUqjzpG zgu*IAEJw!%awKR8Oc9BMXgdP-Dj>k?EY@5E`ewN}#8x(O`oy=VOYaRC zDqSr8GK3#pJUh!X^r1bvLo(aad_`g{G+rn6JF>vH*q0SMvt9d&hA(PE`B1_G&Z?za zE^eFcksoi9N;=hRv;QGvE4*1TqQP)DG0=6YT&&`;2f7>9po0UjE=9bPVUJD6t|_d( zE??P!>pWCvU%+)akYyZfAIuM?b556l@v>r1m9n&yq=K>$tZEvE?UI`~zLgL4(1*=6 zj3QjXu`glTML#M}&y|>mO@o#c-%yYV|x`E9uFLB?(YWq6OUI(Ba4B?*`f47dqiuGr0*fEAizb z#c&!#(?iO562vLN|KrK!ajwfj;l@ZU4QiFh)`B}W*k(ml^F#80D#tN?XuwGV1SXIk z@H}KMP*%jDtz;N_j@4caGXxz9CDAEyn6L>6GTb^Y@_(^m6%6tqDQ{L|F~iczawWCP zWLyVh{fLd397+{~SD1Hjvlf_GKc)+=XqNkS594rKezFvUx8@95Bb)(2v>9NE;}59) z6%G2mqgVgpSF6cKTeQxTtz{9tGTONLZDLCN_$hz4wvMj0p%L8Bp$-DkfKG6V1uEKC zEU+9UiUliNWTr>TIu)`2zJQ} z+IJrK0bp>}gC~Xi%rv&(SUkv2;q)W}*pD(f{B6OHKy5-v9EJhQFeUX4NL^-Hkmt&$ zL9ri{8T_)5nW43_rVPG@m_i%1O;!QW`Dx0(TL=-*E$P5YV1_V&ZZwVCIxskk)Lt+y z=umU0OYi$fbcwUW`NT;Ex`CU0=>)&ZMs6$wH&VjKyv!;YqO*JvzTZ*T4 z$JiM*N1l*F2N8d@9AmdRiSPNxb?k5A*2p{m5gj^!>Eq(q3l6yjz{SR8tBcP~so#mvY1Q5X$*>B`JSO)3?R2h5?ZLCYK5T)4bc zNjWMwYGZO{7`@#DesE!Pl_;gHXN9YWnwr*{bc6UxU9bw=yoMF1o!N=xBkS*Z|Ks>y8@A;E z=TAbf)RqT4Kf2j)w8~j)`KOIvbIL5o_*#u=fAySihAyEOLj5()EWGaMHL3h?E_zS{ zwISuJ6ZN=ReTBM5-nSD?(vjkX(LT_j)9H7UO2G+)OC6>ZrZI~WJ;M+8> znL-ZB&?#e#qA}h?2X@FLQ&5%^anpVl=!X$g5ei&P6`@z}WSUv7Cb}hLGOZvzH!`nV z7Q`GADZ^9gC=owp4ydT`I676h&RD3&kuqyhTOh<-l*1-+cBdUF7aT`T^F)4fLF7@> zXr-p6&9#&j_c^>^*+(d)4eQYw7Y=LT!lP(%1hnYN9kxTY;FjU*AdLL{DAf^Tr{beT zX4x80&_U;mhIH9eXmJR&=`6B7_N5=6;iU=N3ra3is@=%4JyHg*`+!OXa3S2`6lf^{ ztdDBgEjCqys*WOC1M%)dow%*^>u5$Fxp=sITrCu1*2w68I(mmiuW{eWlo{iVu zNiS2Q8F@R!*{yg^ou+$b5_2+*S~aZ;#eOcjcJywXh{k$A$w}iHrKnI0IJB`tQf65V zlXdH!T2m)|v^^ue+rg*+(9*g6N-%h0Su5$uEKXz&i%cCpGvAHZ^(e4SrFP3&mAJJJ zWt(6%FG8KBJVj5S{B<@C5d)3n#F>M<>SlahR?ES@B{g=MF$*XNblP9F0G`z+oF7|) zBP)vVao$wr=#mT62bEA>T4Sr`qz;r(n{>4Hx#Oc^jGXeCl3ua}@=-Y&D98o)b}adP z0QusNoZ5~yb*D^j{uN4VaR(%f3za)mRYE%3Tq5i@l`0i6-iAOvRZ};1#8f`2P;}ot z2konz42bIKH<3B3Fs8j&^3Ed&)Er(3KpuOHx)xGVuwE`gdI3kPk@c%7h|J}TYD-ji zPO0IQ5*ueorHK#RAf}!KWtA$~QR6>#NF706!X8B_SBl1@gPNRbWcYveNpwxocQK2} ziQo(am*_IeU}ngj(O9kvtd0v*+G$w18|KP)E3S0Cs+<&MWiAD!uJ7>brEk^muUzKS z0FYt{=;tClg{!S{HGINVIEgt6D{(tcXx19DB8BfttA9=dK_3vW{YqKq4|ho_&>ya4 ztmm@rSl`WP0UyX7`M^rp=U4tq;iQNSpee_KW=y|j>N_7uh0f(s zoLRfsx(N_(gP?quEKfBh!Km4m+fw5HL1JXRW2mV_?6DaCGxNAK z@@r6zBgMNxm_@gBRpseaoF0%-Evhd~Kb(D4r-N&RGN5T~p9-6@roQAJyuhUOn;F3& zY0y(0Ih8HX3{B=WGM74^|FE8%(u|*MP&Kv+;W{yqbd%KJaK4--n1dKs)f}wb$cmsG zd8b?DS6zB>GgKY9tt%0q7J8X>gH876Qrl5p{pMFL@ALq4&a4jbm%cOCQwzq=5jZpN z{8O{0)PT@P?n8<3b~0}3OwXKq1;;a*T~kF6e`(Hj!Or_AqQ)XgQ2HnMn2+( zGP)~nadENJWOZYZyjtp#$)(~BFFUv4KUyu}rT5o$@YYUjn7A>+MLrYA#_23N z+mycpB7Lso6qH~N+|a@UAYaGU>aO+3|G$O1_jZbm22Hz0XzrYXq4?14p+i7}tV8Jn zjtZHbrRfRJL+Nm|+pjd3FxB5Ol-r%4(A)ZJCEm>g1;~{jExp`ojFxYAl`)$3Zx}$I z>;KqU4mOa1-y57dlJQPrxNg`_ZrxDUop-Q z@F&C+W3OdG)-yOFVz0S8sRErB$D@r`@Uy0Dl!eT_uKM7Cl$km7PR8yB#?WQgpbpi2 z%5icjyuS=vjC$eiiK;c=>kd zGtpC^@6Ofl{JHSh^tiPRyLERE`YPIe?aQ|tuAk%kD@K$VujX+1zYE`nU#^wEjcX@i zJ-rIfE#4TKlfZoGQ5X-Kg7r<)#ajcMZ>(#_+=XevedKBk=Jx0ZbY{aV)zXc1#6#YG z>>8;l=_}wrr^!B9FB!SNjZA!<)mY0wqk04~U+J)j&*zH#D^~YB?HTm|SCj6$R9lBf zX7%KRwdh4~C1;N7lwNZWK>qRV3wki-^sPAaal3e@H<&{m%-a`gJN(xjjM42QsfF<0 zwUCQ(j=bHOJ5^S^IN`ZuaO9weBhBax-6g8XlhLFew4LlLhLeFA|2BE9Rn$7LlPxnD zs#0~nwZWeYKKivY7ya(tXZ*|Oe;2!I{&_z&iCZo_cjx3q-+6m%Vtq2wU=SoUsMX*Y z4N@93YA{oSW(`_3n5@Af4VG%KT!ZNvoUFka8m!e|BZ7*F_46VV>vk#Td<0b!>lXu) z<4+VvYBVuW#zccxtI0w9P%x7XW$5)AQKnLB8MzGcYNZ*uLMlLt^#`d_OH#EZsbop& zm>`v$SU+-|)CYhz!J7yIaEbxg7a_&I&gh?1|d$%8f=vEkcnNcNEYavQ!0Avk<^U24#S!3Y-^-N}O7i$1P=5#=;Balg78WKqOV#9*mBT^1> z)G3+BMlLfGNnuv4)aTXI)c0ZBHF30og=pB;;TI9{VxAHb>%|fz;FKzoF?J)7m|)Ne zE?x|o*s@st&_q)P&MXp~LR->eqv(OoFY$?HTU2Ho>lrm;*jLEluMp%+An{w}#%OC0 zCR;>X(sY1DAJG!im@o8B=L_t>v{kf5C@aaxRPqO0k_OoS8VXz>j3h)YBn00*%y0q| zjwu$#B2|$>HhY%9JTa(f_7NPRR|y79tUm);=twJmu}H*tstO6wu4naViiA@gW~!M4 z`cWwIcPfNY@N5-w>8h7Ouu2SFaS3$6gE)I$B2nXznx*WaBGSnem4pu0uZuQQKsX<) zi&MVMhMN#pQ8qeJzn|D;6Ob`*1{BI6Emng?3U+CtmSU$-%4s4|n`lbZr^+mPc#K6Fp%5CQ&B!f_H5jnMABon%+3Ex?fmi<|G9g9vu#02@6A7E4Y~dt&oKh%s zB~WP~zLuIK+4(~NV9^JK215Ac$XEIbZlc9Radl-6a zBpHM4M~_28qDKIZNtWrn(~i)KvwAQXH&jC1$amOT!vRPv2Gce2U%+{>YA=?g)`qc*vR9r5 z`5<#|h80dGToEr8^YE+d5#$>$3J1z~wZ?-7dWQI4Qdza=OQ^l-1N% z!EKA0NTQ~;HWI~PYoTW}yP?)20y``&S;dvbnvyUve5zqu5^z``t4-xJD-{xDuOl@y zJB^dD#_KPxA34;>ocfEguIn#uFhoE*GTIPfq9#?Yi3X3!+EmOX8_I}~sj9!20ct^| z*kYn6)2JV{HrRbAF=zsnHw0Tz;LsM7t2neWx0DQVF;rZbkOd$cH!MzZ%2f>m74oGx zw^N0)hiDDKjYN`@CMj{Qdw~|$T~IcsmQuuBpreF2;&R2b)_TX7s3UXPi9{9M2LQeu7@lJ zDM)NW@t9Dr22FS@Ink7JyDv1ZibSFsZo0!lCa_Kp(ScAKB++VFFcPKRkJXR7JsN{+ z-T>#vQiCJ-2b`481?3s#(k2IWMahmD7_Ka#zR8l%Mv#?HFx*>`! ziHSxCu%Jzp=_nj96P-X%OOPTs9YBVB2kMu|J&456nMM!t5oI7-Imvqfd2!}}RuGT4 zQct+ZGl-~CCiB$H#-N#!d*MR4`>_kd;F}D>nv^3b71WudJ**K?EtHQBwR)D1JwZ zC@G>*q4*ss%F97<*pT8dxQH_kQk0jI0%%agVx&k21^wnkj1;k$P|$}?#N(u>6^dF? z#7Pm43q>vSCQ05TK}=$iWRmEVpi?Z8WRYZ2C{m=Ts31kNP&AVQD%A5TDukk$6qS{v zXcdZ9QdE+nvQj8oNl{frilsualoVB@sHzf*rKG5?CdC;-aRw=6B0_;kp30e~th}tt= zi)}N~Fs(cpQFBT8h2o%y9_~gBzMmYV=qF2RT>lt3&Oer;r-^lX0)<9wG4YQMIUqIMW`!O&O+5-78Zd`O>p~F$*bk|8oE*vh}u}< z816x}N!gc5beh|>YEerN?;L_V&mueg;)#)TxMl+P#=Acy2IB2 z!40^qD`|wHaD#0GVj@*Bjbjq^epKX$ay>}Y%H~vxfrE92X-UN;l^B%(=M0_|7ppj) zk|Er_8MNRr#wPnr)JY7wZ9Q`I0Gn-O*ZLS4lgkz}zzuYT0TCnhLt+sal@@5fbUq~} zv&WcZ(w1qa#3Yk3$$Y}kl$c~PMw5K_TNqSBq*4UM#)UxRLh_vuiH!@1#=TgLwDL2y zLJ#mTV?-T^A|f83plnXa15`@!`XtH;mcj|^-f0R_=rWuXlFEuLqt2@n`oOD`^qRI&w*^XW`p^RvmtR(W=E}~` ze`?WHX8YAYOg!|f2Rr7!v*UA5zR+6tj=y|r#^JlF*p>Nv{KHT`iJvFI{@|oYi?oT&e`GzU6`zFMpylOc(bx?Wmej}2} zIOb1c6>$txGi%~etRh*M?oy~(i|U@EGLD@LR2tX#M?p5(9+QGdM>nb;%*Vu?2ip`=WmRqsJ)_6UlkAT7tNUnvbtR#bW z4t4RL?VA#eh42R=aTBQ@svG$^#^MiDm=x6PY3D4*k`WW-H*qk(dWMQ%8+uV2hdp8h zbP~icB>bs@)8$Z!?C2$68&wc$!f-}H^xQ6l%n{lxTiIsEb`Zz|j$qv`XP_@R` zf+L*BDJ~_1)r`ydl;QWF7EH4?hl9Wh7(I+aPW)NVRD(VAj5y|o{Ru;1ks?VJL#03o zBj7S|1l)k~`j4AZsdbxH-iV+M90_WJp*7Js8mMy}_IZ(v^KOOh92<`%JRk2z$fFmb zrFVe@W`F@$#oIN-=z(yBO)rgC+7oN?$uH=*6b#ZzfM$Sc6&#<|$%XPQG;{KJYzYQc z$}SNkR&RM-%aK~+Lo_vTH$se8t4P$in5N5RV?){0wD9^MN?_3EBA6KmuO}gb@jH!9?D$mNh-?LH)ZE6huMh%Z-SOLqkI;<@x5ZWm#YO?9##Xvmbp#TQPUZ5D& z@uA6(5;D*&7fC8$Dq(4Q0q$QW42B8^qylYP9UP!ab} zi7K)1wHRJr;E0nhB10-dig<-EMYzXWO-p&MV0nNWeDL#%Z&#>FlKY;LBX<;Nrs{0=T$Aiq@VqA-r3 zVvtw}slsNC6FVT8mMuz2ZjC7ewT6x)FgbA<3y#BRp*RmRWwmjt3tJh`9>>M&92tqk zQ2vcTi1rWg7_(SB)Wix|WjUBcR@9ALj`229S#chGZ6s(VJvOAILTG4UEt5zb!xc<{ z<$Vt8W5MZ|cm)11rQdA9XB=C<4AkH(GHn8!rLm9heES0%1bMgTYS9hg!U$KXyqI+8CMVoD^{4!W5fJ{+ zwF*-9NP{QbNLjIDN;|@sH#IWdt`a8w4wjHpGu|MYXR4{BnY5#*k^$<7JofV@zsEPa zn3#49i<+&b2Hj{4%Eu~%DySZ}o_@m|F*YlHTU-y?2`D`z;Bk4pD02j;E!%xSVwBLYLGlAXUVOKaXC#-$7&it}J42R-W|ijXa$`4G;WMaE1Ubws>7T8a z>y4fi!~a5f46J~S%EBWKi(R~CA+VX)Zd1S5ltZ#tq7=j`Vb-T&A-g7~iXjlQpq*5U zBqN5COCgzxSAb-f<0=+4ZTolR4D>}cIAgRj&dgxAqpS=Sr`1IqLQ`V{H+&s6W%#j( z1U~YNA56^+lS7+8#U5Uda0>e>7}a7dX|vSL5LR)@xUCV55g2wm?>39a-`V;;XdyTs z^;LMCGA5reOkOqBD6 zfr278F${NsKM0SkMW_?Q7<10I;kgJm#`$835YsP^NNM0_m!fUTl}SvECusu1ldgj! z6gR<^aP`^b;{2m+>*D4JRwki3#9$SmZj6}*zJ!BSvh@<4 z+Kp}Hr33O$`WH#l`4z4q#brA#fuSWbgO(Drjdr_&117p|#v0scL z=tLl{on@HAGh6mQHBmStCF-XmeP9qj^w%qAGjERLoSi$2ig=9YrS#Nl5oKt*%8eE7 zz_al>0!`-(LMt9Q)Lvrureg8-}xOBo1W| zK_0f}fb~N)kk$Gj{skWY*z}7ij!^DH<4~5ohQn}R)gUvx4S}>+bzm))%|ao$b7R=) zdLtN0hM>GyBXW;ya=8*C{rOn%2yrGOA<`oJ)wn)1k?QK>pcE<3DzzF)91Bmvnz+rS z{EI!7%Qff{*?&m_4k)(~5|{m##6n2jcnOwL>l4fB98HXk7u;*iyVHy~+Cm>(Qp)2U zS=oNsDv{0Y7gBbcB{Aq@=L0~q!F@?2p!}?*78#J@P+flAP*in?xi)6HExf;#5;R%h zh@mfoQzb1`ntfutLj4?R#_}grJj4h#EBaBWYyxcM=1Vd-I<8&Wd`W#|BqBCHRF`bN zq>ycrWd~6f5+>)vNFGFzXofJAHpUu>(VebKBpOQ&V}(Kv7$v5BWGT_Tg0m%k8DZm2 zMi`$)Js@4O-6m4sZV)(CdL&4d6+d6HPo@$LH}rBT6|qru@thZhsHMmhx{S6C9RxFM z{&V%+8jyS?C7bDv$?Y!}*qhLvTT_g4 zoFfR6+}KO*N;v?Rs4OqPxEoVw*qAYLQgj(d0-0Kg`Qvykka|KL8XXO2wZwLr{*b(& z)xRkveHWRMD+8&-Nr+(N^v2ds-|X;Z7=XHPLM-#*CV7&-b+jdP*m6zbw4-(uI=Jre z+fWsb1#Qe#VvEiRPOo%xOB-YJ$V*pspp(SS*4?TMOGQ7-7b|^g0*-7$9U{sS!|AQ- zft6p^!U8>Nmx>$-I-=G4lNubhH#Oo;P0qsTU)V0Mj~`2CDBK$?Qy}cxXTT*Ln#FL9 zF7B3IaQG&oGgJ1w>=D;K^c3A26{JQ8spIP;KzBb`3q{Fq1u zrQ=$m(N`1Z$0t|^*uIm1{2P!jJYmFn6BZA%8_v|BUJtsuxc|BXi{KxdlBzIiT88tk zT1xt={ir{(3&nMg8B4`$uxCDe9ise;JHyZ&3F8f7ZnSS)28?Mx7~`hGVNqIFj1c=H z00DAr63ZkQt5#$Cg;OB-R=f&>vq1~TG!iO>F`S&@2%Q%uJW!Vl5rzrz)X>PW{@Q9nJ;s`1S7{wVp4q4i*O%xN05(PJQT%`qGF0~^Lqbsk5u#boaXC&;VbEjPhTc~$WZrCA`5V<($ zQmY$r344?|oTmSQ*fabY!V}{>qah|#NDKpW@-+7uiky3Me_S5JJ~K8~`+m11MZ@tnvG(@12oz75)_kU5q2WKziOPy_oNE=v1$B_Uur?if);!*y)9zqHFwQTwY9b`oCmNpwI!R$ z6;o&B_x0v;eJT7JVQL$GpRbVWz)uY4dj^d;CSoSEw4AH|x)!$-`}g4^r94+R3H&b- zo(?m@H_r_&yF@`Adp3UD5x+t1|CASgSuua0C`ZYl%CG1mh|=9&BH05 z?%b}$=N1cH=dM}IfB50rbMZ5sWJO2+K44k~y7!pg)A34}{c{Q9DVHh@2YfpGvR7ek zF1I<2AIR-1;%9|3nU-$+jw}ECWtK^uA+i5=K*aE!|4GJ-l(sKZ#joX$!IN$yo?T}| zO();XwtqUy79qCNbeP?M>&$k<+VO)qTaa!CT#q>ad^P&gpY@$Oomp)OU)+#fyoHBQ z1;io{ti=;St^5|odVEQPAEn`EKlnLD{+TJII+4qd))eKVG44wnLSSx+-i%6dt%L7u z@LON}P}10%E*F|sj9dRM!WTKf19PsKj?fSyclkfxX>?1!YYkz?ObZhYSJAQPCz2K)O z@uTk;t$t=#vHWNXKm5Yau#yY*z;*U_t8Gue&XV)zfxREU-;0DV+fa_5%Njxt2O*iI+!@WArBY@U+9$XB kAS3#nxmPMjKK6^?z^AOwUZu%`ow{zu)(dAAy~&uH)6K z_g=kvRrRX+kmKHLB`nKI;_vzAE$icW(!W*w`@%n4klZ@>$yV#Z>|;|u-g59`Q;#}( zU43Xnpw0?TIdAB+Q_eqMZ5%rFjG^Gd^M}@*KeX>*M-H8*PCsK#q2SKYpby{AvJP%Z zSoi&A$DyXSA6oX*Tua8X4o_Rwki_mdS%z|nRLhnPCg%*VWGI&2Ae6y@M8_&38 zBi@sH>2^_D8P6yaikv(rs0XJZig5#uoCmnX|E&T+<^*S)tB{d!wSY6{+b}8L-tls; zgkPb+D-?Kz0A{7}y&X>Mv;DXV*a!s?!z zw6dB6{(srluV0O+_z&ED(AU(6af z=DB;Gdtk+He)Za8rvEkh;4=?>_wYX*djCBwKm6y(SJb{c_uM^Boxksww;X%kKc9Z` zd%^eDPrY@x@cENBPFr;IH_jLvu>C&Ea!01w2_N%ycVyU3B>gEALeii~LTlWSWfFm$ zEtXXov5NB&77AN<^K3N@SxWQV4r@o(fMxYLBX-H3PQ{SVwg3_ILOvfW8E$wFwi)PK>2c*iMc) z^oRomY6MiRK(>*-d5-m6;F}z&kT8b$zRZ6Q3j^%9gQhpVw8C7nvoE^Od$vYP1bvy@o1LRdTWZdRC zTp(M&*|wZwax(C=mkxoaIj@&w=w5P@E!YXBPW@g$9YdRvAfwg7i!()Q$~>z!hgpO0 z3D!wigJ~JD%R7o=z#Tb>7JCo{h!&$v3iWwzK0#9V1Lnq4QQoyjIpV{J$aUuR+XHwj z*lJG{7~iW1DiQ!`^yi{Rd!AQ{71yNl;;q?!KcJ&MRENJ8z|~UQZ^6s<`_YzRFoP00 z)yXMPDJ9i7X)mR+p!0a^uuU)iekeCQZt1EBb#(w0=;-M1K?Ao2EVzZz6wc5K0Crie zq!#R1L`6{xX0?PYE_%f#EhtJ09OlQkwf$$1vdv#ifNXP7TQO~qlGv$vc&YZuOK>}Y zim>?e5w8~DC#x~OHElVu@|o>VqVdISJj%<0^aNFi{LKi(POmc*lukx0qZR`A_O}oa zHx48YVbBg6+2wVG5W1vkuG$SCg7c8cb45mTaT0wvDqZqQO-NJ{I5`p7T&eye*K+cP zM_$HD`@0hvJ_%-N_GkRP!HlKvL=P(!Q=0Xeko6Hs=f>Od%LtRQS1x&}YoCKaZS%^E z0F!xqMll}@CeW0;G^HR-3C^Log65*e0^+m}q0tF6yi|GNg;JR?vt3?-Cs2?&nn3CiNNob? z5Q4;l&3(qDKC`ljMntmy+6cE^uQwEfUV+ojaJZAHeYumhkL#w{>I)R{H0hkZ@*o!e zEyf@8jD=2Rp)Xsae=O@BggyLy0)MUeTgH0HvTi~6Z2YyLI8;fPe+$Ch_@xYGrUFr;W*n@}E@;f^2N z(5sx3wV^v2TN3IPQf14b$}qr`6Y4g4jgL2J=1-}Z-2O4Dy80SnZ9<_oXM8nO2GuVr z;5}}a zM?4v~d?ugO)@B_n{5a8SJ=a<-;ZIntU$zdUFpXQsP-7!nCRK@W+80Ar)Z8c12B&}4z9;i?>hv|eXvivbBxJ-g z^@s@2V8xh0uqWY`v@QZ}ka@4P-mM%hL{MJ^iTp)Sv6^qml%oD$&W|6Gb9&dGP+Grm zsw4%MXRQrMmaCxZS{rWd-`DiUJ9ID;G9sq0W%+< z+-ffP01&D#M;P4!ElSSJ`LHa3GrdUGgxUi!b?7tKO;$USG%C2I`B^8aRv}c$Ib`R! zYH$45qq(r0qxM0}cslLxizn+<;IJ5#=qG$HOI`cT{HM*0U=lsrn!{9U0K~_bQ>hYb}T861&{V=NXEbb7dKVS?*e|Qqss_75&a#4RkZ;AQ? zy+~Hw9}Xwvxj(!LA?XiCAVmG)NIcb1__0SJ8oHdLFx!ssq;^g253s`!-vPX+KU@}K z^CDOpscVX5E}dj#(oNCPy+`wMp|$(j5ihB4g1VFXCR4`L$u0CTP{sS^(P(O;07_dY z_sy3MpZX?7%*L)1%6GhPVyv?|S$19kWAx3O)2yEttnQhH7SbT5w)|5*G)f{Fpe^z%qhNxv*LhnG;? zFRy;leo6X&I(SrOIM8~@nXcCO^pa4=0h95xV@42zM{A$q3ymghTSGr^dDAW_|C)&{ zF@3IJwe?3ZW&lP{ghL#LI(`C(i8v%Mwt^-6&mMH^Cm{bA>CEtj7)37_jNLIB$>;^9 zggZu}K`$rM3t=p)NF&90Eo|TS0;k8J{A~Xe zBS%vH93o$64pEh1zlzHuns1>|&0y5e1qgqlK*rz{heW19b#$rZ$O8!sBHs!J5qlJa zeKIKJtqloTv^fs|!4b|3I7QgDr(#|Q0(y46JBMXB;+|cvgMMSsek`r$qtF=CD!(Xt zfnJH^m|APsj{=7nu3g87=8i!elXhSI0t$n~NxRH)VEX}L8df+7N8m&Pl~5!R7ouXj ziUm%7(WVi8|I}oiP%mggOdA7pp8RR%bIKB>+{uGHj& zl)^%&W7k&_JQ546p3p-osxPEyXb6g?hyQsH#KsE&t-qF1sUz5_v1#;RI?GgYPY_!y z{#?3b`yWQRZE1BOaH76Jxmor)teZjqA)>qgAILLaaD&Y#>hJ;&jC1DP*AQc?hp2A# zG5Y1zW_xrhRjR&)m|RB-%eRQUtv<(jDaBUb=HE~A?|10e|1O6=!@r;97{agK2ga+5 zh;|p_N0E?3bI44_Dr6wKTXmm30*$YB$6jo87kCf;5>_LdV=3UF=m{!gtGlTaFS18T z91`jhswI58l`gW~mM~j5@O@K58!h$QT zqgcn>iXygO1sWAtxKaG=6wgd8sX8GUH?Dqn+Ax14o+H_ zJy>Axi{hP-I_gmQ5Z@ind_3!;K)QYzesXCw#-!lBd8DC54CUKGl*^M)e*Z3^Je^R6 zFcOhMt+!D=E=HKmWo`%;)6R$}QE{MzbK6m}i88Kf*G zD{HayaJdlocIb%<(J}1mK50cS8|g*ejm6#Z`A{0%?TW2t8ANZ9#MiCL8LVX~RO61r zP*ztUP`iCR?2T_Gs5{Puo6tzT z4@Appx)=+%-rEsH(6R~?wLWZheBPQ*dcd}}T4y}ZONWS`+L9e<;dK(rTHaDPz=V%) z$(-JjfCbTVgeWC+-tVJE>AWO6#d#?Ul1O$B_UOKk_R-+g+h+36eCXitEy2q>h}sm3 zqTMJ&-5*9JWydF}R$wWr)(YxxKo)f<-YNqUtD~+Ww&j9n!lJOTkgGF?tQ{p7mdkHA*+zvt8gm8&gqJL})5bVKhy7Txj<2t(yapki_9lwF7?Fx16N=yOGVg^f z50k>hvTM5kZB4sBDba*_9~w|gIF*(%EcvqCk&>oBg)oy7%11V8jLb8-tur@E-=ewF z(P-POc-vxvqwWP{*Y2k!DeH(PbGqNJia=UKgL zXsM9&dBR$cKIw;bCe-zSqi(=Y(OEK%Jf5T8j5pU=`Z(Sozi*+6(o3OoElu1u_HI+D8Dt7BbFqF6)=+1m16*-OZHnNsjRFkzdQDN7cFx`WS2 zR8K}70zioJZv-yFolKVdUoqJs69C9q)B%AS>Fs65KL7ml;9VN3J1tZ}>o}z(DGpMc z2BpqiO{#lXF0-1MSxx+iR&K@fTqYEDeZg#!SVR!)+H=wCPqySiMZ~Xc88|`0MkX+4(0vH<9+!y^G?j_BqE?oPw;@0>(F1IDRVHYDxjXQP z`fWpv??;U=2Pbt=s-j|-M#^X&bbZ2tl}l@TrtgCve*pVrEt)jItd8(a@7pKTpSdH~ zave!c=;R3WDk*msB(3Z6T4$GIh{bev-pQ~igj*AFNr)AJD1VR|)8C+l6HF{bkuIy` zqW(LQ6+aVdUxnH=N>d*H$3PkO;`+G>=L|P^4I1UhMEvcbJ=@nPK=c4TrJTA6DeGNl zaOhN9!q~0oDyy3jT_P~pkVD?Sd0F01tcEnS{bx{Fa2o1JsCOVY_F?cF*}|c2DDecS zz7p!zbvl_E!?0JduJ&rsvYe}6M>;f$wJOJ=dk_2*frdT{%yE_u_^8Y zFN%8;x_@ccaG$d4xUY`!Rec%YxsSe}9DSu}d#1ip+16myORf|rYJm2<$_7&63J9+Qa!k{+CI9o z1e*9Xb(c|#V%X*=&Z2Xz|W-wozqZL1Rn!i9f&F&oeC zL3(V-RqMwQt8>q2?ViTX`6M3##;mytn7aUA7uH;9d|1#NhPoRdcCuZm@rmyfB`jLM zT^PYKyJU<{ho#;NaKjU}n?g86y?#q}H_>i4rXBB3YTD8MWbmdK?YiQ$qZhMDdCxA= z4z?U<$6yTY1kC$(opy_w!%+7U?J(ds*-{GI9PP0Q?G{I{4DA>n(C$7!dQsXP5$}C) z68R=cWz)!`ZS@KCR5vpsvfJO66$-v zD}4DrUaB_y6qag_<@?Z8v{LTr;0vC~mnw4D?;k)jVe;waN|4aB@ zy%YML@B;MRD-CH_{O>?`>m&jj`nroF`mVp!&^KY70(@7pJhTD<^tI1G2nv-IS%noq z=sjRI1=?!7Vpj1F1Mf5J2CkR&KZ=M1Pr;KMJ#K0J`02QQB)u!Rlr49vRgwPGY8`O2 z(Up#cO?7M4WL)+RaZ#8}JL3y9D$?1roo2TtS(x2 zOVZ9Fc04r2?rx4>XT|WY)jIK9gWs;ut79^~mZIV~PX9J~Vb8lcz4nOs2lLGthX+Ay zKkyq9@BvYpvF=liqzPpSysH`B9jNE~ee=@R3C(d?65#^-+8Os7a5&p-TzV$s^6dW>F1?d+`M)B! zyTT)^hfd_tsonoeJnEl}%l{SGm3iD=;n={VRK7Aj!=n^NtpP%$6Q?FxF?S1|0zJ}t zFv^G>`rUCiQ^k_?mC(23L@m0%%gRi#I;G#{t+~rhzkSjA1{>--wC7*0?*QnlCgbpQ zqp#Eu*QnK1@DOU8Fu0+G(KeK}UCUNx(6q1Bn!88Tz89@;YD0ZPz5il;`=fo6_&3Aw zFQG7hi!tyTR5yWv-)Ur^;a_&Zv@dVXTM@PI#p>&BsPB*eVtpwK(|l`hl237xDCM=A zM5;nlq01q4*ySXpmyCQT%K6F)v2xDr3oULrGDY}qE+c8kr!=y--+JMgS)-Wl10n5xrR0@IGr*<%d0 z3bg|B%JDaZ6)E9}| zF_%r@SHUv=$5`x~g?tPLbz11VP2qeAaOz*ikN=ek5REK1t|3C7l25T`Uq;~luc8p# zb{Ie7A5AYZA?MvubvpLJ66$Nn8Cx(Fe0!{c#nE~x)+Pn^i^EgcqjiTT!7Eq;6@f== zuYVnx#t0qlybPlFL=@CR{(H1u1(ob2s)dAl40+Wz@PiHBN5D&c^e8b#CG1g@N!F&? zqB&Zo7~25*rwQX_w;%cgEi%uhDz2XdbaxaAfpQ+?C9qBMUJ=jBd5{-dx5<&?$o1%( z@nnuhay3j&4a92VXe8Idh`1Mcq*9P(l=Hg?}(L zdyzc~DFfTlDcF6K-iR1;=}E5D96$sX-6etph`$tTli=b4U6VG$L|s99u;2aN_}*2@l}r z>9~2}3~D;Nl~Vz6hlKAozdS*NFfZSt7tn}O66Ea~C4HwM>AMYYPsTHTk6s|RDcW;l zxfMRWrGZcW>A(rhvi&m=xE8|SV%P>cEv9x|32y9#fZf*Oe;+`nZ@q>7eRbt=>&7tL zLLTkQIDHhI9imTh>OYb3T>mNj`u|0U02r1NlOucM{8Cckw6N3dZy<88EG5`y_(0MV zb)w-ImW4s~rx7G~|Lu6LtB+FxSFw2&k_D%swXnq*4I4_9{>@qC|A2DtLm-lBUsU3s zjGqS2Y-$*qwS@DGEu}}wKbvy3CjGPMSso*N?a~-l>R2)f9!n+%NZ+EN)*9B6gs$24 zNk~C%F5HAWTExL4?bDik1?Dkj_J0TzW9lf}L#RzS?>8BKnK2S_R&nGr1XpRBP}z&Y zM~|`&nuLFOY&j4FaaPbH0v|y$V@IDK>0;vJWLPDEbs2#YGDJ|K@uF*51ZNO%pl31m zFip)q4xtnuzCwCsOO0i*eK4^sRsJGn9X)MRG-q%)b{rR#CXQ*k<&i*C<&P210bJ+&n(>M_k13ZI`ff3 zOTqRpBC(UK}suu$^kEk!~tmm$FEg zps(vi47x%fQ_W;}kGaxPy7o-!>RzvUmLzfSV$!K~*rU`TfqQHVORFo>LKywJuXqKS4gZ`=hU;k3Bz&Fr%}4 z*F-VBPuCe*X+4tmo(=-20{n8vB?S5Xo+Kz!UrDajl+=@WV z!?hOA0R`b4nA5MBW9qEU-3h4asF41x5_Pr_K$aZ=BUqY>OHtsOX4QX+=whZ^1lw40 zi&J7~mv*!iv#4{5)ahlbd&W4OQQrUyi!NN}k{*DJPc1@CFe|_LS zGj{qA7~9TAX^>7lwY_$Qi+`LYds02EwF6@qBk3`qyq&z9i|B8R>sbtf9TsC4dvZ^O z2Dbh8AY^9|lE(782JpRB)duUf*x_mUQ|Ro@_@OWpIS=&(uN}GQBA`Cr1RbASEb2-h zX7U!tCst9QUTb9DUDNZ^WH9bLA69~p5Ku7a^B6#q>%kg_D{{DhLjL6|V zA|@VJGLXM-c>l+T@ebR{dKS+({9EvTIO2bfX9iFDNA(_#p8}pI;A!G1Z5`gH;CVHk zQ}KiahY)Z8P-?>hJYmX(@o&O=Ki=PqC)q_N|5JA7&p>k$c-HAY4FdgoAd^rhsx-DRFT2skiO&mAAmYv%tDxn$#&wYJ_n z(z(pe$BpsDtAzRuz?E^h5QzG~39Ty5vxXsbO!4B;)-bif#;N4sYBN7iSRX=8@Xw6F z1(8|*VxUt?m-5?hL^|z{UxJ9pgEPYeEknn#C3}_47sUDPwx(fG-oEZ^G zJE%LMi)!t}KK$z!JzZ&)_bso|di!?_t%QT_aC)Gz7Iz+{v(jIT-$23I`d(vCIMzP^ z?Nw+CYyz0zSmL<=rFdHJl;Ox4X^VvVZzz;ROhc92?f0PwuJbsdwp(0t5WnKv3S3fa z57~6l*L$3VwYWTm zvV275>5&!;1$4X0!e!P9;XT3^Sqn%XaQr=H-_Evv@>4pZPQD$E1wChI_b7rdL^~Qu zK(D)zjp+sBg+yDLF^OKHX#dwpwQ%R8vJ9p4L+QtDyP%e((03tB$ln4$W zVvUL503rwzF2Vss9AzRnfQVO{2o4|uI#7ym01;3m62SpP9AP3jfC!=m*TMlrP*XXA z1Bk#tArWDKC`YX%l5tid7eyRtA~*nU5FX+pfMi~%fPYxR0>1EShu_v8K;kXOBUAl- z;MkTE5DM1L#1W!%;Ogi)!50u#XCa(R7jUapr7!Cxx8^rfiOgoot^NoIUJ{lL7SglV zuUjxavWS!6&Q3|>~|>8!)Jcz&Z}*ivj2C0+Lr0|A3_0rbCQ-?T3a{=c!4)wuw)h% z=P(kvT!0UBxlBCuPeiI6_{mphz{-0bp_~&0$j>Ld()`P%I5dnr(AjS7+vBY`K2d@O z@6!%p>=0q@#+Yf%KU%I#TP;mcHvmK5!I=&^GfRz9Z>1QRG!^zS90aZqMD%M;yp9q< zUtFSsv)g!4EvS|c+;aL`C_PJsA*Vz(7F-S>g0f(ZERxX_+iRpZn3A^mz{x^t+4Oh1 zH;NdDWs6%0z#J?yr8@o3qbgYgdlERJlfZx11~P7IvYNFWto3{WIWX&{Lh3^Z%s8aYzD2HMd942WEJ1nB!i4wJ1BB3%!2`&Nyk}MnXJU0_mT%_gF zRbTGN#3U}|=a5ug@Zx|3d<>lE*V$;J=+_9h+o@i-@VSXlQG#X)j%V&Lx&-vH_|vat z{&Bf`QN#ry2vLaqj|l=ClPC;p-BIvI12=ENdgizBigmN^(Sv(kGU|K&cM(e*{(#{y z2N3Z=6TtyQe8@y_fX1nmbtZ5-mT>Z)1e`>$2~@THZ&6MDckt^!j32cEoe#z&WpRS@ ze7Y;m19oZ;#GB}=I2z-eL_2gl94_2}Rp~e)|Kva~Yg*H-#m5<27W;`UmIbkdZLS_i z4Z5O4a62G2#|6ik3753Sg>03H2&Dr-h|@x>Ou4fwGypG5qFmI5bZ`kr?>;g54II6A zV)Q#WdMToLk*5LDHcngKH0^#)!_BkKwWFX&L%EN0+RCPBU*NR8C~e`ya!+#FK26hp zhBVD3wI6b*m0(*#t$&N<*uNo1n%S6-ZyEA_>R$aYOdvZI`~~3Ot@v{hrhgQ4iYsC7SCgbpmswHB6`AzMG`SLj94NO z`%wfg=5y3CiFi#Iu|gs)FcIt3o)YuMC}x$!+(|JBg0iLTiO*y{&qv%*v3TM$@x58!eG}@RR4wa~ zu^p+=4ljhGKp??{e4KqDhYNP49wztiq0 z2WSZX8Olu_dw)f-DgPG)6vaM5#iai-~b{%Y9ct$8{9@@1>Mimbf;&G?i0so ztkyY+&7T4g+y5!m?f(+L4P!KAX);Dj^vfTk?**Su1fP-{VKLxFbYD<;e5a_On^TsZ z4bhU;e2A8`dq5hj!jZ(t5G~Q);plHrG!BT1t+5lK7h7Y*+IU-JYy1=KfJKgRiNGZ` z|JP0%pxe0Xw2X~Q)jiX}AAu;3Mwnc6F3{mZ#y<`sTuf%Gt(d*}n9;lH6vPaB$<9ue zQcSUqkL!D_<7sh8>v)HBykm5{)6={WbWkPI@sSnAQ#AGov~jZffIEaXbgSNDzl-R! z6Mn;1-HGUh{N4%Q=70o_YUJC?6_H)!cTBIX)BTH{vHsN?>Nqa$ zZlNfS_jAbM=jjJ$vE4#CtH@&E3r4VGsD=TIE)uF9;w7;acoZF@A3{ckFSAZgc=gT_ zj%<=pDR@|V0D=O*QJ8x=v{zW&2f!TFtPCgYqO)Fk#4 z4Fq)e)i`K=3ejAVUAzuDo`wQ^kAiIUJkI3c0dF9(!Hdagguwhh92|-%e?586YEn!t71A^zV31wG3dJf!RoDEN#Q^=_5r=j_3KLW_wzEva;ex|>GR57 z_ts+8OM6*=I&!EP`0={2;)1*Dy)u?uwtEh)``AGJ7AZz_CsSA6L*RShYFwb*KTNyUCtK6~<7Cg6G2V1d;Rq$Hthk~NTT*WPwO8%=jjGA-m zLaLcS^%JNbU8vo2dvy?3hxF-S2R8LQuR}n!RSJXU!R3R?1zH=RwW*7^9n+y;bS)ab z6U!=@WaKRt_0UUu-FoQlEq3a$x6kVpOTRqL9a}=`P5S$E2 z?B|smtT_a!g&5GCa!}xBcQBiuJ;6$T_6Ga&voAP>pS&HoD?$^V0w3PH{U4B7mQlb6(h z^x2Xvp9vw%-Q8fpmy!t{a8uO~QU*fGKuGllccBdVr&dAMEuRfRJ%VUq7AXwfB)I4X zM=zrM7@Pzd$AEHrgYzY+FW4dhf%&-*=GzdhVbT@)8a?oh>Es#4d4_WySSRSE`+|KI zQ@xsr4~H<%LbMQ`y19V~KK_{V8%BDDlO9;fB88iPxXF)%pknmTdWMT0*eIY3A3eiJ zC=Z74Xb2%jf9L^&j9U(JO9*+_5Y072b4>$X0rmM1R3x0moR>48a^;}HpmGLO&Vb5k z5%qFfM!lTC{6aIB*h4ok^X1?mhM6}o^9E+#z|0$%d4c&wzzj}6sV!fk&{rw+WeP1` ziqKambUTHJguX_hGbr>Q6#6QKzD}Xp%Mp4EA?ZlB;&qB#=>$g%gJVJK39n#q zEcA$m@Ct^Xg}&hM6-4GjzbFx}Ajp0r1b#ZwwE(tytp<3jRvccd0p8jpD#L5-4gSh7 zTl+N3R)P7=5N2)+seMXt)+(Y@`#>-zfx)cq zz3qdp?!N7Vx!{dDHLts0`(PosPsg=tT-ycLCqi65gA9WO!Ii#_r2DyNbcbhf^?G!r zUazjx>kCfZn=teGgG~~c61+nK0~#9-xPCyQfUBql54e6^$K^F%@(HFb-wN>>M+U7b z;38wt>M;Gg!=TmCqcucFuLjj2P5gEU>WF4RCJAAR^pL+>T?2tS zkWlFYzpm3EH@HuSa>18%C?EVthYG=;b*NSMzplZyAiGAOv}+D`4SHGzy9PUSo8*g5 zTb>NtG!uoi8X;p)H>qUQNXay*WK>F_>gh>X!BymDXoq_8FLc24g zf!S|h_8U>|7f{@d^dIQf zhR=YZ|A3*txW8@rK?v&S0HsB4&>J+!3>stx4KjlUnL%TY4H|Q7P|*8f2=mHAL-dBc zAp>*Bz#K9#hYZXiqo#)h)Q>_?e~ds)^`;t7Qw^x82GmpoYN|1OrV6NMLQv-)7PfSn zH_d>WWqdFtK%@C2i{A(TFtNn{I$kHzU$?19Z9pI^B?Ox*^~6 zey!@JPtmGw`hZq-)1l#Hw3?0)NrtQG7?EUbnm(Az42qgKGsX|Y9^r{1Qd{+?J&Z9!W+KCb?P16>h+)i->B+FP>8D|vK7VA` zA7**8Fz@AA%q&B&S%zS<48dj@g3S_8KMO&{XzzP|Nn0+y0p%M|z5(SMP`;tPZ)ooe z@SlgkXC4(YcD6U$kbbry{p@Z{&DlMgnzMT~;bt2vcD4aNTY&!}1b#n&8{=cd8!=sF z#25o3rmKvYu7bS-8KOt}y7Z#JNWUKYN2Zv-fF83)q{3f@6~g0Z!(d*lkBV0@ouFc9 zRq57JQZclu7+O{Obj_81Q**^sSQ*gbP=P3k(NTdYiAhp{D2W+c5p;ePqVt}kBXp`> z)u2-?Yj9OV-D;1`Z4OK&Qsv$bn5S^-^^J}0Jy!V)h6E&}9 zFsT{B)C^&2hA=fln3^F>EhJ3M5T*uBu$5KwXJXZB%WtTzi`GW1p5x6ibN%#>bHY~7F|D2xwt7z3>N#Pn=Ljah4Vf@{EYQ(2h`HWegU(!o&fIRz z$hke5k8^vq(9iADY?<4yg?_G?RLwOlp9^e65ax#1%mp?kE^mMeH?Ui($B}!F3pK<% zZ=Nxz<{6I6GX~W>!;yK0Bl85*@0)>|@69)zc)kHO-)M;W2Go25YQBK_?`EJDcnb`% z78pduc0N>33-^~Eu&DeXp3C#ZqVcs0U+}+!~q&w;E2IlVFdhup=19Nu+ zb9V!CcY*n*5N6D5UgRw@Fc%q^iww*~2Ie9IbCH08tDF{?m{q^nTWkbou>rN%GJ{yl`b5;zQYi2h&hEjK`y zn*nFJ0lM4(U2cFbH$ayg+ibb9&6XS6Yu_sC<)T%Z?Cc%ZX;` zDh^W?+_l07Oo6S{y`!}~VDc#9=wU^}em;a98B+vXV7?f>(q_0;>NejG{AB+0QenVP zvMJpJ=NH4HIo;sysA2AR5=7QzktM_oP#!+O3^qPNIJO_b4B6?>;}QrbOwyy0GoYCX zIgM|1z;9C5)_$@PtCzzimSoKxIACg+w*aOrTD}~Z(m>tSG;H{FYS^nz`B(6b(*Rzg z8s<0uC78k>kuLb0YM2L}8pm_ub`&oq?_!UFx2lGjJk1PoL{|fox1}H$yp-GoW}HXa z5Y{b#74gWx;_WHGBIko`fJKf6+aP2jR8j8~4Kbxbrf6?pmR{a))v(`wMl-tdwh>^n?rcH>ktuCEXqfP})i4h}Gc*X} zgf&2U%@{y=5)OoU3J!#M`5HZrmy3ZgPsq{Z1PSywX%PknQJ5GP1P=@g(tAZ{;N+_j zNuS-UaiSu-wI-OXhMP4Gj=&n`gMc}i(Ju|=6kWIA3&&y&`;F_G31p7;d%z4{l5WC` zIAhyGSk?7lf~-r&nNZQdc;Okqc-6wsI1Y#e>lvxKlw&yt>|O=qAlLN`SV?tm89rh>|Q$eMg`#MbqH zV#CXkPf@yNNEaD`vy+B-*#%AcZdf9uo-Fi@KqHpKwJ}_LbtN|hs6@=bIN?ks|8MxN z)j^wKce`P?*T8N#_-d>(7rh*EOAlzY%HXG~VSW)XU%EPIglVWPtb_xNhW(+7LFLGD zF@uVs^3GV<9JroNQ}2rN6i$1(w%=d!a;PJ)8if&FbmX?_e-55i@F$}0tL_aa9QtSb ze?w%$og{F*BA-wAPtolg@VBBnNeXn50q0a&`I)Lef>L8}{=pHK;QmYDy;p#9*2n@5 z+x|ZA^(Kc;0yT1?pFp9STOY=PiJwH6Bjh{`ws5S|;Nz0=XCbv6UnWT*gWMi5TV8_i z0DgGdCIzn--$!2hIHQXrBv=o2?PSV#sgkt_;gfEJ^C+B`k}8eZW-!|~8JO^ZNo`BV zVWt_T@1ST(%|=zj6&zfnwlw0kcL)O>Fey4q72%a(7-gJGa;%%s#?#5?N!p0hSxLsW zx=%CAt_h){C*zDv9ICXIF-xiu!fYfCVxcD3qW}@i8^wXG3i1f)(9Gn-W>%3pa)d!k zgRM~{PF#b1Q;2=%Cw#goA2+qiWm97mYx`}W&g8U#D2?PSNoO4RpY0b>pn8Pud-Pl* zz^i-Pqg1524CgEbE@iX*cKov2?ilk@atVxhBC!}Bs2zm^TC&zB{>SzxNp5riXp9mi z3$=+7aY`#8@-59kG>JJ!v%H7VEa6DTTAz3>a{v*LWr^SbA|SpJ!2v`-79@fLh=3$X z1P2fS21*165CLvU1P2fS21x`55CP^$1P6=*ClcnE1P&l#u8H6PBIcP04j=-@6$BOs z5V62SZ~zetO#}xJv73qD03vob5gb6oA``)Z2tj`dx+(d7)5jHEd|nuR0I0e|b9Q}9 z_;f^45;!D2a7!UQQ_*+e3X9}g+V;^NcSP*)03seL21(&7q$sPoJ&LNN&zX|`dn-M; z>bFxUfiq_h82Jny0I)IKF@i7cff9z0- z8|)lAGD-`tfO@qQTT74n@$l^&dyT}LNRQ}Bfw7b5oz--MMn0CJA74S*8a|*nca3+F ztkrOHEVIAdz&A7-)7g=RsaR4y(G7%hL zbxv4wePQ4@is=|!y`E}4&?IvJ5kwQt&jCabaX5klh#<;v1P2hY#zb%c5kzaw!2v`N z4@Pb>cYqoG>;?}Ov@5)*j&mXR0j4+y5OI`=-~b|yHW3^^#NHG^XJ2~&{0x%4=t?b0 zi(eh3&+BEZtS9$15I6QA003m3hnN~TfP`1+49A!R4j_Rfgd59&)qWC+*H+(wu&OK# zsdU~UVO;~faLT}oC#R8&Gok3H_`p{_=)DZbi@0FMM_+X_^$#a-KG?xN$eY6?zNw@B zK}xXIA5clP)fuAeMCgWp+>V*YTf3#-#)}0Wp2GG}OVzsF3q_pOZxT_A)F4_c(tsYQ|~L zt1mwRB=VQwZP->%QF)5sbAo(n5JoegLz6rNJCG|~HoF9auGi~&*6Mt~ru&}+t-?=BA z*$8LxXM>J8{2`A2HOM4UhXnm#)X!qe0YtD;!T9f3aLMFx4+kOTh>!*Q0%0&p)6odOrSf;)vOk=rvHShxl zxD%Ig?6K|o%_ul_7&T#(e$_khUg@$`5l{N)_}*9GWJkTkO}6XrqTGjbZu(WX;vGZE z@d%Ub%H04{t;}qzFb6Hgx1c3$T9k=&zjmsBs7U&4)O+j($C@eQLDjxx)wkZPp0_u z%?~HyUL8#UM9cZ*U@LZVOjqXNl*F9~!nV$+!|2S`6hN%@ppVn1jbW-};J`?@m&$4oN&2&@wJ+o29RPWsErOeF*oP=00786KM#)a#vJ3@d!BrK)TyDw8R&iZMRzZom3$|ygm_$$$#KL+M z0Q9*9@(-6>+D$<`z~l9)gHRA(V-*@CUq^TJN&8C(N2D7c7~auabb>XM!-?JE=g6=E z9`1E8m<`#v6@Po+559DAp);Q5-_77L{Us2wOtNzl#cjo3AKplp(LF#g}*$LrsGNnq)+5TctoATmk)NB3-sROSfnf@J%zJq*dD*T2)ysX{Grl z{~1>`=D!s05fyNoqY&x`h*k?A2Aj_!Es$1k73p{txcxQ?Vjd2@%>_<;$Z08Faf>!# zn)J&g6)CyU(CKjaQ`prq0#~DCM((c4=vT;$x&qO)yBozPD~M<6cLJEXf8##u#H{%y zu47#XTAok+37wY^iG2e#H)$ZB+R=;88dV&Tk8j$u@A)VD5CGLL%ag6oo-UTf80t~)0dFd z5<(q!-hj@y!yHNohsRDqf_xR6%nc}Aw>F3Za2TfUlWI+I&ohO#kiEmnge50o2$YL# zp0r1w#Yv}xJ^B+oN~#~Vg;CETN+(EdrLLQDp>E2Cx~ZtCJLhoW1{_{XII#Y`3^=gpIazNe)uCwBaHTbTKZM@L=jDR;g7N7{J)}iDF+G7Av5=FbBTVJjQ@BU;6K=-2 z5t5-5R64was=ZzA(lVsJ+8+G{=mk>$5)WL~h>QD@aejk7bgr9dzL9ADI!$xR4w_ST z(41hzXil*WG{0&x%~KYvbL&D)b3PG2MAGh5bNK!{h+ZV3w>q`+!}dpae_TwINY`pQ zDHufCl|M+!m1NLH@avO?J)BveSOAZUWulSG7?;I7SR4vMo4 zhB+*Kzbd4SIt*>VWRZuNBtD~_|6c9#qPJCF12PeHl%<(cd$!Y*#g+y1f~yENeFO)2!VaaUCUGuhF$Nfb`%P`>h<_3 zRAyz>8xQ~^ICpyEso<+F6IW^ai)By5@9orlx*^_pl1I|fHdX@`2GVZ&-s6S(-cF+z z$A|{kY8o(B$uYtcq##6MdXZuq^x}0yooFmtZ8U^B93o%ZVe?&cMc{${q5A^{+oU=} zCmXIGYLEU2u+b&|jE9;Hsi(0r$#<|`PWWA~@uPGgM!9Wt!y62H{85zIh#}p^T2hkk zXScS5btW*~rKJbff-X7~2D`VTLp2-hdf&LSj%LN)?V&=U%)P}limi;8Zb|ZY`mT(%t9}z|P-mfSP$$?~z#G1% zQcbIk(A~8enjiYJH)kRnmN#IYNd#+`VOqmjgGM*3VaW28*rp(*b;u!&?Zh{a|0eDH zJ7GTh5Bw@z1a4YOvV|pR3wD85zfrf9vSQ4oyl66&51ahfCQYV!$QPAF09k zS}Yl`N2Pcyb9l7kFZ*ECV>8;LSK2gHK%NwwTzGCLmSCFoDz$uPdKHUt^zWEs8ru$G z{U>mTu>(O2)^qFfh;Y2Q0mr+z zDB<`Cl!tPPa6DHyknYQGza42#u-i4EC4#s&aU2=+Vx1(r^W&QwHc@m0zUI5m;Z*<~ z(VHJ%>je9TV3Ixg@%fvN;HramdQL4Dpr)Q;3AV3W+lIgQqwdG5Cxb!eFJFeyvHyU^HV z@Fo2E@c(t|?I^yKpdn;0 zlGDqm$>RfVus>=@vW(~z5Uk=honH(PEHf~nKRMtUWFw7-S`=xx$lie&<<+-pd7y0I zJQWI++dGNP&27cwC*r#q_*Qel&A`@d70}9ONK1vC7FvtfbGgfrhH*AG-t7jt>uBvT zTGkT^MsugV_ioe`&|?{CTb9~JbM;Vt3-PgzH|bHsC)-kWdD|3aLaTh1B?KvCmfc<7bq&z>offWGUSR3!e@ZoWN{$9Y-o?Q0bYAB zxS{Xn1-Ako{@z3$Gfy*PAr=|D`W+fa$_5;%5aD=d1CC;b(O5`0Hs}~x*FX>Ky8$MxO)~mlq(}0pe1IkP^xT}E% z8?h7?$@Pc*S9BbDVsEc(W)zxgU0UeC2 zn|7K02>x~me~ZN5!>M}1-**sy@7DaKWbl_V6Mx^^$ltYb{@xPdmQ-gOLY%%+LKxg8 z>I&f2DY$hJZbt}iDYnhG5^ncs+$b5iQRZ-be;*+jnQ=7#gkG`U8OKfR<=E<7!HF&2 zVf#`Bbg__6KtqNrLviCbTznIgnRA4eFfFCti#D63)TcRYEMZwn)s}EfU!HVQqa93g zyasr`i|`&T2|3C{4q_D+u3UxyU5y+Oomh7u5Q3FUt6Q*g zPlEkQ>s$DIFK5bdYw$%_YE99p^kYYitYGZ=NCudpyzojgfHby!{|hT~*dfO&Cg1MU zxP=~q=PEefxW+tw2eQPz^6J#rAd$ZXY+HL-v)7C5YFksSbFY&y%_rug9hg6P_4_p) zs0E+{p&HWR{X~b*e%z?l4)jjax(DUa5HG$i+?I;wSv5NqSzPF3*rH*~ucEHvsDprG zX@1oyDYz2QEygv(<3KPiC8u~^1_vhE!NnHH`FIq@SELH#OY-rHzn&#w3orU*(Zi)* zVxgIfef6TRd@q*1#B;>?){?lLjsDjwEbJo|9ux0>;Eq@SfTj;6gFciwq|XN%<%I45 z9%!+wZ765@l{$|bTwQ^60=l!0cEV`usanwy&SrQEVUO5s>9r#OH!2r*cwz6}#ad`J zwf#Rp?GjF1fD(>U#9WE9UtUjN0SL6TnoF>B#UdVdRq|+l91p zlPRkb3Kg=oTDn>?SZAcOpUCQjL85OVkDLCLVuC^O))Zj|pVR;}19T zIIatzXRY@TuSW+2&q2bIw1D_PWA}5iF5s*$qzgEM(FN3^o#=w}i|YbhDkn1|K0BM0(%?8VC&`(1C`e^;4LCa|(@+XswhB>H*$jZ$r@p!d?dLd+pmCfc)p?9dc zSaYcMVy6hsNv^_9v0KZVH`1?;0)I)7&xEGM&=k53WO&02tC@mUM)4+@QODn!sE*+R z2^~Maq@cSC-xGKvcNcSkt#lWsC;Dg-?LlhaJ5T(Dcs+fywctb1TEv&WB)W|3w-bo& zJiUA)LNQyBnHAZJ(A$Qd>JkuzZK}tC%}ckbrU~1p6WdRs>dmS(K z=O1h2c{HvhEXbmDZ-iq~T}XV?qpg|2lRb?wgZH&kl_?-Sxlgcj4RsjkfDYp6Z2Zt# z6OW`%P2>v=lm9Nhj94Q_MSNMmKH|$M!WZMibPX{lve<+#*l)7#qc)2ft|hNf>B_R) zK~1N9*n%#1u3^0k^W*p~j26XcI~U*96k9plO%9-n15&C zSDiskda-npXpAN=WbJ9G7qLw56-#2A6gB*zF|CN)L?Gxiu&W&8gF#B13M*HxZB zO^bc4klEpU!braB_?M&pjXbHaJJX!{Nt2pO$5NpSQ`Tpo3*S%u3hvCVTZbF9n=9oz z67rSXOnGg-H5qfU9W)vdM|qxs=!mBi3{s$mk12%%ePcW}fyr@R6gmbWQ$YL@WMCjO z1(z3ROY@g|a7J)IZFL6wB?xet26d{}l9G~gFKqS|-QeSpRnLtULp@hkL-9$d9F2?S`x4mywGyE2X8h$5 zHvf7NcrD^?#a|!7aoY$(tq%dibYnIi>MW99lFusgeUN11Q;;9>DWYWPT*@5k+)tBi zvF2g#Ns_69P;NcS8Cl`!2NO?bh-~PEiKl~h>h(k{T4VVO+Btd1h}KvZENJY9WY?XG z`aVQ>{uC6&+^IsXxC3F#hV}%(??e!@r4dBKO>!NYSIE}?hVPhQkfP5U)c?-mJUPed zFkG$`+^b!bz5=Cdp8${I^Q95-W1V7^;iIsOri1vdWOgVLWwh3s;6?^;5yN#7Hv zzhb^4FY3o-hd=pvaw6%J@loTfY|T2VPCjfn_JR*mrS*KAY>D7Gz~)I;G>NKj0v)93 z9`cgPtN#@e%00bh6@&ufHd2*-K)1SAud_-dcb2uU)pwG$TIBIztMsJoBVm5pa_ogI zyr*Q$Ym84->JK;)Mp8IBhkxhdSDj<}Kj2s&A-VmWmRrh-y+O*0y+O(hDJC$X6hGXk z4M=`d7M8KB2LY!w*|Tt?CYqVA)>bu$n4Z=y#ikJG#WP#ul)4OOQ!J7yUd$jzgyAJa zlcMa7v>vV7s{~m{QOu_Tlcy{9{KAll~3UW#D(svNRKb*GVzj*v&#C0LDLMN@2 zo`}3~6V0lPAP*w4Wu~!Cz}IA|7h_O70ce%xpErq5+2Cg&1oLSat7if&3uqSrS|uHV z4M9L1Okj03V)Zaw8p&e55QWQm8>0xZdmQ`ZSz=5@h(-$TM{+j_!k`=R0QqgESy5I`RAx?p|uQOl<=(d;jHejGHb1CHyKj1|(U zu7w=uGwLKn!_+ziL-@%EVksJhU>ZM#WLZ!w8j@6fC#z0Drpln5_3LOjB( zyzXtZyo9niXb86sKR|hPDxjrnz9#vQ?o;;7bPR(q2o@p8{w3-(WW`eHcm?c@>g7|j zLDxH)YZG)6nGX(F$6XSc)L;9WRUy4W_9wFawY)ihF>M^ zAh>Kxaia|}Kix=7^a^R)ENj|<(l#4k3p?O0W4qe)O<4;XHg@jP9z`>f{Pl8tMFyk4 z8rE2viP!>ll#Nvym*y<-Fa&N>BCKI{f2cX5|5r}nxtP^LfgF^rQjCF9*vOW!5 zbT8i%Ux~CLF)6lpwENr98r&AaY9QGE7BUP-Bgk={QM`+Fa1olK+3hWPBmtNnbKD&7 z`V?}enfF0%tC3DDS79Jw17FhA)o2Ko-SL@XnA>$6?m;)psI%$Wv1BSnBd>#w>0y;0 z*3Lp?#$-0F=29Sw&%$KXdL#}bYIj7*^5w&*1V{O#8ZSH14yaU3ZZd?W^Y%o!Cm04M zFB{Vgd78MLM}6!EPOKzRo;sPkYZ@f+_6DSj)f%Oy6gmZFTh0dFCe z>KsJTCq9DLph8g0Llx?Bj30=)U7~o+Pe=WPqNMU`r=j}`a_5AFTzov}GOn&uy#-I4 z!1LS*NAUR5(v=b2U(a|aAZCNx@etV|C54a1tc9Y$!7O^BLf*z&V9=h#wkTmDhdN}L z;oJY@WrhwcGjzx@gD#>a4W^AVT*Aka9Ca@0FBU7ub`<^dC|EGS3yLP3VmULj7ey&V zHm@Mdqpu^9;sYPN8Ak^%kU-{o)$#IZP9A{INA}un_P@zn4^BahmzUJrC!{8W$0#)^scpA5mQ4jmBE}phytyG&C=eU1YG!L%)8-nY z4La}@kg#P7|G|XxKuAvri78@R@Oc8?7MsDgX?H)eMbS}t{dqS8{u6&@U54V5P!90a zvex4XD~kV7{Gs^!4&t!B9p~HQWt=i*e^!*mUXwgp<_{ zd}#W|cy;*N0re9EN%_yay_xc-wwpTVtdKeMu-%zp&-8HfX&J6N!L&A^0@Q#LcCzm@ z4bRU4ulgfAA5M-@9&D8Ea2_>_H~JWznPmeGhUjK+K1Xmqui;Q0hVumjhZli{Q8C$H zSf8~XM*b4ki4#>!WXW(;&!e4Stjs(n8I$RR%o)oHX6C)7UD0fw@J}I&;05TOhpAnnrxK;a!xw)7YNyFS&`Y z5wN~x*V=;=s2kl^9?!G4(JIVgEQL~^gVK#D?S2zY=0{VJ8X{w$#x`g)+9^1c&rnfIdvuo=@KHHPWPOZs#Jo?jqbqztq8e&E0? z){*CGQGmstbn@eSgFqA%zH?PvY{yRcPI6gTs%5^QLS2<_X+F2fXf$&_g_IE z)}d_wc3^;c&Aag^%`XXBY4skw^1@|EcxvCWYfxG<{6JxNKCQMPZ|!W|px=VC5qyW| z6)ZLRjO;r#NR0s^t!Am=Mw5JG^fV+>0a3!(e5O%q2(6`+m^?gcWxgiz5QO>xy_oJ5 zfo+Yu>&9S3^L;!N3k@+!(e&i_HKh_?0KjM8w?IuKN4AMJhUV25kl@Hp9&OeZ-x1ru zQZn{QZxP>Xcz%gxupPN}ewW7UP_W@H4fvs9nbhj&wmM(0=b~gwpx;iu+XudNv0Hu8 zthvGi(J%G7AE$HTy*;KU(9IO0#1Dq$=!lsleuzRccHaSte3f{cP~9jphN%LEdeuu|SlSfsr!XvH3J*{i zW;cb0C=7Fl!qX@WbBDqu3d6iIdE_odSSl1TgAy@9;(*{oz#^fB5#eKH&t29HROG!| zzSBxKatt1StCuMcUWQ-(f-2TWvZbQCEKX+#?6n|M~7RRTvOz=Vv2#u zhgZ0M-GT@3J(Gu#CmY@7SI5S>vkBjXT`Tj(>({O9B4r@s-`tkzN3`%>%0qVj1mxtp z?D`)tH0$7xqTpXlkdy&2WaKyYC^0yA4wWX6MCwXsMqP#gwqVtlQLLK8&SgnEq&*vVPVF3_@BLC+Y|I*l zs^W7&cag1Z1{Y3^0#|(nU=z%>2H*{zuMFJ4o;lyZPFjZp_OUGE_U2wR$cMkPqu}rb zqXoO+@1a!^_+~kHIUFx3^Kv>~S|!O*MKmxsj-z3)<6)J#Ps=$U+Do0kuc^ziu0mbd zph17KH~*5ZyKkuL5M zJHz$gOHjdmrL|%-!acYu!u?LP;W16m-%i5)9mM}8xIZwF&ZT^1F>Zp`6SQqjE=-p5 z6@RC4(V7Yc<8opN3r01OseX2sWMidu&^1w8u6SG27OZ?&-_ULO&C73#M(F>r_vUeO z6;D62H$+7R7sLhGMo>h+4O|en@cVwxsk`;`B!lAbegAmp^O?R?r>ah!I(4e* z)TyltBC{3rsY&WJaJ7ujjX!kn-v%zojjlLj8MHDEo&nEizcixrRCB&Qke44AI$_Rj z*5=w88yy7Z^_5t|r}SvUZ;k zTJ^BG>a}ogIu`>B_FSZ3cfAley+5!7u*0eqHSe86pqNYxYDLX^8)6`_qUOCf0Myiq z3cW+DsL1Yh$ZqH|SPEOWm(c+mOQGYv9&l8Dc+c0ta6f|o0o1p2ba31F@8v&Wv^>Y* z2f@DuVYlJihA;o9uU7C4#xmHT;9bA>ogr3+fAJqFExk`U*RR zp98)g4t@q}@zdeB6it8@u}hIsZaf|A!al#0wFGg&W;azEG-&6gDsMof%4PV$E#ey% zxoX0xUk-q%27{f`)Y1ZllQ?z$t8-rEevn_k3P~mJ*CM&(otC@kf5P z5CXF?BlOpt?ls<o=FKtUtMQfy|~&Cfl^hWJMNRpkLzNl|bv&b56E3$9mYBCfz9e$~U9l0zER5 zU=8(t%`#@;oJJAoFVwFE_g`SmT=jw#)`~6KcBq%v%{@V+-2?4GKMz}cyl2um zoLvON@vhA z-iAv>Vlyex@nlX|vi3PT%J)p<`!kd8WB*RRGOse~Cv@oX9^~6pRfCOD>@zE@4wFCY z$0i0pRrnWU}(kl18C*#Crq5;LF<)Q5DK> z6MU5c^VOvo_zHk+?{kPTgbiggy>@Kfsv`N!%1;2pWu@g@{vt@DJ%1=WkgtEW092O~ z)ehBgqld4szF}+s!211Li@G^J^q|nNDT9Y;529Gb)?@Anc08O9g*h4P9%-?I25s_> zNj~GUIj~Odv}iCA0B@i#waty{>_osHG-ywY|T=uT?bk8(hnV z{B}CW?z09~YMw0bk|U!0HzI$mJc-Oanam%Zhv+I57ko%qC{940E!Dn&qG0m>IP2go z2pcfujZZ%N*LGI37OsuxdeNEcW<7iybd7^9Ijd%SZv|F8v4*{Hxc9bDSb7a&jC}>I zE*^^4)6fHI6miOiszUXwu`f5oEX87qWv)6|} zABpVEHu-4$%KGag@H;?rfaG!kA4}Y#VP^f00|KJBbK48eP-vm|Dx90z6Y%VZg2}Nz z7tR)>{Q?`K52NbFQaWGD<;6nB4W69YnQRV3D59Zt+*`8clpP%4QO}05s$MweT4Q(!HYf zG_$aSHG2OGp*N$tNbdd`l~gN4W)(X-Qf0);1&Cp)sD1w1+I#$I36oRjOcY2N8>1#3coo=}DV*fIiG!>|2F*U z=Ih1KF1vOx?F;9*H~dohLLS}!yNE}3f=93s1n24Zhu#Nm*B(pS$09R!G`|Qe*zX9Y z7CBjTYOVHWasG#^z&MeVTnx_Z8Z}nw^EDis5yNqO5hv^68517OnS;xJ-bp96h(I~} z9mG#w0?A>Axt>pVD(^!0(7jk`akiJ=0Oi`OcS9GMhD8w@H)+i``mJsCTc?EUZC6=C zx9SoK+ak}x{EFpg$;E&VJ9Vrj(tz`BGF_$_W?ij1*U3ez^0{bHK3ezIWh&5Dh-~EX zRwe6ucwtNmoT>KUIwUPHSE;nbTF{IZ^yesOCSFi1oNGCUtf6r3+-t2~7u55ZHUIrl zIWL2L51Se921V`uGtnAYyN#_OPzFOS$keV@;j&$TE*}|#Fz1U5LC_Wb&DyM`2e&sKtZB(PHl@+WG#X8hmgvt-mN1pAt@*$@|T* zwMayir<`LT972;voMWJ_&Mw(HJQS{2cIk>`E8_B<=UCjfy!UPhL{?_B-fa+Z-0};? z!O#>Fj#9hrwohOkKsrwkd54|$>`F=&`$cq^sfb=@J?{~RO{dsIP=-c9Se=$yZc-n-OUc^P(sV9oRle)8U#{Iq)O_-XUb z!6)sVPEXc5i=R&KY|J&i^>kz3QeA8|8{jLI+(NC-#jmld4*0--ULq!Cv{Oqt68m8Zn0Y|TY| z0e3P)+ZwQwAv8^MLta|9EoAf9dA9*lP{dUQ=i{4oGq}D%#Q!{a6QwQX;w5#Xy(cTJ zbvH(3-FAz*S=QAk>yxIee@eS{mkq_q~iJPVt!)pc6ji2T^jjL1qupH)3LqG8`- zA{x$#(J(DZ18TWpiZXSoCRJ~go|-jqTtv^|Mh00Iv}ymw@Wh!aJ!gY8O>Ek-&kh@? z|5KYb=~@E1urEp4!;g|O67Wg14Wr;^C$r!6R3qNUaenOu!ntpZ&Pi}aQ_e|<4dy?y z%zaucKl|RG{OB8!vMO_^2}KUqOp3FkG9LmwKQnxMCW)tkk1<7l(iOj;jqPUT4XxCb zcUvCi$2Jz^_m`>Whc_}>#s|>m!lsVv;wL9UWqLPjcGEVNvAFhnAIqE(W3gy+KShYy&02<7N3+c4`D%X}@Eqli z%L?i^(#)Tikq$fz_}sB1>O127sgF3=YbtFN`R^>>V6n6&<9(Nm_js&TCvAtK0?ech zVp@?b}(ITFZ>58(g4|}txXQ4>++f7Uj;FmY_qtj*hRb)klN!&bHqD zMRoU$J%!rf+2f3bg|JZOvEMH)C!qdEY}uaN^COFsfiByya2re;k}EMt|1?V<+sW(r zy*IIv8<%38*lJc=x^_B}HeF70nlGo}y=bCEeKl+fbo^6IKyvqAb*0InD-b@eC5Ilt zR*r2VG6IQ*B!PKGd%oK2F+(PWHBDrCq>}w2I^K*rhgAu&C!r%{? z_8g*x9^xuTu@RS8k`VXigm9^XMcs-0CN?cvkW#!$0ckI$YrE4rfeAnZb94f0%0&%a z%U_+t=-BVk5Iu@vn&47wA++lI;7k@Cj`Z){(@YM%K|lZ)rOk%B$UUqdJ9*fV&ITlA zM@e_48*DCVvAK9PML?sEM2}7Zc*`~DhP?vZixqI_umMakxZ$D#m=opF5V^qPHptJ= zF(l{m0KX@Dj21E?zzr7HrJ6xFd5ldRb!G^QgOkmB?+35V{`1Fq(PeyQjEY$$b2JMt zCE-pk@D0Y#P>zE-!x*P^hKm5C&K^!w0+lG0O0(I4vKX(kM|En{Z&9lxR z6+5Ui8i96JXRA?%*xP05jIHJu6Ka4xP{KaE6e<3bRuf(}7+NYbiB|J}ThmCgIn{79 z14m5an!euS9o+vq1Wv)?ZY_$n6`1hk90Y7l*2);1ZHW8iU{?v=oj`qHhgGZ>!%1(k zu~a)@qL28r04;aG*yJC>^HwpfF`9$Glx5}xbF4Wl1HGWvS`^zS7uSKml*pO(Hq{5% zbek^Df%axPaC{97YZ0;15a<8NH8e-=dI@y?A5Wkyl6(+47vt3gRSxh~gyX;!x59gO z!9E%{Zp002(OJ-vb*Nd>V4cT#{`DQuFm;|gVy6qr)iFV*n5-yKd3Tmqd@hOoix$>K z^}aQX)i{Q2kNs^21<@^3e^15;l;SbDPmRNIB;LGNjpN$fgQhn6;wn^$e{dN8yIf>o zzayt1vT~IH&U9reFu)f)T%^kJ@3d(AdqqPdkLvDV>#BRS?HnB(A+F%H9;b2})+q)* zVvlSByD>MGGtRc0E{={nk1|lB=vfO)r7hT6ux^#A;XRLw5S;R+bK!({kEE>^BOH@z z+}$je_Z&{RP(7y%-GQqZ9rLYX4&kO_`um&?^i55dEGFPa{E7_kalJqz~pPr%7DF`vYjmtlSi-}yt%z}TnZXw6+j zdotFj4g*Vba`d4783b(32LY`gO9nVOnbPIe5Pb{cB9qsEt3%gfQ7rZjH^*u1H`^?K zt1bs|Z}0-p`VY{`qdTB`26rmp%@UaQYo+Yf>$%fb1Sad1RbUXG=R;|8_$SgK`e%`A z4I8^t>GFoIvfO~`eGaf6Uv(AoED-FJovYUiaG?Hq1QoLi`2yVWam_LNBbHdL=KMEl zouL=o{-;K) zje1!`{Z=q(w9YnN`8z|`%GBDwAEJ=Ih6h0N`>3#U%~^wgdoi05BQ=!~p=N zAeuxR0K7T?hywsv)HH@T0KiFX1&9NHO9Fs60C;Tx5Jymit8ICmWE7|MP}?k(ZCB7l z3l%iq!szRnNc*z6s6%TS?&6&X_EuV@Z4MbJ7nmcr@3PrTdj%nU1IM-J7c2V$S4LJL zJ21KssUCcquO5FbP-gsdh`559^6nu4htRbcE*nqb9t}ZT{s2(Nlb@AHe&r;|F{!V7 z1-J&r_Zo<&PGb#)#_dx5FQ}^CiL1uShJe#c? zgghUV`k>yx&`UR2&RARbFoHYVSO5PSdcozQ|Z9o zVYAO;jnqzy)0|+((VqxtE@sQ=ZP_@@*#>r`y+PKGvLooZ{TcOsx7@SnaDjn%ml@kcfR9=M7V4wdKN;|kNb^b zuz{7)tCh9QWg@-5ax9Xi#=e1($F3YlOqJvDE83j5FXq^|$d^$9)2HlL-Vg8q9NP;+ z@Fa?}@?aNhNvQWbJk!d#p_|^c0koQYQe!`vloVW7OH#5E_P0m$WG8HjkB4msZyaxT zTJqLGpuKq5uAjs-MvLk#LJXbH9Ec(%q8*E9jyIe@vBPz?LF>JDs=iEn^GRqo8On~~ zJM^0uitn5kLuKGjk7aKIYjKwMV04q*a)mqKm2uwyM9p^xpM!XIKpCEU$+j&yqL*ce7emo;x1rpz`&-A zb*MRPxHu)QQ<9w7uOXso;mdk0J^tAX#n(I5ltG9hV|g80>~S0`ygfv=aD;Eq ztN{}~fPd(Mp`DI>*e>`-M`|5~{{r0nV;?q&JVN3psiIIG|4VWe)S6m(SJRH&(EOT< z`xNCd7}-*9oB4nJFsTwye|>CNCe$ z;7WgMTCKY+Jygob!C>C7KdoC@A_jXocU9r_1EIROfk2spVAh%*dn11E#*z)m#aza* z{=zW`G?fcDK#%TYIs#G|QDRXu^x+UH$Vq#*LpN2!5$>hMGYgI?6+`OrKY~a)YVzi4 z3=wW(5W=3iM}Z(bO)t{4VgN8Oq;BD0!_JP$q_X?5iV6Lo;-1YTnolD^$Db z7}=OJakZ7(W4jlwc6xW;jpB>Hr}nSFG*-~t1X~AmpvMwcVcdG?UWEIv`V@*Tn+feo z31zk`9r%@wU2ok<&cYu0FcQTZ=R^Mk0Jc`e7`DnVtnbs-#$Ijhe0hqGVa7*oJdNq} zF3!r;Yk1i79K=QpDKQGL>&^=>-s@kDMA+_#b?ER7o=;A+ zMsfRuTpUR#RT6^v75Ita?UR^uG10Xq^iBLyaS0vQn2_Mh1jHjLI44Mn4mlS*(Vl~x zctlFtZC7Avamb24382@mYy{xSIp~vdsp++-3ciodIcL|{n}K-jI{c)x7tnrt9Q@Bs zxgUtjbCV8$&sIX7orF9)BD;5jK}V8o_2`kaR+JZ9T5BoW!J+ghr z+x6$*zX1R9ArC?O4chfQ!1j*85zTrB{4h0IFolJ92xq(AAFzY*AGB+Xl`W_xxni@G z4#Z(wM;8=p>+UVq##z!YHf!tJwoN;A`b^uOVcP!8MBAsN|9j0Ir7vt{8{sf2#)t5p z>B?msT|@8a+ZZcq=Wl@*?OdR=y}lP^gKZnSD$z)9UP$@>gEHPt?XPkgpx)Pz-N1N$ z!2dAd7<+JUxc^N!W#GB{2)2_j-X?lSB^$&dB8`>ACicS7w~`pd`gs@&Gt*d}o9I-m|Nfr$OkRlu%%gFei@vhH86+NDY8^?Gct$0D~LUgR|fj*trUVSwYg*2~&^@ z`?CG<%~OZ>zCqmbyU;EVcH=FY>TI5x&T>32z!=Mq_j>RN?_1;Y#5G0Se$GUT@1vF@ z^ay$qCJvI!ki_@Sl-$844`tVi{?i~`?^e=ywGREJyb;vz5Gfh_N;1jrpKVA2(a#ijCiJOi@WkEx^0ugFur~!2FzRyBbjn3c^cKzD`jiN0dIjyqonL305(STd%BX*n@vq&bt#x@L0uc93{FD&Kved2#QMz^Od^*;fadyS^4|M zk9IR+vM-_Q$H5FIIGC~NO&DIJV6fb3u7pIn#v=G%B!j;Pytw_HwpK`r)i&44kWSk= z%c{Ofx*F?xsI-+!!V-6T-$xq7t|Y27LIOzd;I*lt))>30c>A~h1Ef%Xmq)K>B#g!0 zTZGFT4{hrj50FFB=TgPW0_D=vF`VLMrrMH*Sd75KeWgK-d zHvR*weMa@%QfZHz>~}pJeN3k{hjnV`G-Q@>mvtSDr}9%EP1mrn<6XxB?W#mNQjvJ% zRl!_8BGVl2UPK?j{q(|}OF}l3QIFEND?dX7K}DO0%x_);p0z5^u0$5NB7QaERPMu1 zt;I>ncNOiK2~(aV zXJ>@t9euWUEr8y`z>tcZ+o!Rka%%gU;71V5-SXZq;J}3tZ5lVr2QH*fGwWXC@x3w} z9M#@)tTk}44#gW%wOs0=qtK-Yaj8voR;~vLYWMF4?d{}$9Le2Q7=df5H&zd9FPz+c(% zV8Rz4(dbn&VqE|d=$MqV+REAoOw#U&(jH+kwB0W@o~1k;w6}Uv-V*w@X*Hs=H`N(* z_Cc&Y5zEN4ZM_OKxF}pde6f%(Oo3_{`G2eCT zm_$KN{pp{>uy6(31BRlmU?jR2Kn|^=mRhozRz3uF#G0w-545EW zAjk#FjH)o zR0;UM^m?Jq|1_(d+QaAv(3a3v9|-|BC?Nm&AO@5I##j^rKB$0`LcoU<@Y)dYVFi3J z1bjpRcZGnP6z~TE9wi+&12DMbJ|TrNe+=~Vuen;lV%Z}slF<`bEPI4SG5{9K9$}FT zfW@*$SR?~rvFs5R$pBa^dxS+Y02a$0VUY}g#j;0OBm-cv>=71;&l&NeTeb^M$EHi$ z=EyR!V@g%N0XWuFzlje{omakyFEp6Sm+-}4O?*R@l%s=dK9!Rf7l%4id4&{HS%K7` zz?26O{221C6%qVvIt0o#I0N&vGU%Al*Db|*Iu_+5pI6|zcOgKr4ADzE6xVFyLl4-{ zr7it5acJ9~6ZC)5^`dFA+>WTwg{A0YtO*@r^_5|^n5`CS=sbjoLiN;;fK@C^pCeqt zb*K&b|A$@ivVURjEMx36QM$UNzGRF&8s&mvmUWqzx3g3aYpUR=5US*Q^|EJ?Z`xk<-#Id)qQTdAi(VfXppa^DY z@R!8nv8_!d9-H7);<07=`!vn>z<9po(^T-W9Zw}5oA*@WvDHsP-;tnC>qd9BKM9@< zn30q+bRg=ehvTGqRD-KS{mb8t%d=s9!C-#%`kuuOe)|^fs-{s72xE&zDJ&O>G(?@AWC2QXw3^z_-#g1 ztJ_LjU~7!1e1fQ4K0#ET*cQS19m^b(s1zQ|WDdh_K28?qs0hj6EfF`1YxM9qJ5TDH z!I%7`4XT&?Cx-Ab zL4ZF>gD11taSd(J8hbx#tiK=@F07^dzk?U+>1OpO*Q3uJV#8fVR&}=J`q~1}44>k? zEjP0*2%FWWtFYU0v)i&Jet*6#XPhynqa%=EJv}Oed1h3G@V4}*jNEORQR!6LoKYF4 z+p?oFJh$aWDa?bS@6cw$KO5cKZ&6Zwey5+`>*o*r*cxVQm|c-DyTUN7m!mQBcnZF> z{8mJ}*}L7UJk1z);RoF*`qP}X5Z^x3T_?0hoiJ+6z(+>+clYnpzt5asr!1@TNBEr} zaSG$=R;1;hU0$5A`@0vF{q9@Q@`NwC@opbf30_%ToJsZXgWv-ZY_?l1LWnk>G=kF- zd=`SW8e*w4<;A&-5C8;kKn$&xSPa>3xD|BlK);o4wDKpEz}~`25a*g6dkZVdz*#8@ zU%RH)-om;wA*`k#q|e^M+B6}oxFAF(xE$wi1T9n5n_q2LzKk}K^7uP^p^jfEQKg2@ z&~Yp!deravxCOHyP zISpbersGXfgqX72+=jN>l{>Vd5xX*0=hC91Qk!Bs1OwF;R;DeC%@sBj7RB-Y3Qst1 zJ`wR-HNMz^j2X459f(+pm<7jF#)NT4ros)z9m+9n9W$AS+B%MbTyRcIYD6T2U!qUh zR@u-GqMwZuE&Mln_+)YZh6Do=XQ%U2?@mb9e>P7Q6e&eSBU3m}W%*1KptJH53i1ZK zzyB(32pIi%DED^d0R~-=3^Ef>4HNl?i9+Xz2^2eM0gc9-RgguoB4e9OTo&n7dQ$!^ zY#k&pl2zHXF!~A5o1ECGt!KK`wu{<&#+y&(n4>+y;);A~7WN47>8xsR+x8v?2Q&+) z!Hhe2dP*+1QM%$0Am16$+vn1j(9OZ1f6;C_PTvLURkOlERDZt?sZM-I738Vzliq~Y z)xe#8SAqi0@n|Pt|KDAxw!^wJ4)R!++;HI_yWe&j8N>>a#MAQBXn;(#I1YN4{0IUz zHsYqeau(Zx@Svt9SEk#k1(q!@W^RS{@^?UR&y^B5qlv|}G0u3>=*o7v1oX^~+U2oq zm&%)~*Nd#eY|bjdEw21ry}t4fZF)QMLT^Xh zLj_0k>P9avF7U1yK*i^aeKKO+qD zhOlQ6V@=A!=>X}=`uhvrI41>eGMpTfc+862)F9%K+_7G7#jxysIo z?CW5O!AoIZ;1Tu(9$}w&BKEmVb!jAu-=rx1Brb}bi~){fr)2@FE+h17`(|eh-bn=E z-5iuZ-mV!!N#wV&?H-A^yY7rv?@?YcJ>^dDiQLhp{#c{jLD$uV_-IeqkEUH0p7xcl zi*PLrwj+!%*mPYYunc7hB^l^tdu!~w7>8x#H!7pb4%0D=-zY5VyXNn#{O{HB6F18* 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

!pr3 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

E5QTJmKj#*srU<-d7Ut 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⋙0kLt%{Ik5f9d3A$Z!pRsqWNHOUJLZ#c|xEEj}F05hYLZ0B=3ps$8nCFI^O6tlrbRBAAj{V9C0{` zDc6tp_TF+~&LJM`flv>QQK$#UD3;oiLT55DRG&zyPbAf60(sgscg~c|CRk@r8=N~M zTE$RrM?>0N@CWq#Ko9yrTgvSo96Ne@J3&2Bp6b@yn660P~|so%O#>AfLUkkT7+=+O42tNw{S-V&5^5}ZF|YS-M2P6P&BbH8$8QriKP z=P0GuiP>$3Qy6=oPB`{}yA0O(cw1Z#FSfbV`a49GJ{{Wa5aUmDZMRfO zI?=1$8U@$zH42VSO|jraZ*Q!4zejIx0_C|wj(UX{*B1C) zb~qdtPGW8~kE6U?q}%JbrVV;M)?NGL`>$i4jD3Bxg8Q&4ttJf%kLl6Wu4p>*2?qOI5kvAG#8ht|1Mg<+@y3YYKI?;G zVAOVkyj)~UP&VYSB`A_s_=}#BeZB~~4lx&kZpnB&^4{_M-ls*-eTaDwB6jGVyH1vQBS1L_ax)yqZ-G2`@+Xiuz5&XylQ%s9@D1?54gt!!lk;FT z{u*QvS`~}X%qrr=GpIl>t|Y-;TuDN_I2S^^I4|zOx4x^lzv()YwW65QWP6fbNcJWfPjWcP1d@|U&LX*xWD3c3BvVPIkxVB! z+>7gE7RXICvLPl{WP9=3^4V0AY%ltGHq|E^+BLk%MX-4wE_(6ID#_FQ{I6Y-+-=Xt zhkfW7bbe)c5{&-p7n0n=&ll>Nq+|}u)RuZO&KGmv6W7j%cfC$&Z&A6|z2BaH6=HCH z-JxDu>Z#JFc*Q$jTuX1kS;vM}_bDF7`kk)#DLx6#)!_@lo~JLQcirbHQ1nRG!=9s| z2IN2S;LWZzmDes5cAo@Kh*QqNEDH%sQobDWoqA8K-)D785!kDnq0fgzqzG)|W;hC8 zYIn`E-~!HB+bd*Uh71&uoVCt5Oig)x)FWnw$dHkDDOR zGg+m&ZH9HARJVQ5198eV4_+JoNPTkCb?ySxko@zWC-=hkZi-jG2*)6AQIcU7_dv`` z7uQ2fTatZ9jw87YZ0>m)lqw84q+dMPEx`N5#iQNsd2%3p&vW-;uDIv%TmsL8Uj3$9 z32)#f!+n_M;9;fqrDENKyxKH4V^Lm&aAmN;aH~tDyB}6MknDL0V+Mn)O4_R4j8V^Y z4}~+#3qhfDWt0!v?rs>WEV)z{;_0ZTqE{DDaiqFXOd!PsQcQbF+n&+}Q`+{Fwmn&f zkYxy2hElIaLVtqKt2jD`MareZ?!)2}koCPkTq@P033*F>Z-L7}J)+6}rt7K8FZGC_ zoLhq2RwJ55BwEGQHCn|Qwx?2BsyOf3Q(1Tx`biJ)rOS<8YpLQ)>_Rz2t8ZS;ft>MN zYZ#1RzMjLB9+%P@;FAJ*1eCi%&pZN0lMKh?97_wePT-FiTMD)hYO!8K}>g4ci( zAO_{{i4A%V@U+Wp2J&)|*LzOzwz$%%XOj2LE18}o?~p44dw%GhcI91&Swi7WSK#}^ za2F*Y?51n?m9;%$u4MH}cDtD|&NzZcjjgcb85n0*n;EyU zKPy>%J?G^0jm%@OmztXSj5p;c^MFoe|t~zTzO+<`oCYHn%yb7kv}< z2NZt5_S;E))*h%cn)Y!C?&I>^!~TrOpxMf1c6ESV9b#82*;S^KTy=L+xp#L`t;lpz z?QM6EtCftDllUDJC(U<`hy8)JkOs~ku7 zgAD1Uc2vrotqxju8o{G&9Pw=TRKw>to9DnE)Kd1x56*x>l2_4#*_ZA-zGXkxu7ki) zEeGvCUXed0Nr;v;9iYrlJ!4{C}}Zsvo#emXzS z>UNIFN)F{Jj(^aIIl+MQJYgoqFw{eJM=iIZlu@BqWw^z9AwsN@JoK$MtoRo*JaA|IJQop^H*Soek zsVuf4Mfbx`ipf?dt%F@9HeYi^bQ|a1Hsuf1sI9Ve;Aii%y0e|F@cH#KKX8(LTGiPQ z^`b=j4Bcew_Q@vraNL?>&!Tc!JK<)Qz57D898kEH*V*>7#I+SUeDKUYNX2jBDz>wd zTlzlcti)Q}>t`Nd^*+w|1C0APCb{+#Klw76>lpiqJHz9s{KV-PkG-fT?c;HW^GW+& zqp9V*u~SgDe~wOZ_&*V`8b@I5kNz4*)7o3ks&TZgU3b_LD+Z68ZH}2ic7q6ZXTZZ;B;;dC%17FN&+T9de z<+%9tqcXf17wx_zMl+h#F`Mn0-LH6P_VKgWgnX#71v4>^j_oyW-n~7x*0J*0XJa=5 z-;B}x`jXj)kkX&UA+9-xoHTB}3%)(R9(GQM9~6)5E{zY%cxLzd6K>A@X!q1O&CP4# z7>nVG@N5U6%eIl_%#C8MzsAbF4NB9z$K!rxmcx0=8MeHVfEh zDchtO!~>-y+kZQt8aCg@ocjLPR<&2VXntDlqM2YR`!mADvm`O&)AA*4qW05iOL}uT z_I6(RX(QB+d>RG5{ORH)!@$odJj40qb4$VL@!6G2&OuqPh5DG!ZdsD+%vrY{NUJxw zPFnr28Refny~Jibx%&AfnH-AEpw&Ohz2A@zgd=3m^Lp0^7xhjfT-4|IUDVrz*fh=< zV$%?tc4xV|^|b z%}37cZOdA4Fy}V*p~m^$X9Y{CewHuY=%Tq>i}UW#T_u}2CR;fs2Qgp6$j+hAiqjWM zw{iV>M%AAg&m7Zny^BXf*uVeG+g#3my=)uVhgV!QYTU-yTg~at{k-4#TRE%;@Jr2q z>NrOfeZC>Om1FxR$95AWs}W~yW6lR0)*cS)0o(M?_szv(2i75NHt*+I%X-@yKi``P zf3E4XY#+OQfakpHZEfJUp&UDwZDM~`LH*{~wa%A6w=GADyZVTX{hTgJ-4z9E9fUVC zzRR3v;Ocqj&2V+<@&|bSxXJ1KBEEc+^QbT0nLx8(%!pz7vv|yzwdEhnU*S*=a2$Fg zoWhS+(Y*B0L@65)!avpH8?NwmAZ4a=+_5*OGt*T(@z%!+f%?-Z2tnjZuoC6$V%mSWm1c2j>IB=4239!Jp2{_r<1S~Zk1y&k6 zfYrw9z?sI^z&XYtV68E{2lClC8`xmv0z*b6u-TXgTx|Rk*lrvEb{Ot#r(7Z2)d}{RjAr>(rCs zgKH!36_Wu4b;G3>i;5)86fgiZu1@3h9Jq4+A`G8-z9tG}m*@h!^t~}rYR~zsr z*Gs@duHhq4XWW&*Om__Ea<2n+cRvN}<^B(_uY2sNs59pNg(){mo+Z&}VU z$hWL);DD^7fPQ5a;gI!27$$fLpu&0DQE2 z-nsC(2Zf&5gF<)ppwPSbpwN5upwRpFpwN%*L7^Yt!#B<)2J~nE4rcYqtbUVyc!z!X zfPL7>KI~y1zF;5ru@B$&_>p|erVx*39FR@*d2lv`esVU2J|de!KRug5ACpa?pUtM@ z*>n=C3s^mw)upViWOX&GXR>+@t83vKT6#9+!%f-yC!nQg_c{+{ntcXvV|E;PPxfQy zxy1b(pRMfnQFgnHW3ruN@(jo1g>1@)vwKqf$M>W-PwGi=F6c>dp3KADJba70@?F5X#5bcfi*v`W0Wg7goG*I4fp$1%NEOdLY|mld5YzGZuj zqL9sFqLJxE;xA0E6z^R`_OBB^GTi{W0{ZVoZLZ%baIR(IkWDE1_hy9#>{T?=E%|%8 zNxHJTq$_#~amuubLx|ovbK;N7yZoBAk!6!jb-_4)l|e0_>;0HyGs23_HrIAoWi zHr&P|eFo?t$HXCnKq;MG#b2iA3dLWq^iM0g19W!IuvVf~Id8^^j>~zNX@1VcA*3(K zc`3eI@rhRDywysS%!!hD2JWkpd!po?D47!_^Fg4ooZA)>t;#7{L^Q$wfcdeUUd$)= zWKQn$K}k=vD#y`Al-v;|bDuINO8yene6qJfnG+>*qGV2#%r_`=qFPV(NKf{5D08C3 zC#v~mf4AZj)q09A>B(Nk(d6!n3yG3BQO+MwG9P52RXNock)G@k<#a23J}BicQOzg! zKBXs0?ucqW+doFuhaHM$94qztpes(iY}p3T>rPy=EdO|^A9R8=-;g8g)ec2>E1JTh-_{cc5VLsdK!9jNFaMROI+SJbPhPtj$Hu26Knq8k)_TG1Vf?p8G8B$cm<<}2z` zbcLc%qhsg(Q&HP#Qa@19Tt&T#E>m>9qE9QjOHteD%Dtkwih32@rKs%;WlzynW2m3c zSg`3#+22n(SDM!<+M(z=MYk)uQ_&a43*pPTrgbMMrDreeH@AujQtt-!4U7FwXj3!SFwKa!c9ysUl=@({JUb&DyBCr+5~!0&fSY%Wc^Ev z_A>o&k$WP-&-q5tIg1C79`PFn>dX0Qu?O@@#3RW1`E4&UZE4%f^oln3B(nEJ+c2gr zZ62m?w*{H*Yg?uGo0$I6_9D|O+V+C3$cbJk>Ai{$xGqW~zDc-AC?`U7I^xGAETG5?~?ow3bOLsO!2PisF(MgKt zDq5?kSJ4hdmnphV(e;XMSM+H`cPhF|QBk16S9E})*u>@ZOj0yg(ON~ligqZvPSNd( z?o@O@q4G!3T17h)U8m@FMRzJHiln;%icV6rR?!Yc*D1PP(VdElV&z`ZNs2Bjk^J>l zidIYdw4wuNDR<41PExd1(GEq|DY{+Jor>acFX!6;MJFj*tLU!9(%jZ2X~!j!u2Xco zqB|AEPs>aH6s=XXL(z4LZdY`tqBtxp-6=Xr(ON}26kVt2c13q8DlS*<6`iDLt)d-@ zu2XcoqB|88_|+F`4>+tWf#?ND@`qT3bSsi^ouxmR?OqP2>4D7sGbznAuf)5htp zbxYcz=sHEWD=LnX<^vSn-rvUZ_)bN|0I46K=p;pJ72P?|#`&}EWNEM9RGXmr#&%GW z>vt+DMk;?49Xw9j8(bi%C{pH%ZUkk2N|ir~uB(vx?TQWvO8q27J3y)2*C|T33ov5g zBl^CgA1L~vq8};xv7&p#CAojfeKogd-rT&FybJSg&Rd_iC(oWgF#o*#%KUJCTmHlO z&*gugZ!b8#V0=MIL3P0e1uF~I7Ti{FSHXP+dkgj#{8rGb@Z7=~g$oL=FMO^rqo}&5 zvFOI4TZ{f&^h}Yxcv$i1;`55jivz{Y#qGsc7vE95srX;T{U=YG9G!go{;Wv$Mb>b6VJar-+6xYl%9Y8`LCY;+4SwODpploS8;R2#)>~zJY4a3 z#YYu;D!#1vw&J&nBP)-uJh^gYWl?2m2d+Ou%*;5xxy<+N`sehZgeQM9DQ>x0U7FOL> zwY}=Ks-vny)fZQ1SwyK34WraeFH z=V?bwKW+NB=`*L#onAjZGQDm3Wz+vS{ZG@MpZ?kOFQ*@zZp=7x#^4#_XLx6f(Ki520 z^JdMinte6@srj|WIqTF}qi3Bzt7X>0S*vH=J?raPJ!j|49z1*4?6I>a%+8=Da!Q%Q?Tyan2nw zck|p&=N_DET;RGO`+`9icrR$U;13tvdBKYp+&u5)dCwgG+q}%$qiS<%XVl(O`)%#- zwGMAjugAO8dx`f-?}Oe)y)W0jQTI;Wk9EJ+W%%5_p1yv*<9q{s1-|ormA>h|Ileky zgD>oh`!4j|<$K-ti|<(f0RK>bq2KRc;BWS?@?Yb>*}uvEfd5(l%l;4jU-%FCj|yBE z_&s2+?^8ddzOMeF`n&2k*S}G}zuwj`xZ#Y3l7`t0k%pBGe`wg)@M6Qi8a`>**YI zLt3V_1Y6=Q_qM#!@^Q=FmhW1AYB@IAKRPZtDLOaW9Bq%@7kwi7Ui8~&k63Q3I93*$ z8;i%Tjr}q9SnSo<2eI9;Z(}{;ed9yoBjV%Z-gqRwB7S-N+W2kp_3?Y-_s55|SF~T< ze$JA~OT0_AEcs!{jEgV4_{)nAUi|yT{gw_}dco4Gmp;7o(9*1q0Uf7w6m{Iuac{@g zj>kG)=yacsGSU0kakt5h`%K*he)S5vUg8M+kHk%-(?mZp8n=~l#ZjUFcbg`Q z<8aUDc-%1>DCUYmq82xo>cmO78+0=61kv4}Q$$n@7Z-`s#Y)^{x}QU&JKb zWXi>QQl5Acz2|laAv@sPbGS?M67JNzjGIlb;?BY5s+q zPH*Fu)4RCk^gcrW0JoezM93ctulN$7e=mIEfbe5j35agC`J#`lUi8IHq~mNsaUyOV zjl@l(Gi+gT7H%1h#Vw>%b1l zO0mjzskqX18TLso7gyU>VW;E@vDS8#xX!j(+-$pA{LyxexWl$a+-w=IKp^F^fR6nM;R|; zpW_{oW9$?IjnBm?##iDTV;}Z1gvjYP6oX1B<10sYKy5#IFYu8Q#%2ofEaN$S#zFn= z3Aw<}8NXxx&nFau6Q(uS1supB{QSu&emIG4yJf?izX>@IOOu1I{>! zQZ4b(lPE?1$N2F{lrG743@1Ci8IK=6!GTl{&j+49+yl%XUJk4tPB9M;p9yux@C$&~ z45ygfF`WF|%%;yUNPX_$u==Y}6z)%qnb=?z;t0n6jHfbA z8vPyo35+J2ZOplBH2H8XtM45B6HNcc_%F8e`RL!kIl$^(W60*$W614qV~%wutH)0u z{$$3Q3AbVe^05hj2R<|51)wyQd}-&SV)9M$e=jDtM|(=JJ||N*h}F{0X&y2i%{YNk z+Lvy_MipEQDIwoRmr(tb{Bujll`M;q#$~WmTyhm~ddaoGdNzH#jO=_?wjG=UW#mIe z@8_VFwYt|4uRz_moa_uOC)1J*s){8>4uA&h^YPoccbXf1bHTV(FZIuoyd4X#$!zXiOp{ym^9 zuY>heQoq(y=$Q@Fx6ExI^}iTDX>j+)d?9!)(8}qvAZqeY>2(j(M};URb)nw|2+?Q3 z$blNa4y}gzAfvyDe2z6e2adn#-@txhGPT-~@sV+pA)Xl_S0j7RI#Gzc2*q%EZ_1e} zR$maIJe0MoF+y=Tybsc*bR~U|zRCJ5dyG{r6yi0EH!`kcwEDb>Ifsv-^wSzo8ABO| zhg&GN#nJ6Z*Q_X|D99+|CT&W$>2_p3NFOH0D7LbUq*|7UHI33#x{^MB5Tg*SK7SFr zdyo)6GG@lNKy8hWj7hpHX-E1jU0MB+F|>v_D@rwAx{|(GIo24uT4_yK_5&}pzBvS= zA#)DaQ$HhfzI-9|)v|6(Ur70R0pmrCH!)hvRF`AtK1loN{(QFRgrP!wyJ!&br$y8v zY>O$Z?u#i8k6uhQbJ*fxFde=4G~mR=JVrCtGRl@E>qC6;nXq%wV#jz6?>?mt|@#U&)ar_1iL%8Khcs zNPe)|k$fvhsu!%Fw$RSFnsGg&)&6xW$tyck8uA#JFv8L!OA#PxGPQNKo-@b<8wqeaosGn#2dd*y@53HFF zJbG;-@PxJG_GHE}YpJD7V6`kG*)vyOw{ENuFJ0gNY$0}DKNR@G^``=VyPnef^9?k{ zb^in5iGT2eKjIIKz^_^U^fr?ntNIX+bo*{3{sG39*v_x4?sn5PaGTSQV$$!X8=yYn zCW>L%P4`26FOQp7-b8L^+)TKDv5ir3{>|!NEu68pBy8sNdod+$GCmKooxj~eVf~#^ z#-!#};zSs&skmwJLHL80QO-fB-FhOh$88kKgLjbq7Z_!Uzk7#moDh5N$O2kNjiNu3 z%?lXgj5lnd^16|6;}-JmK2}?MY3ajrTRxp2#7A4c0$TfoVfR!2JobL_xtLM*4E4tm zr-DuAFiP1^&SK=8qVawTy@Ord#(2ki;@rfzmhr;}-=2sU88K_ddtf|+9*nnu@C$F4 zN#jLcy!e4vVDUnPAr@jzZHPspH*hiL)dpU)=m)$|90j}x?|>Mh9rJ2KTr5rit`z-& zmtcmCw@Wd{HpFFO2=D>Sv+F7RyIJm5JtFYsKO z4>%69bVE$S9Ni{zfd=N{L8$W?3o%zW@S*}?k*x{*Vj$il#M~V(w*d`tKIZQ>Q35nX z1?KREsKgB3CZ+)KS`TLOHc`bm4KsQ}R5MPuT?GCNpdn^rhHn!!Kts&3ErohE(7}>YEvF#VUgh=QTHgbGz*>sQ<{g4l54^)+PwoWA(u%?qu9xyBC~|SckBQyRZ^r zh(FmLfckF6zhGU$5ce_OZ+jU0ZCIf|{b76ps}!gMSfj9se=@#>bqdr3#(&wK0{?9w zUTC&G4fUtC9Z>IK{M_~|I9~wq>ut8@q5cwRh_7&S!iIC7FGBsh?PaKi@hZ?}yarB& z@dnhHK(saEpFoH47BI_r8`#}=7p6TJvyJz`>1BKf>}`AuejmoZ#x8JndMCeFD(H`pVZ(_Xiqcfbk8~0~rSy`@uPpaj@|{ z_(K>^GJXJmDC02WNAOPp8e+I{5b6;?L!4^-0`*9sAx<-Xh5B^HQO57!oWVHSz)57B zQYAdg$gmmWOvbT>9h|d)Xjz66>T`i8Wy1};)5rpDFnWOhy3rH(hJlwA#Qzybfd8h^ z59+so__ZbDDB#=1G2pzz_^xprIPV!Jfb%}kz!}s2P=CnykueaQkBvd#>}1?!3<2j8 z<0Rm2V;J~*7(X+HgYzll=fV88^-;{ zSn$6C8sdB79H*a9CRW z4n%*IQ4F;Wh<7gWUIJ=YMhVcFQ3iBnRKT=b#uTV=vkjP)Q3dRsF%5WU#th(wj2hs^ zjM>0PGUfvNX3hhS$n?VPsf?#(`oI|pw23n^15lsNI6AW)oH0O@X=V`Wvl!3LYy@X4 z<2jj4;GfGlJ~IOTIG|0Om)QdK1jdP(xLP76G3I5qf}hKnpScM90-zxZGuxmp0ve(? z^CGAx0}WA@fq7Tfx2I?lDAtIS;fz6rM0ppoBfZxivIP*qu7BOC!c{BKJK>Wf?=B-e#1Y*3) zydCPx7%$Jf1DsVro477>J=E7S-kG@poDD!j+>?11)SDQe%)A?%Cm3JK+ywOpnfJo< zL!f~(&|9GX8i@Lkc^~jMoa;v)Vt)wO!~QVvDElM8LH5Uh!|aa(Pq9A%9A|$DINts= z@I3nt;6(egz)AM!fw}e;p?LR;r1462? z{|H=UKM2lZAmkbQFHm0yggj&a73y}NA(q&G2VQKq88)#LXowDb2Gq-dkZ|mFs4oRV z!m&G{z8r`Wx4WUf#-0WB)r_~;dq91sy(jn^fM|F2-caAgc(?rsaQ+0eiTmySpuUgs z0sB!3xaE36R%u{Vzk2x^%%xnhYy@dKuC0s0MvPm1&(@f3W1R296_MR(FmOD zXad$cB0#UB1z6{Z0h=AIz!t|MVARnDj5#g>#vMz5t&XL@g^p#wMUEA~C5}tr|HX_Q zj?2JV%DBw23hL#KD`C0<2)`h^^PsT zJ014{H#i;uZge~Zyvy-0Li`iZ5O+Hs0p9C)47l0xIB<*O3E*EGPXX_9JPo|xu><&k z<5}Q?j^}|7IbH;Ab-WCG*zqdxua4J%k2v0d&yOz5@R4_!=mj-@v}zxgTnm z^LyY(=MO-S^GDz`=Rx3f=P$sS&R>Bw&fkHvoVE-@%ywn~=Q-^eHc{tvLVcCf4P5Qa z0$$_n0bK9w3B23c8~9h}5x~DW`vL#uJPP=s^BCYR=W)Q#ohJalaP|j&?HmZ)?;HgD z&N&4B|KdCe>Yo`8IfsGsD-daM4u|@8AkyMG6>1w0vVrR~s52Ptt~0>NWbEM@4SqHd zEzWf&)V&z{xW@{Oerx!0TN>;JvO!;AU47Ot%104_y(c?_+$x z)dJ4_j1RhE;6DUJ4Rp0ay_NAX*CKEpW&FFV4g4Lhi-6C#mVp1fYbn$(05QjOEra?c zpdns%t$_L!#(%gj0q0f5*Ibu@|GH}x@D10M;D6y-4czOx2AnTlYk^<6t^;Sk>jvO= zt{Z{hyKV*^aNP?0!F4$!T&SkX7@MXZvmptxc5VS9}u<0{XNtV zFh1n|0h|Yc_ zO+1SS&Cr`MKIgWB^E~5=ZYTIJFuv?|gZ~N;^~#+E^*?}yc+K4d>eqpo=em1B{ZGb! zxqE~27USFQBfx(LXoz>+{h)r2@dNi!;JnZHq5Bx{KVsbJJ`VhkfshK^CqTW6@l$ty za6V)F!aWfD&l&f+2Z8@35c4DV5UBS74e@XHNl<^oxZgbtoNpPwcMpg9fcsS7&+gM; z=NBOAv-=FFe+8m{bB_l8?miPJx{U>%-R&Hhjs-%R?KTehZnp{GyaPlkx=n=oJ;qPF z<$|+^@tbb>;C~B5`|4H*^>;wDuWrRqA7K1XHxD>JF#g!B1nQrvY0RslPQ7`tUn z0msdll~o0PcOd57S<`?gWX%BPWYqxsXUzr<$eIfrm^BZ0VwM*;D9Z;NoD~2L$*Knq z%?bif&T0e>%W49ik`)0C&uRfyWyOHiS*^fnS&M*kvf483;%KbkZ4s0DxPfE(IDw=3 z*ntIovVcW>=#AF}eR|?8-`=p>A8T!AVg0NSt6|f`T%3Dp!YbbqtkzvEZWZ@nMQ$6` z&i;Y(Dm%qq@txRz!iBlZbFa(YllyhYiFy zHMc5I)l~I<)$XdVst#0TS06oXz_gR6Jvy!b^pmGQHT|RMqh~bE98xo)W>QT_&5WA% znkQ@8XZ>;3e`ftQ%Q1WV>=$N#KKqzC1Lx$=DVb9>r)f^>oF#LvnRDZu{8(F1IdPcSqfhy3gvy_^$Fj;`_ws_K)#b`7ie0;os(e%by$Y1nL5f zfm!uq8>$-W8!l>C-SAMulMSZ_OM^ARg~4}%pDozG;Lw8ZjmI|*ZVWeG-Pk*HeCX`Z zme4z)U7@|9??Ty4txZdsE^WH8>6Gxe@J-=O;enAgk((mxBQG@XY~I&=Zp)IEOIxmP z`9sT&mh9+J(b3W3=#=QJ=(6aw(c7ZWMqi2kGx}xhi1uUK2ezNxKC!*H{et%S?UD9H z?H%oNm%O^G>{~MVV*AqUrROc3xpdjm%a?w$^oOOBI-cryuj7-B>Sezy-+3uy z+|0}ldQF`EUch>f5Km6R!Cu87E}a8y#GN&ITO3JQ@~^B|FEmKZAj#XRYoWQT2= zk0h0qXA`^A?AgS4?5?ERyZn!-ynp)#)6vu<|Nia2@S{|oO}L*S9{o`aH{!H!0~Dlw z4C?M!3Ga;)Wuve@JqF*I_|C#N7T+A4Bb$rw0(|rEEfXDLjkrc^6dSPW{47p;y@%6Y z@8Pu9d*UN}ALIK0?*4=CM|?lwJBaURe81p3gzr~;zv25GpTJcS8$JVH2EI&uc6<(e zPJAwWZhYPFW#Q|NuLr(td_D2?!q*#LAACpP>x-`+z9aD+h1KSx@g0NjSbWFfJ09N& z_;T>|$2S1qKzt|S8-#B#z9IOA;yVf7$@qrhI|bixd?WCkif<&o)9{^+?+kpS@Qubd z2H%i_FP&g4EM3{BrEF!N{#9qW zmQO#|b<^|*osZ$`HRCMT3VfqyUfgSGNk^}xHD|e&*5qYn)#hdOuJvdC#p};rSnALI z60~QXKf4m&Qhb~7?Z?-@%Ab9!&!7DqzWw<6`u*7x@m+v#^vpGV)(6(~xf|aWd=KG! z4Bu1u-oW=Zz7O&3##fiWrVqvcd#Dcv#u?SYHGM8y(CF9{Il6D&61&I|4t!30E_`l$ z-SB1M>yEDnzTS8tq7Tk*_QQ81zN7FRjqe!n2jk@B5UkUq$j6sO{H>wDd16YdHyXci zq(2lAo~l5+_6*I*kAy-2UpyEIi^<+tgEaG0MWXS5UuvqOfk2WGTVH3UMT zBCjtViMA!Yiv|#auOUF;MoWXScpw~zDr1pmP}SPpjIgwG)4r#=AsX=d5lYxw7YYbV zh+=vm9trph7yAOu9B+?yRpt$Q>k(Lr-qX~KR8I{wMdIX_%nCCmI_Rn(SxYr62!y)#k!We8o`R$7&_RmA#Q|SyJQ%JAGo~Yy;_K8vEYceF1!5{Vnby>> z6*rNYRl)kO7ny3txH*`}P;JPGEvPFC#JzrR+^g*pdt|OZf>>3dyaFThBTY>xb5B8C zWi+xd=!dr!C2ZzL!m+qF9M_Q?nd*hGcsDH`43VCxr#c#>jHwJnV_g2e0J1Sq?~Mlp z=W+l+HV2~dU?A4DRb4akk>s%78})>d?+d-5u3ZR3IV|gPZrEQP^@d}poT%B8BOyv( zel!w3jOzk#Fw|BZYzq7jAyviwNm+z8)#Pn%K*kDBHC3|8XkdPDaqc27I0bnLQ=Ji> za4;V9hJqJ*DT2At`j{vRMgxd7XWi6*FB0`r>E!xQPht_&vVv%EVIZnKNR+&#A%u}X zK|iu#ez3kZ%3fPcb=gy6;!0r2;!vH}*QoWL>bB-UX~gTF90;MDM0up58E!O}vNF_) zh8@-QyDS)+kJwN4hW%7ODfWn};`-qY1dpRF*`POC!FORZ~h$U3sLc)z_f42}c!CuP9B%c7Of5AFQ^SqG)S=-7{oXcHUls|+8$t>Fj6k5#qV<${vF76jesT!&cD#H6yn! z7Do+?YrQoq6fY*s!b|CSgwFUBKKJn+OLu1N+N5Duotfy$KsrmR*Q(a5Xi5umP?Ccj zva=vC--~vg!nGvQA`56qp#VLFFK&*gnoXl<0Y)thB&JG+39TAcQBhG8fyLaBr1De> zbOT2(gaJQbhLh+pWhgPoG&GW%7N!Q8Be5V0Gw5j$XsU<REGt#nfUpZ7B0(6D zLu{umXEt$tq*6iau3JD=HxT8a8%3b%e;VK8Vd2Ra@c4^K{^h=BawHZHqu1)pjB3BG zMzRrF7)o4fqZ%tSOk16rTLybPnCo$3M%3Gk-VX9zvsZ=-8;U8oBY_a9a*@UqbAU1J zn6;#EG0EmUpra`vaDeW{rWS3GIiG*}F#1jH$%!ouA z15qU(t1c^9VyS9_c+#Zvt+N1T1)`Cv;DrH8I4V7IzmYZj-yW3Jr_(yQZ17` zD}1CB!nipaXqIgUJRjy05dUH%BzA2=@>x8v03DS#d0=E`;6u3aLXu`JT5Gh8Rmg|V z<^a+xA=R@!7Q|FXkH5@8F3@y@)f5B|GOSBP-_L^*`q}>}0m?@K-(qI2P}FrJ5YtHz zPZ7XXzeYVu*PReeV${6L>@f3MgFJ!JzAHT{NveR5Vk6C5RdMBkrDl*Yf#x2?T!WSZ z5dBt~^s``*<|*uIUY8!G$r;*(PE4AG!*~@Bn682`ZzvR5gk18qMx&@ArWlYLN3qnk zqC-RPi(V_*+RU=q`KWDLfSQJB7eo^3_U5}0vQE#F6klho%pL7Tm*p%w zZJL1#f{OXbFjiGHd&AtNO~sm0B0*#+$w&`@I$RY}qD3hN6{1omjez8#W!zL&Wam1K z*P*H-X4T>S4)AiC3Jnr&9BCe@ zB^vIqXn{})IBd0=a?3;WCT>j>ag|3h;!4M}K1z|O=FS7_73M&R!3~};yV4tsLTfR! z<_h=$3|xtY5%h1oG9ePB&fakEJ(5-)A^lqHd&2W0N=(L>go5YFTMgluIsYBeE^##WZ%qX9h4H9YMjJ&J&oW657jdKq?s0unOarX zih>Z%AeH!a{jBu1#u7RV>{cyFBuy4mt%u*aesnl;B1I!EE0trIYJVtp$`9gdwQi|V zUgb>8kUU{Dm$1LC4Xesn%G0eMOj<3rFqAl+%poz5gmleSf<%5OfJHJt#ywh)9H}M+ z!UKf};iCc|HGRlR0SR2R#DvbesGyZ6y>6z&wv_5k^%e4a6jfzmkd|FNvFVWzDm!HQ zn2PJvKuc=?LZct^Mpo%Lg~$ugWQF{ooD`K_43P^-ZZ3ypJD*!2iTE+LM{^-%fE?9R zqL}Ggx>2Q_ZmjJo3sVD-fJ!5gX0_(c<)v8x3@ezhhU>L>%UM;J#!cs-a#$jVtVTzI zcAd;tODH^z=IN)7tu{c5viPF7F;Uz(n`Yxl-lSMebx5&E$)-+NIxf=p6#Lo`5$)WB z!|ckaQ!gpfDGoaGgkowo51nr+C)4@xGmRNb^!SN!q^ddKlQU1hsEA^M0hz+=WJP@_ zQs*U^Mh6&Eth5Lx9HA>#g`e))EKzBc>WgV?wnR&~XtQRLXrYd)rpeJ2*5gm+>;9UW zd~#pIoS4}pNjsf(7a*$gP(Tc%oF~HhA+%8TI5D^Dj7PISEM%kiVaxeaoD4y_vh3hs zFhS>LN+D8=g{t~pI8{v+{TVd8SgQJXkKS0ZGUeopoFzsc(xKb8c&W;n z4A?WJPtstnNdu8-2Z|VZgV9J^PttK4kx^6T953xgMFOtbBes}}ol5BksfxK%VMkP* zbY}sn!rJ^|74yj}Shj{@I#5jQ2v*g4W5R*OEeaQXJQ}i|V_~s}1^`nFSDmS4aHg0j z@*4uQi9r&(@_`d+DaBZFd7$a*k(HZ{sk1bj((Dd$64IFHax_yFa=L+;jR~U#i8VJU%j%;7vqs1nw5c1@o2^sP#v@GvyNN^^ zu$5RH!S3EdOg)S9m9+{zA4c=WifFh#AZTnxMv!YnK3FNGO+VSC)J3qpBiE=y zZNd*h3Mbx4t#|0^wmlq8C z(WaOnX62FMd^H7biS5Rm5Etm zs@3x3JH>O#AHfEeBqo@q7dju=hy@IbeZh3@&e{) zEJbxo1Y$G1vD8d4ox&`|Wm>9YayljbO*hpX)I6S8XuWxeCYBhsyS9^~&2#(xd#aK5PMz)IKNB#*IOGa? zkJ{$&V%AJ^Xz6m~NEtPtRU?M(+)TgBmPD%-y0cI1*|jCz4QpTEL>pmt-+9j%6MmB0 zX;Fa&c6db+nCru zm;HNz7Zdp~BCoavrPneh5J&3h;04WlW?&4CED}xL#d*YHIg^JhT9&7jLd?)jqYFMA z%9!EBf;|oSoDMm*#W3xnomJ*rgkmz4kz~u{%A!q}ay}$XSxcsfmE1{HB8Jo`leD~& z4pQ00fjIUUuz=+8LqH7952B`_<(joz?J<+5DLg6Yly#Zo6sfLFlRPx{ZOM%pjL9Xt zGGokQOXP;hB3oQ^meM3^sXVe*W-VnIQA@Ft4Q`X26g^q)%Iq-ilBz}*?oB(EDq^V* zQptsH7CaQG1!`uWZWCRXfoavu>6Bbf&AOy)>mn7hH%resGj(dJC4<6DLr9fs{z_LF z4Mw6k_Qd^?siDkI(s*KdI0jgcQ&$k6&yQf)vpOR8jIp__d`Pm>5}O)}VsaM?*3*$R zJ!?YKl+!0a3DMM9Q6-ud_lah?fQ_9ATJTWECp0T`I*M-8^p2SqC z2*+~BP{opx2IogX*B*9ZRE;47XFMq_I5mxPjdJ`` z6(BJQu8b2xPRJL`IFEL6FcK>nc+!yCg z7)x=1rn*oYYcQc#M<967&L@uy$enncRcXTNirl4d*17^dbgGvVu$86Hs;jdOm@s3* zC&jup>x$2DG2M7#detu79odv8c`@Lroi&bb9Y(i2nJCnON*&#VeGhF|$`mEGmawA1 zha}YgB>RM|(}oD9dPqjHX#w`N7ACxoNsFlcnAYO(2|4D3SQ+RnFkDjg&b8({HH{<& zHvmg1$&MgVYGjVZSZiUCl@yk=#VO*XNGl0FhoW=Av|;88b1Z&XbH(D7m7Q+8i(E=~ z--X4bI3|jZMGG^g7CzZGH(AXzC3DCQtv#p;LUFNZlR{MWo2;0jDPAY`%nI6xebX$- zT_=@0$!!II!s;-WKsV4X6t*0*F<7gfmg#Zpa@D}<%=P0Om3Q}j9yvA(W)k4{R+S`eIeDOOUF8J4?$&x+Scw=r*cl()}4pxz+}KPY>s%%6e=4DJ=KLosVVt`DpaRT zI(vc@Jg?>UhjLFezCvMUtl-QANY;6|dNIWr}_M4$i z#eOkej<8(9L2XUa@rlp?uRS7eeEWuikMS_T_eUU!s$}{5M{WU1El!#E zqCt6kOmb9;Epb*HYrL&8nev!+0)mlNp0~63n&h1|mz001tKod3r4WlF+&i%7${^K6 z`K+)$WG1~f1@YWa(2Iiw00$Q?Cz` zUj;#Gdrc5x>GT$A4lV-nK~yYnD#xn7#zAIv-KlGHnX_G+(=E2HO*uDY&L_fDk%*~! zhk=01aMo6Kc2YYkSvy*3QSq#nl~!A(-6X5A)@$>EfX`~IwAwTeXW^~JT0aU$;AmQu zNQZ9FYQMP?1DWle7|0&B69bfGdg-Jw^_{hPjMmnwMnk$)Pv$(4r4~&$<)Y}3$Wj`U zY+7zXk{ye7yv5V=8s}kgiaLb)qF^B87vobsOSh5mD$UH|v)qukMm6D%cB$1oi3A_Z zty6)EU-||r&&d+v3u~=bIe#qHEmp18EODx8#R2-{lLCs>5|WLAn!PGAQKgw?r<&lP zn@O`~6%-PVtz7IYXg_uDFBh-P=3|}l`ySm_#xhYxE%%-w& zTSBE=kWB51g_B(T(wenU5?0NaC0Hrp{*`K8(Kr*cfNapYn z8=Q&6!Bo0zOFg2t%(W6fW1iz3mqf&*JhIZ5u5 zC3>sRnD(TkQ*Y5*8;Fc!s)=&Sd$pL5nBJz_Gy4NhS{LS)g2HPUU06zlLUOl?V|7G{ zkrva|rcP?0+QCb*mYz=7(oAGAamR50`6s;$5+|A6(^oA@w zOy*lWOKaiMzDiIcC5plGIWsiH?4&s>6XXZgX_op^U8UALL42 zQt&AucWuX#44sC?U~_V2Xaio}F!RI8?K;Th7U`@ZVb=MN2Qv;ZVA-N)MnJLF; zv4^MJ*zLz84_jDMN@?ex)u?Oa1{|+?_k~1ttH;S&o)Ykp1hRwoALOZL@_=Uppd5Qe z6W&(^Fh5k`BZg+I^t6Fp>vbuskZu}q8c3&KsIkOS?v~0ZQCuwHcI79nqRJ;aXogCW zPUcWZ`V?tGNnCht$^`5%i9t3J>ym74(UK|6pDpjQP|ztXvL(+t;#`lurB3$Jm@+=W zxLW8WJG7dqwBwVKlr}jUFVmOKwa;Pb! zv8(@PNBM(BudQpP*+*L$AEI^NoW?0Tu{SQ99@D%`XcTC$Ber}4*Iz38lh zBxO%pDUSay`Ov8YBr%=eNw%b0N@Pm9nKdDt7wJ|y$$)fAdZjnb#2Nr9SW?FDoxj7? z8LMMiQk_JGmhP~tgcYZNH;jFX)&Oyoo<^{OI+M%WIb3lQEDUs1lhbSxldkNVHZ{X) zGf5=iD5edXQcz2k&*=rbRGv9A;2B}MDa#VcmQ>l2pr__hSW-eJ>H8a$gLP#Ikn9Tj=2$eEP+YWdY_u3RR?P4Q%HO7ehN$r6w9)9NPKLM+)vvapwsHUCFz z$)2g&Bxh9VF{L6$<|W5Rt)f~pK^C3PM6(DKL-~>@D)^dgw^NH2WVJL1mJm$jX#Hu~b>sr2!Vj(#>=PJ2Ua% za6OhE&<<6^II^nxnz&$DQ9Y0DwowHu>!7+^z&q* z5LKlKV-WABR%5N1&(7tB{c4Ryl^*u)@M0tK3nr;7(=3)SjH#@Tnc$d@l-F_>=^baUrivE@YzdN@rTD^}6c{>4*fq*Png5!NUj{-?&rM>BHcxg_h+9He@& zC&te&M8c(LHdw63d3hX`#}=ShRwZ47%xd!;gGkA8LpSf$XW8@ zzZs`qfFU0-Vb$eKVOz9hN?BnRJ((vlI7X>8i)^VlCaN3REa<$-k^L@=$W?mzsux=5 z#1FYWtOfERxtr$4IMosvIq%w(_$xf3=Ad)Ru-i8-td_9Jm_tr&wqBrF@Uzj~%+0TCt^9XZprfLba{tz)np@iE;b zdn7#Yd(Nbx3Z`2f#m=fHbDRx99knc(sV+eco@s9dE0JBr#T=OnB2qA@n4e~X*zi+3 z7^?Fd@KzdjGL#6aM+%Dp(uI(v90Iknq2vu$ZCjNTG9nJenWJtsdD` zSq4Ns)X8zLK=*tqwvhSwPDElrmt##uIBBSn<9-;=Myjg-|HXdio_d<_E>I9-5$*)c z58|;S?zB8%fwwXAu_;jyQC%5U5W;@CRDpXEYCxm=`eA=Xw7J0>4y2i3eDx{&^ZB_k z{UEdsM)ilPplMNUhBq4a%tu9}hZk9%3%52~Y9HRF!n?(m#ce#5Rfp3Y78ac~3R-Jy zQES+T7fjSjGBw3WE3Rx~w8-UW+3==~GV{mj@y^BB29HcjHQ-=po_l! zF#WovM<&nB-dMLTb4c%^6FqGI*mduh{6IMOe90_J50>6fb<=it zx-Up;_X}dE30`^jdRjC{J&ZnmtFL%?Dj-7R<*X*FVJ>csGH-#pp{JjerPmesNvUva z6V=BU?ugS*0N^%mMYCwYY7nI5l-?pn_fzP>*ML98L{66Q9tNv6jx)oO{wPmbv#Km+BLG#FJu2@q)--LH&`oOUaPSlA2>3 zvM6P2ic^644idU1JYo{Jq>j!XGmoAKi8RBoje?S~AbYfkglUr(cSF=xAah_x#mux+ zPXlL)OiqJqD$in%w{7GBTp2LMM(!Y;!IGX< zC-|c*{84h}57jtaKia|{&3sHnq$jK(AE1!VSwS2+K`AXsmF7un#2ba`<-=k?NXad% zmQIwx8CDbNP?^a1sa0?3#?(+qN+aEvn(->pX}PBiMs;N{I^BSh-YK^ePdEqCEpsNM zvvuOTH0dM+o%nP&I`L^Hx&lawqpGT~xlFkjWx*vC)fu|XMhP9HR`5%bQk3SQmG;MD zJi|5D)aZ9vAOgtAFDqkp0@X9F+cV$W!^W+Z#cf+&!Bzs7`Q$8>bd}Yv6cy9h%8OLz zoj6TmDQAt?pTqEmUWp@y<=QZ|>PeK;)8=_(Mxkm--oPHQs3X*NX~ZHc$~e^s{i9l7 zQyB$@C9lXgX--*3zcHaUKg^6@~(|A`+_zv$m2B*7KSfCBlpVB-*fi$(Dk~V7fTquYq(yS4rtTV7zXNH4I*V z;O8?r`@qB9F@7$XBSDr-2JX#x@jRU}CY{`7Gg%litu~N<5L+7Z>9tOdDR!`|{`qi* z2uCZhz{CSCMIhzs2NzkgErgM5Nj7P;w}teU(qt@?$(MT-qbwNaH<_hz6;^|AUBEO8 zg@Uw&#!e~sabp|eTNT|c;QIj;VaRW62?H-y;&4W~o*rw$j|YY86JaH>RftJE6>btw zdCWZAy-D{_GOgZ8j@2`5hvOKOgTI*$T|iXT%+%@F6N9R=)lB-PO{hSSHxMIC$6P5= zc_@;E1$f6H$U=Y)eo8fZ8on7$`JLn^g`?{bMVYH55Hh5dt(KdUSXK>5-;1e&dBXfd zF}k8-6&tN50FqSupsAQozaWEK>-@Bn2nFWH`3F=`Lm&+{m>SIMxw9y>SfEHxwOXais535R?+N{ih{di*)wS?X)Lm9{uT@^6SGg!n$jj&;dKMm z09nli#LHSjnyFu$kvhnb{BtwZiz`<&t3m{T1o#`_hm&58BPT)gC@ z%T%a>PLgtEL8mw0DBoqpY=M6OP$X+PI`QN*_;i)0#B?gHQ1*0cP|T-Il}J?8irbC& zam!9^`dBU!Ga#N&=TgBP66KuiV&D;J@&fa*(8C!m^GvQXQTS%Fm%}r$RKrg&Xv9>b zB&EfowfdIgQ<5)fPCPitJ3ojci?lfGxA?EiMux5mNNQx3%cv(RoYd!IX)f_BE~OcQ z!$NwZt2#pcGa_I~K}uA~v!v)E+jLj0vQBky*tjOYZ$kxLZ(6ezXaK4R2Cgc@!J<${FRRewaI`R?s<4It=y3 zfxhN$2Bi4%8Q4^ALT`FQbp*W!ukDgr-=inBTET-c^}SpP%`t!@g8|)gf|U9%eYh0O zo_t6}IlX z%E?SpT5=LefyzvVHKv_Lzq6=gMPL2Wr;aCrbCSoWjCNF@AWNANERZ%{z}6yj$Fso(IhC+(q&;YHD}D%#ki0R7;CB?b4Z! zWbUXJIn%6CG!nNKI*$}8vwCXvznOQHO)QnAKTnvRHC>7X{J+S zT^b}M1u5h+c`3Fvn-)3Me&v6+k>s)EE`EAqlWMFEE6F)^F!JD0O1O!8FkRYLzt^pE zEa4ThOua>*7UllCm86);H!f2mB$-K(L5lQqyD65{0NaJBW+!>Zn@UN&m7p_jsuQu! z7jT@w4ev zf8iPV6w|-@M{6*Nz8A}FL{Zyt0Y{Pm!mvU|zKcUQjpA??xe(a!DS?HZYqf zzWmh%E@INsPtWQiU?!F}gH5eX(pfGRUg=dG{J0anTPxopf~QsK(r@_^vZZ^P(ZuGDXunLkz8MlBzQEn$N;&@C?cCvH)RaS|ZGrr-U9gl7J5E|#sx z0+lqT74#$V{)*N(RzoZX^38P&|MF*ab)14>Sd-309PZ7atD54?^h2#C10qzgIf&(c zlaudD=h1KQV!vA_6_YdkmVCt2<7p21mpYp{@YA|HA zBtm@qo;JIX;kppj;BRW{A;@SA&RUpGs1!{Ny=jdGoR}M^HmjC9%%2{kc^9u6`RF%( zOM_ut+CTCt?K#OT?Z#9!M6E zMV|S(8#jxV^0F&4ikLjz*r~HFj8N=SC{d2+Dmlak+L+^wB%GBDP%+T*qZCl(NH)HU zXr!II7~groY4*DCPjv2_s&*`|jm{UuWeZX|$(QTg2@|EqJYLl>?7XRE7r3LEWqQMh zIMjKqW_~4HIblC=YL9s+D5b9pL3HOe8S8Zw^&{r`3SO~!hRkAM?sMceW0Y3i3r(^y zZPwA`3p4ciISD+K*re13B8~+K>Q%AlCun0VFmE36NIIt)!A7Nll3r#4(dZTvJ0P$~`B646S;LIVa0vZt7E$KyFfb91Sy6 zYY0lsz7^Bf7tQv`3kX28H^8aT>hVgE*0i(*#qvA?oC43>zb-<=Q z3zHT=%)C>}=Q4fLOZ1|U2BLh9GLdwWe$7Wv=w&Nu+2U^$KP`)ovs9qXL0!R*iSaMl z>7Jc>um6v|w~f*BO7Hv5Bkt;Tmt0bowX!5@xblWlBvK+NN~_gsrO|Lijl?%`hLYE7 zl^$}2FA_PVW`?3>WyM3PhS!bVG;o8&2#k0U1c_k;wb2@_krq(UB27^TNYGFHP@rwl z5BZh?E&8QE`~O|neLd%#`@Wxf;mg`iyIRikJm)?y*SXI1ey($FMBr2ep1~l%3*;&q z+5Wxk!qV)U<|VcB!%&~izFUFf?1;`Rt{jqxT2M%Q`Rbx=HZ@MZie((^--n;7FE75p zm$=k^SP*HDF%{wr77@JC+(2yBeU2cgo?T2#XE`R3<}Q%bda2pkmn+u1RKn%!TRFsF`2Amyamr9H)~q4%5<2Bd17Iqb^@8rWdor1>g7)ZL83 zH>Ec3-RAnyb-L5ki^}z{b(#XYO?I7nFoV^bxO@eVQ43(nA86QkL%1LnTU(E!yV<#8 z3);E!pO#f-0Zx8TM^M-w@>2%Qg1u1M*uvK9&5N_=hU56s6tkSJ=3^av8?LQac(}pkl&oE4=NTS{IMnMo zO8jYGW=&+YX{zH=4Zd7HH1)`R3xhxdC$)m%FGC{lWS9E1nHFwWNFMIR+%G zA)?CIkSQB=5)A4qqu$vD8D5&<(GpKBS8vM_ET@(JAzqe&z03}T;!rIANdgiVS0tdC z4zV!Rn+uH?B$rs0V_Dp!-d07*S}%V~P1@zSGFmOs-4BeEHQu~29rE0pX+C5 zU~+-WIx+vUZ2G)xiLxNRH`bv>s!C*^%+7)FNganKVioTTU|Fv&>Q=+3zyfy)n@CYF zPLZ_JvuCkzFR=rsAtd><_pNfJw()Un@%{4`^peRdN)%0QXR-aGW06`ifok;V$l)gl z;M0)D7so5#nnmF&$k%$$UvYm;3w_1|ZX#x`zs=>6*$O@>8>4v=8r|#3L7nVNXRp!BjkJS{2WuWY{()#>?-N1lAsB zSg(Gb7G#DsGtC%dB0RA1>4bJ{48x#2a$ zM3?-VtXF)P?hkuO`dQBKIo@*?_>!$d{>}3SHUmGtH|2R=0kicOAX}5+589OA+taF` z>9v_o3>ZIo+DyqF#rL8-PmGB)6>?!fKLoZKU8ONpblvGe`eRY)mBWbOxELu0NtY$eujvhT^YhI;Kv1&}Eptj4c5_#+T-008I8`^K;NC_CM*kClYWHT< zJB9u2JJmEBho%v`88kf!JQ=%$+=jK|yI6)iRO#lS7dUil`X9swzL4jQz61w{#8859RF{n` z_QO&>f(nkQX18+|r~e6Uri>1Yp{d>}q$XJz&7|_r;l#8)1b!Qn^SBt*ZGH-6z(jmr zmh=3gGLV}+ImId))Kk!ORupRUb!oo3efLE1h8T?BBb{t)>}7Wsc&n6d9T9uku%gUn zg!p+9aXGWNV)gJ0hkM~7r*I$ZuX`G@Dv0$H>6r1wb4y7zbMb@{sd%wN%pB@e93l#l*iT*^Dk><*zsA%pRI5mi+z#%2@|UhFrJ>n^iZ8ZYo^hrG=H>IT zjMWd_@@7XPmRhBLAgW!;VXSr;xyP->9QbLM*=eD6Avxq;))3}fTC$5`0MaQM7@Xh@ode|gvtN;9C_{f_rsJ@Pyv!1GB7mHZkvl4s5 zO`hC3tWhiR9SE?I8p7{XHB>ars#*sF_qm9xWTndk59{G9ZY38WL~) zKDNN2kOd7Nry8K2iz@0x85|N2(8hiu0W2c>7ZQj#zQYv8O zAl;G&AUV_^EKS-*Oy94w65AdoWs0T3=6C0%U&D2}Wa0#X;cDagMgYj@Gzql)qoi$b z=qWx6eEOpK$&YbSnH}IA7X@2Wf9j=R#!C$|3TN7y#b*>6>AiVX*fbkLZP3we538$sW97=<=R7OWSnZEN^|oz!)IQ7_)|0!vU=FS7C3$xdR-X! zVnAg^)sTt5iCzI(qnYAVyvP_=t2vCJoHo1~$W!jrK|4yZl1^fB%9av7W-X$RU5XBs zAdzw^EJQCD$~9D<_KWKZP4v<#jebJkP0hLz5zo5B1EW3t6%Xjnf7Wd+y4uq;m($XI z)eQ;H_Ou%o+kjeC6Wr{vDO2F;!ct?No26F#mL#&G=1l^_dNMOsk-Ikm*uc)lgr$u#vE(P zFu`DTIhqaD^b7J0U#}E}ok~hUP=2D2H=-6g+Qey7%_VHnO;aHT^XI_Cjxca#Q!*?( zILSmGFJW)2ZOUNHR*`GGv@o>FjSJ7JdzY+Ak>YD36BYyvLr*9r`s~^0x~bC$3UMR{ zY{Cdo^+v;+3}`mQ4(aM4g#~`(IzH-BsF1U6@e(lZiucC2p9!StGqQ#vqu?X-F(g1xU~E|341T(mxUvaiH`JM z&hYImyffA{G;DP%NzLEFBUF3aw@prn79VheMpSCsNTpB9Rnl7TCIxMU4J zTxt$FvcLM_Qga=kJj3NH_I&wD-hXeT)uKIsSi&UJn*?l7D{JyV?R(r{#}Ccal<%;$ z$JR*uv7$rS_n^AF2!6G5gGi6uM?cLqc^Q7~K9=L;sSLriafZJdpv_>_gri@p)Pk)S zm}t-kNIc6xxVUz?CvKM&A`%sm@FHWEbnQ}%sCHS=e&+J>?8T7otzJ6MhJAIO1SBYp zwZjJJhP7+K;-wsSZKzSLFgMYpXBdwg23aJ#cXMx&U&Vy^2l5>8Lyy4S z2Og-%pLr1!NU@QkKd`TjGHdK<(K<5SnrH!Jf6gl>ONxr-rm^hLP`n^ryaxs5npg*; z_?1V)P2o7p%o-ezgtR#E^2SOi1NYJ7mKfsNwbUwe~m;VXotNWC6Dr=(4tG9 z5LkXWhiNFe(_Wz7n4K;yym;~QH96AD7tUP0IJ+2JB>5@(Wmp|?O8uoc_kJedLU@5Y ztt=~D2F2X`r*WapVq&vY34n^44b{6M^r7ipfL~fVr(n%hUB z`BMVulb=q0s?L{m_p0RN()oEMHmEp`lqef)S%Ocf)v3WJTB9ATQzB1Re)Y;6CV1=?2wcs5DF$8= zP11Gzwr7`5f9M_CZA211bAGy8$@g>Yx6I394i(L65LdX^9IHtmvMcV$iW9sxDYTCc zmB}n<&S@@NvLw{vDa`=_Jtp1r9zCBSjnQxS)uj3%P!B@5w)Gcn&U3>TdONZOzQCR( z6U0*atW@Xb<>Z~Yqy!NfTbX?`m&OiFn|!x2QNVc!ig5XiMAwjyVnDw?Uzv0Y4J=sp zk#d2^G$K3Of%04_u92G?Uc8`66r7f38@^yjG_66ZH`YiP5a(v78h&{#odFDr4$%5`x*`8~e5MKV%qZhG*iL-w+t zn1sB8M0>7wjHSHw`4dU5Yr3i#7he}hEr{gH7f>&MDhX-#GLtW&WYF?m?h*hO=8!)Z zr%Vvdk)G5fk+OvF%k1Lf?21y9`S67jNSCfyh|Vvzg95GU{4kVV-}+{ZQe4`Wf2%7C ztc4V(*P>#lIO@|wSgK`%Zh6_F34{~_P`@c%)>n(Wxz4-fci7E0clRA^rpQ!zL&7CR zUI6wQAv~S_KBv+&ZMfkb*K=D+&+eQ3gL(q*8ixiGu&4L^w zN;JPPM?2B1+jDk1@~10`!HH}Yk_fpBL2@ksqAbe%d=xtm7nVF;Bo#g1x|c&jRk>%* z$1vAill=_AO2eGh72bO3q;A(JWQzt7;aHBNi>Ky?_p-ROct(O-&b7;z3oeV;o&c}R zW&E7S8C?nJ+6a!qHexKx%%wyUyC_|I--7Y7#3EV;QMRNgy;jmrpDx9T&}Cf~CypU) z6AmU@cd0qoDb;M}IWGy*vCm$xaGFw7Oh&TuYnyp>_YcWFH)u*6lYFvsY%%&~+1VP?vDQ9t#j$zM>;opIp!$cG3~u zY#m^uxHRy;E;*Kylw&~wMwLbnHg)~HU<5F8dGgcQOBZBl>EMbd!WxbmMdNtV4|s^n zFP2p4iuQr|9=zy31(yh3_F{AMg=%sM`Mjdk5^GC#2tZ`{sW!9qNNY!SZ8rx&Yhb7U z%(yb-G*plaG&&bZ`)YE}3Ar?uA#|aM8|8i1ToNX2E^*^F{}wlMHHf6fC$kd31Ut&# z7Aq+Wh=VZcbvFJR_``0#fW*)+XBN{Zk_73}LOL%)X?ErES$&0=^iQ|RDFHw@hmCww zo$Z;tiDn|o?|wvBH5-wa%Y7k8$7CnsY4#Ed72(CDacoC$%CF%d`|6ri{6C94Vuf|n zT=5bFanyv2S(BP6DPwfl7nkCO3*rRGW!WH2z`%b+Lh(d- z_CFJPJU+g7dG6|&f&=0~ajR{&6)JyrLHi^Efpl+e@Gs3@I(>14Qv(9{d{2kc+jEM9 zE`HS0N(PDcV)BED!_#I}kdR!IUcU66?nG3sdM=BB-}9{D?gQB%v-UEj{HPHKa?h@s z?8#1#jER+*#jARO5$_$>yLoa(yJA(Rubw+crhM+n%d})fY}`H4DJnFH-bFS0seLQD zXhe`ER{Q({B(JKfvxgf6z4?SqguNE5n+6OF;^BfY9?~&;zoFrH;`j$A6mBta}ArAgb-g9l~IF(hekWm*j#{=p6HkQp&NseC3qxE?8b{ z)b;d59c5@zzNU~h-25`nEwRn5MUn6Br+<{oBMGojT&E#1bb*66lQbqr#^$dS9qHYM zOfrs^_V{^F7W<+CL4H~zKNtGO^C6C=xsJkptnM|gy_rCFVaX(F2m$D30ILpSThh)wB&@?XeAR`@roi@u zO2*=32U%`V{V^QS119Un?(zVS`?sDf(oNrz%@WIMll=(&rgW)m7aMq zbB_&@*V2RHc#R4)4sYqQ^AtAY=8!(%S%9tz{IH5u0o91wSoI6MZk#F+A3AJY{-0OezeXy>`^x5NkIsj>U_1Q1RQf0<=*@C`d*;)})OhP$hF zMTfvS>_L}qn@36^a|-`n(NM` z?va1uhs8K^uLxS`uO?otAlbVXj}WKm++tG-r%O8UA!-&H++!74d_rQYU0}>|WrWAE z7+VW&qfuUhkvzJY9FaFxWW9Y)t1#p0T>=t&Qjv=9pFVZ!`SfX;nEr+DegEZCy3H8> zW_;oD!iua8-C@EcajbdY)n3IIvEG!nU|}wfYU>oCQjd+GtLO515EyT+7lT;?x0Lj13WeL%YFu$1#}Li;DvG&0MYI88E#-Wtw*$Ek zTE38`j^*X))c#IWyBO;wfzyKUH1om55nyyW+pRKRRIwRrmD}Cy-5Zsf;jH4`=X+|t zkY}-!QQ`IX_tY2A@#4+~#=S50R1@Gnkz&4kU+$?W=o=0!Yo6)W+$ZQ`q2yw&i9KD+VJhy>?VloSv1b8i3&Q^G_`g$ExsiO zOOs4{OoUj1#FdTJL#+FS3qjOOY6z8MLU0b9Lu*5#HE zW?zmeb>GZz6t>-kk0$CY)B$65`fDIN(1Vf#n$ZdKPF2Z3JJ7@32Q;S=7hX{;B9N>+ zM5V2bKkZ@a1183b8G23O!a5Q4Fy#Zr`qYX7A*M}*FAB=;dk4KgQN)NxFZN*IMNOms z^}PV|Vh_u|sHqKUh-j2m?BVzqMdeLJ%PPPM;OL>%*W0h;0`X!$QEgG?f2~E8{ zdS%XpUJ@t!P2X}W-a7b+y|%mz6?Yax3AiagAiMS2d?>*}K3RjFHM%^&xAvV(XO zE{G20T(tZ6%;>ZDm@*^fl*t&tgm0#+`z=biNV1p5{K8#tXsFvj>*nQxszO6YUWU z79uMi&0MxHP~~;Sa=VYycmOtZB(li!aR7t@!Y=_%lQS=>3q;F|92&eDKHLvln-3EO zX6X^tvMV?|utyn_wIYwz(eBt;%delgY*@5OYZeRI`&nF4;tojYaE~P7)RF|9i76Lc zutJYikXY0!nB4wr)t2O8{6^9FhNE%e#tdhP(yDo|#*~SX?`*6SNuWdddS*tK5T#qK zDVH}>a(ZK3Nk-AI$^fFdyxNWU0m8C1AKslq+p`;Mi{YthG^~G7FLY8|3~xMik?hqC z0kL;z;MB&!-u)YFujLjX<$4bdiM_uwCf*YVwhVjOx-(yYe)w)_o z7KL;jwO9JLSu9VyvO&bV8(HYR(md*rBr%%F?A}nbed4*eqR`rDse*MHyJVkqY`aKk z5Z^}y!QD0huz~SK?QO@V_xFhui*Bq8J2xli23hUbau3@A)cziuZNCPsnp(vkOz+pY zGNIh=4O?q}kN1U@*^pQ>v0fupz?HTZ!@kgClfBSqlf57!Y-8$$u&-j!9?R?nfop>X zie3=;v^&CnbX&2Rg@LAZ=u{NARYkYUwDO&rW_*=4YLC5jKmfOF)Udh3LfoLNJD^#4 zPtkCLQtm*HGQpUX&=AJLe>osrWHF+{F%8CFbn(<+Eox(0dV9a!9&Em-iM5=o7e$Bd zB0*#R7ENTwZHN&u2;1m?sgirvTMwnZBudNEk_>PQ_N5+Ldr7n=z7228dh8*$mqc#P zfK|;Nn)^_5N~>^EX>5*2=a= zxUWyjl1r>?5PRaUD;Ie;`ylun0%}R2T6JFCiLSsU%2v6=v29}pT)P^ZOZ^SK`s{*R zydGxE=wxAh*CG#Ku~Bg2m2L9pWPNZF&w4StZJ32He4a5$V`VbhE)sbP*nig)B2^fZ zW8v{>s&Cjl{~|g}7v@6nBYdD?OHV(VUS81xQlb6Z9h#$;n=~b=oYZ-8QUMzW#G0MZ zs2AA9Jmrfe zU$B``M3*h>enjc-;@(B!F)x`dvJyOKJu#tufngn+Cr(8(;U*CTD4S#u=JdwpIr%5b z9BKSS319-5k>2P;PMF$8m{KbG*~_sD$Cy(~+`k$n9BK1|@!uO>QEdM7^J#uI$yGUc z`O>U*Eeu+BDVq{&=^I?iDVm#$ca?@W2>xp-0c5RygOR5+@5-GiYpsg`Z}-d&T{ydn98>fbkFa0okt1 z2W7RhwqVkStKyBTrjGM*fhERrqXDd`^FOLRmLQwDomfzP_}EZT#mEv=@DT*;GbrNusMg+E|hJ)j4cm z1iIE~!nmS#TKAm_C%(tMUKe}p5?%f@ou(=0%I0U)*_4me_h{X5xVu;X@+dxsxX*Wp zp13PFDr#5ej4K;R$F)b2Y-+A_Jt}@-t9xz^Hnrt`lO(ccA6^{HB`C2S>C4nq(A6vc z^7H9I77(FKPG1N zrb~Nb!g;E08Kag}atptAlU^H-;qE5<9e|ju`Hyn#vV4!vd2H6UuA3 zd}$a0@;zve?to#fz7nvStNlcS=cIZSCe#L!;lD}nVUjYyE}T_nr^KOUs5K&xy+q$5 z^?gw?9Wov0;sNhd_wQW3igl*94|u+{zA<=4xn4$n`4W5Ewq2_swVN%XQo73A{1ATM z6W2Mz>E-z=+S=rxeEE=jEjfg!bH6fC@{@)vbfwE4ae%!h&&fG3MPH; zu__z>7=GcxnC3O%b(tM5%|*=?f(0XUsmJ=v7yzHjDwJMUj{&YoO(+*O8`D8cV)i#{ zV_n%zGX7A^Waed@-WLBD6)kDS8+$j37(xE?rP*BWRxRt_F00#nydfYdZ7QJw18`lt4u^tjAGs%&0SdL`_W|InPO_OnljnjFo?jQ31IP=(l3e7T9(4yo-V ziNeEQY52|6vC?BPqZHs7K1heIUeH^d=danPCZrUA!%Da;(`fzoJJ^#4g?IpQT{(0H znsDRrwQq&;bHtsF@TOYYQM1&&szIgL2)7d$YxbT z-;Dd*gs^?lYB|0qE8MbHz#OZPj>YJXW7g%oV4Y9bRBLt!UD=DzkrLhcA`G*(^a`fZ zk+u6{?5nDK-e_Y^a5}||=xri;tDzdz%X|l>Jt@5$eZ-2k=NM~P&qgix&)BNz_IW`G zod>loY7RP5(ad|yX72b)@3h<80_5|@4L^Fprp6z$RknmD2FI=W$Ppj0T#X=hn=E@<{KfA1aY0MnUc)1{Ky z%V*J3dky-zYJ)VsdVPHnbWPK_VCWl@pa2OU4X0HC=;ZgIP=Zi`(Unzi?GQzKROZiG zf@t;MoD_~`)d&g>X||x|P{mnEp0QL@!eNyo6Lkn){}$6z`t`JGm4Gt;EGOF7f2!3Z z{JCKAHn4k5?cx2gbTl1P?U1kDFH_yAF_~1|Ho zvF8{s*TBWcUjkID{tveY6|r7x=|DK-siAHdwX!7|Z*qNC|JCiD6v7=5bxofxph{se zXX5fHV}ek`d3tUTAar0RHz+nuvaA2&`cv8%ch(vjx%%flwLko6$v((0uM3jVjkyJ> z2t*!;K%5~jb+E7zELnWWT-&05pWi8XOL;Oy zE!K#@i*VCgywk_nr=|8>5!Pmm_m_>9OPX6aBI@gzzR{rx9GBf1k8x*BS`AizW5y6R zmiij?p$fp=2f|)+r8lcZ;5)YDwEDx}nG;ag1pZTI4Ip0-nTSCw1z!e;u0g==zVQQH z^?0ME7`3lxtg9NW>G|cgdv<68eOQwYw?SCBX&!pS;4^!Ixfx(cS8sI`IWR7&Ck0sUK@fVAi5jlX^OG}L+w8x#pOc16986Ty`--;mO@(n8+QhnKK|SgK-d`25Zw zqo#_?({GD9PNyL+SE2JVJeCF1iqSmV2^$xQZEX1X1w}61nOVb~)8a@E*1aLsc|`L? zeaqOWwj*xeT(ctp*J+#!cV=!qR`4Afscrk;xj8vCj%$V7^wUTm-x=&V1$tmUOgR*- zMqK^E!KiH%x1O>I9l^4;JB6&l9@bqn>dwt`tk*tM{(=Q?7#wN8vKu z`LWZfK07%RG_zvop|t(6;7i{+*M|H9!LwpLq4u?|$Y53*4hQXb=k!#yyVC6wcM_3< z50T#KKF_;J2nN<@N;Lz|;UxJASK+85eSP7X#AutE&4Cim;}T4|=yC)U;UEf!jVp>+ z^B`?M+(nB?r==6pg@{8|kEljFV6>Khpm84z-2a07gvRyXSo!NXpEPfpqMXdDo?pRMpHb2H1z5Q_Wy?JO3K~|0HBKWefPsCO67kt0DtAWqNDz1)!XAYV2(`QV%nEl; z0>VrB&n-qq*QI>=^@-+!E?1B+U<<<%b1_nE;62Uo5R~itec+XV&KpJn?S8|A%pRp1D4(T$M7Cdk zPxyc$b05b$utgspd+p5;mMblTdUDi&w2IcVMTeIv^ETe;7s+fTRL`#G$c9~A*~Tl78g zHW1lFPm6B3*MCD}91~e~$LM>q&%(%K={=FxVFmang&Pv{AUQDACWauVzGr#a{VB2@ zQiP)&zpsm@bD6_impNWvw^qx;R`jtfzV&{wKFU7hcRWYhVjd#LE)M&sOQWuCLDhe5 zUn~sk)}`PmZ7U()+xoq)^?QFx_c_d}*?d!-2Le)+4!^5>dkveOwo0f|!$h6BM0HmG zPZ$k}G$8^XOMg}W{y!j<9_q5K(9=^Y6!ny9u^#F&EIo8f)x*Pmtg70*<&4;6RQm3g z(sv(=(sy6E>R&i2;`QxcOh4U9tY3Y*h!{E$d1)59=`~Yni*jGpx3p28awnc-pK?}g z#|W^3CxJwaidusk{~9IY8!V`_jjBP27IN)d#!yK$_aO(mwfCvi6MGs?Gn-6;jG#+g}%G>bI)~s@4t`i@(8v3 zaS7koB9BqGp!_eL3AAm(H07yg?bG8C&RG%-mxdSiYPxU2jH{!{ZgRaB$=egEix$KG z!zRWLAW%YCdn0|ublH6RC3`xr=h5pawf{x4V$j-pjI1FM&|Je$%z&q~|sbM@~-G^4FtHx=rIbQ9aj`?IvavR*$+FWB!s zOEZj%Y^#2j4vegw&5d+VCtvs_6vB1XL7U;D=T+$1~th~Y9^HEZIKY&<8SKo zglG$or^d17vz^&d>Le-BoxB~8-q{sHHMnl{9faYEJ&K}01>wU@7(0fKr#yt)F|m?m zN(S@bXaG{yDjCab6%6(8+aeg)2-pA{>A@QOO{^&V0u{d7I6pI*<|(7g38COUJ%I+(XLn{shlSX8G)C9aDi&kcaV@|} z!PUnrr{qqakP6V^Jdq_FnOZ=8O64pc5elArM1p61JlEmEkJg^`+Wpl!A;Xp>Q)md2 zz?U{Q7Lx4Nqbcd!+M|t@n46r{I^&GiSDPH?gSF?=UfE6derE07Lj+JO3yV#Tacb=` z+WKv?@w2qFcK;jWu}#it^^aZf!-{>;uP~m7xDb`ZMt6hBzah!}8`7GDziy=F#iq`! zL~1xTN6wGp91muaEK=oeeH#71Gc6|gx+HSHwbTDpfNpP7L|XlSZXL{wZT|*#0lgg` zdua%GZRCWeb+GGaS)}(pUCSfrtKaqtgpwOSxHAZFRK%1&OW$cG|5Iti5G%p{ z{5=!)Uh@U|(7D&Vg1%|iR%2g{n@9Q72z#w>lsDysVMzqq`|3;&<05@eeamPqXuZbT zWa4%5NM~(ZZ1i|oJ8M}#eJ$At!4>5%n`0uahiYrx-OKbqVO{K;GRujRuGqN#_oM_L z))lsV+Rk1GE-HU#u&S>A{l7>A+b^Q_4kh#JP2O|8gl*f|5$dG}&FJLR)CGC@_}=*U zWsMo3m)*d!?4XuZHa?1by5~%Qzu*nw0FJcQGtkx>@>Y z3mHyNdg#INIZ85XzN`P@W(TF~Jc!3G+JFE?R@tL`83)o22dzeeHZr{O>^%0kaB}qv-l-_t-&? z6HNa_W8koe3OV{X7S5z(<|*OaqnpLkP9(Xoo;vYo>?4GQ?^qJ$MQDT|@c5`lP8%8i z=n;)LU5x880dbL5|FGT|b`{j!91ef9+?DyM2lGE~!|IXB_D1%t!8*#_Or6njYidm4 z+yqu?O!-y^TN|;>5lK7sM#jj|l}ui4;QO}5&5oW{|6$!-Up~OCp|O?(Aq_`GV(Z#j zGNzTEE}X^4Q@3m6bgJ&@pm8JoiZ?{?=T;ZA*TQfZ?W(Q6eb{P?E>S25xp zCznxXd0PGBJ3ZM^LyuYxH2qrseOmojHOS$9xYf(<1_O;X(IAJkLIrZnCaVBt)Z3ggyA_GnPCTO*aD!yK!Bw+8jrguo~wxJlry|9TDF z+e)x?0I`PrS48ssSH$xC7wRt8^liry>nQFpHD;`)6P=SBBh>Nq85^INV%`~Y^&4u` zYdBfvI!>DHI$0TyvidVRqu+Atbd zX|=V`d69#E%Vh(dk+xCWHyJ%)&%_jCnad5$E;Ia#dZxEig?%r5U$`9w*7x-6b$KBD zJ`{H`oUpC#6RP)yEN^=9)grJp(aD+GKjw#i|6o9QarMxl@Hssl6 zgsf9DQM(=pfwm;K&QtyRk>t99))`H~o)I@p*9U!wLUP=0@(Yy3+Ihx&$eWF$EXyEI zPrhXothPx1&Z?|H!|kM;ObJRzy}sq&jTI%Cv5)sRM%KI6MuHP~sLYV4rKClkhRCWV zZ8j=`-~0JFuS%DLzt?2Lau(}w!^L`^fP%>+@|N{uy5BEaOsdwR0y3OYDqHoV3p1fD z1zar;rN9R@w)#2XX3e&=`rCK1`x04M+m9BfKbDid&e?Wu zLG(+UY}$@Cv(joSgmL>V-I7mz%}Rr`#&|Y<(&~TL<^mdL1Ldb7$!p;HXty*<>e}U0 zeq-&a)B^TaOnoPZk)h1hfAG@aT0Jug-63qbXZ>5!T2fmJ=Tpt4*taviXU-WU4nM+koZiuFY4YWnsxr9a(t& zCPYAhO?G`>qEk(zUb{?siitSkMQ`l{sBn_XT7Ah-v0i1pOgTAME}W{e9_b!yMbg~} zD1#{hZJ97drb6w?Wwnhkb*m)PQv^#&NctEq0`O(MlGXlj^AuNFay7_zn9g`_L-(NQ z+N$Qy3)oVIl)O(O-kgG75gtpcKiT}G)=uzh6VgUkWu#cTeq{3?*229^iK>&QYCa#` zYO0l?=3G@u=elj=l=LN4wGp&Yxm}OY$89B-*R>0t`{E|VW!>4^)sCy9BCm4W>GRqd zfb~!}I=QG8r!`D#B^uS@wQje5($USNa@B&m9x*dtS2Wi(YlV{qavQ_mV>^{8i)|Oa zb>H2@ChB`Utgrrr;%cMPoM>6v*Y!vnO?sl2(Nxq zC7jnR_@N1qJTV`qL>YN<+!C>%9V`C&djZKBh_u((9dTk^JD;E}aWgArCMg%MWP?0o zJO8`-PdC2=Y~Woh5Y`4KQ+=3~85l?FMx5|c<(KwyN9AAN{^vb~bMj>TD(@~cM5cK# zLmT|q`^bBpP66$DT+=|%pL(TUY}eb*VSz8MZ5|~xSG$~v>2#T^uXdXOMw=6V(RAWi zx)~Yz|7*p32jrd6ikn%Lwnod;hfs96ljV>nx(8F%)Erb_N+3^$@2{WfKCS+f%`@K8 z(0kduAnh}4`oJ#*Xg%2yc)h-Hvku{{>w?=kg>uD8_1hMb>H2H`?o1U8v({uw4YQW! zC^byBC|;Llt9@+KFgFvYzIj?|+|THF+bp~hugr)5I=9hVqegT4K2>sK&cE?XSx zZ!x7&xbo|wjl|udykscg>>2r`{(gWnE=%r(_)>p6f@&OP^Y3dvt7QMCSKBgN; zcN<1{ksB9!``fVs=0#o5JQ#PO2X=R>7UwMeLVmvv?V3t3lh5fIHSU}B%hh5;)@Sfq zH6~r-nGLVzob=9gY-bYJ~|z#by-|I&AS$yp1QBK zB7(FyyfJlonA`DuN>{ne-Oq`#T8=+X`4h6jnTfkoxeSFjF4ot>oi$AGQtvs{rwtds zVQelo7|XZi7WDUlhlOC=yaL?l%8INvQh1lsBgPrL8gl{)Fwezy&-IK;JmJ zJ9hPV0dB!A7B1gi220_RpR|99DW{JuKYjuX2Eb;g!4!T*jU+9DHBEgO1>H z?~e-wohEl_g!0r&U%Cpn;&E`*ul?Zo_*-iKlul4$H^kFt#aYJ`evjXzftS`9If@&* zWH)-qCz`_oyC~8?dW5mFOG(Rv)&J@*^AwVtwtP!}T$~*T(07a4{i-_3w&=QQu`?OcYYn)GZk;*0G(6AqZ=Ow~})i26{p%J(mU4x{9RiPXh>J9=i)s`vw zc6{fG`mL89a>PY-g7tHU_H7$|l9qh5DUYW|=Qu~KT& zKy^?gf*?I!pASBz%-jk6=l27qZSU(h+{3Y?L%NcIr(As%SFxpSe*X)+W@n4PUS5oo zbilE^imF}rO@q&|mVN+#v(XxN9zrHrtL)M`$E!b>)ts&w9ZS#Y-!2oc&Sg=aT@{hd z!zWZ98Sl6cJfzR#&2)^E1@JZ1W&|v#1yK^)zn29SWlp>ysQpDCkf;mIxSih1W48va z<8MCYt+esl)xo!GsQi_To%fpR+8QniKQ0+XMuiS|j?)fmXEsoN*cZEOj(+dFOKO*y zHBN<(?d=}YeqcoLpw{B;4c>duZ-nFg4tmj<-VNHmV;>A-|iQQhr+p?GaFof(-y_=-F?1yF1K~O_q#-Z zN##<1BiJonmclH2y4x@05o_i|X=F9ot%-exiLz*Gi!cpRtSS^!zhW24!uj$Q2d0|N z`mD$dtr+f9ccvvy+P!6S+wXXWLny=TLoj3<`r+ikk#7Hem~4-eVXQFvOt&}ZA{Sic z_|ohBm3=6G&2Kbt#v_di>(kNbQY3C7b1hoG{UcuLiv))-FprT#Khm!`Tl&EWdDaJm z5#IiOm_stRm)F{SepKV}irO|35oy_Z08waDty0s3=z;v z{SenPtXmn>_Cnv#Ke|8U0WNyMa@JJ=?{xd@BO2E(%qKjBdK_ayF@3$)Sza%mU6Xvh zcpYoVgt&wdezyx*$u8|gJXZ@RE8&Hw5+3o*_BbUm<1~kMYxUSi_-g@qE5tvN@Oub( zEf|a>j&+gSx9n{skCeYl<7ibRrl%e$vOX+r95;RSNV&SNkeVS;M#GRV%gQP=OPQ?hO58YZCq<6ogPk#}njlWt zy|tklrQs^mLtlWWo<)sEbcbt&W;Q)^QMV5);Me$;aMN;Kx@eEw>7mCYtH-W;a6ixe zRfo!OxVKAP`3=NvcE+?B+_TFy`AWBCpKx;FQN!ZCTKF|#-6>xKpnb$iV{c$A-5cN=#Zwx*vR z2~pz%eZQfedIFwxJOB=WH$8+}`n*O>Ju?Cl#CyEgt?sXjC+nvN4iqc>5Et#@BvXjB z|EQD$lu1b{-&;fu74~bsOKgZ^p$b&6b($y?6Rw#Y>-S!P(o_gIr_9i-Jz( zXiyI>;FQwZ$@@+ zKV#B3B2ALFPY1TUv*!u15v*5X_380mn#~ZtEl5ub-tKr50-P(%frP{~I-{kZJzZ`FF(%}%Fa);os> z((3<&PalnlB)Ql^Wblirpd5T7@tRG$9rAUB;Sm5jXR{H<72~QqsH>cC`7j|c96|r0 z5JChiPlL#mhYz!PNqdkCI|4T?**kKT1{(doKYB}w8o8qr+hn}v(CeclR}8*$YFoN5 zU8rFJULr|LtY^OE82@hT#TmbhQn8FzR2Q5$jz*JLX)3gFM$hS7dnTFusm~nx7Ckfg z24^5eU#L2nm0=2~yBSy*wfE&4Z+H>%%Mq>NX9_!}tV;$H#= zywS3KDQVs`OOrR>NAW_DU%UBU;vUAhIniI-bV~7J=0iFtJ9nrS?g}9)$W{$_)57vchk7~t#)z-{2 zn0)o-OWS~O^&wdzb9U{y#|V5L6upO9!Qe`}J$RSJc{fhFqvjv4E1LH}7%ufeAAJmGy}vEvYM6re zgI`T9t}0{B?PKmT&O!;Ys&h|R0CouT1~2-xo$t|BL9QCH&|J|V0C|N@SX1~;ef_vP z3Xqvd&YfX_W}6;80>R&UcQtm_^1fQ?31ee zW{!iN$OLtHbF+t?+C5=mvAjfSTYbISzXty5_}HHE5Lvw@wuJZ4+j(s-1RiT>BRi=* zvcK)xH^^$C;UP7mJm6;V0XA_L@*I_}aRdY5qqu?zlZQ7(BaBLlp=LVruEuc{_ah0+ zniUr%Kz$c;ce6pkeb=MK$Ut`P=%-){OVN!FH#@pw#pAha_cAGrgw=|XLXL-c%6$Ve&iH285!!}_?y7xQ&P5<}Y)u!2_Lt(@7gv9ZGA<&_#pZNv7rks%-HpXU)k z17(bWIx-{P=dJVk?d`X1^zF!;@SNBDERb1HoMa!uARCU zmZz`hTI&1IQO$h)O?&6}tHKj5Pg}2u1|KO`i~tL;6WE89%S=`L|)}uGWFZ)<@6A`_Dfm)X+a|2u3L{Fm0fkMqryPnt^Vn` zy54$+Yttij{Y*^h;rhvtNbig7^|Z6D;cd%9ux-pt3g`KjjntYGbc9Vz9Snq6-?YCT zr&e84s*hlZEZQdQ^K{+DvF?8(D21;s;qydYvwh4p-4~bDbj8_ziL)H)9>Tl5Eeg}q zF04K@%E((t^~ff$ziMfrkD$(baiPQk#NJFraT`@5;k&fQ4Py-|MzzD8uEgPmLg{R8 z!#)dW%qcqK@lW38a6SDJV7t?B@ZBJE z2b~F%g$7^xSYt}m1wx<1f8RfezX+f^m|+9=O(a8Uli42l6?*v_)rNw#dSKDWAFuQv`*9kpOdX2Fr7eTc@zTez++&dU`U`6Q&V< z1+9r`#0jjyGr11b8w&)3LfibNh0V_BGrVksA$D!MX3_V2361;Kj0Q;p$NJ~9Hgr1b zK>sL=Kpe;6&ro^t;ozhGR&X?;1mA$!xv`b|YWK4t2)|ywbU3wy_z8^$V=*#O755j? zGqn&eYfWiRmAGrw4Rz6X{Y-keKJ+o82-I=SGi}ko?H3#B8JZIl{aA7)UyoiIOt1bX z0B14kRx!(hy&FRYb7bKgPawTAk94hJeR){6d@O_Z0m|P)ZRMfb0c{jA+<~M=ZxBQB z9L^kpVtCgAF(v0HIE8^jLPt(~oXVNj(=dW!YS|fa4ogS+@x5`L^NBXewBLq0-SEj7 z4(J*-iJZ6PMZMMz<(3@Htj?*0AFy%xl@|@vrq$N%oqb249IX0aQ@oCdBh7IWQ$BK@ z52U|7q>&&??gRDP9m;db>4A*u^k951_H{P&#yJkpa-9ufMTd%A*YfRb?bkBKVg_`& zQDQq@0SrxO&XDvt{XtZo91@nDAJ9s_R?Z^`CvXPCqD=bmmDLN+GtS}waK>kO(6-F2YNtbQsV`hbfU4kFCpj8d)C~fmZ08}K*pC0y232Y~DLvL7A>6O0F zS8bpHt(%IiJ|73aJed>~U^$_Zha>I`d?I#g4-5+WVM_N!lp($Pfzf9TBZ4bN@Bn^$ z4EiBKjCSp3K5CAoxR@J`xZC3q>@E8mVz#<)c*}(3qB!zwgQv7>bZy5xISTT$)~GkF z=N`gW;C_vI^oMXmC8ekHxRb(j*qc2NKG|Qhf^I~e3bGM(DyZZyEi{QH`F(>Yw8n^5 zf_=W4LFK5Yc-E}gSD%LuwtP3Gd-$gB_qb>u$izdklp}<><_6aXTJI?vADSYk0wooP z#gJ3s0hC&HFy*aX27R}YJ$!Oq5ueB!mok346J^}1z$f=6@X5Uh>FLp<*Yixzv}B=N-rv|(q6xCmYK7y94#slu+S(shEFx!+N5yq`%nkPDd zLEy0YMi=u!{<)FXl~otC9&V%1GGig;$psB=c={@&*JflZVYpy)mqAckxL4+;3tk*@ zh0t*r`?^5jLFSFrCANi3yxb)B)@5UbzqqzM*qPF{dgOG#BLX=<+lH+dvUg?#QQnlu z2GQE%(>HVxhPv&6zmp>h>-7V+%GREQ7M!5a{DeED>-7`zu@|008;57jezpjn)h~k3 zAkw_67M3V%T)s#Y^j$X96%hr9&b?I^0%40{D!V-&;Wj42k%rm>5fD=@R7(MZs%k3@ zREPHtdAliuy2$O)EA_H_*qw-tpJDCmHBdBowXZE^gYSE+O*n)1`&z>k5okw1`r>a2 zsvm5&-wi{&`lof*rJP1ewHGRH5Arll+c{dwxNbbf+Qlue2@Cn^+My&X+Jvnh)@<0a zGa@6F&+DKc272?X2MK@)$%SR-K{=7r53(hZNuz)Hu)mO|F~&O9+{-6aH=Jr`krd3R7`t*hgrgRCb(jy z913QP^Y-g~)t$F&5f^wr&@Y6zr5?RjPqPhMKPowG2(KViez)!bk>TNoQ5bsOfMS|V z5Fq(ga>c8yl0xVkgT5OO<~B7OGfGp;S? zyX72#qa?IgOt%5RvD+h%2O?{qEHd9k#A3n@&?(?2eQVy=XHKPzGp5M9XA7ePsRQQ+ zVfNPf;C4dRfnZw+x7PlNEEh_CcNP)EQ_RY3!}`h|=IIKgOxg0tb8k;8-sh6}E}7M! zZZOvlpuU+)Mp}xm6{z|#(N_|c+ zMV@wBafgac^Ib*1e(Uwsei#-GLwfaQMj66*lQLeu(=*eecPw94Xzi3R-b%&0%KhpK zVoBuOk{EVa5e(A%IqYJWjyzNL1ckQK%d*}cyt01XI(FbXm3#R0&XW}r(fB9JJ9bvc5jlX6q3tKB2#%&Ko~juuh>pp8IG0?Ux=Zaf4Y)+OT~RR4I#ZZT%NGJBGE z=G;XFsWWPDjo0N8#KHBCeG&mc26;jae6&M!kog`Yqi~9wDoYEAD6-WTD#>7MaxlUdJX4+q6M?b$aKzj zgnAH}=P_$==q97rAOtk{;Fwv=EL|*jHd{D{dPV=2RurY(dbb-?5yLe=`m(_2)*z5K^|K_ zEd((R`5l4ED=KqW*!fzhneI~y8M)bQFPR0-21T*Si?!-9#ZK?MLWGKuxmt9OU~Fs4 zJqBAZ(w-=_XBW2g^|J5uX!&c85lq~sn4b7+%8^*(`PFiyoTy)~fM-MarWmsgl4h0I z=7&UMM3-loDPSWfs*JnAv?24j8>!xv%VRHzA=h4Mv3p?^4oci9*0AKG+T^l=eQ3BWx%6ix;r-jWONf^#W z1#4gb`+eX5t?wj%uR`H*W z$(m_f-6oAAk|SNWjqf&F*F=YK)wY{*de#$pXsZyKM}=AJOmczNYX=reQE6J_(KVcv z`?y4m+>bPUbG;uDWLOri<5`zIk_VoynYK^sb@YB&88xTra#W9yGkrUr9Iu|SveW*lSLl8oy1?qU;KORIn5_I9|| zB)JK2-3gvtA07@tk>S|Y{4)jn;Ip_fxu9s``n|IIj^Tb@Y*9J^<0_*yi{gR?ar>se zgW7S`cN-_ne=ZJ2^yAZ{+1ouXdEk(--!pO8(L`}z%;5CXWKYp6;D;^=uhjbISuJJ6N7_CepOkD7B?juVEG?5eQ> z3mZ^cC54UdGp%0V*x+{%RV{WZEe)JR+`@u8U&(T=HIN4oUYuQTlw8-_zn!Wqr zNf$N)#Vrw13mO8{Fj;x0f7<4b(;jVrn%nf86D3wqw%LzMEf9vn3TRm_*CzCYko#Ko z*QS8c46+8M?IyDI$L(L+Tf*vgZ=JD`cJ|?HTDXqXi}dt*HHLQawfL63j~cgxOmfe) z*a_Oc-FmgG8@x=U_oldSzMNCr3%^~nN>A6))Ri-Q1?{m1 z5!{{5xQfot?tsL3Vr^*J9&Hy|;uhSI@s_9w-oyu5OliIgd(5lm?pu;tEe~^}&=ok= z@zpT;kQE*+|5OJyvk@DzD}COb6CQAP_BBPiE`lm=X|5Ma>Z~~~bRZF){Dy~|`;W$9 z$B!#v)_!S*@!Zv0o##z)Un}@a-0Z5L2KIDc&`vtnbtQ>$Ma>fP8=1 zd_6mA%-e?Fmi~21CvKB$&ozBihc(*IZ!5k(UT>`1j(2$qWzeQOyW58KS8LstB{~kf zTl@qv^8RLJ1zqcMpC@va_3wa2ZbiU10(Dy17_1>hOOCrmt#qKqap@bDyZEiB^D`T7 zm1ally^YyqrDxiP$@JaswQ68X=ByO$4V)_Bxj8Fwt?{@JFG5Oj^$2_0If74Etn?uX zW{g>gM8^ko(L$N!?RSOc3l->@y+G>p^@1;~*!8wkil?(?1aD={>6*p7uYtAR-U6;E z3h3HC%A8=ERA2bqeoQ2vS`Pc9uU~A51=B(va!k6m#os11VY?zHw0}_?9MqL9-KV^l zjpKEvnhP081!Mp7MA>rn*NFo{m~k4T|Afdc<+^l-II01Ts7uVeFg!|!l_?Ta2c0Y@ zPOPh)aNYc#k-_RuZUu~u%=DH)e1(J{Y~{RXgZzP}y3%|>jeWQg8*QUmO~jaHel_s{g3|9ns#|5!EdZZE^+YA+<;kcjsX+>Yx_s zpY2yPqAT2TQ8@D$buw)NAz{&ceJnF3Til7Ez83dl(@$`<`m?kBef^Pz;(Jd{Hmds| zGv>0?g6^NoWgDS^G`mqM%ihaqvhF2hy&u#QCN@eN8yRU``Zy4y))HyG)$DI|^Q$?k zzn<0H#;TJS<^FSe$d7)N$I^6M@^Q|UBU9g0?M3a=B1e(@>`x{gSA|RBy#YiF;7|I{ z)14ehLzcUo?NWXE>M`+DD&7qcbnE$8p3DNZ5+7vb1>R<+U(X48-C+6E-J0p(xp9?-{_-q^ z&~8pS9Csn=*W6ub_rS64Xgt3a&f~n&XXB+NLc0@JgwGs9%-&;GBq=(d=M^%Wp@}em zKO)Q@ls%TK5j_Tscs{WnV z;+L#N(uGiGRHx^Out6QiK(Y&&@qJfR8(gMs&`yrXrESP;Xv;6DPOmw|`5r%ZQ%pDFsTqv7+n-SXL`5_7>-6wSyNBswM(ebFwcECw?Pgmasc^GS>qkp}23$iw zPN{=kF^8a%8tc@vi1XgQ&9hih%nHvT@Sd%O4xl$VDSF#?+ux37P+m&Q`!}` z>a0`m<^Fo;E$1MPW5jU)zBz0f;T_iiDLXc# zIF-#k6$lt#FcOd7(tqF8LSE8ePdPav!{s^kIj6rX&3~LJ_*cOKi)QdRQmm(ti5=n9@qN$#rRmUCsKNdyQ#;lHt(%& zE|q_r!!En^FTaOnQnmbY{lR2hRpPI%98(W(4xjSI?Di;>wBIc|*dM+4xZPIWHtF*^ z{=>q%*6w4c54Ad{HL_n^0Q+!IpkyBM=Qqkc+<^11*Bib*TMK=T0^(-Da8e_i2l3=- z>{(QngqCFl2Mjhk&9wS&)|;f;oLMd~O&>Vq;HXIlvu+OWNOWRDEwM<6_gUtavVxqL6vM%Ms~O?c7qk(fZ}mPQ$uHTCUfY@zN127WN~6Y~IAX zk5|V=0-g*7%Y0eZch+(8;i`SNQw@ocZvUxNz{Qk4*w|d9Ls*N*y|uC(xrL@*}uyd+;CEiJ+O~7Tl^Hy7vQdYa-dm*fCCxtNrXW+ z4k=!IKqgE*SC7`kSBQt^@~B7NY-W|M955sMVSLmRmwOwCIqWTAAu5UGJsNt^Y|lGt zi6Wrm!jH&sDtg%DOF$3U=1$*yLi4Pr#~OW4AZRb!x2#`|mcH6Z_Q8bHl6!|7vnYFn zN}X1HwA?=Pi?DaP30J#B6K=san_It#uovXo$^X2WreC(-sG!gE@ zSBMML+ONn${$jPU=59(WVEPvmJf8;E{$Ta5-&qjd&#BMDxz$?c1GtqtSp9o<7MNub z3vL2#8!ibVBVT5ZaSbuCfKIWYVw|oea*uKOM!q&D`a^&tw0xTRsIO0yAdW}Y;RV{b z`q3Hky(cU-?;>Ja&kzTYGb7eY(@~W4Dri!pJYYh^Vj%Thc+v}>NB`zgGyxHkEA zD(rVqGjPW*%Z$=1P1D^P?&z~7h&}M(x0kg|G-OdY>7E_!j5*N#SLGP6DGs!!cp*|< zZsEB2E5Ti^p#tmxwq8XM0=Mi3!BDH6P4>IxIlGDNSJe*z#qX!VedjeMLA7)bhJZec zq#wjSMjqxyxkU^6=3n6oK~21n{(^X$s5K$y7BK7 zf>?wdST8iyCfYu;iMsbi;32L4=0wBbL`>1n*#_ydB1kIjc1K;UB#Z=M3q+7+}5xFPg32QJcm}B!szwtb^;gE0yUH zdCJaMriHjm^=Z9E2#88ri11sU0*T#ik&N&dc#bsHao*@|D-VpD+wt3#E+RHsz zk5B9RyXExdvkwcPk0>@91!1Af)!*_C)4n3cADDIDNFr#kEMIa^yl z%3zN9q4x!aYh!l=f8eB#vO%u;l-s=h9f(8%-MtHSOAO%+q-0T z>mjg$-a*%KiXYd((j&%WjxlQJrV>_Ym-#u?;trce%ROCUxy12qx#d_oaq?@>Y&6A- z&IT``9|JnP0^bCSdARv}LRf*KBeiv>j&+vKBQ}^j-)^I|F~vNvklOuNAY}h2*s-V_ zU!7H1{a<`p+?)5eE5rits?J^SQ5S9Xy2lm?q=XO3fgn6)@>wZoIm4hVJv_z$6}}hm z@vb-x?QD;)9|x7j)Eo6t=&*C&Zl_z+h$Dmtq=R~v@BCyCVK*L>Eur5bO%wjYwcD&|EM0OiD1k?_sO!WgFTZT^(}M0zp3R${bSEvNxED69^{B@$1Q(N z|9)9FGz1**J>=Ry3vG#h5d7lM;V+^=+ZV3%u?%&61tXl(wgm|Nl%unj!9Wpm0Y8D& zbZKMt!2t~BejFDY5Y)x0&3Mi$Vz>`?Xr5}12o>p$|b!q8`l7^SiWe$ zZ*2oJ;Kw1&p~JzGM~x1;k&@i^;N|1$ufDS-KW)zxSR)`ZxQ}g_ld=HPBN?x*J+O=s z73u4xsXEy5q*B{=ss--`PE!aqw<5|zNo;`RgEB5Vf~MTZoic2|yHGuw?KjgCuR}qu zoTG<{o9hAY;O-O72B*oJ>*Jt$U~?Y-OT8SrxnAB-FKAzEn+5uL=jQsEFxuwo1h)+h zzc)FvY2hU(K@h!rT)p}$B*FTaHtGn<=kT*ru6xf}!j>wJIc54z3g3?E5t>FtA_Lrd z;MaP+S}MV{2(Ch%sLP0&xE2cS0NgQ3%p^8aL&~6m;$AX%l@t?bHXlXvP%u5Gl}Y`D zzun?=iH?+pyLVY@))(c!yV*dAq`aK0ljlf3t^-R=)Abh=fm*%3nW5{@$ZZ1Q>u)v_ zXTs?vM^;QX_8hpw&v!X^DYRP~s3YthyMIfskO#@RT@CBH?e&`Jy1kpwy<_cf*KLp0 z1K+$WR(HHSfW*?q<#5-GG<<U~&!BE?bxnw(o5Xt>{GSq8lr9rv zpHpIAFvuw-`<#+*&gSxxO4Ah3hHnVQA=i9^vy*?uSE(g@9E6O)wX;0P(T0QBr)}dJ zan7^`IxcMss#!9hJ3Z81aig18j|wKFb(^AnZtk^~;vjl8sGh)+ftk_T(ZXrZoku&n-u8{WHYx}X>NjVaeR$-09K zVjHBIa52q&kzsdUN>TR%AcJp%v_3+LQ4HMYvO;ZVySEWw^(QyKkTvYq%L)!MX>k|K zFa+6MdF^3x2pcyLy-83L6NaE?-76S@Fk)`}_RNcHe(h9Q+F3i;a#{rm9lL5fH8EJ#T9__ozPKl;8Y@K9A`434M+$g3Twtf1uB|<%?5~&%^fo zq>lZhdq`P4uFqpiXPnU|NtW;FlN3uGM9_0@$MGWC&$v&2&-;2VFI~UiQVHXegh~Bz z`gtYZ=S4)G2m=(#Je)(|+flKgwE7R(qR4@tEDuU6aK#85CAv!!!q0F^-+#YvC7}mU zoX%LpGBE^*la^s>7=}$AmV^*a9azX)1hKJ!=oqa2&dmY3Ij~%gkgT;Kpg!9iOkLUZ ztp*9-(uf&V-La7(B|1cn_KrE^tGge_9;hBE$frl;{CQ0gYPY(vJ;48mCVq_0j$JHZ&3vfh;;*5Uh+P=|WDm`8W794p%-*ZX;+8vzvS%y$}yV8@! zvjiJMl@8wTVi$|B3_!uhVK2~^6KW|o!A}bxudLrM(C6UHF5%uUp&wlJ@2oWQgRB=c z8`QCHOq5cp?=GbkttzaryIMOB4K@l4H&@LUhK)&V` z^m&%+=#1`%Jsc~T7w}SqVF&wBjOz&p56IEh0~XJL&8o-AV_NsK(mlu-=r%%xIA_c~Bv}{R z{?6_Fns*w3N%xjY-Y8~$vY)a_9)^?JYuq+vORjz?aqic3Z^^Z7*;z`f*owlSeM+2; zaYJUT%Ru^b&3&8tTm2_9jaSg$F`JWECWtoouo28y{=|mSTl_6unk@2Y#j^F~**Pik zVl8ex4Z#UAF+f}oy2_##$Q^M5`a_s2^F+w#io{z(?nFn#-a>yCH|a8Tmkdi))E29V zmVq+O@a330p<2i`ZMk0=X!ZM@tbCjA2(wdQzaI@e!dgd$__Jr*Gd`QzkCe4T$XVSd zf(5+>y;aY5BD`2_=w*5M%xhZ@dS@I8=%8w?NUXNocl&Qay9CZQ#SU2d0N z>Q|IGehY=LR#)}u<|^tp?VJz<@X%zh&&8q5e~2D;3kf2~l9}ker@_F!2*1&Z7cR9U z`s8l}taC|V5^6a@$Xdrw^YBT1K4?xgaci*#JyV4s!{7-B!L>qUB96%d8zjX2k zHvJOCrPYNk=Jqux56uc{AbDr25X0A0#(N6of;_p_sGfu0UnlbOfle%T#EBNs?qnNd zl<>L@t1O6WrYa>bj(i z!(1LCbn-7JRQ3~-nJ@x_zvx$>eLE}(mczNu7X@x5`e(>~rJud>LNN=6ppGEn0srk7 z0-@mIWJZ-)FVqQOg7Ik1mcE-HF3NLQfwZMK7t#hdi|Y21m`F)s7V_H}aFzX*Yn_ht zLFI#xWo=vGx z-s%?@F!-~y`a3RsN2kMOE!H1n%aO0|4v~(E$YyDKvTZ-Nq!)N|u==;}6i~H2z8Sz^ z@xjEc!DU)&^(RQ&*oX~F%}rA$*tf;o`3-_B;V#>-25%_Y*n|rk3kSu?XU-%8>xAC& zd%?1%%Ifff2ek$iZZ0sA;|GJ{^YLMo*sFWt8+#?hk9!UB1CHOM)f1lb{ICUzn#9pPFq&PI~e3`mlG5CknkKPdG6UbWB+Kilmo;l zBzK@KF7ndaTBEO>nY%iVl+E4l3`VwlXh!hYj>r#_zvcvcrgRLP=IY$=h>P$ES0T}m zLXn=rFW(;~3DGwbe71O2S{eQC!q5NdFTMAF|Fffi^1mJbH;;YwKUhxp{^vjX<@X+W z;eYFANTpkcK^6nANStDi zfUfdzH~zD`wmzn2UyP~W|0urvo%r(m`Xb17d@&a#|0qhnbRe#;Zc%>HePaW4%6#t` zyKAuHgYC2TkEwvUJ(#{arjL8SGRD`Z`0BM^*4Mk$ZpZb1d5=bacE^q1_n)iw@x_;4 z(Zj7?^raWg(figNtN+El|H-{K{_em3Z}VY7~{(w{<~=RWjV-~?Loe*2l;aAeNF#2zNwk3=dCuMG5x)3 z$5;$LrrCbHL)3W{@K=WO=@xx?k7}(9c8nP=ZhW(u?3W@3^_+Hm@gM8kT_EmrebJix z?5_WFmU8>*_4`$@ef8J%^*0|FyGwtCZISrBW0XMa%=h}2zD!@t*=l{kETh$qFQ{)z z`^DUjFMgSRwP+9ML$Lg!*5%9MyGTa>+&kE6pO*$(x3dQKvU*MJxv%-Es8d_g=JA)& znIHp1u>xOI=SyJy;=j?C`^LT^vb_G(T|lePt)l+BY%v9y<^fx(t(9C~y(>Tca?4Y~ zmMBWtdP>;Rx6k$E-us>kY~8PK4VpyHtG})FnbE&r)(^G0d&dj+Y8l4w+PdTLea)8} z-(+P(NMkSnm5=M+Tl)7a^zb+Dwsm{#uDkD2i(%JVku50=^iR~7cKixUcw@$JdSm8+ zu`PogGpeHh>w*5lL61SUkKLUH_p4VLyE*Z&CU{+3#AU;SNL>qF)Gd)M8M8MnN?V+Kmxq0hVS{kl-<1ovYxl%B(5 z(5Ghg`%U#<)>J>I*WcsMPxR|mo5trhy`Na+)t}gp-}4{8$6Q|(&|8gc^$?(c51`dl zU;lyq{R8{^kEwi~XXn3F<|6Nr#yu@-j{Sjr4)Md%QQ4#PEkBmKN2WREo%?*#W_Dm^ z?va7+ck{YW*4HIwXnmlJ42Y$qiJoVLS^x8QCv?hrO?=0BNiO}^`m=r!-ziyZlja+6 zrSo+9Mt!&6bo%*efq6t3YkuK#`|;0B$f+Pv?UXtxZv~uAKlg^(98-v|`{*%li{^g7 zgFO#-a9KK|aVia;Wjg(pKZZ&`iP@BFTHcY<(% zeuhh`{c*m;`Wu0gxJ-RV6fnRs0dPG1%#=C@X(v@QuF28&&wAl|s>Ai*Tmw$=m>2uI zb-BCns0O7SGe4?ok9mdqa&YF1ul6l!y{r0@8ga%(rG$Ro(WJJ(YgR>Tu`!l)C!4m>lVL69OSG+t0*`IB$7-!xj+nvI07|KjU32T=QG* z>l^JyJA%Va_0#-RhVG5b%C~zU=2~r63WZmQtl|w6(nQR1uR?=@$eYh&rs#%nJVQ>ari| zeXW$5_r|(!b#$@<5RQgms)w6Jxi{AT?zBY;cB>@#MN?H5??t7r{)4TL-H+hKGSG_4~NV+Apo`dZ%bkylMMZLea1Kb88paRBX`Cc zhCHTko&&M|8b8&$vV^^B!JpT$?^#|Wp1QWG3AMj`pX~*7>+iSnE`RMEQSSZpvmPV& zJ@Gbu3`mP^x!3P!Lt6Ab*=MN*V~t*Q8z`=jqRl97=zEsw+@BKahm#1JJ6>M5aBY-1 zymgu5^>u5tJZwcD%i1UPehJc-ea7#2P8gKqfb7X%9QIL{MqP64^YsA%WnBu6Zv3yM z@wjp7h4P{ME(Ng@%%){Me}|x3n{3-|ZJ$NA_Ws`5qiHt!c07-!;kurW-bcB4Zm~Ar zXJ6esv#9I+cIi9!TCb(|-L0Q{uIqdMecX^os42il=xdS3s9R9}mrXlaEb1#VW9-Xg zJFb7lJa3OKtXjn2kIY54uYZ7>|Hl?cS^Wcjv$}ump8X$NwLh@Ge|)z~dVQdV?;{*~ z9y7`fEBlmX^;=v2%Eyux%jrilAn?DJ^m$Qy{ExEZ7$jz{*1pj4yvBw9@NtZjlP((zh8dkZWXA_7jyjiQnjg|Hmbm1!q1Q0rMT5& z5hT<1`1)8;em$38f6Sr#N171^rDmisu0>%KtX%yqjqr`JE&2CW6>J~-N>M<`Fb?@+ zHBpE3B*a^XVX0nMc(>?SK*y6NhK2<@w{>ibtXnnLcVWn4@(O*b;Ad!U(NFz|0BCe^ z{m1&o`U(q*m@%-vZGE7zne}z+*T?RTV%F4uMWj?ETfgCzbJ4J)x!lp5DrOJ`=%2-` z6gM=e|KIk`2gdH|%J0AT=FfZcn0cQ0*#-k|yl+^WPN+TD#$1&?YDtdzL2aODc8zIbP#$Z$Fgy;!)BY@9#sZiTkgQqCd4y0Y7M&4sus^7&iw8w)UeMzyJ$|6a4@FWE zMuX=I_I%0>&{Ix2eJn5N$H_SoK~mcN+{&lBA&P`CCh0ue0+M9$ETwyk86PfRKCL*H zX^i~fp757RZ5vgF_!L2ewj<2z3wE0lh6@%a!aF=veeG|rB6XD*|uP||2O{X8;!6Y8WMWtPGP^9)|;w_DrCoihY z1$McFbjf#=oLmKYToii`3KYEt?t0poyzGGgvQ)Z9rHqf0@444YQu8P0G%9IO^q5!k zCvM9z(e6{6B=pHLCE6m($48l1@y+NdkiL<0!g4#{W9(cghO zo+so9Um@P9?M?EZW})C|+ckx*O{w%+8vII@(n*U$TLC%1*q3}?9pI%k>ihJI=f~?S zt+u9RE~BgMWZfxkxYk|wwe#kcSDQUrYPCV7wU_Q!3vHeKC{X&*n1FEALVv!W-3yjH zdJy$%4aTn}u)u1HpNAg=zky@mEe|SBc@R%pkhF2dp`2w+5_=@CTjJz(Ln4vP*9}o# z2W*V)8~kkCUT;4GTcF`MBK+_>C%B-$FbM|~C_=_7ts3L(J8jz zd`;C2)&P5vYpZo^!woy(O)hUG>#Rnd4XF$wimgc-O<*sZpwXiBvI$gzEFxuZq6CAj zRfy;~{e{lYNp5mq;^=gCH`$b#AVg8Rvn_oaQ_A(2wJ4j)`oDaUeYNsn@Cy8W$yt7G zTW-*KH0^RZUjU9s02ZjDb}Pw&`W73GUKOAbS|x{|>Rv!~*v7&VwEqTe1G&;dqcr%R zl9SnHGu)5eHsO@H`;zl+SkLj%|@>m$rH9PIx~VRZueY5wvGgxx|1W17K?+Z)$;%)o0J#=70@>fWAu zJfmwA{~I;y1r4}1Kba1DGj7JK^lV%fePf&+>)e#0mQ&Q#SKVbpSlwk6pQ09mAUM@s zLWjKGwykZhm15q(i_j*;t}1pyQ(6MA1O>(ZwFGM=@Wdm$)9wE^8%3R}D-V5g!T~6( zLiuC*u4ECEv!Sf~Wy)952C$IYdUVpzAq$e8ccWuY1LjG?5A(PG9e+YL=L2#l^J)uk ze(L55Yf;^QwOZBCqn0nF%faR&|20$)DR+3nh zs&5?;CAwrp6nGhkDVPz-hN{C`vo+phaDy!=pAj6(XJ{19yur+Z2ZI7os$i+`q?^`G z&MhMcSm%?14hRjBh|ROd#QO`yGWX*r8ukdcRM0#{;sVV6(j-JdaYk<(BtlN z1LE9fl3+vPW1TTXWdmL0SFj;bzVh>AZH_G3pu9_@VAPRSD-4_VI3D|G#_%;h>ZIBD zs9Ah4v*0yIo7i*7o)<;%3StThwweM?t&E91m+W~FhPa^qCVCiEx+vR??dbvwu86u! zmf|u+F>9YfiXJ9m|Gm=d6$C^3B`x*ED-&Avk4b(EFp?nxp0}F?782KIov0hlQzssCUH>6 z&r%2fhWF3x%s(DsygtBK)f3n2_&^9h1~*qidFXD*53s-Y{hKGP*QL_)2*$vlbdp_bL* zwC(*{=WKD+-TKGr>jiv(@wr?9yWYQE%>V~TogL7HF3y-}j+JW)Sh*YV-5iZRQjGpL;@O?IF8T1dDt=_CFWfSl2lip?cDXaEJqPV^|1e!Vc-W{kH*#bF9 za;l{9V)-Elb1e_TM0c!5^*7q1)l2MkbfIplR=iw(0W)lq4ZdH3(5se}R;-earwhTd zVcxaiiv#iqX|!1v7P(81p>aRFHSsm?&a<_UaJNKDqkjj$2~2<}m7wYXmz9CXZsyVr z%|q0Pkaseu;n0bQ|JDzlv_1|kBP%&uz0{831bYzj^*(^Xh%-BJCK<3g$tiJ7uNl81 zZdOVdBwe2T;4#H!?T)tK_g-IetPK6p4QiaZXvTsu#P2pj|OxW^+rb)DKMSZC`v|1UNRj| z1?|~Oc__sJa?Ai(>B3Y>taVPC$@S0IuhFNE9-^?;2x`&{(q<#bqj*ihBcv72m{(`& zH~i<-FKOTOk%>~2^YST;6Gt8=KhArb_>r7+3uYcaB7FwN*+5wbB;uk|ge3^=xWGNR z9J4PMid3fr!#W!2UWLdEStk2w1(|f9-5lHIky?YF*JPY&=jz00+eiI;Y$Ryf%XfmECncRD&~YV5kh|Ge{%-9q33+D(UYqmGwoFWjO1BScHNC zfvON6EvQF_*vT1-E91ev#L<>s3#a?rePmOBQaDwVcW@BFg>(xh)IqK#>5**^Dl-Hk zEqRYqxm0FsC^)@QF}0}1BTFg#9JJXORFrgW?P)zQj*r^qZ-hR@fny$=j>mnVFMDbXtNNWuG8LK-ZQZSN2-!k(Ve`r>BT2is9yMUvi9PlFYKfp5XnmUiyGRuS5>7d1!*f7^IC&1N=uM~B0`To2<1 zypr#ZTvg^lDU7OH!K<3r2eHXRf^+40bzFAalcML9=bcT5Z(&gzF%f#!$uR9LLYC0xRYhBrN!<4NlflO)A&YPL4{ETfn@>PBN%5 z?Sp6&f-h>1q*Rg-#a%2UGUeV4QA)WJS{$xI6SW&PYwqEemfd~57Z&Z+Hzl`YFvqJOHAtw)< zZF08d+i>>C*^}?V*)3;xz8hy&&aB%&v7Mm)Y`$N6A~{9m^4ifvCj%1e@JXivJM*13 z?x#h6X|HzK+U(t*XKRQxUp5B3SSW;=$!VaFCWQ--S+IU zCpv6G+B!P>|DTD&#H8|CY=DmgRiQ8Wma2cU&u&Dq<9>sBG27cYHzbxYk6jymv&)ATaDj8}`Qo zwS{lMqisCU!pS#&GesJpF=o0h_nD2FWR^?6!=5C8%HGDEkT;rIB#>IM_7bKVKa1rq z;?c@I#FDT08{tZIS^te6^0NMsM(X}iZ~iYflDx}Z*RQ=i_TNPSA@J3);8^l&LAmBg zGz_Ex`V0dOnK*k_!d!tsy`)8uhy`A#x%1ggDJE?%gqmpVh*FlUd?xKQ&hW@rY5la- z*p|`qf_o*doDS0uyQ=(&EU7j7WF_n2{sh3E(6j@y-8kNQtXL^-_swZ&j=92De()ehpr zKIB&G>eeikxNhb9lu#X{wbsL}2AyGp&TtJn!&%svxH|0jD40-qRHp$AEwB7>^<*o& zhOM+62G1R|!s_4Qdd~}R(GWRQfD*Xwt6sXGy@qVI+Z?zRn2S1GsJaf_Q3C#`26vBb z9R_gbwUF0#i&H5plLi|Y zcOpk+wwlZY*>cB+FQRT+{W~ANkZ_o$eh^1ccnD!s9d|OZJCr3Oeo5uq?dgnP9mD{9 z^&5ra3T^MOo5GnzzfYKz7p4UM1#CHPgLXV?gLWLO(=Z>07ceY3?g+^7)+umYJYczp zp~C{OO;cZsIWNt;lf11s9FzhwoK$08u(7Vnj0ca#nx~p@%Bni$5cZTuSf=li3wKRA zrKzB{ovQW2d>B($lSyyqhne@~CBxZM9;Z)voIaIzIDIPLV}#%o9MAWCN{8K)u~#j9 znRxB(^6QPv@{GzI`<{iiga-JK)sfj5){@}hXPqtIlN{#+Pt=}7(G!r@PDwlX?|)$X zW|+(<#lKJO`t!4uKZv&e(YJp8&mYZCqDqQ>WYi zvh&D;|MGYLXv@?8d;eAc?$xWlcJi73^51{w;M-R|`6q9`IJ30re;mH`hJXFqD>wbw zEf@an+rM|}`k(ys7ys+Afdh}PIKBP%9$fsxncqLX|Mfrp#jXG0$qiqa`oqq@{N1Df z>3_X7yz}ettok>*|D-DwweOrS9f+bFLM4>E3*NRpCl;O|F7bx7ZqM*G*269r(BiN% zf`KQ+1g@3QiVUU$3iKhusuF7x<6A!1#nGa;d<53;$_#M5$Oxf3iU)Y~7xb^TVG4)s zuu8{$3kA`aLOgJVh#tF+g6ln*YYpy899LFR$tloWPm5Kciggd(`d#R+S(>`)>d%## zthVypFYOzXfz>^Qr#I8?9AUue6c}HId#7!MOr{Ol>OwlJ^cP6qt#z9Y*v$o6auvdD z5k5qHGkb|Xld~EV_X>LTyz#*mx#n8}`Z9)wp{R6x(AbXhF(6)0Ts^bcl8`PwXc_B~ zWbDW=`wzw1@;WJTqjd@bLB(O~&WrnJzwEdyg@%(yEMX!!!=YA8@%S|yo! z1X$@^S<|74B>6d%#u7o>(V81-Z25W6i1$E1IVPTL$e0GwRFU#&C4;GWl9FYJ^r|5O zVlwm7#ASjsZ77fu9gq4dVetU7K;krR;du;l%eZbZ)P&U<;PGpOFFXlFiWiN`&xy6= zRVZdU9hw-8B*d4TH0OsRyNK%8l^JX^xe+4Rs#r^45{&V!UEtuW6=qpWmpTx{`wO4Q zTmi{&eSs)9w%Wp7+R%pjY!9WlV!2krw`R$;W~rq$OTU?szR3uG4J@@Z0WuJ#oWp`# zo|%tPt`cdaSF#ryd)5T<1Czyx~pFbSn573tDO_NJD7_ zEj1SelDOcef^?$}@T7@WJPu7ZABN9XixAacxK>h-rN1=J#f(s(fInh4f{+xDHWV__ zUvTL({gtk`(vM#;E;6@W*y;>8A{x;U*3bC|REp38%~uUpJ$-+}bcQA}rOOvxQJT@$ zc*#`3ig5t2$?kiv@@~S+}XNwm>t73hkh8L1f%d zxdO~Ux`1dT(Z_yeLd0bHIRUeoE>NPc?^zdK(Od0!*6Jf?`E#&)bj~Ic1;xpQc)%5C zft6>08j+P}1rWV35*lEt;pG}7;}dF4hzFpewIS9fqmuIeV|+f8aaCo8s)rNR+AHLxm3Yi&l#RPXYOyK z-71@QtbASrYa@iRQke8@R-b~}ujMLnxlV|eNKRzCL@;5hPMBDcywXc=bd3BJg_g;b zC0+Rme3_^X1!_Lc#*fq(Ql9F+6#%<;La2mfosTmaR{~NFDgl)N=Y_69l=nr{p0rDRpM)znmemZo`i0dwWK*o+w|z8gH2 zEK3{Ps2|;kP>-;iGX*pym|9kM)in(^eB=d%-P852tv{db=h0tyG;_N{g8v`SOb+m1 z+73492?x*JIIH76pqgoO4Kmf05S4LNNFW%4h5;{&L54$?T$cQCUnSMel(1uQASq{R zH0OI5X*ctr9=TpDrI~gerp-cCURVKQOvcH#2oqg>88(Pb5TVya>T)L*05Nm5D&o#8 zuP$Ae=?Zh(R!55j!nJ7#i)A#d%A%2VNvlgV0>)%XIhuJBm;`YH#G~0@&W30a&vK1D zpf|eIpvzDRM?sCO{=l9;1YQu@o_GLJfkI&96nPFCaDj(4s2x^(z@|<0&8z%!KwJ0? zc>2weFckvlWQztz=v2g8E^x^QE?MA(72rH-#2TlxMwE!2B`%r5jblhG`9(cB+@bRR zy2m9|TghT!f72zF4b`UueD!De@zUV5#lMr&WL{K;MFlKGxlB9D7UHw(=t4Vdk|U^M zsum3rz6py41MP1BO;_MT)=KHNrVLtQ;B4_((>CbhF>y+ExX#k{8n17D*T{uc7QUvI zUdW+%>(YWPD$Y-Op-&!3z}{$d)e>`C8AU7GRtjJCI!4i!U{op3t|ig<`_`Ue?!&mwz3G&P{B ze}kwY$fw@w+hN#4bL{=D?XVVG*Ke`sFf*jQTd=#vF&+@SN&4@5Mz4(?8_+1+@@%_K zNue4Z>W0Y%QwOH%l1bGTVnwNxs{~Ge?x^O77j{sR7!L8bZtvO6^Rb<;Lga^iuV79=XLQy|^`FZ@t$p{e0gwR_EpIvoew9(v zbf5_&zXM9-VXU_Vj)*ZgbdJ`0Sd`gCHr$Pf)!++%SR-Ak-*lK^AwsZnr2iq--moL> zP*3}b1FB6cN~2bdtR^Y7CntUFHVyhLLRuiWVad3C6&y_r=^1?sZ-!b%yD}{y!hKhCN=(U*@#w)P( zixQUw*Ru$E0W^_}!~-u0z)K{eanvqJTwjv}rql6Ae)U5P6-25MgPS6JaCb-#JFCrR zxH8yn8wV9Fel5#t)s!_9=|*b3AF1^~XA#i$uZ*^2j3L#uvJ!IWc?AYW$p#8{fE8n6 z8O3gNz!jgM`kbnVdr#$n8aR{-iNoYCyDJxS!Y?6zOFC_BXWO*<)FxFm3?foS7V_V& zBZ4Q8C9G?Ov^Y#_p!9k!PWrK(4XojT%RyOu`NIlrzSJ@2H`O~=k4Cp7! zIL!zm9!lMWR)&2J>X8GwkhEb6P;gp8=fT7X z%$Y2(^xrC`J2@4Ck%pno2uNjB4wM-DRSEDPtG zvXqQ#8nvVN%&g=H6YtDLjS94YZ)w=qvy2*8p&DhV`f_tp3#8=~@q+c)q zZmJOpeaMQSL4BAsIJz-nWD@fyiWPJhly7dcG_|c`%IdN56%?eRv%pRA<1yY{dOPZl zL!3V^8%f@_0BsU2gG^Y2#~zE=YEP5Fs~c<~))MS~p(jDb_7Z_DZzGZsB9GdpkRAPL3goP++osZ)RntUTNQX8Zk2=4Zx;Q@Pz!KMWS79<+qaX94)Tz~% za%%M4m| zNIxcoJI)M5JS|Q zE#z^bJVU?-eK%xzS0}9x#WkdPkD!JqGHgZ`*TvCQs=AEiiWpG4^0!pNfZJPb?=M<7}VGpxCWG5f95| z-N!spPxOQ(dV*pptyXOMiU@`R-mCm-JS;VsW%MC1B8}cIsW&ZYm&-)^WR_n`lLwe} zk7+}tC{kj{xQ&VN*At7|QQ5p{9!G~w2aOat%xWTOa@asJ#)z_%o-ofiU|^8zV8BBU z^%VFf?Kxx5d3!!$&qwWPdc1`Nb1%vw-;*yu5PHzS3@kWV_Hj%8ggw7u&!_Bp+@8{5>Cgm&by9=6YxJpFsY{JXjf=09x@4t( zSD1prrH(01_Ht^<1((QBbKzA>O64_t;Z(R}0axj30yg*f)S~eS*gOU7Gxq#}J%4B= z4c3#IDw0I!j3Yh4UXY=A`GnW}ax~nQ_!DcT21R2>in?B$qSJxBJ;TKFisGX_k0sN@6$^@5~#|&f76jothAp`!pje zpGK!}AJ&W*6W`ZY`7GFnbXU2Lspq2X{;4ByEEeE&Du|1f`&a~V1#hBqXm0#thPw2CIt8lT8EmkCsX1HhFR7ENqv#JjT$I}D>3?K6xkxsHa9 zl8gn%QUi~ChAlzuiD@k;pCgmoR}_o1G1G@IExO6Q1X7v(j6l|nvpRsr%RRjxqdW}F zlOH+6NPZ;!Q00(93{#RH;gT==v8Gbv@;kmzl>;93v*+p^T8)z*rLSO*th!f6%5>ZS zLwQ*drur&hHP10Ulb6D5gTi#I;1=n@3UTFW$*YxT91KpVa|;)O6`EV~ zxA|>QJ4eFSq!ywVk?h#-M1A9z`E4e*W2^$mxAjXGk5azJx)xHv>IElh*hoPCjo$8M zI@6RctUwx`biS>P9WF-MnKo5dp(2G@2nE5VFhIfQPuF~!!RiA}m2KI0;bMs7S|)cf zlMtRO$N0(ky7Fxth6jJFbBj=p@AOr^XFI|#(HY_K_Y8{!FAz`4j{XiQTPwH5l~?*Z z;9byS06(-TFV(_ziig6#&&IFLW4sRSX8Ia6y0}uCz)MCMum&h!)R5S8ya#1^DhPe(v2)~+E9U~)idOC%_G1y zu)cfgo9O$$TK&enh9^H)y`mahYJSa+#sttFS}Sg45u1&UmPk`Y(dF`zbImB3CTe8{ zexYy`)*9tO4|PgXv{v{)A7&`g2cw~~1#`xx`5@V3;F2Y&+g{U_ri_io3DCGy#(SAY zKW`j%`=XOOLbt-^L>pbG=!*nLlhUPLsw0&&8(NG#8p`Q^2+i z!U6n~)y53)*k*+^RH&qeBcVb!6-l-}19yoyQEw@|hp^NdW>Z#N8^#&8skT~Tj$gFa zs6aq>CZgHk`8nt%*?MUKQ{BLD@gET zAI@~E{FPu?)H=hCpr((S5)$|x0c`2|SQ$6_tvVZ9bWEmf4Et)~HwN0{3AC)D&fgRBne zEyAD=8X94E+yuGm)vVhqBV&pl4>4w#Y%wI}O)hp&Yi?%p<4{basgKJ|r3#Z0Uujok zns58*imd&}?hZb423ngADaH)Mb1S7aZ=18wh z#TWvyP*;A=mI@5Jwp8G{YDp=8lg*-EIzueDvXhzZqCR)t7zpd|u-PYy(=ovMrCDt0KUUmvX$dsqD!Op7i$O`{^LZq_(g zUV(qnU5Odkl3y(^cNuF_x3iT6zG>uf6gD-8zQ+=KWy#N5=<<$*sHrf6(IMxBp zJJJcu%6?TlN0haJ+!MlJ>+yC6Z?~+-+OT{p7*Wrz%5?b>bxhgqcq>CLWXOr-YSVFL zE2uMsbMLAx4D3LO`_t|W-IHXdy$kcJ)7bHgy?aq&u3D@SBauW7c~?roter7KW9MYO zE@;2FkfZOD%w3&+rIBBzQ zdaM*hyHim*+MVv%J~cgcw ze`TsPKQuReXm(%e3)8dvOGEf?{O#$7AJ{iu8ap&OF|~ik==^9Y6|MZ@^urtHYM~p) z2&STsR_^X}Zs**+hbAXSAD%2lg;aFa%xr1n%{b~UMEQFK!(8hXF{v(r;ed2UWco8BkS+{A&I$x>6U zJ0wDVL`Z4~g_&r-8dEX1aSC5`chH1 z3K61iJTS_jOak_~d60hN{KSFM-Up7%aW-v;QcJt>Zzvv^+c!NsIq~p@;)9IW#Prnd zTbN_~+fcmY(B%A~+0yM(r9<xqbT|Jsi;t|ZR1>N-!zCU9Qnc_mG#ej{SSa3Q~Q6dwQD%u3tECUm}6jw zqK8^0Om8F9ehsrEmx?+{Q}eS&qG%0tHH;z@YFs^2Y z#hatSk`<4cvJt-TYd$)H$&-{`)y}^d-FJL|IZSdnE8ZucJeS!KSIcqbhg>=$jbvPT zQ=%4Jl|NEgg=vcv1NVAV;zi}6WKAoSauwrD-@LSNmJ`fzy;OCLOzO4Au?q%}C%jKT%5t%e$s2qU znF9~-gqRn?3!xWASzG-YTvA`vRI9wOR*9?ML_Zc+^@ZHH`m{{-38}h^k*ZHxif4dj zTs^iD#ED)kZIZewOsBQ`ze?tFu|Sb)8(W%=rldNu)}{9Kx9 zy6k){z~vZChr+TBnsDkMj9oM$I~$jw4FS^TeRWfVRZRnMD3C0BGF)7ZaaKKh7V(lG z_WaKqsLZ8u?N7(c_;WFh&oH~f8}U-9AP!^^ZFz%pNXP(efJpAz8b)rbS&W?ba)^fZ zSvn)zE=(qbIXKLM3quO$Lk}+9iM8*%t|if#C!`*om0{xr7dEvGO)D#o{}yyMv@g5` zXmVMjY`b3QG|V}Jh7yED*s<}X>mj2f3NJy4+eMM1nN;+}PtTQ#J0|8vCnu*5-!VP4 z@6hZl%)_0Jl=dAGtFV0@QvL9u`BD+F;Ku3M;x4gjbMwDF{jk`>?O%X-xNPF7>3JB& z>8ZJ*7?0BE*bu8g2S!2F)23yA83zKtpIm}yWwVpo83uLFHTLzsOc(g8vp?Xl>Du4J zx+ioryy-qw#??1IhP@zILa`z0-QG%RP^;PZyjw~xBqZfoE<0gBZ7|MCYf^qLWU#Q~ zdX~)|Uc+>}X8aXWQJLyf&IMp%nZ|BndU*9!c-KZT1hl@_JL6vpLm&69sc(?FyB__n z=_qEM)6Kd9TWbscYg5sc$gmr48oGJt@Wj+jTmDh;enhmU?RQMi9D&D%9Nv}yCkEt@uPD()`L&W`Szo~Ic*r}hmA ztBW&;C=*P8BgK10XTLOE92p%y08dj)Mb~aefFCavM<(`_rsfb?yr81K7)PT^K+KUf z$6Aw|(pP?Fc68?6>8U#(*;ks;B-lMZJAHW0*r5OT_Al>MTIKvK|3^NbiAHv1xJP8i z1Ah@+D17|F;z;=y|03Sg`^&#jhOyiBeg**S^>QMB-0Qjw(Dy!kXkv0~FF@Qo>tODa zh14@+@LN%IhC0IE+j19!ulfCELpm4p&>hpWJ0>UZ8J(DlOk69KhQ=l*E%NWyN5yT; z1uXlPA+QXAWe6-oU>O3-5Lkx5G6a?(und7^2rNTj83KRrA&`oC>EjxU<_xRTi-YH7eCE)rZn!ZuA(>_`=Z7J4SE`3i;-!PgZzWxy#SH$z} z-{m6@DcV&3md~XneZ$ghqTlY{R=!RE47jy?J$dz^9DPSc-xZmsmMChxCA>)4jbDLq z-$NBAYAx-9q@5*oJ zVP7I&k=Bd?bA5L$ias9|n%d_uP2ZMLymAN|B5pxescsBZ!US$%i@rs(fijz+sP+qn zQMAqA_D_9(g*j?dz)$&vKh5~o2*1hbdfMl{+A|g%qSpBasMqs-h58)Eg}RGixGu~W zjJEK<6*G&`P2{M8^e}wJFpNm4p6Uy`3K2Mwab6Y z5Lkx5G6a?(und7^2rNTj83M}?ScbrdfdKpE-O49se)(@10?QCshQKlemLaeVfn^9R YLtq&K%Me(Gz%m4uA+QXAzn2jBe;<~zBme*a literal 0 HcmV?d00001 diff --git a/lib/Quartz20/mono/3.5/Quartz.xml b/lib/Quartz20/mono/3.5/Quartz.xml new file mode 100644 index 00000000..c983e3df --- /dev/null +++ b/lib/Quartz20/mono/3.5/Quartz.xml @@ -0,0 +1,19889 @@ + + + + Quartz + + + +

+ A wrapper for generic HashSet that brings a common interface. + + + + + + Represents a collection ob objects that contains no duplicate elements. + + Marko Lahma (.NET) + + + + A sorted set. + + Marko Lahma (.NET) + + + + Returns a portion of the list whose elements are greater than the limit object parameter. + + The start element of the portion to extract. + The portion of the collection whose elements are greater than the limit object parameter. + + + + Returns the first item in the set. + + First object. + + + + Returns the object in the specified index. + + + + + + + Simple C5 wrapper for common interface. + + + + + + Default constructor. + + + + + Constructor that accepts comparer. + + Comparer to use. + + + + Constructor that prepolutates. + + + + + + Returns the first element. + + + + + + Return items from given range. + + + + + + + Indexer. + + + + + + + Only for backwards compatibility with serialization! + + + + + Responsible for creating the instances of + to be used within the instance. + + James House + Marko Lahma (.NET) + + + + Initialize the factory, providing a handle to the + that should be made available within the and + the s within it. + + + + + Called by the + to obtain instances of . + + + + + JobRunShell instances are responsible for providing the 'safe' environment + for s to run in, and for performing all of the work of + executing the , catching ANY thrown exceptions, updating + the with the 's completion code, + etc. + + A instance is created by a + on behalf of the which then runs the + shell in a thread from the configured when the + scheduler determines that a has been triggered. + + + + + + + James House + Marko Lahma (.NET) + + + + A helpful abstract base class for implementors of + . + + + The methods in this class are empty so you only need to override the + subset for the events you care about. + + Marko Lahma (.NET) + + + + + The interface to be implemented by classes that want to be informed of major + events. + + + + + James House + Marko Lahma (.NET) + + + + Called by the when a + is scheduled. + + + + + Called by the when a + is unscheduled. + + + + + + Called by the when a + has reached the condition in which it will never fire again. + + + + + Called by the a s has been paused. + + + + + Called by the a group of + s has been paused. + + + If a all groups were paused, then the parameter + will be null. + + The trigger group. + + + + Called by the when a + has been un-paused. + + + + + Called by the when a + group of s has been un-paused. + + + If all groups were resumed, then the parameter + will be null. + + The trigger group. + + + + Called by the when a + has been added. + + + + + + Called by the when a + has been deleted. + + + + + Called by the when a + has been paused. + + + + + Called by the when a + group of s has been paused. + + If all groups were paused, then the parameter will be + null. If all jobs were paused, then both parameters will be null. + + + The job group. + + + + Called by the when a + has been un-paused. + + + + + Called by the when a + has been un-paused. + + The job group. + + + + Called by the when a serious error has + occurred within the scheduler - such as repeated failures in the , + or the inability to instantiate a instance when its + has fired. + + + + + Called by the to inform the listener + that it has move to standby mode. + + + + + Called by the to inform the listener + that it has started. + + + + + Called by the to inform the listener + that it has Shutdown. + + + + + Called by the to inform the listener + that it has begun the shutdown sequence. + + + + + Called by the to inform the listener + that all jobs, triggers and calendars were deleted. + + + + + Get the for this + type's category. This should be used by subclasses for logging. + + + + + This interface should be implemented by any class whose instances are intended + to be executed by a thread. + + Marko Lahma (.NET) + + + + This method has to be implemented in order that starting of the thread causes the object's + run method to be called in that separately executing thread. + + + + + Create a JobRunShell instance with the given settings. + + The instance that should be made + available within the . + + + + + Initializes the job execution context with given scheduler and bundle. + + The scheduler. + + + + Requests the Shutdown. + + + + + This method has to be implemented in order that starting of the thread causes the object's + run method to be called in that separately executing thread. + + + + + Runs begin procedures on this instance. + + + + + Completes the execution. + + if set to true [successful execution]. + + + + Passivates this instance. + + + + + Completes the trigger retry loop. + + The trigger. + The job detail. + The inst code. + + + + + Vetoeds the job retry loop. + + The trigger. + The job detail. + The inst code. + + + + + Default concrete implementation of . + + + + + Client programs may be interested in the 'listener' interfaces that are + available from Quartz. The interface + provides notifications of Job executions. The + interface provides notifications of + firings. The + interface provides notifications of scheduler events and + errors. Listeners can be associated with local schedulers through the + interface. + + + + jhouse + 2.0 - previously listeners were managed directly on the Scheduler interface. + + + + Add the given to the, + and register it to receive events for Jobs that are matched by ANY of the + given Matchers. + + + If no matchers are provided, the will be used. + + + + + + + Add the given to the, + and register it to receive events for Jobs that are matched by ANY of the + given Matchers. + + + If no matchers are provided, the will be used. + + + + + + + Add the given Matcher to the set of matchers for which the listener + will receive events if ANY of the matchers match. + + + + the name of the listener to add the matcher to + the additional matcher to apply for selecting events + true if the identified listener was found and updated + + + + Remove the given Matcher to the set of matchers for which the listener + will receive events if ANY of the matchers match. + + + + the name of the listener to add the matcher to + the additional matcher to apply for selecting events + true if the given matcher was found and removed from the listener's list of matchers + + + + Set the set of Matchers for which the listener + will receive events if ANY of the matchers match. + + + Removes any existing matchers for the identified listener! + + the name of the listener to add the matcher to + the matchers to apply for selecting events + true if the given matcher was found and removed from the listener's list of matchers + + + + Get the set of Matchers for which the listener + will receive events if ANY of the matchers match. + + + + the name of the listener to add the matcher to + the matchers registered for selecting events for the identified listener + + + + Remove the identified from the. + + + + true if the identified listener was found in the list, and removed. + + + + Get a List containing all of the s in + the. + + + + + Get the that has the given name. + + + + + Add the given to the, + and register it to receive events for Triggers that are matched by ANY of the + given Matchers. + + + If no matcher is provided, the will be used. + + + + + + + Add the given to the, + and register it to receive events for Triggers that are matched by ANY of the + given Matchers. + + + If no matcher is provided, the will be used. + + + + + + + Add the given Matcher to the set of matchers for which the listener + will receive events if ANY of the matchers match. + + + + the name of the listener to add the matcher to + the additional matcher to apply for selecting events + true if the identified listener was found and updated + + + + Remove the given Matcher to the set of matchers for which the listener + will receive events if ANY of the matchers match. + + + + the name of the listener to add the matcher to + the additional matcher to apply for selecting events + true if the given matcher was found and removed from the listener's list of matchers + + + + Set the set of Matchers for which the listener + will receive events if ANY of the matchers match. + + + Removes any existing matchers for the identified listener! + + the name of the listener to add the matcher to + the matchers to apply for selecting events + true if the given matcher was found and removed from the listener's list of matchers + + + + Get the set of Matchers for which the listener + will receive events if ANY of the matchers match. + + + + the name of the listener to add the matcher to + the matchers registered for selecting events for the identified listener + + + + Remove the identified from the. + + + + true if the identified listener was found in the list, and + removed. + + + + Get a List containing all of the s + in the. + + + + + Get the that has the given name. + + + + + Register the given with the + . + + + + + Remove the given from the + . + + + + true if the identified listener was found in the list, and removed. + + + + Get a List containing all of the s + registered with the. + + + + + This is the heart of Quartz, an indirect implementation of the + interface, containing methods to schedule s, + register instances, etc. + + + + + + James House + Marko Lahma (.NET) + + + + Remote scheduler service interface. + + Marko Lahma (.NET) + + + + Starts this instance. + + + + + Standbies this instance. + + + + + Shutdowns this instance. + + + + + returns true if the given JobGroup + is paused + + + + + + + returns true if the given TriggerGroup + is paused + + + + + + + Initializes the class. + + + + + Register the given with the + 's list of internal listeners. + + + + + + Remove the given from the + 's list of internal listeners. + + + true if the identified listener was found in the list, andremoved. + + + + Create a with the given configuration + properties. + + + + + + Bind the scheduler to remoting infrastructure. + + + + + Un-bind the scheduler from remoting infrastructure. + + + + + Adds an object that should be kept as reference to prevent + it from being garbage collected. + + The obj. + + + + Removes the object from garbae collection protected list. + + The obj. + + + + + Starts the 's threads that fire s. + + All s that have misfired will + be passed to the appropriate TriggerListener(s). + + + + + + Temporarily halts the 's firing of s. + + The scheduler is not destroyed, and can be re-started at any time. + + + + + + Halts the 's firing of s, + and cleans up all resources associated with the QuartzScheduler. + Equivalent to . + + The scheduler cannot be re-started. + + + + + + Halts the 's firing of s, + and cleans up all resources associated with the QuartzScheduler. + + The scheduler cannot be re-started. + + + + if the scheduler will not allow this method + to return until all currently executing jobs have completed. + + + + + Validates the state. + + + + + Add the identified by the given + to the Scheduler, and + associate the given with it. + + If the given Trigger does not reference any , then it + will be set to reference the Job passed with it into this method. + + + + + + Schedule the given with the + identified by the 's settings. + + + + + Add the given to the Scheduler - with no associated + . The will be 'dormant' until + it is scheduled with a , or + is called for it. + + The must by definition be 'durable', if it is not, + SchedulerException will be thrown. + + + + + + Delete the identified from the Scheduler - and any + associated s. + + true if the Job was found and deleted. + + + + Remove the indicated from the + scheduler. + + + + + Remove (delete) the with the + given name, and store the new given one - which must be associated + with the same job. + + the key of the trigger + The new to be stored. + + if a with the given + name and group was not found and removed from the store, otherwise + the first fire time of the newly scheduled trigger. + + + + + Creates a new positive random number + + The last random obtained + Returns a new positive random number + + + + Trigger the identified (Execute it now) - with a non-volatile trigger. + + + + + Store and schedule the identified + + + + + + Pause the with the given name. + + + + + Pause all of the s in the given group. + + + + + Pause the with the given + name - by pausing all of its current s. + + + + + Pause all of the s in the + given group - by pausing all of their s. + + + + + Resume (un-pause) the with the given + name. + + If the missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Resume (un-pause) all of the s in the + matching groups. + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Gets the paused trigger groups. + + + + + + Resume (un-pause) the with + the given name. + + If any of the 's s missed one + or more fire-times, then the 's misfire + instruction will be applied. + + + + + + Resume (un-pause) all of the s + in the matching groups. + + If any of the s had s that + missed one or more fire-times, then the 's + misfire instruction will be applied. + + + + + + Pause all triggers - equivalent of calling + with a matcher matching all known groups. + + When is called (to un-pause), trigger misfire + instructions WILL be applied. + + + + + + + + Resume (un-pause) all triggers - equivalent of calling + on every group. + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + + Get the names of all known groups. + + + + + Get the names of all the s in the + given group. + + + + + Get all s that are associated with the + identified . + + + + + Get the names of all known + groups. + + + + + Get the names of all the s in + the matching groups. + + + + + Get the for the + instance with the given name and group. + + + + + Get the instance with the given name and + group. + + + + + Determine whether a with the given identifier already + exists within the scheduler. + + + + the identifier to check for + true if a Job exists with the given identifier + + + + Determine whether a with the given identifier already + exists within the scheduler. + + + + the identifier to check for + true if a Trigger exists with the given identifier + + + + Clears (deletes!) all scheduling data - all s, s + s. + + + + + Get the current state of the identified . + + + + + + Add (register) the given to the Scheduler. + + + + + Delete the identified from the Scheduler. + + true if the Calendar was found and deleted. + + + + Get the instance with the given name. + + + + + Get the names of all registered s. + + + + + Add the given to the + 's internal list. + + + + + + Remove the identified from the 's + list of internal listeners. + + + true if the identified listener was found in the list, and removed. + + + + Get the internal + that has the given name. + + + + + + + Add the given to the + 's internal list. + + + + + + Remove the identified from the 's + list of internal listeners. + + + true if the identified listener was found in the list, and removed. + + + + Get the internal that + has the given name. + + + + + + + Notifies the job store job complete. + + The trigger. + The detail. + The instruction code. + + + + Notifies the scheduler thread. + + + + + Notifies the trigger listeners about fired trigger. + + The job execution context. + + + + + Notifies the trigger listeners about misfired trigger. + + The trigger. + + + + Notifies the trigger listeners of completion. + + The job executution context. + The instruction code to report to triggers. + + + + Notifies the job listeners about job to be executed. + + The jec. + + + + Notifies the job listeners that job exucution was vetoed. + + The job execution context. + + + + Notifies the job listeners that job was executed. + + The jec. + The je. + + + + Notifies the scheduler listeners about scheduler error. + + The MSG. + The se. + + + + Notifies the scheduler listeners about job that was scheduled. + + The trigger. + + + + Notifies the scheduler listeners about job that was unscheduled. + + + + + Notifies the scheduler listeners about finalized trigger. + + The trigger. + + + + Notifies the scheduler listeners about paused trigger. + + The group. + + + + Notifies the scheduler listeners about paused trigger. + + + + + Notifies the scheduler listeners resumed trigger. + + The group. + + + + Notifies the scheduler listeners resumed trigger. + + + + + Notifies the scheduler listeners about paused job. + + + + + Notifies the scheduler listeners about paused job. + + The group. + + + + Notifies the scheduler listeners about resumed job. + + + + + Notifies the scheduler listeners about resumed job. + + The group. + + + + Notifies the scheduler listeners about scheduler shutdown. + + + + + Interrupt all instances of the identified InterruptableJob. + + + + + Interrupt all instances of the identified InterruptableJob executing in this Scheduler instance. + + + This method is not cluster aware. That is, it will only interrupt + instances of the identified InterruptableJob currently executing in this + Scheduler instance, not across the entire cluster. + + + + + + + + Obtains a lifetime service object to control the lifetime policy for this instance. + + + + + Gets the version of the Quartz Scheduler. + + The version. + + + + Gets the version major. + + The version major. + + + + Gets the version minor. + + The version minor. + + + + Gets the version iteration. + + The version iteration. + + + + Gets the scheduler signaler. + + The scheduler signaler. + + + + Returns the name of the . + + + + + Returns the instance Id of the . + + + + + Returns the of the . + + + + + Gets or sets a value indicating whether to signal on scheduling change. + + + true if schduler should signal on scheduling change; otherwise, false. + + + + + Reports whether the is paused. + + + + + Gets the job store class. + + The job store class. + + + + Gets the thread pool class. + + The thread pool class. + + + + Gets the size of the thread pool. + + The size of the thread pool. + + + + Reports whether the has been Shutdown. + + + + + Return a list of objects that + represent all currently executing Jobs in this Scheduler instance. + + This method is not cluster aware. That is, it will only return Jobs + currently executing in this Scheduler instance, not across the entire + cluster. + + + Note that the list returned is an 'instantaneous' snap-shot, and that as + soon as it's returned, the true list of executing jobs may be different. + + + + + + Get a List containing all of the internal s + registered with the . + + + + + Gets or sets the job factory. + + The job factory. + + + + Gets the running since. + + The running since. + + + + Gets the number of jobs executed. + + The number of jobs executed. + + + + Gets a value indicating whether this scheduler supports persistence. + + true if supports persistence; otherwise, false. + + + + Get a List containing all of the s + in the 's internal list. + + + + + + Get a list containing all of the s + in the 's internal list. + + + + + Helper class to start scheduler in a delayed fashion. + + + + + ErrorLogger - Scheduler Listener Class + + + + + The interface to be implemented by classes that want to be informed when a + executes. In general, applications that use a + will not have use for this mechanism. + + + + + + + + James House + Marko Lahma (.NET) + + + + Called by the when a + is about to be executed (an associated + has occurred). + + This method will not be invoked if the execution of the Job was vetoed + by a . + + + + + + + Called by the when a + was about to be executed (an associated + has occurred), but a vetoed it's + execution. + + + + + + Called by the after a + has been executed, and be for the associated 's + method has been called. + + + + + Get the name of the . + + + + + Contains all of the resources (,, + etc.) necessary to create a instance. + + + James House + Marko Lahma (.NET) + + + + Gets the unique identifier. + + Name of the scheduler. + The scheduler instance id. + + + + + Gets the unique identifier. + + + + + + Add the given for the + to use. This method expects the plugin's + "initialize" method to be invoked externally (either before or after + this method is called). + + + + + + Get or set the name for the . + + + if name is null or empty. + + + + + Get or set the instance Id for the . + + + if name is null or empty. + + + + + Get or set the name for the . + + + if name is null or empty. + + + + + Get or set the for the + to use. + + + if threadPool is null. + + + + + Get or set the for the + to use. + + + if jobStore is null. + + + + + Get or set the for the + to use. + + + if jobRunShellFactory is null. + + + + + Get the of all s for the + to use. + + + + + + Gets or sets a value indicating whether to make scheduler thread daemon. + + + true if scheduler should be thread daemon; otherwise, false. + + + + + Gets or sets the scheduler exporter. + + The scheduler exporter. + + + + The ThreadExecutor which runs the QuartzSchedulerThread. + + + + + Gets or sets the batch time window. + + + + + The thread responsible for performing the work of firing + s that are registered with the . + + + + + James House + Marko Lahma (.NET) + + + + Support class used to handle threads + + Marko Lahma (.NET) + + + + The instance of System.Threading.Thread + + + + + Initializes a new instance of the QuartzThread class + + + + + Initializes a new instance of the Thread class. + + The name of the thread + + + + This method has no functionality unless the method is overridden + + + + + Causes the operating system to change the state of the current thread instance to ThreadState.Running + + + + + Interrupts a thread that is in the WaitSleepJoin thread state + + + + + Blocks the calling thread until a thread terminates + + + + + Obtain a string that represents the current object + + A string that represents the current object + + + + Gets or sets the name of the thread + + + + + Gets or sets a value indicating the scheduling priority of a thread + + + + + Gets or sets a value indicating whether or not a thread is a background thread. + + + + + Gets the randomized idle wait time. + + The randomized idle wait time. + + + + Construct a new for the given + as a non-daemon + with normal priority. + + + + + Construct a new for the given + as a with the given + attributes. + + + + + Signals the main processing loop to pause at the next possible point. + + + + + Signals the main processing loop to pause at the next possible point. + + + + + Signals the main processing loop that a change in scheduling has been + made - in order to interrupt any sleeping that may be occuring while + waiting for the fire time to arrive. + + + the time when the newly scheduled trigger + will fire. If this method is being called do to some other even (rather + than scheduling a trigger), the caller should pass null. + + + + + The main processing loop of the . + + + + + Trigger retry loop that is executed on error condition. + + The bndle. + + + + Releases the trigger retry loop. + + The trigger. + + + + Gets the log. + + The log. + + + + Sets the idle wait time. + + The idle wait time. + + + + Gets a value indicating whether this is paused. + + true if paused; otherwise, false. + + + + Gets or sets the db failure retry interval. + + The db failure retry interval. + + + + An interface to be used by instances in order to + communicate signals back to the . + + James House + Marko Lahma (.NET) + + + + An interface to be used by instances in order to + communicate signals back to the . + + James House + Marko Lahma (.NET) + + + + Notifies the scheduler about misfired trigger. + + The trigger that misfired. + + + + Notifies the scheduler about finalized trigger. + + The trigger that has finalized. + + + + Signals the scheduling change. + + + + + Notifies the scheduler about misfired trigger. + + The trigger that misfired. + + + + Notifies the scheduler about finalized trigger. + + The trigger that has finalized. + + + + Signals the scheduling change. + + + + + Metadata information about specific ADO.NET driver library. Metadata is used to + create correct types of object instances to interact with the underlying + database. + + Marko Lahma + + + + Initializes this instance. Parses information and initializes startup + values. + + + + + Gets the name of the parameter which includes the parameter prefix for this + database. + + Name of the parameter. + + + Gets or sets the name of the assembly that holds the connection library. + The name of the assembly. + + + + Gets or sets the name of the product. + + The name of the product. + + + + Gets or sets the type of the connection. + + The type of the connection. + + + + Gets or sets the type of the command. + + The type of the command. + + + + Gets or sets the type of the parameter. + + The type of the parameter. + + + + Gets the type of the command builder. + + The type of the command builder. + + + Gets the command builder's derive parameters method. + The command builder derive parameters method. + + + + Gets or sets the parameter name prefix. + + The parameter name prefix. + + + + Gets or sets the type of the exception that is thrown when using driver + library. + + The type of the exception. + + + + Gets or sets a value indicating whether parameters are bind by name when using + ADO.NET parameters. + + true if parameters are bind by name; otherwise, false. + + + Gets or sets the type of the database parameters. + The type of the parameter db. + + + + Gets the parameter db type property. + + The parameter db type property. + + + + Gets the parameter is nullable property. + + The parameter is nullable property. + + + + Gets or sets the type of the db binary column. This is a string representation of + Enum element because this information is database driver specific. + + The type of the db binary. + + + Gets the type of the db binary. + The type of the db binary. + + + + Sets the name of the parameter db type property. + + The name of the parameter db type property. + + + + Gets or sets a value indicating whether [use parameter name prefix in parameter collection]. + + + true if [use parameter name prefix in parameter collection]; otherwise, false. + + + + + Concrete implementation of . + + Marko Lahma + + + + Data access provider interface. + + Marko Lahma + + + + Returns a new command object for executing SQL statments/Stored Procedures + against the database. + + An new + + + + Returns a new instance of the providers CommandBuilder class. + + In .NET 1.1 there was no common base class or interface + for command builders, hence the return signature is object to + be portable (but more loosely typed) across .NET 1.1/2.0 + A new Command Builder + + + + Returns a new connection object to communicate with the database. + + A new + + + + Returns a new parameter object for binding values to parameter + placeholders in SQL statements or Stored Procedure variables. + + A new + + + + Shutdowns this instance. + + + + + Connection string used to create connections. + + + + + Registers DB metadata information for given provider name. + + + + + + + Initializes a new instance of the class. + + Name of the db provider. + The connection string. + + + + Returns a new command object for executing SQL statments/Stored Procedures + against the database. + + An new + + + + Returns a new instance of the providers CommandBuilder class. + + A new Command Builder + In .NET 1.1 there was no common base class or interface + for command builders, hence the return signature is object to + be portable (but more loosely typed) across .NET 1.1/2.0 + + + + Returns a new connection object to communicate with the database. + + A new + + + + Returns a new parameter object for binding values to parameter + placeholders in SQL statements or Stored Procedure variables. + + A new + + + + Shutdowns this instance. + + + + + Connection string used to create connections. + + + + + + Gets the metadata. + + The metadata. + + + + This interface can be implemented by any + class that needs to use the constants contained herein. + + Jeffrey Wescott + James House + Marko Lahma(.NET) + + + + Simple Trigger type. + + + + + Cron Trigger type. + + + + + Calendar Interval Trigger type. + + + + + Daily Time Interval Trigger type. + + + + + A general blob Trigger type. + + + + + This class contains utility functions for use in all delegate classes. + + Jeffrey Wescott + Marko Lahma (.NET) + + + + Replace the table prefix in a query by replacing any occurrences of + "{0}" with the table prefix. + + The unsubstitued query + The table prefix + the scheduler name + The query, with proper table prefix substituted + + + + Common helper methods for working with ADO.NET. + + Marko Lahma + + + + Persist a CalendarIntervalTriggerImpl by converting internal fields to and from + SimplePropertiesTriggerProperties. + + + + + + + A base implementation of that persists + trigger fields in the "QRTZ_SIMPROP_TRIGGERS" table. This allows extending + concrete classes to simply implement a couple methods that do the work of + getting/setting the trigger's fields, and creating the + for the particular type of trigger. + + + jhouse + Marko Lahma (.NET) + + + + An interface which provides an implementation for storing a particular + type of 's extended properties. + + jhouse + + + + Initializes the persistence delegate. + + + + + Returns whether the trigger type can be handled by delegate. + + + + + Returns database discriminator value for trigger type. + + + + + Inserts trigger's special properties. + + + + + Updates trigger's special properties. + + + + + Deletes trigger's special properties. + + + + + Loads trigger's special properties. + + + + + Returns whether the trigger type can be handled by delegate. + + + + + Returns database discriminator value for trigger type. + + + + + Utility class to keep track of both active transaction + and connection. + + Marko Lahma + + + + Initializes a new instance of the class. + + The connection. + The transaction. + + + + Gets or sets the connection. + + The connection. + + + + Gets or sets the transaction. + + The transaction. + + + + Persist a CronTriggerImpl. + + + + + + + Persist a DailyTimeIntervalTrigger by converting internal fields to and from + SimplePropertiesTriggerProperties. + + + + Zemian Deng saltnlight5@gmail.com + Nuno Maia (.NET) + + + + + + + + + + Base class for database based lock handlers for providing thread/resource locking + in order to protect resources from being altered by multiple threads at the + same time. + + Marko Lahma (.NET) + + + + This class extends + to include the query string constants in use by the + class. + + Jeffrey Wescott + Marko Lahma (.NET) + + + + An interface for providing thread/resource locking in order to protect + resources from being altered by multiple threads at the same time. + + James House + Marko Lahma (.NET) + + + + Grants a lock on the identified resource to the calling thread (blocking + until it is available). + + true if the lock was obtained. + + + + Release the lock on the identified resource if it is held by the calling + thread. + + + + + Determine whether the calling thread owns a lock on the identified + resource. + + + + + Whether this Semaphore implementation requires a database connection for + its lock management operations. + + + + + + + + Interface for Quartz objects that need to know what the table prefix of + the tables used by a ADO.NET JobStore is. + + Marko Lahma (.NET) + + + + Table prefix to use. + + + + + Initializes a new instance of the class. + + The table prefix. + the scheduler name + The SQL. + The default SQL. + The db provider. + + + + Execute the SQL that will lock the proper database row. + + + + + + + + + Grants a lock on the identified resource to the calling thread (blocking + until it is available). + + + + + true if the lock was obtained. + + + + Release the lock on the identified resource if it is held by the calling + thread. + + + + + + + Determine whether the calling thread owns a lock on the identified + resource. + + + + + + + + Gets or sets the lock owners. + + The lock owners. + + + + Gets the log. + + The log. + + + + This Semaphore implementation does use the database. + + + + + Gets or sets the table prefix. + + The table prefix. + + + + Initialization argumens holder for implementations. + + + + + Whether simple should be used (for serialization safety). + + + + + The logger to use during execution. + + + + + The prefix of all table names. + + + + + The instance's name. + + + + + The instance id. + + + + + The db provider. + + + + + The type loading strategy. + + + + + Object serializer and deserializer strategy to use. + + + + + Custom driver delegate initialization. + + + initStrings are of the format: + settingName=settingValue|otherSettingName=otherSettingValue|... + + + + + Conveys the state of a fired-trigger record. + + James House + Marko Lahma (.NET) + + + + Gets or sets the fire instance id. + + The fire instance id. + + + + Gets or sets the fire timestamp. + + The fire timestamp. + + + + Gets or sets a value indicating whether job disallows concurrent execution. + + + + + Gets or sets the job key. + + The job key. + + + + Gets or sets the scheduler instance id. + + The scheduler instance id. + + + + Gets or sets the trigger key. + + The trigger key. + + + + Gets or sets the state of the fire instance. + + The state of the fire instance. + + + + Gets or sets a value indicating whether [job requests recovery]. + + true if [job requests recovery]; otherwise, false. + + + + Gets or sets the priority. + + The priority. + + + + Service interface or modifying parameters + and resultset values. + + + + + Prepares a to be used to access database. + + Connection and tranasction pair + SQL to run + + + + + Adds a parameter to . + + Command to add parameter to + Parameter's name + Parameter's value + + + + Adds a parameter to . + + Command to add parameter to + Parameter's name + Parameter's value + Parameter's data type + + + + Gets the db presentation for boolean value. Subclasses can overwrite this behaviour. + + Value to map to database. + + + + + Gets the boolean value from db presentation. Subclasses can overwrite this behaviour. + + Value to map from database. + + + + + Gets the db presentation for date/time value. Subclasses can overwrite this behaviour. + + Value to map to database. + + + + + Gets the date/time value from db presentation. Subclasses can overwrite this behaviour. + + Value to map from database. + + + + + Gets the db presentation for time span value. Subclasses can overwrite this behaviour. + + Value to map to database. + + + + + Gets the time span value from db presentation. Subclasses can overwrite this behaviour. + + Value to map from database. + + + + + This is the base interface for all driver delegate classes. + + + + This interface is very similar to the + interface except each method has an additional + parameter. + + + Unless a database driver has some extremely-DB-specific + requirements, any IDriverDelegate implementation classes should extend the + class. + + + Jeffrey Wescott + James House + Marko Lahma (.NET) + + + + Initializes the driver delegate with configuration data. + + + + + + Update all triggers having one of the two given states, to the given new + state. + + The DB Connection + The new state for the triggers + The first old state to update + The second old state to update + Number of rows updated + + + + Get the names of all of the triggers that have misfired - according to + the given timestamp. + + The DB Connection + The timestamp. + An array of objects + + + + Get the names of all of the triggers in the given state that have + misfired - according to the given timestamp. + + The DB Connection + The state. + The time stamp. + An array of objects + + + + Get the names of all of the triggers in the given group and state that + have misfired - according to the given timestamp. + + The DB Connection + Name of the group. + The state. + The timestamp. + An array of objects + + + + Select all of the triggers for jobs that are requesting recovery. The + returned trigger objects will have unique "recoverXXX" trigger names and + will be in the trigger group. + + + In order to preserve the ordering of the triggers, the fire time will be + set from the ColumnFiredTime column in the TableFiredTriggers + table. The caller is responsible for calling + on each returned trigger. It is also up to the caller to insert the + returned triggers to ensure that they are fired. + + The DB Connection + An array of objects + + + + Delete all fired triggers. + + The DB Connection + The number of rows deleted + + + + Delete all fired triggers of the given instance. + + The DB Connection + The instance id. + The number of rows deleted + + + + Insert the job detail record. + + The DB Connection + The job to insert. + Number of rows inserted. + + + + Update the job detail record. + + The DB Connection. + The job to update. + Number of rows updated. + + + + Get the names of all of the triggers associated with the given job. + + + + The DB Connection + The key identifying the job. + + + + Delete the job detail record for the given job. + + The DB Connection + The key identifying the job. + the number of rows deleted + + + + Check whether or not the given job is stateful. + + The DB Connection + The key identifying the job. + true if the job exists and is stateful, false otherwise + + + + Check whether or not the given job exists. + + The DB Connection + The key identifying the job. + true if the job exists, false otherwise + + + + Update the job data map for the given job. + + The DB Connection + The job. + the number of rows updated + + + + Select the JobDetail object for a given job name / group name. + + The DB Connection + The key identifying the job. + The class load helper. + The populated JobDetail object + + + + Select the total number of jobs stored. + + The DB Connection + the total number of jobs stored + + + + Select all of the job group names that are stored. + + The DB Connection. + an array of group names + + + + Select all of the jobs contained in a given group. + + The DB Connection + + an array of job names + + + + Insert the base trigger data. + + The DB Connection + The trigger to insert. + The state that the trigger should be stored in. + The job detail. + The number of rows inserted + + + + Insert the blob trigger data. + + The DB Connection + The trigger to insert + The number of rows inserted + + + + Update the base trigger data. + + the DB Connection + The trigger. + The state. + The job detail. + the number of rows updated + + + + Update the blob trigger data. + + the DB Connection + The trigger. + the number of rows updated + + + + Check whether or not a trigger exists. + + the DB Connection + The key identifying the trigger. + the number of rows updated + + + + Update the state for a given trigger. + + The DB Connection + The key identifying the trigger. + The new state for the trigger. + the number of rows updated + + + + Update the given trigger to the given new state, if it is in the given + old state. + + The DB connection + The key identifying the trigger. + The new state for the trigger + The old state the trigger must be in + int the number of rows updated + + + + Update the given trigger to the given new state, if it is one of the + given old states. + + The DB connection + The key identifying the trigger. + The new state for the trigger + One of the old state the trigger must be in + One of the old state the trigger must be in + One of the old state the trigger must be in + + int the number of rows updated + + SQLException + + + + Update all triggers in the given group to the given new state, if they + are in one of the given old states. + + The DB connection + + The new state for the trigger + One of the old state the trigger must be in + One of the old state the trigger must be in + One of the old state the trigger must be in + The number of rows updated + + + + Update all of the triggers of the given group to the given new state, if + they are in the given old state. + + The DB connection + + The new state for the trigger group + The old state the triggers must be in. + int the number of rows updated + + + + Update the states of all triggers associated with the given job. + + The DB Connection + The key identifying the job. + The new state for the triggers. + The number of rows updated + + + + Update the states of any triggers associated with the given job, that + are the given current state. + + The DB Connection + The key identifying the job. + The new state for the triggers + The old state of the triggers + the number of rows updated + + + + Delete the BLOB trigger data for a trigger. + + The DB Connection + The key identifying the trigger. + The number of rows deleted + + + + Delete the base trigger data for a trigger. + + The DB Connection + The key identifying the trigger. + the number of rows deleted + + + + Select the number of triggers associated with a given job. + + The DB Connection + The key identifying the job. + the number of triggers for the given job + + + + Select the job to which the trigger is associated. + + The DB Connection + The key identifying the trigger. + The load helper. + + The object associated with the given trigger + + + + + Select the triggers for a job> + + The DB Connection + The key identifying the job. + an array of objects associated with a given job. + + + + Select the triggers for a calendar + + The DB Connection. + Name of the calendar. + + An array of objects associated with a given job. + + + + + Select a trigger. + + The DB Connection. + The key identifying the trigger. + The object. + + + + + Select a trigger's JobDataMap. + + The DB Connection. + The key identifying the trigger. + The of the Trigger, never null, but possibly empty. + + + + Select a trigger's state value. + + The DB Connection. + The key identifying the trigger. + The object. + + + + Select a triggers status (state and next fire time). + + The DB Connection. + The key identifying the trigger. + A object, or null + + + + Select the total number of triggers stored. + + The DB Connection. + The total number of triggers stored. + + + + Select all of the trigger group names that are stored. + + The DB Connection. + An array of group names. + + + + Select all of the triggers contained in a given group. + + The DB Connection. + + An array of trigger names. + + + + Select all of the triggers in a given state. + + The DB Connection. + The state the triggers must be in. + An array of trigger s. + + + + Inserts the paused trigger group. + + The conn. + Name of the group. + + + + + Deletes the paused trigger group. + + The conn. + Name of the group. + + + + + Deletes all paused trigger groups. + + The conn. + + + + + Determines whether the specified trigger group is paused. + + The conn. + Name of the group. + + true if trigger group is paused; otherwise, false. + + + + + Selects the paused trigger groups. + + The DB Connection. + + + + + Determines whether given trigger group already exists. + + The conn. + Name of the group. + + true if trigger group exists; otherwise, false. + + + + + Insert a new calendar. + + The DB Connection. + The name for the new calendar. + The calendar. + The number of rows inserted. + + + + Update a calendar. + + The DB Connection. + The name for the new calendar. + The calendar. + The number of rows updated. + + + + Check whether or not a calendar exists. + + The DB Connection. + The name of the calendar. + true if the trigger exists, false otherwise. + + + + Select a calendar. + + The DB Connection. + The name of the calendar. + The Calendar. + + + + Check whether or not a calendar is referenced by any triggers. + + The DB Connection. + The name of the calendar. + true if any triggers reference the calendar, false otherwise + + + + Delete a calendar. + + The DB Connection + The name of the trigger. + The number of rows deleted. + + + + Select the total number of calendars stored. + + The DB Connection + The total number of calendars stored. + + + + Select all of the stored calendars. + + The DB Connection + An array of calendar names. + + + + Select the trigger that will be fired at the given fire time. + + The DB Connection + The time that the trigger will be fired. + + A representing the + trigger that will be fired at the given fire time, or null if no + trigger will be fired at that time + + + + + Insert a fired trigger. + + The DB Connection + The trigger. + The state that the trigger should be stored in. + The job detail. + The number of rows inserted. + + + + Select the states of all fired-trigger records for a given trigger, or + trigger group if trigger name is . + + The DB Connection + Name of the trigger. + Name of the group. + A list of FiredTriggerRecord objects. + + + + Select the states of all fired-trigger records for a given job, or job + group if job name is . + + The DB Connection + Name of the job. + Name of the group. + A List of FiredTriggerRecord objects. + + + + Select the states of all fired-trigger records for a given scheduler + instance. + + The DB Connection + Name of the instance. + A list of FiredTriggerRecord objects. + + + + Delete a fired trigger. + + The DB Connection + The fired trigger entry to delete. + The number of rows deleted. + + + + Get the number instances of the identified job currently executing. + + The DB Connection + The key identifying the job. + + The number instances of the identified job currently executing. + + + + + Insert a scheduler-instance state record. + + The DB Connection + The instance id. + The check in time. + The interval. + The number of inserted rows. + + + + Delete a scheduler-instance state record. + + The DB Connection + The instance id. + The number of deleted rows. + + + + Update a scheduler-instance state record. + + The DB Connection + The instance id. + The check in time. + The number of updated rows. + + + + A List of all current s. + + If instanceId is not null, then only the record for the identified + instance will be returned. + + + The DB Connection + The instance id. + + + + + Select the next trigger which will fire to fire between the two given timestamps + in ascending order of fire time, and then descending by priority. + + The conn. + highest value of of the triggers (exclusive) + highest value of of the triggers (inclusive) + maximum number of trigger keys allow to acquired in the returning list. + A (never null, possibly empty) list of the identifiers (Key objects) of the next triggers to be fired. + + + + Select the distinct instance names of all fired-trigger records. + + + This is useful when trying to identify orphaned fired triggers (a + fired trigger without a scheduler state record.) + + The conn. + + + + + Counts the misfired triggers in states. + + The conn. + The state1. + The ts. + + + + + Selects the misfired triggers in states. + + The conn. + The state1. + The ts. + The count. + The result list. + + + + + Clear (delete!) all scheduling data - all s, s + s. + + + + + + Exception class for when a driver delegate cannot be found for a given + configuration, or lack thereof. + + Jeffrey Wescott + Marko Lahma (.NET) + + + + Base class for exceptions thrown by the Quartz . + + + SchedulerExceptions may contain a reference to another + , which was the underlying cause of the SchedulerException. + + James House + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The MSG. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + Initializes a new instance of the class. + + The cause. + + + + Initializes a new instance of the class. + + The MSG. + The cause. + + + + Creates and returns a string representation of the current exception. + + + A string representation of the current exception. + + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + is meant to be used in an application-server + or other software framework environment that provides + container-managed-transactions. No commit / rollback will be handled by this class. + + + If you need commit / rollback, use + instead. + + Jeffrey Wescott + James House + Srinivas Venkatarangaiah + Marko Lahma (.NET) + + + + Contains base functionality for ADO.NET-based JobStore implementations. + + Jeffrey Wescott + James House + Marko Lahma (.NET) + + + + The interface to be implemented by classes that want to provide a + and storage mechanism for the + 's use. + + + Storage of s and s should be keyed + on the combination of their name and group for uniqueness. + + + + + + + + James House + Marko Lahma (.NET) + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + Called by the QuartzScheduler to inform the that + the scheduler has started. + + + + + Called by the QuartzScheduler to inform the JobStore that + the scheduler has been paused. + + + + + Called by the QuartzScheduler to inform the JobStore that + the scheduler has resumed after being paused. + + + + + Called by the QuartzScheduler to inform the that + it should free up all of it's resources because the scheduler is + shutting down. + + + + + Store the given and . + + The to be stored. + The to be stored. + ObjectAlreadyExistsException + + + + returns true if the given JobGroup is paused + + + + + + + returns true if the given TriggerGroup + is paused + + + + + + + Store the given . + + The to be stored. + + If , any existing in the + with the same name and group should be + over-written. + + + + + Remove (delete) the with the given + key, and any s that reference + it. + + + If removal of the results in an empty group, the + group should be removed from the 's list of + known group names. + + + if a with the given name and + group was found and removed from the store. + + + + + Retrieve the for the given + . + + + The desired , or null if there is no match. + + + + + Store the given . + + The to be stored. + If , any existing in + the with the same name and group should + be over-written. + ObjectAlreadyExistsException + + + + Remove (delete) the with the given key. + + + + If removal of the results in an empty group, the + group should be removed from the 's list of + known group names. + + + If removal of the results in an 'orphaned' + that is not 'durable', then the should be deleted + also. + + + + if a with the given + name and group was found and removed from the store. + + + + + Remove (delete) the with the + given name, and store the new given one - which must be associated + with the same job. + + The to be replaced. + The new to be stored. + + if a with the given + name and group was found and removed from the store. + + + + + Retrieve the given . + + + The desired , or null if there is no + match. + + + + + Determine whether a with the given identifier already + exists within the scheduler. + + + + the identifier to check for + true if a job exists with the given identifier + + + + Determine whether a with the given identifier already + exists within the scheduler. + + + + the identifier to check for + true if a trigger exists with the given identifier + + + + Clear (delete!) all scheduling data - all s, s + s. + + + + + + + Store the given . + + The name. + The to be stored. + If , any existing + in the with the same name and group + should be over-written. + If , any s existing + in the that reference an existing + Calendar with the same name with have their next fire time + re-computed with the new . + ObjectAlreadyExistsException + + + + Remove (delete) the with the + given name. + + + If removal of the would result in + s pointing to non-existent calendars, then a + will be thrown. + + The name of the to be removed. + + if a with the given name + was found and removed from the store. + + + + + Retrieve the given . + + The name of the to be retrieved. + + The desired , or null if there is no + match. + + + + + Get the number of s that are + stored in the . + + + + + + Get the number of s that are + stored in the . + + + + + + Get the number of s that are + stored in the . + + + + + + Get the names of all of the s that + have the given group name. + + If there are no jobs in the given group name, the result should be a + zero-length array (not ). + + + + + + + + Get the names of all of the s + that have the given group name. + + If there are no triggers in the given group name, the result should be a + zero-length array (not ). + + + + + + Get the names of all of the + groups. + + If there are no known group names, the result should be a zero-length + array (not ). + + + + + + Get the names of all of the + groups. + + If there are no known group names, the result should be a zero-length + array (not ). + + + + + + Get the names of all of the s + in the . + + + If there are no Calendars in the given group name, the result should be + a zero-length array (not ). + + + + + + Get all of the Triggers that are associated to the given Job. + + + If there are no matches, a zero-length array should be returned. + + + + + Get the current state of the identified . + + + + + + Pause the with the given key. + + + + + Pause all of the s in the + given group. + + + The JobStore should "remember" that the group is paused, and impose the + pause on any new triggers that are added to the group while the group is + paused. + + + + + Pause the with the given key - by + pausing all of its current s. + + + + + Pause all of the s in the given + group - by pausing all of their s. + + The JobStore should "remember" that the group is paused, and impose the + pause on any new jobs that are added to the group while the group is + paused. + + + + + + + + Resume (un-pause) the with the + given key. + + + If the missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + + + Resume (un-pause) all of the s + in the given group. + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Gets the paused trigger groups. + + + + + + Resume (un-pause) the with the + given key. + + If any of the 's s missed one + or more fire-times, then the 's misfire + instruction will be applied. + + + + + + Resume (un-pause) all of the s in + the given group. + + If any of the s had s that + missed one or more fire-times, then the 's + misfire instruction will be applied. + + + + + + Pause all triggers - equivalent of calling + on every group. + + When is called (to un-pause), trigger misfire + instructions WILL be applied. + + + + + + + Resume (un-pause) all triggers - equivalent of calling + on every group. + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + + + Get a handle to the next trigger to be fired, and mark it as 'reserved' + by the calling scheduler. + + If > 0, the JobStore should only return a Trigger + that will fire no later than the time represented in this value as + milliseconds. + + + + + + + + + Inform the that the scheduler no longer plans to + fire the given , that it had previously acquired + (reserved). + + + + + Inform the that the scheduler is now firing the + given (executing its associated ), + that it had previously acquired (reserved). + + + May return null if all the triggers or their calendars no longer exist, or + if the trigger was not successfully put into the 'executing' + state. Preference is to return an empty list if none of the triggers + could be fired. + + + + + Inform the that the scheduler has completed the + firing of the given (and the execution its + associated ), and that the + in the given should be updated if the + is stateful. + + + + + Indicates whether job store supports persistence. + + + + + + How long (in milliseconds) the implementation + estimates that it will take to release a trigger and acquire a new one. + + + + + Whether or not the implementation is clustered. + + + + + + Inform the of the Scheduler instance's Id, + prior to initialize being invoked. + + + + + Inform the of the Scheduler instance's name, + prior to initialize being invoked. + + + + + Tells the JobStore the pool size used to execute jobs. + + + + + Initializes a new instance of the class. + + + + + Gets the connection and starts a new transaction. + + + + + + Called by the QuartzScheduler before the is + used, in order to give it a chance to Initialize. + + + + + + + + Called by the QuartzScheduler to inform the JobStore that + the scheduler has been paused. + + + + + Called by the QuartzScheduler to inform the JobStore that + the scheduler has resumed after being paused. + + + + + Called by the QuartzScheduler to inform the that + it should free up all of it's resources because the scheduler is + shutting down. + + + + + Will recover any failed or misfired jobs and clean up the data store as + appropriate. + + + + + Will recover any failed or misfired jobs and clean up the data store as + appropriate. + + + + + Store the given and . + + Job to be stored. + Trigger to be stored. + + + + returns true if the given JobGroup + is paused + + + + + + + returns true if the given TriggerGroup + is paused + + + + + + + Stores the given . + + The to be stored. + + If , any existing in the + with the same name & group should be over-written. + + + + + Insert or update a job. + + + + + + Check existence of a given job. + + + + + Store the given . + + The to be stored. + + If , any existing in + the with the same name & group should + be over-written. + + + if a with the same name/group already + exists, and replaceExisting is set to false. + + + + + Insert or update a trigger. + + + + + Check existence of a given trigger. + + + + + Remove (delete) the with the given + name, and any s that reference + it. + + + + If removal of the results in an empty group, the + group should be removed from the 's list of + known group names. + + + if a with the given name & + group was found and removed from the store. + + + + + Delete a job and its listeners. + + + + + + + Delete a trigger, its listeners, and its Simple/Cron/BLOB sub-table entry. + + + + + + + + Retrieve the for the given + . + + The key identifying the job. + The desired , or null if there is no match. + + + + Remove (delete) the with the + given name. + + + + + If removal of the results in an empty group, the + group should be removed from the 's list of + known group names. + + + + If removal of the results in an 'orphaned' + that is not 'durable', then the should be deleted + also. + + + The key identifying the trigger. + + if a with the given + name & group was found and removed from the store. + + + + + + + + Retrieve the given . + + The key identifying the trigger. + The desired , or null if there is no match. + + + + Get the current state of the identified . + + + + + + + + + + Gets the state of the trigger. + + The conn. + The key identifying the trigger. + + + + + Store the given . + + The name of the calendar. + The to be stored. + + If , any existing + in the with the same name & group + should be over-written. + + + + if a with the same name already + exists, and replaceExisting is set to false. + + + + + Remove (delete) the with the given name. + + + If removal of the would result in + s pointing to non-existent calendars, then a + will be thrown. + + The name of the to be removed. + + if a with the given name + was found and removed from the store. + + + + + Retrieve the given . + + The name of the to be retrieved. + The desired , or null if there is no match. + + + + Get the number of s that are + stored in the . + + + + + Get the number of s that are + stored in the . + + + + + Get the number of s that are + stored in the . + + + + + Get the names of all of the s that + have the given group name. + + + If there are no jobs in the given group name, the result should be a + zero-length array (not ). + + + + + Determine whether a with the given identifier already + exists within the scheduler. + + + + the identifier to check for + true if a Job exists with the given identifier + + + + Determine whether a with the given identifier already + exists within the scheduler. + + + + the identifier to check for + true if a Trigger exists with the given identifier + + + + Clear (delete!) all scheduling data - all s, s + s. + + + + + + + Get the names of all of the s + that have the given group name. + + + If there are no triggers in the given group name, the result should be a + zero-length array (not ). + + + + + Get the names of all of the + groups. + + + + If there are no known group names, the result should be a zero-length + array (not ). + + + + + Get the names of all of the + groups. + + + + If there are no known group names, the result should be a zero-length + array (not ). + + + + + Get the names of all of the s + in the . + + + If there are no Calendars in the given group name, the result should be + a zero-length array (not ). + + + + + Get all of the Triggers that are associated to the given Job. + + + If there are no matches, a zero-length array should be returned. + + + + + Pause the with the given name. + + + + + Pause the with the given name. + + + + + Pause the with the given name - by + pausing all of its current s. + + + + + + Pause all of the s in the given + group - by pausing all of their s. + + + + + + Determines if a Trigger for the given job should be blocked. + State can only transition to StatePausedBlocked/StateBlocked from + StatePaused/StateWaiting respectively. + + StatePausedBlocked, StateBlocked, or the currentState. + + + + Resume (un-pause) the with the + given name. + + + If the missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + Resume (un-pause) the with the + given name. + + + If any of the 's s missed one + or more fire-times, then the 's misfire + instruction will be applied. + + + + + + Resume (un-pause) all of the s in + the given group. + + + If any of the s had s that + missed one or more fire-times, then the 's + misfire instruction will be applied. + + + + + + Pause all of the s in the given group. + + + + + + Pause all of the s in the given group. + + + + + Pause all of the s in the + given group. + + + + + Resume (un-pause) all of the s + in the given group. + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Pause all triggers - equivalent of calling + on every group. + + When is called (to un-pause), trigger misfire + instructions WILL be applied. + + + + + + + + Resume (un-pause) all triggers - equivalent of calling + on every group. + + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Resume (un-pause) all triggers - equivalent of calling + on every group. + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + + Get a handle to the next N triggers to be fired, and mark them as 'reserved' + by the calling scheduler. + + + + + + Inform the that the scheduler no longer plans to + fire the given , that it had previously acquired + (reserved). + + + + + Inform the that the scheduler has completed the + firing of the given (and the execution its + associated ), and that the + in the given should be updated if the + is stateful. + + + + + Get a list of all scheduler instances in the cluster that may have failed. + This includes this scheduler if it is checking in for the first time. + + + + + Create dummy objects for fired triggers + that have no scheduler state record. Checkin timestamp and interval are + left as zero on these dummy objects. + + + List of all current s + + + + Cleanup the given database connection. This means restoring + any modified auto commit or transaction isolation connection + attributes, and then closing the underlying connection. + + + + This is separate from closeConnection() because the Spring + integration relies on being able to overload closeConnection() and + expects the same connection back that it originally returned + from the datasource. + + + + + + Closes the supplied connection. + + (Optional) + + + + Rollback the supplied connection. + + (Optional) + + JobPersistenceException thrown if a SQLException occurs when the + connection is rolled back + + + + + Commit the supplied connection. + + The CTH. + if set to true opens a new transaction. + JobPersistenceException thrown if a SQLException occurs when the + + + + Execute the given callback in a transaction. Depending on the JobStore, + the surrounding transaction may be assumed to be already present + (managed). + + + This method just forwards to ExecuteInLock() with a null lockName. + + + + + + Execute the given callback having acquired the given lock. + Depending on the JobStore, the surrounding transaction may be + assumed to be already present (managed). This version is just a + handy wrapper around executeInLock that doesn't require a return + value. + + + The name of the lock to acquire, for example + "TRIGGER_ACCESS". If null, then no lock is acquired, but the + lockCallback is still executed in a transaction. + + + The callback to excute after having acquired the given lock. + + + + + + Execute the given callback having acquired the given lock. + Depending on the JobStore, the surrounding transaction may be + assumed to be already present (managed). + + + The name of the lock to acquire, for example + "TRIGGER_ACCESS". If null, then no lock is acquired, but the + lockCallback is still executed in a transaction. + + + The callback to excute after having acquired the given lock. + + + + + Execute the given callback having optionally acquired the given lock. + This uses the non-managed transaction connection. This version is just a + handy wrapper around executeInNonManagedTXLock that doesn't require a return + value. + + + The name of the lock to acquire, for example + "TRIGGER_ACCESS". If null, then no lock is acquired, but the + lockCallback is still executed in a non-managed transaction. + + + + The callback to excute after having acquired the given lock. + + + + + Execute the given callback having optionally acquired the given lock. + This uses the non-managed transaction connection. + + + The name of the lock to acquire, for example + "TRIGGER_ACCESS". If null, then no lock is acquired, but the + lockCallback is still executed in a non-managed transaction. + + + The callback to excute after having acquired the given lock. + + + + + Get or set the datasource name. + + + + + Gets the log. + + The log. + + + + Get or sets the prefix that should be pre-pended to all table names. + + + + + Set whether string-only properties will be handled in JobDataMaps. + + + + + Get or set the instance Id of the Scheduler (must be unique within a cluster). + + + + + Get or set the instance Id of the Scheduler (must be unique within this server instance). + + + + + Get or set whether this instance is part of a cluster. + + + + + Get or set the frequency at which this instance "checks-in" + with the other instances of the cluster. -- Affects the rate of + detecting failed instances. + + + + + Get or set the maximum number of misfired triggers that the misfire handling + thread will try to recover at one time (within one transaction). The + default is 20. + + + + + Gets or sets the database retry interval. + + The db retry interval. + + + + Get or set whether this instance should use database-based thread + synchronization. + + + + + Whether or not to obtain locks when inserting new jobs/triggers. + Defaults to , which is safest - some db's (such as + MS SQLServer) seem to require this to avoid deadlocks under high load, + while others seem to do fine without. + + + Setting this property to will provide a + significant performance increase during the addition of new jobs + and triggers. + + + + + The time span by which a trigger must have missed its + next-fire-time, in order for it to be considered "misfired" and thus + have its misfire instruction applied. + + + + + Don't call set autocommit(false) on connections obtained from the + DataSource. This can be helpfull in a few situations, such as if you + have a driver that complains if it is called when it is already off. + + + + + Set the transaction isolation level of DB connections to sequential. + + + + + Whether or not the query and update to acquire a Trigger for firing + should be performed after obtaining an explicit DB lock (to avoid + possible race conditions on the trigger's db row). This is + is considered unnecessary for most databases (due to the nature of + the SQL update that is performed), and therefore a superfluous performance hit. + + + However, if batch acquisition is used, it is important for this behavior + to be used for all dbs. + + + + + Get or set the ADO.NET driver delegate class name. + + + + + The driver delegate's initialization string. + + + + + set the SQL statement to use to select and lock a row in the "locks" + table. + + + + + + Get whether the threads spawned by this JobStore should be + marked as daemon. Possible threads include the + and the . + + + + + + Get whether to check to see if there are Triggers that have misfired + before actually acquiring the lock to recover them. This should be + set to false if the majority of the time, there are are misfired + Triggers. + + + + + + Get the driver delegate for DB operations. + + + + + Get whether String-only properties will be handled in JobDataMaps. + + + + + Indicates whether this job store supports persistence. + + + + + + + An interface for classes wishing to provide the service of loading classes + and resources within the scheduler... + + James House + Marko Lahma (.NET) + + + + Called to give the ClassLoadHelper a chance to Initialize itself, + including the oportunity to "steal" the class loader off of the calling + thread, which is the thread that is initializing Quartz. + + + + + Return the class with the given name. + + + + + Finds a resource with a given name. This method returns null if no + resource with this name is found. + + name of the desired resource + + a java.net.URL object + + + + + Finds a resource with a given name. This method returns null if no + resource with this name is found. + + name of the desired resource + + a java.io.InputStream object + + + + + Helper class for returning the composite result of trying + to recover misfired jobs. + + + + + Initializes a new instance of the class. + + if set to true [has more misfired triggers]. + The processed misfired trigger count. + + + + + Gets a value indicating whether this instance has more misfired triggers. + + + true if this instance has more misfired triggers; otherwise, false. + + + + + Gets the processed misfired trigger count. + + The processed misfired trigger count. + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + + + Called by the QuartzScheduler to inform the that + it should free up all of it's resources because the scheduler is + shutting down. + + + + + Gets the non managed TX connection. + + + + + + Execute the given callback having optionally acquired the given lock. + Because CMT assumes that the connection is already part of a managed + transaction, it does not attempt to commit or rollback the + enclosing transaction. + + + + + + + The name of the lock to acquire, for example + "TRIGGER_ACCESS". If null, then no lock is acquired, but the + txCallback is still executed in a transaction. + + Callback to execute. + + + + is meant to be used in a standalone environment. + Both commit and rollback will be handled by this class. + + Jeffrey Wescott + James House + Marko Lahma (.NET) + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + + + For , the non-managed TX connection is just + the normal connection because it is not CMT. + + + + + + Execute the given callback having optionally aquired the given lock. + For , because it manages its own transactions + and only has the one datasource, this is the same behavior as + . + + + The name of the lock to aquire, for example "TRIGGER_ACCESS". + If null, then no lock is aquired, but the lockCallback is still + executed in a transaction. + + Callback to execute. + + + + + + + + + Exception class for when there is a failure obtaining or releasing a + resource lock. + + + James House + Marko Lahma (.NET) + + + + An exception that is thrown to indicate that there has been a failure in the + scheduler's underlying persistence mechanism. + + James House + Marko Lahma (.NET) + + + + Create a with the given message. + + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + Create a with the given message + and cause. + + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + This is a driver delegate for the MySQL ADO.NET driver. + + Marko Lahma + + + + This is meant to be an abstract base class for most, if not all, + implementations. Subclasses should override only those methods that need + special handling for the DBMS driver in question. + + Jeffrey Wescott + James House + Marko Lahma (.NET) + + + + Initializes the driver delegate. + + + + + Insert the job detail record. + + the DB Connection + the new state for the triggers + the first old state to update + the second old state to update + number of rows updated + + + + Get the names of all of the triggers that have misfired. + + the DB Connection + The ts. + an array of objects + + + + Select all of the triggers in a given state. + + The DB Connection + The state the triggers must be in + an array of trigger s + + + + Get the names of all of the triggers in the given state that have + misfired - according to the given timestamp. + + The DB Connection + The state. + The time stamp. + An array of objects + + + + Get the names of all of the triggers in the given state that have + misfired - according to the given timestamp. No more than count will + be returned. + + The conn. + The state1. + The ts. + The most misfired triggers to return, negative for all + + Output parameter. A List of objects. Must not be null + + Whether there are more misfired triggers left to find beyond the given count. + + + + Get the number of triggers in the given state that have + misfired - according to the given timestamp. + + + + + + + + + Get the names of all of the triggers in the given group and state that + have misfired. + + The DB Connection + Name of the group. + The state. + The timestamp. + an array of objects + + + + Select all of the triggers for jobs that are requesting recovery. The + returned trigger objects will have unique "recoverXXX" trigger names and + will be in the + trigger group. + + + In order to preserve the ordering of the triggers, the fire time will be + set from the ColumnFiredTime column in the TableFiredTriggers + table. The caller is responsible for calling + on each returned trigger. It is also up to the caller to insert the + returned triggers to ensure that they are fired. + + The DB Connection + an array of objects + + + + Delete all fired triggers. + + The DB Connection. + The number of rows deleted. + + + + Delete all fired triggers of the given instance. + + The DB Connection + The instance id. + The number of rows deleted + + + + Clear (delete!) all scheduling data - all s, s + s. + + + + + + + Insert the job detail record. + + The DB Connection. + The job to insert. + Number of rows inserted. + + + + Gets the db presentation for boolean value. Subclasses can overwrite this behaviour. + + Value to map to database. + + + + + Gets the boolean value from db presentation. Subclasses can overwrite this behaviour. + + Value to map from database. + + + + + Gets the db presentation for date/time value. Subclasses can overwrite this behaviour. + + Value to map to database. + + + + + Gets the date/time value from db presentation. Subclasses can overwrite this behaviour. + + Value to map from database. + + + + + Gets the db presentation for time span value. Subclasses can overwrite this behaviour. + + Value to map to database. + + + + + Gets the time span value from db presentation. Subclasses can overwrite this behaviour. + + Value to map from database. + + + + + Update the job detail record. + + The DB Connection. + The job to update. + Number of rows updated. + + + + Get the names of all of the triggers associated with the given job. + + The DB Connection. + The key identifying the job. + An array of objects + + + + Delete the job detail record for the given job. + + the DB Connection + The key identifying the job. + the number of rows deleted + + + + Check whether or not the given job is stateful. + + the DB Connection + The key identifying the job. + + true if the job exists and is stateful, false otherwise + + + + + Check whether or not the given job exists. + + the DB Connection + The key identifying the job. + true if the job exists, false otherwise + + + + Update the job data map for the given job. + + The conn. + the job to update + the number of rows updated + + + + Select the JobDetail object for a given job name / group name. + + The DB Connection. + The key identifying the job. + The load helper. + The populated JobDetail object. + + + build Map from java.util.Properties encoding. + + + + Select the total number of jobs stored. + + The DB Connection. + The total number of jobs stored. + + + + Select all of the job group names that are stored. + + The DB Connection. + An array of group names. + + + + Select all of the jobs contained in a given group. + + The DB Connection. + + An array of job names. + + + + Insert the base trigger data. + + the DB Connection + the trigger to insert + the state that the trigger should be stored in + The job detail. + the number of rows inserted + + + + Insert the blob trigger data. + + The DB Connection. + The trigger to insert. + The number of rows inserted. + + + + Update the base trigger data. + + The DB Connection. + The trigger to insert. + The state that the trigger should be stored in. + The job detail. + The number of rows updated. + + + + Update the blob trigger data. + + The DB Connection. + The trigger to insert. + The number of rows updated. + + + + Check whether or not a trigger exists. + + The DB Connection. + the key of the trigger + true if the trigger exists, false otherwise + + + + Update the state for a given trigger. + + The DB Connection. + the key of the trigger + The new state for the trigger. + The number of rows updated. + + + + Update the given trigger to the given new state, if it is one of the + given old states. + + The DB connection. + the key of the trigger + The new state for the trigger. + One of the old state the trigger must be in. + One of the old state the trigger must be in. + One of the old state the trigger must be in. + The number of rows updated. + + + + Update all triggers in the given group to the given new state, if they + are in one of the given old states. + + The DB connection. + + The new state for the trigger. + One of the old state the trigger must be in. + One of the old state the trigger must be in. + One of the old state the trigger must be in. + The number of rows updated. + + + + Update the given trigger to the given new state, if it is in the given + old state. + + the DB connection + the key of the trigger + the new state for the trigger + the old state the trigger must be in + int the number of rows updated + + + + Update all of the triggers of the given group to the given new state, if + they are in the given old state. + + the DB connection + + the new state for the trigger group + the old state the triggers must be in + int the number of rows updated + + + + Update the states of all triggers associated with the given job. + + the DB Connection + the key of the job + the new state for the triggers + the number of rows updated + + + + Updates the state of the trigger states for job from other. + + The conn. + Key of the job. + The state. + The old state. + + + + + Delete the cron trigger data for a trigger. + + the DB Connection + the key of the trigger + the number of rows deleted + + + + Delete the base trigger data for a trigger. + + the DB Connection + the key of the trigger + the number of rows deleted + + + + Select the number of triggers associated with a given job. + + the DB Connection + the key of the job + the number of triggers for the given job + + + + Select the job to which the trigger is associated. + + the DB Connection + the key of the trigger + The load helper. + The object associated with the given trigger + + + + Select the triggers for a job + + the DB Connection + the key of the job + + an array of objects + associated with a given job. + + + + + Select the triggers for a calendar + + The DB Connection. + Name of the calendar. + + An array of objects associated with a given job. + + + + + Select a trigger. + + the DB Connection + the key of the trigger + The object + + + + Select a trigger's JobDataMap. + + the DB Connection + the key of the trigger + The of the Trigger, never null, but possibly empty. + + + + Select a trigger's state value. + + the DB Connection + the key of the trigger + The object + + + + Select a trigger status (state and next fire time). + + the DB Connection + the key of the trigger + + a object, or null + + + + + Select the total number of triggers stored. + + the DB Connection + the total number of triggers stored + + + + Select all of the trigger group names that are stored. + + the DB Connection + + an array of group names + + + + + Select all of the triggers contained in a given group. + + the DB Connection + + + an array of trigger names + + + + + Inserts the paused trigger group. + + The conn. + Name of the group. + + + + + Deletes the paused trigger group. + + The conn. + Name of the group. + + + + + Deletes all paused trigger groups. + + The conn. + + + + + Determines whether the specified trigger group is paused. + + The conn. + Name of the group. + + true if trigger group is paused; otherwise, false. + + + + + Determines whether given trigger group already exists. + + The conn. + Name of the group. + + true if trigger group exists; otherwise, false. + + + + + Insert a new calendar. + + the DB Connection + The name for the new calendar. + The calendar. + the number of rows inserted + IOException + + + + Update a calendar. + + the DB Connection + The name for the new calendar. + The calendar. + the number of rows updated + IOException + + + + Check whether or not a calendar exists. + + the DB Connection + The name of the calendar. + + true if the trigger exists, false otherwise + + + + + Select a calendar. + + the DB Connection + The name of the calendar. + the Calendar + ClassNotFoundException + IOException + + + + Check whether or not a calendar is referenced by any triggers. + + the DB Connection + The name of the calendar. + + true if any triggers reference the calendar, false otherwise + + + + + Delete a calendar. + + the DB Connection + The name of the trigger. + the number of rows deleted + + + + Select the total number of calendars stored. + + the DB Connection + the total number of calendars stored + + + + Select all of the stored calendars. + + the DB Connection + + an array of calendar names + + + + + Select the trigger that will be fired at the given fire time. + + the DB Connection + the time that the trigger will be fired + + a representing the + trigger that will be fired at the given fire time, or null if no + trigger will be fired at that time + + + + + Select the next trigger which will fire to fire between the two given timestamps + in ascending order of fire time, and then descending by priority. + + The conn. + highest value of of the triggers (exclusive) + highest value of of the triggers (inclusive) + maximum number of trigger keys allow to acquired in the returning list. + A (never null, possibly empty) list of the identifiers (Key objects) of the next triggers to be fired. + + + + Insert a fired trigger. + + the DB Connection + the trigger + the state that the trigger should be stored in + The job. + the number of rows inserted + + + + + Update a fired trigger. + + + + + + the DB Connection + + the trigger + + + the state that the trigger should be stored in + the number of rows inserted + + + + Select the states of all fired-trigger records for a given trigger, or + trigger group if trigger name is . + + The DB connection. + Name of the trigger. + Name of the group. + a List of objects. + + + + Select the states of all fired-trigger records for a given job, or job + group if job name is . + + The DB connection. + Name of the job. + Name of the group. + a List of objects. + + + + Select the states of all fired-trigger records for a given scheduler + instance. + + The DB Connection + Name of the instance. + A list of FiredTriggerRecord objects. + + + + Select the distinct instance names of all fired-trigger records. + + The conn. + + + This is useful when trying to identify orphaned fired triggers (a + fired trigger without a scheduler state record.) + + + + + Delete a fired trigger. + + the DB Connection + the fired trigger entry to delete + the number of rows deleted + + + + Selects the job execution count. + + The DB connection. + The key of the job. + + + + + Inserts the state of the scheduler. + + The conn. + The instance id. + The check in time. + The interval. + + + + + Deletes the state of the scheduler. + + The database connection. + The instance id. + + + + + Updates the state of the scheduler. + + The database connection. + The instance id. + The check in time. + + + + + A List of all current s. + + If instanceId is not null, then only the record for the identified + instance will be returned. + + + The DB Connection + The instance id. + + + + + Replace the table prefix in a query by replacing any occurrences of + "{0}" with the table prefix. + + The unsubstitued query + The query, with proper table prefix substituted + + + + Create a serialized version of an Object. + + the object to serialize + Serialized object as byte array. + + + + Remove the transient data from and then create a serialized + version of a and returns the underlying bytes. + + The data. + the serialized data as byte array + + + + serialize + + The data. + + + + + Convert the JobDataMap into a list of properties. + + + + + Convert the JobDataMap into a list of properties. + + + + + This method should be overridden by any delegate subclasses that need + special handling for BLOBs. The default implementation uses standard + ADO.NET operations. + + The data reader, already queued to the correct row. + The column index for the BLOB. + The deserialized object from the DataReader BLOB. + + + + This method should be overridden by any delegate subclasses that need + special handling for BLOBs for job details. + + The result set, already queued to the correct row. + The column index for the BLOB. + The deserialized Object from the ResultSet BLOB. + + + + Selects the paused trigger groups. + + The DB Connection. + + + + + Gets the select next trigger to acquire SQL clause. + MySQL version with LIMIT support. + + + + + + Exception class for when a driver delegate cannot be found for a given + configuration, or lack thereof. + + Jeffrey Wescott + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + This is a driver delegate for the Oracle database. + + Marko Lahma + + + + Creates the SQL for select next trigger to acquire. + + + + + Gets the db presentation for boolean value. For Oracle we use true/false of "1"/"0". + + Value to map to database. + + + + + Conveys a scheduler-instance state record. + + James House + Marko Lahma (.NET) + + + + Gets or sets the checkin interval. + + The checkin interval. + + + + Gets or sets the checkin timestamp. + + The checkin timestamp. + + + + Gets or sets the scheduler instance id. + + The scheduler instance id. + + + + Internal in-memory lock handler for providing thread/resource locking in + order to protect resources from being altered by multiple threads at the + same time. + + James House + Marko Lahma (.NET) + + + + Grants a lock on the identified resource to the calling thread (blocking + until it is available). + + True if the lock was obtained. + + + Release the lock on the identified resource if it is held by the calling + thread. + + + + + Determine whether the calling thread owns a lock on the identified + resource. + + + + + Gets the thread locks. + + The thread locks. + + + + Whether this Semaphore implementation requires a database connection for + its lock management operations. + + + + + + + + + This is a driver delegate for the SQLiteDelegate ADO.NET driver. + + Marko Lahma + + + + Gets the select next trigger to acquire SQL clause. + SQLite version with LIMIT support. + + + + + + A SQL Server specific driver delegate. + + Marko Lahma + + + + Gets the select next trigger to acquire SQL clause. + SQL Server specific version with TOP functionality + + + + + + Internal database based lock handler for providing thread/resource locking + in order to protect resources from being altered by multiple threads at the + same time. + + James House + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + The table prefix. + the scheduler name + The select with lock SQL. + + + + + Execute the SQL select for update that will lock the proper database row. + + + + + Property name and value holder for trigger state data. + + + + + Object representing a job or trigger key. + + James House + Marko Lahma (.NET) + + + + Construct a new TriggerStatus with the status name and nextFireTime. + + The trigger's status + The next time trigger will fire + + + + Return the string representation of the TriggerStatus. + + + + + + Provide thread/resource locking in order to protect + resources from being altered by multiple threads at the same time using + a db row update. + + + + Note: This Semaphore implementation is useful for databases that do + not support row locking via "SELECT FOR UPDATE" or SQL Server's type syntax. + + + As of Quartz.NET 2.0 version there is no need to use this implementation for + SQL Server databases. + + + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + + + + Execute the SQL that will lock the proper database row. + + + + + + + + + This implementation of the Calendar excludes a set of days of the year. You + may use it to exclude bank holidays which are on the same date every year. + + + + Juergen Donnerstag + Marko Lahma (.NET) + + + + This implementation of the Calendar may be used (you don't have to) as a + base class for more sophisticated one's. It merely implements the base + functionality required by each Calendar. + + + Regarded as base functionality is the treatment of base calendars. Base + calendar allow you to chain (stack) as much calendars as you may need. For + example to exclude weekends you may use WeeklyCalendar. In order to exclude + holidays as well you may define a WeeklyCalendar instance to be the base + calendar for HolidayCalendar instance. + + + Juergen Donnerstag + James House + Marko Lahma (.NET) + + + + An interface to be implemented by objects that define spaces of time during + which an associated may (not) fire. Calendars + do not define actual fire times, but rather are used to limit a + from firing on its normal schedule if necessary. Most + Calendars include all times by default and allow the user to specify times + to exclude. + + + As such, it is often useful to think of Calendars as being used to exclude a block + of time - as opposed to include a block of time. (i.e. the + schedule "fire every five minutes except on Sundays" could be + implemented with a and a + which excludes Sundays) + + Implementations MUST take care of being properly cloneable and Serializable. + + + James House + Juergen Donnerstag + Marko Lahma (.NET) + + + + Determine whether the given UTC time is 'included' by the + Calendar. + + + + + Determine the next UTC time that is 'included' by the + Calendar after the given UTC time. + + + + + Gets or sets a description for the instance - may be + useful for remembering/displaying the purpose of the calendar, though + the description has no meaning to Quartz. + + + + + Set a new base calendar or remove the existing one. + Get the base calendar. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The base calendar. + + + + Initializes a new instance of the class. + + The time zone. + + + + Initializes a new instance of the class. + + The base calendar. + The time zone. + + + + Serialization constructor. + + + + + + + checks whether two arrays have + the same length and + for any given place there are equal elements + in both arrays + + + + + + Get the base calendar. Will be null, if not set. + + + + + Check if date/time represented by timeStamp is included. If included + return true. The implementation of BaseCalendar simply calls the base + calendars IsTimeIncluded() method if base calendar is set. + + + + + + Determine the next UTC time (in milliseconds) that is 'included' by the + Calendar after the given time. Return the original value if timeStamp is + included. Return 0 if all days are excluded. + + + + + + Creates a new object that is a copy of the current instance. + + A new object that is a copy of this instance. + + + + Gets or sets the time zone. + + The time zone. + + + + Gets or sets the description given to the instance by + its creator (if any). + + + + + Set a new base calendar or remove the existing one + + + + + + Constructor + + + + + Constructor + + The base calendar. + + + + Serialization constructor. + + + + + + + Return true, if day is defined to be exluded. + + + + + Redefine a certain day to be excluded (true) or included (false). + + + + + Determine whether the given UTC time (in milliseconds) is 'included' by the + Calendar. + + Note that this Calendar is only has full-day precision. + + + + + + Determine the next UTC time (in milliseconds) that is 'included' by the + Calendar after the given time. Return the original value if timeStampUtc is + included. Return 0 if all days are excluded. + + Note that this Calendar is only has full-day precision. + + + + + + Get or the array which defines the exclude-value of each day of month. + Setting will redefine the array of days excluded. The array must of size greater or + equal 31. + + + + + This implementation of the Calendar excludes the set of times expressed by a + given CronExpression. + + + For example, you could use this calendar to exclude all but business hours (8AM - 5PM) every + day using the expression "* * 0-7,18-23 ? * *". + + It is important to remember that the cron expression here describes a set of + times to be excluded from firing. Whereas the cron expression in + CronTrigger describes a set of times that can + be included for firing. Thus, if a has a + given cron expression and is associated with a with + the same expression, the calendar will exclude all the times the + trigger includes, and they will cancel each other out. + + + Aaron Craven + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + a string representation of the desired cron expression + + + + Create a with the given cron expression and + . + + + the base calendar for this calendar instance + see BaseCalendar for more information on base + calendar functionality + + a string representation of the desired cron expression + + + + Create a with the given cron expression and + . + + + the base calendar for this calendar instance + see BaseCalendar for more information on base + calendar functionality + + a string representation of the desired cron expression + + + + + Serialization constructor. + + + + + + + Determine whether the given time is 'included' by the + Calendar. + + the time to test + a boolean indicating whether the specified time is 'included' by the CronCalendar + + + + Determine the next time that is 'included' by the + Calendar after the given time. Return the original value if timeStamp is + included. Return 0 if all days are excluded. + + + + + + + Creates a new object that is a copy of the current instance. + + A new object that is a copy of this instance. + + + + Returns a that represents the current . + + + A that represents the current . + + + + + Sets the cron expression for the calendar to a new value. + + The expression. + + + + Returns the object representation of the cron expression that defines the + dates and times this calendar excludes. + + + + + This implementation of the Calendar excludes (or includes - see below) a + specified time range each day. + + + For example, you could use this calendar to + exclude business hours (8AM - 5PM) every day. Each + only allows a single time range to be specified, and that time range may not + * cross daily boundaries (i.e. you cannot specify a time range from 8PM - 5AM). + If the property is (default), + the time range defines a range of times in which triggers are not allowed to + * fire. If is , the time range + is inverted: that is, all times outside the defined time range + are excluded. + + Note when using , it behaves on the same principals + as, for example, WeeklyCalendar defines a set of days that are + excluded every week. Likewise, defines a + set of times that are excluded every day. + + + Mike Funk + Aaron Craven + Marko Lahma (.NET) + + + + Create a with a time range defined by the + specified strings and no baseCalendar. + and + must be in the format "HH:MM[:SS[:mmm]]" where: +
    +
  • + HH is the hour of the specified time. The hour should be + specified using military (24-hour) time and must be in the range + 0 to 23. +
  • +
  • + MM is the minute of the specified time and must be in the range + 0 to 59. +
  • +
  • + SS is the second of the specified time and must be in the range + 0 to 59. +
  • +
  • + mmm is the millisecond of the specified time and must be in the + range 0 to 999. +
  • +
  • items enclosed in brackets ('[', ']') are optional.
  • +
  • + The time range starting time must be before the time range ending + time. Note this means that a time range may not cross daily + boundaries (10PM - 2AM) +
  • +
+
+
+ + + Create a with a time range defined by the + specified strings and the specified baseCalendar. + and + must be in the format "HH:MM[:SS[:mmm]]" where: +
    +
  • + HH is the hour of the specified time. The hour should be + specified using military (24-hour) time and must be in the range + 0 to 23. +
  • +
  • + MM is the minute of the specified time and must be in the range + 0 to 59. +
  • +
  • + SS is the second of the specified time and must be in the range + 0 to 59. +
  • +
  • + mmm is the millisecond of the specified time and must be in the + range 0 to 999. +
  • +
  • + items enclosed in brackets ('[', ']') are optional. +
  • +
  • + The time range starting time must be before the time range ending + time. Note this means that a time range may not cross daily + boundaries (10PM - 2AM) +
  • +
+
+ The base calendar for this calendar instance see BaseCalendar for more + information on base calendar functionality. +
+ + + Create a with a time range defined by the + specified values and no baseCalendar. Values are subject to + the following validations: +
    +
  • + Hours must be in the range 0-23 and are expressed using military + (24-hour) time. +
  • +
  • Minutes must be in the range 0-59
  • +
  • Seconds must be in the range 0-59
  • +
  • Milliseconds must be in the range 0-999
  • +
  • + The time range starting time must be before the time range ending + time. Note this means that a time range may not cross daily + boundaries (10PM - 2AM) +
  • +
+
+ The range starting hour of day. + The range starting minute. + The range starting second. + The range starting millis. + The range ending hour of day. + The range ending minute. + The range ending second. + The range ending millis. +
+ + + Create a with a time range defined by the + specified values and the specified . Values are + subject to the following validations: +
    +
  • + Hours must be in the range 0-23 and are expressed using military + (24-hour) time. +
  • +
  • Minutes must be in the range 0-59
  • +
  • Seconds must be in the range 0-59
  • +
  • Milliseconds must be in the range 0-999
  • +
  • + The time range starting time must be before the time range ending + time. Note this means that a time range may not cross daily + boundaries (10PM - 2AM) +
  • +
+
+ The range starting hour of day. + The range starting minute. + The range starting second. + The range starting millis. + The range ending hour of day. + The range ending minute. + The range ending second. + The range ending millis. +
+ + + Create a with a time range defined by the + specified s and no + baseCalendar. The Calendars are subject to the following + considerations: +
    +
  • + Only the time-of-day fields of the specified Calendars will be + used (the date fields will be ignored) +
  • +
  • + The starting time must be before the ending time of the defined + time range. Note this means that a time range may not cross + daily boundaries (10PM - 2AM). (because only time fields are + are used, it is possible for two Calendars to represent a valid + time range and + rangeStartingCalendar.after(rangeEndingCalendar) == true) + +
  • +
+
+ The range starting calendar. + The range ending calendar. +
+ + + Create a with a time range defined by the + specified s and the specified + . The Calendars are subject to the following + considerations: +
    +
  • + Only the time-of-day fields of the specified Calendars will be + used (the date fields will be ignored) +
  • +
  • + The starting time must be before the ending time of the defined + time range. Note this means that a time range may not cross + daily boundaries (10PM - 2AM). (because only time fields are + are used, it is possible for two Calendars to represent a valid + time range and + rangeStartingCalendarUtc > rangeEndingCalendarUtc == true) +
  • +
+
+ The range starting calendar. + The range ending calendar. +
+ + + Create a with a time range defined by the + specified values and no baseCalendar. The values are + subject to the following considerations: +
    +
  • + Only the time-of-day portion of the specified values will be + used +
  • +
  • + The starting time must be before the ending time of the defined + time range. Note this means that a time range may not cross + daily boundaries (10PM - 2AM). (because only time value are + are used, it is possible for the two values to represent a valid + time range and rangeStartingTime > rangeEndingTime) +
  • +
+
+ The range starting time in millis. + The range ending time in millis. +
+ + + Create a with a time range defined by the + specified values and the specified . The values + are subject to the following considerations: +
    +
  • + Only the time-of-day portion of the specified values will be + used +
  • +
  • + The starting time must be before the ending time of the defined + time range. Note this means that a time range may not cross + daily boundaries (10PM - 2AM). (because only time value are + are used, it is possible for the two values to represent a valid + time range and rangeStartingTime > rangeEndingTime) +
  • +
+
+ The range starting time in millis. + The range ending time in millis. +
+ + + Serialization constructor. + + + + + + + Determine whether the given time is 'included' by the + Calendar. + + + + + + + Determine the next time (in milliseconds) that is 'included' by the + Calendar after the given time. Return the original value if timeStamp is + included. Return 0 if all days are excluded. + + + + + + + + Returns the start time of the time range of the day + specified in . + + + a DateTime representing the start time of the + time range for the specified date. + + + + + Returns the end time of the time range of the day + specified in + + + A DateTime representing the end time of the + time range for the specified date. + + + + + Returns a that represents the current . + + + A that represents the current . + + + + + Sets the time range for the to the times + represented in the specified Strings. + + The range starting time string. + The range ending time string. + + + + Sets the time range for the to the times + represented in the specified values. + + The range starting hour of day. + The range starting minute. + The range starting second. + The range starting millis. + The range ending hour of day. + The range ending minute. + The range ending second. + The range ending millis. + + + + Sets the time range for the to the times + represented in the specified s. + + The range starting calendar. + The range ending calendar. + + + + Sets the time range for the to the times + represented in the specified values. + + The range starting time. + The range ending time. + + + + Gets the start of day, practically zeroes time part. + + The time. + + + + + Gets the end of day, pratically sets time parts to maximum allowed values. + + The time. + + + + + Checks the specified values for validity as a set of time values. + + The hour of day. + The minute. + The second. + The millis. + + + + Indicates whether the time range represents an inverted time range (see + class description). + + true if invert time range; otherwise, false. + + + + This implementation of the Calendar stores a list of holidays (full days + that are excluded from scheduling). + + + The implementation DOES take the year into consideration, so if you want to + exclude July 4th for the next 10 years, you need to add 10 entries to the + exclude list. + + Sharada Jambula + Juergen Donnerstag + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The base calendar. + + + + Serialization constructor. + + + + + + + Determine whether the given time (in milliseconds) is 'included' by the + Calendar. + + Note that this Calendar is only has full-day precision. + + + + + + Determine the next time (in milliseconds) that is 'included' by the + Calendar after the given time. + + Note that this Calendar is only has full-day precision. + + + + + + Creates a new object that is a copy of the current instance. + + A new object that is a copy of this instance. + + + + Add the given Date to the list of excluded days. Only the month, day and + year of the returned dates are significant. + + + + + Removes the excluded date. + + The date to remove. + + + + Returns a of Dates representing the excluded + days. Only the month, day and year of the returned dates are + significant. + + + + + This implementation of the Calendar excludes a set of days of the month. You + may use it to exclude every 1. of each month for example. But you may define + any day of a month. + + + + Juergen Donnerstag + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + + + + Constructor + + The base calendar. + + + + Serialization constructor. + + + + + + + Initialize internal variables + + + + + Return true, if mday is defined to be exluded. + + + + + Redefine a certain day of the month to be excluded (true) or included + (false). + + + + + Check if all days are excluded. That is no day is included. + + boolean + + + + + Determine whether the given time (in milliseconds) is 'included' by the + Calendar. + + Note that this Calendar is only has full-day precision. + + + + + + Determine the next time (in milliseconds) that is 'included' by the + Calendar after the given time. Return the original value if timeStamp is + included. Return DateTime.MinValue if all days are excluded. + + Note that this Calendar is only has full-day precision. + + + + + + Creates a new object that is a copy of the current instance. + + A new object that is a copy of this instance. + + + + Get or set the array which defines the exclude-value of each day of month + Setting will redefine the array of days excluded. The array must of size greater or + equal 31. + + + + + This implementation of the Calendar excludes a set of days of the week. You + may use it to exclude weekends for example. But you may define any day of + the week. + + + + Juergen Donnerstag + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The base calendar. + + + + Serialization constructor. + + + + + + + Initialize internal variables + + + + + Return true, if wday is defined to be exluded. E. g. + saturday and sunday. + + + + + Redefine a certain day of the week to be excluded (true) or included + (false). Use java.util.Calendar's constants like MONDAY to determine the + wday. + + + + + Check if all week ays are excluded. That is no day is included. + + + + + Determine whether the given time (in milliseconds) is 'included' by the + Calendar. + + Note that this Calendar is only has full-day precision. + + + + + + Determine the next time (in milliseconds) that is 'included' by the + Calendar after the given time. Return the original value if timeStamp is + included. Return DateTime.MinValue if all days are excluded. + + Note that this Calendar is only has full-day precision. + + + + + + Get the array with the week days. + Setting will redefine the array of days excluded. The array must of size greater or + equal 8. java.util.Calendar's constants like MONDAY should be used as + index. A value of true is regarded as: exclude it. + + + + + Matches using an AND operator on two Matcher operands. + + James House + Marko Lahma (.NET) + + + + Matchers can be used in various API methods to + select the entities that should be operated upon. + + James House + + + + + Create an AndMatcher that depends upon the result of both of the given matchers. + + + + + + + + + Matches on the complete key being equal (both name and group). + + + + jhouse + + + + Create an EverythingMatcher that matches all jobs. + + + + + + Create an EverythingMatcher that matches all triggers. + + + + + + Matches on group (ignores name) property of Keys. + + James House + Marko Lahma (.NET) + + + + An abstract base class for some types of matchers. + + James House + Marko Lahma (.NET) + + + + Create a GroupMatcher that matches groups equaling the given string. + + + + + + + Create a GroupMatcher that matches groups starting with the given string. + + + + + + + Create a GroupMatcher that matches groups ending with the given string. + + + + + + + Create a GroupMatcher that matches groups containing the given string. + + + + + + + Matches on the complete key being equal (both name and group). + + James House + Marko Lahma (.NET) + + + + Create a KeyMatcher that matches Keys that equal the given key. + + + + + + + + Matches on name (ignores group) property of Keys. + + James House + Marko Lahma (.NET) + + + + Create a NameMatcher that matches names equaling the given string. + + + + + + + Create a NameMatcher that matches names starting with the given string. + + + + + + + Create a NameMatcher that matches names ending with the given string. + + + + + + + Create a NameMatcher that matches names containing the given string. + + + + + + + Matches using an NOT operator on another Matcher. + + James House + Marko Lahma (.NET) + + + + Create a NotMatcher that reverses the result of the given matcher. + + + + + + + + Matches using an OR operator on two Matcher operands. + + James House + Marko Lahma (.NET) + + + + Create an OrMatcher that depends upon the result of at least one of the given matchers. + + + + + + + + + Operators available for comparing string values. + + + + + The base abstract class to be extended by all triggers. + + + + s have a name and group associated with them, which + should uniquely identify them within a single . + + + + s are the 'mechanism' by which s + are scheduled. Many s can point to the same , + but a single can only point to one . + + + + Triggers can 'send' parameters/data to s by placing contents + into the on the . + + + + + + + + James House + Sharada Jambula + Marko Lahma (.NET) + + + + Internal interface for managing triggers. This interface should not be used by the Quartz client. + + + + + Should not be used by end users. + + + + + The base interface with properties common to all s - + use to instantiate an actual Trigger. + + + + s have a associated with them, which + should uniquely identify them within a single . + + + + s are the 'mechanism' by which s + are scheduled. Many s can point to the same , + but a single can only point to one . + + + + Triggers can 'send' parameters/data to s by placing contents + into the on the . + + + + + + + + + + James House + Sharada Jambula + Marko Lahma (.NET) + + + + Get a that is configured to produce a + schedule identical to this trigger's schedule. + + + + + + Used by the to determine whether or not + it is possible for this to fire again. + + If the returned value is then the + may remove the from the . + + + + + + Returns the next time at which the is scheduled to fire. If + the trigger will not fire again, will be returned. Note that + the time returned can possibly be in the past, if the time that was computed + for the trigger to next fire has already arrived, but the scheduler has not yet + been able to fire the trigger (which would likely be due to lack of resources + e.g. threads). + + + The value returned is not guaranteed to be valid until after the + has been added to the scheduler. + + + + + + Returns the previous time at which the fired. + If the trigger has not yet fired, will be returned. + + + + + Returns the next time at which the will fire, + after the given time. If the trigger will not fire after the given time, + will be returned. + + + + + Get or set the description given to the instance by + its creator (if any). + + + + + Get or set the with the given name with + this Trigger. Use when setting to dis-associate a Calendar. + + + + + Get or set the that is associated with the + . + + Changes made to this map during job execution are not re-persisted, and + in fact typically result in an illegal state. + + + + + + Returns the last UTC time at which the will fire, if + the Trigger will repeat indefinitely, null will be returned. + + Note that the return time *may* be in the past. + + + + + + Get or set the instruction the should be given for + handling misfire situations for this - the + concrete type that you are using will have + defined a set of additional MISFIRE_INSTRUCTION_XXX + constants that may be set to this property. + + If not explicitly set, the default value is . + + + + + + + + + Gets and sets the date/time on which the trigger must stop firing. This + defines the final boundary for trigger firings 舒 the trigger will + not fire after to this date and time. If this value is null, no end time + boundary is assumed, and the trigger can continue indefinitely. + + + + + The time at which the trigger's scheduling should start. May or may not + be the first actual fire time of the trigger, depending upon the type of + trigger and the settings of the other properties of the trigger. However + the first actual first time will not be before this date. + + + Setting a value in the past may cause a new trigger to compute a first + fire time that is in the past, which may cause an immediate misfire + of the trigger. + + + + + The priority of a acts as a tie breaker such that if + two s have the same scheduled fire time, then Quartz + will do its best to give the one with the higher priority first access + to a worker thread. + + + If not explicitly set, the default value is 5. + + + + + + + Set a description for the instance - may be + useful for remembering/displaying the purpose of the trigger, though the + description has no meaning to Quartz. + + + + + Associate the with the given name with this Trigger. + + + + + Set the to be associated with the + . + + + + + The priority of a acts as a tie breaker such that if + two s have the same scheduled fire time, then Quartz + will do its best to give the one with the higher priority first access + to a worker thread. + + + If not explicitly set, the default value is 5. + + + + + + + The time at which the trigger's scheduling should start. May or may not + be the first actual fire time of the trigger, depending upon the type of + trigger and the settings of the other properties of the trigger. However + the first actual first time will not be before this date. + + + Setting a value in the past may cause a new trigger to compute a first + fire time that is in the past, which may cause an immediate misfire + of the trigger. + + ew DateTimeOffset StartTimeUtc { get; set; } + + + + + + Set the time at which the should quit repeating - + regardless of any remaining repeats (based on the trigger's particular + repeat settings). + + + + + + + + Set the instruction the should be given for + handling misfire situations for this - the + concrete type that you are using will have + defined a set of additional MisfireInstruction.XXX + constants that may be passed to this method. + + + If not explicitly set, the default value is . + + + + + + + + This method should not be used by the Quartz client. + + + Called when the has decided to 'fire' + the trigger (Execute the associated ), in order to + give the a chance to update itself for its next + triggering (if any). + + + + + + This method should not be used by the Quartz client. + + + + Called by the scheduler at the time a is first + added to the scheduler, in order to have the + compute its first fire time, based on any associated calendar. + + + + After this method has been called, + should return a valid answer. + + + + The first time at which the will be fired + by the scheduler, which is also the same value + will return (until after the first firing of the ). + + + + + This method should not be used by the Quartz client. + + + Called after the has executed the + associated with the + in order to get the final instruction code from the trigger. + + + is the that was used by the + 's method. + is the thrown by the + , if any (may be null). + + + One of the members. + + + + + + + + + + This method should not be used by the Quartz client. + + To be implemented by the concrete classes that extend this class. + + + The implementation should update the 's state + based on the MISFIRE_INSTRUCTION_XXX that was selected when the + was created. + + + + + + This method should not be used by the Quartz client. + + The implementation should update the 's state + based on the given new version of the associated + (the state should be updated so that it's next fire time is appropriate + given the Calendar's new settings). + + + + + + + + Validates whether the properties of the are + valid for submission into a . + + + + + This method should not be used by the Quartz client. + + + Usable by + implementations, in order to facilitate 'recognizing' instances of fired + s as their jobs complete execution. + + + + + Returns the previous time at which the fired. + If the trigger has not yet fired, will be returned. + + + + + Create a with no specified name, group, or . + + + Note that the , and + the and properties + must be set before the can be placed into a + . + + + + + Create a with the given name, and default group. + + + Note that the and + properties must be set before the + can be placed into a . + + The name. + + + + Create a with the given name, and group. + + + Note that the and + properties must be set before the + can be placed into a . + + The name. + if , Scheduler.DefaultGroup will be used. + + + + Create a with the given name, and group. + + The name. + if , Scheduler.DefaultGroup will be used. + Name of the job. + The job group. + ArgumentException + if name is null or empty, or the group is an empty string. + + + + + This method should not be used by the Quartz client. + + + Called when the has decided to 'fire' + the trigger (Execute the associated ), in order to + give the a chance to update itself for its next + triggering (if any). + + + + + + This method should not be used by the Quartz client. + + + + Called by the scheduler at the time a is first + added to the scheduler, in order to have the + compute its first fire time, based on any associated calendar. + + + + After this method has been called, + should return a valid answer. + + + + The first time at which the will be fired + by the scheduler, which is also the same value + will return (until after the first firing of the ). + + + + + This method should not be used by the Quartz client. + + + Called after the has executed the + associated with the + in order to get the final instruction code from the trigger. + + + is the that was used by the + 's method. + is the thrown by the + , if any (may be null). + + + One of the members. + + + + + + + Used by the to determine whether or not + it is possible for this to fire again. + + If the returned value is then the + may remove the from the . + + + + + + Returns the next time at which the is scheduled to fire. If + the trigger will not fire again, will be returned. Note that + the time returned can possibly be in the past, if the time that was computed + for the trigger to next fire has already arrived, but the scheduler has not yet + been able to fire the trigger (which would likely be due to lack of resources + e.g. threads). + + + The value returned is not guaranteed to be valid until after the + has been added to the scheduler. + + + + + + Returns the next time at which the will fire, + after the given time. If the trigger will not fire after the given time, + will be returned. + + + + + Validates the misfire instruction. + + The misfire instruction. + + + + + This method should not be used by the Quartz client. + + To be implemented by the concrete classes that extend this class. + + + The implementation should update the 's state + based on the MISFIRE_INSTRUCTION_XXX that was selected when the + was created. + + + + + + This method should not be used by the Quartz client. + + The implementation should update the 's state + based on the given new version of the associated + (the state should be updated so that it's next fire time is appropriate + given the Calendar's new settings). + + + + + + + + Validates whether the properties of the are + valid for submission into a . + + + + + Return a simple string representation of this object. + + + + + Compare the next fire time of this to that of + another by comparing their keys, or in other words, sorts them + according to the natural (i.e. alphabetical) order of their keys. + + + + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + + Trigger equality is based upon the equality of the TriggerKey. + + + true if the key of this Trigger equals that of the given Trigger + + + + Serves as a hash function for a particular type. is suitable for use in hashing algorithms and data structures like a hash table. + + + A hash code for the current . + + + + + Creates a new object that is a copy of the current instance. + + + A new object that is a copy of this instance. + + + + + Get or sets the name of this . + + If name is null or empty. + + + + Get the group of this . If , Scheduler.DefaultGroup will be used. + + + if group is an empty string. + + + + + Get or set the name of the associated . + + + if jobName is null or empty. + + + + + Gets or sets the name of the associated 's + group. If set with , Scheduler.DefaultGroup will be used. + + ArgumentException + if group is an empty string. + + + + + Returns the 'full name' of the in the format + "group.name". + + + + + Gets the key. + + The key. + + + + Returns the 'full name' of the that the + points to, in the format "group.name". + + + + + Get or set the description given to the instance by + its creator (if any). + + + + + Get or set the with the given name with + this Trigger. Use when setting to dis-associate a Calendar. + + + + + Get or set the that is associated with the + . + + Changes made to this map during job execution are not re-persisted, and + in fact typically result in an illegal state. + + + + + + Returns the last UTC time at which the will fire, if + the Trigger will repeat indefinitely, null will be returned. + + Note that the return time *may* be in the past. + + + + + + Get or set the instruction the should be given for + handling misfire situations for this - the + concrete type that you are using will have + defined a set of additional MISFIRE_INSTRUCTION_XXX + constants that may be passed to this method. + + If not explicitly set, the default value is . + + + + + + + + + + This method should not be used by the Quartz client. + + + Usable by + implementations, in order to facilitate 'recognizing' instances of fired + s as their jobs complete execution. + + + + + Gets and sets the date/time on which the trigger must stop firing. This + defines the final boundary for trigger firings 舒 the trigger will + not fire after to this date and time. If this value is null, no end time + boundary is assumed, and the trigger can continue indefinitely. + + + + + The time at which the trigger's scheduling should start. May or may not + be the first actual fire time of the trigger, depending upon the type of + trigger and the settings of the other properties of the trigger. However + the first actual first time will not be before this date. + + + Setting a value in the past may cause a new trigger to compute a first + fire time that is in the past, which may cause an immediate misfire + of the trigger. + + + + + Tells whether this Trigger instance can handle events + in millisecond precision. + + + + + The priority of a acts as a tie breaker such that if + two s have the same scheduled fire time, then Quartz + will do its best to give the one with the higher priority first access + to a worker thread. + + + If not explicitly set, the default value is 5. + + + + + + + Gets a value indicating whether this instance has additional properties + that should be considered when for example saving to database. + + + If trigger implementation has additional properties that need to be saved + with base properties you need to make your class override this property with value true. + Returning true will effectively mean that ADOJobStore needs to serialize + this trigger instance to make sure additional properties are also saved. + + + true if this instance has additional properties; otherwise, false. + + + + + A concrete that is used to fire a + based upon repeating calendar time intervals. + + + The trigger will fire every N (see ) units of calendar time + (see ) as specified in the trigger's definition. + This trigger can achieve schedules that are not possible with (e.g + because months are not a fixed number of seconds) or (e.g. because + "every 5 months" is not an even divisor of 12). + + If you use an interval unit of then care should be taken when setting + a value that is on a day near the end of the month. For example, + if you choose a start time that occurs on January 31st, and have a trigger with unit + and interval 1, then the next fire time will be February 28th, + and the next time after that will be March 28th - and essentially each subsequent firing will + occur on the 28th of the month, even if a 31st day exists. If you want a trigger that always + fires on the last day of the month - regardless of the number of days in the month, + you should use . + + + + + + + 2.0 + James House + Marko Lahma (.NET) + + + + A that is used to fire a + based upon repeating calendar time intervals. + + + + + Get or set the interval unit - the time unit on with the interval applies. + + + + + Get the the time interval that will be added to the 's + fire time (in the set repeat interval unit) in order to calculate the time of the + next trigger repeat. + + + + + Get the number of times the has already fired. + + + + + Create a with no settings. + + + + + Create a that will occur immediately, and + repeat at the the given interval. + + Name for the trigger instance. + The repeat interval unit (minutes, days, months, etc). + The number of milliseconds to pause between the repeat firing. + + + + Create a that will occur immediately, and + repeat at the the given interval + + Name for the trigger instance. + Group for the trigger instance. + The repeat interval unit (minutes, days, months, etc). + The number of milliseconds to pause between the repeat firing. + + + + Create a that will occur at the given time, + and repeat at the the given interval until the given end time. + + Name for the trigger instance. + A set to the time for the to fire. + A set to the time for the to quit repeat firing. + The repeat interval unit (minutes, days, months, etc). + The number of milliseconds to pause between the repeat firing. + + + + Create a that will occur at the given time, + and repeat at the the given interval until the given end time. + + Name for the trigger instance. + Group for the trigger instance. + A set to the time for the to fire. + A set to the time for the to quit repeat firing. + The repeat interval unit (minutes, days, months, etc). + The number of milliseconds to pause between the repeat firing. + + + + Create a that will occur at the given time, + and repeat at the the given interval until the given end time. + + Name for the trigger instance. + Group for the trigger instance. + Name of the associated job. + Group of the associated job. + A set to the time for the to fire. + A set to the time for the to quit repeat firing. + The repeat interval unit (minutes, days, months, etc). + The number of milliseconds to pause between the repeat firing. + + + + Validates the misfire instruction. + + The misfire instruction. + + + + + Updates the 's state based on the + MisfireInstruction.XXX that was selected when the + was created. + + + If the misfire instruction is set to , + then the following scheme will be used: +
    +
  • The instruction will be interpreted as
  • +
+
+
+ + + This method should not be used by the Quartz client. + + Called when the has decided to 'fire' + the trigger (Execute the associated ), in order to + give the a chance to update itself for its next + triggering (if any). + + + + + + + This method should not be used by the Quartz client. + + The implementation should update the 's state + based on the given new version of the associated + (the state should be updated so that it's next fire time is appropriate + given the Calendar's new settings). + + + + + + + + This method should not be used by the Quartz client. + + + + Called by the scheduler at the time a is first + added to the scheduler, in order to have the + compute its first fire time, based on any associated calendar. + + + + After this method has been called, + should return a valid answer. + + + + The first time at which the will be fired + by the scheduler, which is also the same value + will return (until after the first firing of the ). + + + + + Returns the next time at which the is scheduled to fire. If + the trigger will not fire again, will be returned. Note that + the time returned can possibly be in the past, if the time that was computed + for the trigger to next fire has already arrived, but the scheduler has not yet + been able to fire the trigger (which would likely be due to lack of resources + e.g. threads). + + + The value returned is not guaranteed to be valid until after the + has been added to the scheduler. + + + + + + Returns the previous time at which the fired. + If the trigger has not yet fired, will be returned. + + + + + Returns the next time at which the will fire, + after the given time. If the trigger will not fire after the given time, + will be returned. + + + + + Determines whether or not the will occur + again. + + + + + + Validates whether the properties of the are + valid for submission into a . + + + + + Get a that is configured to produce a + schedule identical to this trigger's schedule. + + + + + + + + Get the time at which the should occur. + + + + + Tells whether this Trigger instance can handle events + in millisecond precision. + + + + + Get the time at which the should quit + repeating. + + + + + Get or set the interval unit - the time unit on with the interval applies. + + + + + Get the the time interval that will be added to the 's + fire time (in the set repeat interval unit) in order to calculate the time of the + next trigger repeat. + + + + + Get the number of times the has already fired. + + + + + Returns the final time at which the will + fire, if there is no end time set, null will be returned. + + + Note that the return time may be in the past. + + + + A concrete that is used to fire a + at given moments in time, defined with Unix 'cron-like' definitions. + + + + For those unfamiliar with "cron", this means being able to create a firing + schedule such as: "At 8:00am every Monday through Friday" or "At 1:30am + every last Friday of the month". + + + + The format of a "Cron-Expression" string is documented on the + class. + + + + Here are some full examples:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Expression Meaning
"0 0 12 * * ?"" /> Fire at 12pm (noon) every day" />
"0 15 10 ? * *"" /> Fire at 10:15am every day" />
"0 15 10 * * ?"" /> Fire at 10:15am every day" />
"0 15 10 * * ? *"" /> Fire at 10:15am every day" />
"0 15 10 * * ? 2005"" /> Fire at 10:15am every day during the year 2005" /> +
"0 * 14 * * ?"" /> Fire every minute starting at 2pm and ending at 2:59pm, every day" /> +
"0 0/5 14 * * ?"" /> Fire every 5 minutes starting at 2pm and ending at 2:55pm, every day" /> +
"0 0/5 14,18 * * ?"" /> Fire every 5 minutes starting at 2pm and ending at 2:55pm, AND fire every 5 minutes starting at 6pm and ending at 6:55pm, every day" /> +
"0 0-5 14 * * ?"" /> Fire every minute starting at 2pm and ending at 2:05pm, every day" /> +
"0 10,44 14 ? 3 WED"" /> Fire at 2:10pm and at 2:44pm every Wednesday in the month of March." /> +
"0 15 10 ? * MON-FRI"" /> Fire at 10:15am every Monday, Tuesday, Wednesday, Thursday and Friday" /> +
"0 15 10 15 * ?"" /> Fire at 10:15am on the 15th day of every month" /> +
"0 15 10 L * ?"" /> Fire at 10:15am on the last day of every month" /> +
"0 15 10 ? * 6L"" /> Fire at 10:15am on the last Friday of every month" /> +
"0 15 10 ? * 6L"" /> Fire at 10:15am on the last Friday of every month" /> +
"0 15 10 ? * 6L 2002-2005"" /> Fire at 10:15am on every last Friday of every month during the years 2002, 2003, 2004 and 2005" /> +
"0 15 10 ? * 6#3"" /> Fire at 10:15am on the third Friday of every month" /> +
+
+ + + Pay attention to the effects of '?' and '*' in the day-of-week and + day-of-month fields! + + + + NOTES: +
    +
  • Support for specifying both a day-of-week and a day-of-month value is + not complete (you'll need to use the '?' character in on of these fields). +
  • +
  • Be careful when setting fire times between mid-night and 1:00 AM - + "daylight savings" can cause a skip or a repeat depending on whether the + time moves back or jumps forward.
  • +
+
+
+ + + Sharada Jambula + James House + Contributions from Mads Henderson + Marko Lahma (.NET) +
+ + + The public interface for inspecting settings specific to a CronTrigger, + which is used to fire a + at given moments in time, defined with Unix 'cron-like' schedule definitions. + + + + For those unfamiliar with "cron", this means being able to create a firing + schedule such as: "At 8:00am every Monday through Friday" or "At 1:30am + every last Friday of the month". + + + + The format of a "Cron-Expression" string is documented on the + class. + + + + Here are some full examples:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Expression Meaning
"0 0 12 * * ?"" /> Fire at 12pm (noon) every day" />
"0 15 10 ? * *"" /> Fire at 10:15am every day" />
"0 15 10 * * ?"" /> Fire at 10:15am every day" />
"0 15 10 * * ? *"" /> Fire at 10:15am every day" />
"0 15 10 * * ? 2005"" /> Fire at 10:15am every day during the year 2005" /> +
"0 * 14 * * ?"" /> Fire every minute starting at 2pm and ending at 2:59pm, every day" /> +
"0 0/5 14 * * ?"" /> Fire every 5 minutes starting at 2pm and ending at 2:55pm, every day" /> +
"0 0/5 14,18 * * ?"" /> Fire every 5 minutes starting at 2pm and ending at 2:55pm, AND fire every 5 minutes starting at 6pm and ending at 6:55pm, every day" /> +
"0 0-5 14 * * ?"" /> Fire every minute starting at 2pm and ending at 2:05pm, every day" /> +
"0 10,44 14 ? 3 WED"" /> Fire at 2:10pm and at 2:44pm every Wednesday in the month of March." /> +
"0 15 10 ? * MON-FRI"" /> Fire at 10:15am every Monday, Tuesday, Wednesday, Thursday and Friday" /> +
"0 15 10 15 * ?"" /> Fire at 10:15am on the 15th day of every month" /> +
"0 15 10 L * ?"" /> Fire at 10:15am on the last day of every month" /> +
"0 15 10 ? * 6L"" /> Fire at 10:15am on the last Friday of every month" /> +
"0 15 10 ? * 6L"" /> Fire at 10:15am on the last Friday of every month" /> +
"0 15 10 ? * 6L 2002-2005"" /> Fire at 10:15am on every last Friday of every month during the years 2002, 2003, 2004 and 2005" /> +
"0 15 10 ? * 6#3"" /> Fire at 10:15am on the third Friday of every month" /> +
+
+ + + Pay attention to the effects of '?' and '*' in the day-of-week and + day-of-month fields! + + + + NOTES: +
    +
  • Support for specifying both a day-of-week and a day-of-month value is + not complete (you'll need to use the '?' character in on of these fields). +
  • +
  • Be careful when setting fire times between mid-night and 1:00 AM - + "daylight savings" can cause a skip or a repeat depending on whether the + time moves back or jumps forward.
  • +
+
+
+ + + Sharada Jambula + James House + Contributions from Mads Henderson + Marko Lahma (.NET) +
+ + + Gets the expression summary. + + + + + + Gets or sets the cron expression string. + + The cron expression string. + + + + Sets the time zone for which the of this + will be resolved. + + + If is set after this + property, the TimeZone setting on the CronExpression will "win". However + if is set after this property, the + time zone applied by this method will remain in effect, since the + string cron expression does not carry a time zone! + + The time zone. + + + + Create a with no settings. + + + The start-time will also be set to the current time, and the time zone + will be set the the system's default time zone. + + + + + Create a with the given name and default group. + + + The start-time will also be set to the current time, and the time zone + will be set the the system's default time zone. + + The name of the + + + + Create a with the given name and group. + + + The start-time will also be set to the current time, and the time zone + will be set the the system's default time zone. + + The name of the + The group of the + + + + Create a with the given name, group and + expression. + + + The start-time will also be set to the current time, and the time zone + will be set the the system's default time zone. + + The name of the + The group of the + A cron expression dictating the firing sequence of the + + + + Create a with the given name and group, and + associated with the identified . + + + The start-time will also be set to the current time, and the time zone + will be set the the system's default time zone. + + The name of the . + The group of the + name of the executed on firetime + Group of the executed on firetime + + + + Create a with the given name and group, + associated with the identified , + and with the given "cron" expression. + + + The start-time will also be set to the current time, and the time zone + will be set the the system's default time zone. + + The name of the + The group of the + name of the executed on firetime + Group of the executed on firetime + A cron expression dictating the firing sequence of the + + + + Create a with the given name and group, + associated with the identified , + and with the given "cron" expression resolved with respect to the . + + The name of the + The group of the + name of the executed on firetime + Group of the executed on firetime + A cron expression dictating the firing sequence of the + + Specifies for which time zone the cronExpression should be interpreted, + i.e. the expression 0 0 10 * * ?, is resolved to 10:00 am in this time zone. + + + + + Create a that will occur at the given time, + until the given end time. + + If null, the start-time will also be set to the current time, the time + zone will be set the the system's default. + + + The name of the + The group of the + name of the executed on firetime + Group of the executed on firetime + A set to the earliest time for the to start firing. + A set to the time for the to quit repeat firing. + A cron expression dictating the firing sequence of the + + + + Create a with fire time dictated by the + resolved with respect to the specified + occurring from the until + the given . + + The name of the + The group of the + name of the executed on firetime + Group of the executed on firetime + A set to the earliest time for the to start firing. + A set to the time for the to quit repeat firing. + + + + Clones this instance. + + + + + + Returns the next time at which the is scheduled to fire. If + the trigger will not fire again, will be returned. Note that + the time returned can possibly be in the past, if the time that was computed + for the trigger to next fire has already arrived, but the scheduler has not yet + been able to fire the trigger (which would likely be due to lack of resources + e.g. threads). + + + The value returned is not guaranteed to be valid until after the + has been added to the scheduler. + + + + + + Returns the previous time at which the fired. + If the trigger has not yet fired, will be returned. + + + + + + Sets the next fire time. + + This method should not be invoked by client code. + + + The fire time. + + + + Sets the previous fire time. + + This method should not be invoked by client code. + + + The fire time. + + + + Returns the next time at which the will fire, + after the given time. If the trigger will not fire after the given time, + will be returned. + + + + + + + Used by the to determine whether or not + it is possible for this to fire again. + + If the returned value is then the + may remove the from the . + + + + + + + Validates the misfire instruction. + + The misfire instruction. + + + + + This method should not be used by the Quartz client. + + To be implemented by the concrete classes that extend this class. + + + The implementation should update the 's state + based on the MISFIRE_INSTRUCTION_XXX that was selected when the + was created. + + + + + + + + Determines whether the date and (optionally) time of the given Calendar + instance falls on a scheduled fire-time of this trigger. + + + + Equivalent to calling . + + + The date to compare. + + + + + Determines whether the date and (optionally) time of the given Calendar + instance falls on a scheduled fire-time of this trigger. + + Note that the value returned is NOT validated against the related + ICalendar (if any). + + + The date to compare + If set to true, the method will only determine if the + trigger will fire during the day represented by the given Calendar + (hours, minutes and seconds will be ignored). + + + + + Called when the has decided to 'fire' + the trigger (Execute the associated ), in order to + give the a chance to update itself for its next + triggering (if any). + + + + + + + Updates the trigger with new calendar. + + The calendar to update with. + The misfire threshold. + + + + Called by the scheduler at the time a is first + added to the scheduler, in order to have the + compute its first fire time, based on any associated calendar. + + After this method has been called, + should return a valid answer. + + + + + the first time at which the will be fired + by the scheduler, which is also the same value + will return (until after the first firing of the ). + + + + + Gets the expression summary. + + + + + + Gets the next time to fire after the given time. + + The time to compute from. + + + + + NOT YET IMPLEMENTED: Returns the time before the given time + that this will fire. + + The date. + + + + + Gets or sets the cron expression string. + + The cron expression string. + + + + Set the CronExpression to the given one. The TimeZone on the passed-in + CronExpression over-rides any that was already set on the Trigger. + + The cron expression. + + + + Returns the date/time on which the trigger may begin firing. This + defines the initial boundary for trigger firings the trigger + will not fire prior to this date and time. + + + + + + Get or sets the time at which the CronTrigger should quit + repeating - even if repeastCount isn't yet satisfied. + + + + + Sets the time zone for which the of this + will be resolved. + + + If is set after this + property, the TimeZone setting on the CronExpression will "win". However + if is set after this property, the + time zone applied by this method will remain in effect, since the + string cron expression does not carry a time zone! + + The time zone. + + + + Returns the last UTC time at which the will fire, if + the Trigger will repeat indefinitely, null will be returned. + + Note that the return time *may* be in the past. + + + + + + Tells whether this Trigger instance can handle events + in millisecond precision. + + + + + + A concrete implementation of DailyTimeIntervalTrigger that is used to fire a + based upon daily repeating time intervals. + + + + The trigger will fire every N ( ) seconds, minutes or hours + (see ) during a given time window on specified days of the week. + + + For example#1, a trigger can be set to fire every 72 minutes between 8:00 and 11:00 everyday. It's fire times would + be 8:00, 9:12, 10:24, then next day would repeat: 8:00, 9:12, 10:24 again. + + + For example#2, a trigger can be set to fire every 23 minutes between 9:20 and 16:47 Monday through Friday. + + + On each day, the starting fire time is reset to startTimeOfDay value, and then it will add repeatInterval value to it until + the endTimeOfDay is reached. If you set daysOfWeek values, then fire time will only occur during those week days period. Again, + remember this trigger will reset fire time each day with startTimeOfDay, regardless of your interval or endTimeOfDay! + + + The default values for fields if not set are: startTimeOfDay defaults to 00:00:00, the endTimeOfDay default to 23:59:59, + and daysOfWeek is default to every day. The startTime default to current time-stamp now, while endTime has not value. + + + If startTime is before startTimeOfDay, then startTimeOfDay will be used and startTime has no affect. Else if startTime is + after startTimeOfDay, then the first fire time for that day will be the next interval after the startTime. For example, if + you set startingTimeOfDay=9am, endingTimeOfDay=11am, interval=15 mins, and startTime=9:33am, then the next fire time will + be 9:45pm. Note also that if you do not set startTime value, the trigger builder will default to current time, and current time + maybe before or after the startTimeOfDay! So be aware how you set your startTime. + + + This trigger also supports "repeatCount" feature to end the trigger fire time after + a certain number of count is reached. Just as the SimpleTrigger, setting repeatCount=0 + means trigger will fire once only! Setting any positive count then the trigger will repeat + count + 1 times. Unlike SimpleTrigger, the default value of repeatCount of this trigger + is set to REPEAT_INDEFINITELY instead of 0 though. + + + + + 2.0 + James House + Zemian Deng saltnlight5@gmail.com + Nuno Maia (.NET) + + + + A that is used to fire a + based upon daily repeating time intervals. + + + The trigger will fire every N (see ) seconds, minutes or hours + (see during a given time window on specified days of the week. + + For example#1, a trigger can be set to fire every 72 minutes between 8:00 and 11:00 everyday. It's fire times + be 8:00, 9:12, 10:24, then next day would repeat: 8:00, 9:12, 10:24 again. + + For example#2, a trigger can be set to fire every 23 minutes between 9:20 and 16:47 Monday through Friday. + + On each day, the starting fire time is reset to startTimeOfDay value, and then it will add repeatInterval value to it until + the endTimeOfDay is reached. If you set daysOfWeek values, then fire time will only occur during those week days period. + + The default values for fields if not set are: startTimeOfDay defaults to 00:00:00, the endTimeOfDay default to 23:59:59, + and daysOfWeek is default to every day. The startTime default to current time-stamp now, while endTime has not value. + + If startTime is before startTimeOfDay, then it has no affect. Else if startTime after startTimeOfDay, then the first fire time + for that day will be normal startTimeOfDay incremental values after startTime value. Same reversal logic is applied to endTime + with endTimeOfDay. + + + + James House + Zemian Deng saltnlight5@gmail.com + Nuno Maia (.NET) + + + + + + + + + Get the the number of times for interval this trigger should repeat, + after which it will be automatically deleted. + + + + + Get the interval unit - the time unit on with the interval applies. + The only intervals that are valid for this type of trigger are , + , and + + + + + Get the the time interval that will be added to the 's + fire time (in the set repeat interval unit) in order to calculate the time of the + next trigger repeat. + + + + + The time of day to start firing at the given interval. + + + + + The time of day to complete firing at the given interval. + + + + + The days of the week upon which to fire. + + + A Set containing the integers representing the days of the week, per the values 0-6 as defined by + DayOfWees.Sunday - DayOfWeek.Saturday. + + + + + Get the number of times the has already fired. + + + + + Used to indicate the 'repeat count' of the trigger is indefinite. Or in + other words, the trigger should repeat continually until the trigger's + ending timestamp. + + + + + Create a with no settings. + + + + + Create a that will occur immediately, and + repeat at the the given interval. + + + The that the repeating should begin occurring. + The that the repeating should stop occurring. + The repeat interval unit. The only intervals that are valid for this type of trigger are + , , and . + + + + + Create a that will occur immediately, and + repeat at the the given interval. + + + + The that the repeating should begin occurring. + The that the repeating should stop occurring. + The repeat interval unit. The only intervals that are valid for this type of trigger are + , , and . + + + + + Create a that will occur at the given time, + and repeat at the the given interval until the given end time. + + + A set to the time for the to fire. + A set to the time for the to quit repeat firing. + The that the repeating should begin occurring. + The that the repeating should stop occurring. + The repeat interval unit. The only intervals that are valid for this type of trigger are + , , and . + The number of milliseconds to pause between the repeat firing. + + + + Create a that will occur at the given time, + and repeat at the the given interval until the given end time. + + + + A set to the time for the to fire. + A set to the time for the to quit repeat firing. + The that the repeating should begin occurring. + The that the repeating should stop occurring. + The repeat interval unit. The only intervals that are valid for this type of trigger are + , , and . + The number of milliseconds to pause between the repeat firing. + + + + Create a that will occur at the given time, + fire the identified job and repeat at the the given + interval until the given end time. + + + + + + A set to the time for the to fire. + A set to the time for the to quit repeat firing. + The that the repeating should begin occurring. + The that the repeating should stop occurring. + The repeat interval unit. The only intervals that are valid for this type of trigger are + , , and . + The number of milliseconds to pause between the repeat firing. + + + + Updates the 's state based on the + MisfireInstruction.XXX that was selected when the + was created. + + + If the misfire instruction is set to , + then the following scheme will be used: +
    +
  • The instruction will be interpreted as
  • +
+
+
+ + + Called when the scheduler has decided to 'fire' + the trigger (execute the associated job), in order to + give the trigger a chance to update itself for its next + triggering (if any). + + + + + + + + + + + + + + + This method should not be used by the Quartz client. + + + + Called by the scheduler at the time a is first + added to the scheduler, in order to have the + compute its first fire time, based on any associated calendar. + + + + After this method has been called, + should return a valid answer. + + + + The first time at which the will be fired + by the scheduler, which is also the same value + will return (until after the first firing of the ). + + + + + Returns the next time at which the is scheduled to fire. If + the trigger will not fire again, will be returned. Note that + the time returned can possibly be in the past, if the time that was computed + for the trigger to next fire has already arrived, but the scheduler has not yet + been able to fire the trigger (which would likely be due to lack of resources + e.g. threads). + + + The value returned is not guaranteed to be valid until after the + has been added to the scheduler. + + + + + + Returns the previous time at which the fired. + If the trigger has not yet fired, will be returned. + + + + + Set the next time at which the should fire. + + + This method should not be invoked by client code. + + + + + + Set the previous time at which the fired. + + + This method should not be invoked by client code. + + + + + + Returns the next time at which the will + fire, after the given time. If the trigger will not fire after the given + time, will be returned. + + + + + + + Given fireTime time, we need to advance/calculate and return a time of next available week day. + + given next fireTime. + flag to whether to advance day without check existing week day. This scenario + can happen when a caller determine fireTime has passed the endTimeOfDay that fireTime should move to next day anyway. + + a next day fireTime. + + + + Determines whether or not the will occur + again. + + + + + + Validates whether the properties of the are + valid for submission into a . + + + + + Get a that is configured to produce a + schedule identical to this trigger's schedule. + + + + + + + The time at which the should occur. + + + + + the time at which the should quit repeating. + + + + + + Get the the number of times for interval this trigger should repeat, + after which it will be automatically deleted. + + + + + the interval unit - the time unit on with the interval applies. + + + The repeat interval unit. The only intervals that are valid for this type of trigger are + , , and . + + + + + the the time interval that will be added to the 's + fire time (in the set repeat interval unit) in order to calculate the time of the + next trigger repeat. + + + + + the number of times the has already + fired. + + + + + Returns the final time at which the will + fire, if there is no end time set, null will be returned. + + Note that the return time may be in the past. + + + + + The days of the week upon which to fire. + + + A Set containing the integers representing the days of the week, per the values 0-6 as defined by + DayOfWees.Sunday - DayOfWeek.Saturday. + + + + + The time of day to start firing at the given interval. + + + + + The time of day to complete firing at the given interval. + + + + + This trigger has no additional properties besides what's defined in this class. + + + + + + Tells whether this Trigger instance can handle events + in millisecond precision. + + + + + A concrete that is used to fire a + at a given moment in time, and optionally repeated at a specified interval. + + + + James House + Contributions by Lieven Govaerts of Ebitec Nv, Belgium. + Marko Lahma (.NET) + + + + A that is used to fire a + at a given moment in time, and optionally repeated at a specified interval. + + + + James House + Contributions by Lieven Govaerts of Ebitec Nv, Belgium. + Marko Lahma (.NET) + + + + Get or set thhe number of times the should + repeat, after which it will be automatically deleted. + + + + + + Get or set the the time interval at which the should repeat. + + + + + Get or set the number of times the has already + fired. + + + + + Used to indicate the 'repeat count' of the trigger is indefinite. Or in + other words, the trigger should repeat continually until the trigger's + ending timestamp. + + + + + Create a with no settings. + + + + + Create a that will occur immediately, and + not repeat. + + + + + Create a that will occur immediately, and + not repeat. + + + + + Create a that will occur immediately, and + repeat at the the given interval the given number of times. + + + + + Create a that will occur immediately, and + repeat at the the given interval the given number of times. + + + + + Create a that will occur at the given time, + and not repeat. + + + + + Create a that will occur at the given time, + and not repeat. + + + + + Create a that will occur at the given time, + and repeat at the the given interval the given number of times, or until + the given end time. + + The name. + A UTC set to the time for the to fire. + A UTC set to the time for the + to quit repeat firing. + The number of times for the to repeat + firing, use for unlimited times. + The time span to pause between the repeat firing. + + + + Create a that will occur at the given time, + and repeat at the the given interval the given number of times, or until + the given end time. + + The name. + The group. + A UTC set to the time for the to fire. + A UTC set to the time for the + to quit repeat firing. + The number of times for the to repeat + firing, use for unlimited times. + The time span to pause between the repeat firing. + + + + Create a that will occur at the given time, + fire the identified and repeat at the the given + interval the given number of times, or until the given end time. + + The name. + The group. + Name of the job. + The job group. + A set to the time for the + to fire. + A set to the time for the + to quit repeat firing. + The number of times for the to repeat + firing, use RepeatIndefinitely for unlimited times. + The time span to pause between the repeat firing. + + + + Validates the misfire instruction. + + The misfire instruction. + + + + + Updates the 's state based on the + MisfireInstruction value that was selected when the + was created. + + + If MisfireSmartPolicyEnabled is set to true, + then the following scheme will be used:
+
    +
  • If the Repeat Count is 0, then the instruction will + be interpreted as .
  • +
  • If the Repeat Count is , then + the instruction will be interpreted as . + WARNING: using MisfirePolicy.SimpleTrigger.RescheduleNowWithRemainingRepeatCount + with a trigger that has a non-null end-time may cause the trigger to + never fire again if the end-time arrived during the misfire time span. +
  • +
  • If the Repeat Count is > 0, then the instruction + will be interpreted as . +
  • +
+
+
+ + + Called when the has decided to 'fire' + the trigger (Execute the associated ), in order to + give the a chance to update itself for its next + triggering (if any). + + + + + + Updates the instance with new calendar. + + The calendar. + The misfire threshold. + + + + Called by the scheduler at the time a is first + added to the scheduler, in order to have the + compute its first fire time, based on any associated calendar. + + After this method has been called, + should return a valid answer. + + + + The first time at which the will be fired + by the scheduler, which is also the same value + will return (until after the first firing of the ). + + + + + Returns the next time at which the will + fire. If the trigger will not fire again, will be + returned. The value returned is not guaranteed to be valid until after + the has been added to the scheduler. + + + + + Returns the previous time at which the fired. + If the trigger has not yet fired, will be + returned. + + + + + Returns the next UTC time at which the will + fire, after the given UTC time. If the trigger will not fire after the given + time, will be returned. + + + + + Returns the last UTC time at which the will + fire, before the given time. If the trigger will not fire before the + given time, will be returned. + + + + + Computes the number of times fired between the two UTC date times. + + The UTC start date and time. + The UTC end date and time. + + + + + Determines whether or not the will occur + again. + + + + + Validates whether the properties of the are + valid for submission into a . + + + + + Get or set thhe number of times the should + repeat, after which it will be automatically deleted. + + + + + + Get or set the the time interval at which the should repeat. + + + + + Get or set the number of times the has already + fired. + + + + + Returns the final UTC time at which the will + fire, if repeatCount is RepeatIndefinitely, null will be returned. + + Note that the return time may be in the past. + + + + + + Tells whether this Trigger instance can handle events + in millisecond precision. + + + + + + Schedules work on a newly spawned thread. This is the default Quartz behavior. + + matt.accola + + + + Allows different strategies for scheduling threads. The + method is required to be called before the first call to + . The Thread containing the work to be performed is + passed to execute and the work is scheduled by the underlying implementation. + + matt.accola + + + + Submit a task for execution. + + Thread to execute. + + + + Initialize any state prior to calling . + + + + + A singleton implementation of . + + + Here are some examples of using this class: + + To create a scheduler that does not write anything to the database (is not + persistent), you can call : + + + DirectSchedulerFactory.Instance.CreateVolatileScheduler(10); // 10 threads + // don't forget to start the scheduler: + DirectSchedulerFactory.Instance.GetScheduler().Start(); + + + Several create methods are provided for convenience. All create methods + eventually end up calling the create method with all the parameters: + + + public void CreateScheduler(string schedulerName, string schedulerInstanceId, IThreadPool threadPool, IJobStore jobStore) + + + Here is an example of using this method: + + + // create the thread pool + SimpleThreadPool threadPool = new SimpleThreadPool(maxThreads, ThreadPriority.Normal); + threadPool.Initialize(); + // create the job store + JobStore jobStore = new RAMJobStore(); + + DirectSchedulerFactory.Instance.CreateScheduler("My Quartz Scheduler", "My Instance", threadPool, jobStore); + // don't forget to start the scheduler: + DirectSchedulerFactory.Instance.GetScheduler("My Quartz Scheduler", "My Instance").Start(); + + > + Mohammad Rezaei + James House + Marko Lahma (.NET) + + + + + + Provides a mechanism for obtaining client-usable handles to + instances. + + + + James House + Marko Lahma (.NET) + + + + Returns a client-usable handle to a . + + + + + Returns a handle to the Scheduler with the given name, if it exists. + + + + + Returns handles to all known Schedulers (made by any SchedulerFactory + within this app domain.). + + + + + Initializes a new instance of the class. + + + + + Creates an in memory job store () + The thread priority is set to Thread.NORM_PRIORITY + + The number of threads in the thread pool + + + + Creates a proxy to a remote scheduler. This scheduler can be retrieved + via . + + SchedulerException + + + + Same as , + with the addition of specifying the scheduler name and instance ID. This + scheduler can only be retrieved via . + + The name for the scheduler. + The instance ID for the scheduler. + + SchedulerException + + + + Creates a scheduler using the specified thread pool and job store. This + scheduler can be retrieved via DirectSchedulerFactory#GetScheduler() + + + The thread pool for executing jobs + + + The type of job store + + SchedulerException + if initialization failed + + + + + Same as DirectSchedulerFactory#createScheduler(ThreadPool threadPool, JobStore jobStore), + with the addition of specifying the scheduler name and instance ID. This + scheduler can only be retrieved via DirectSchedulerFactory#getScheduler(String) + + The name for the scheduler. + The instance ID for the scheduler. + The thread pool for executing jobs + The type of job store + + + + Creates a scheduler using the specified thread pool and job store and + binds it for remote access. + + The name for the scheduler. + The instance ID for the scheduler. + The thread pool for executing jobs + The type of job store + The idle wait time. You can specify "-1" for + the default value, which is currently 30000 ms. + The db failure retry interval. + + + + Creates a scheduler using the specified thread pool and job store and + binds it for remote access. + + The name for the scheduler. + The instance ID for the scheduler. + The thread pool for executing jobs + The type of job store + + The idle wait time. You can specify TimeSpan.Zero for + the default value, which is currently 30000 ms. + The db failure retry interval. + + + + Creates a scheduler using the specified thread pool and job store and + binds it for remote access. + + The name for the scheduler. + The instance ID for the scheduler. + The thread pool for executing jobs + Thread executor. + The type of job store + + The idle wait time. You can specify TimeSpan.Zero for + the default value, which is currently 30000 ms. + The db failure retry interval. + + + + Creates a scheduler using the specified thread pool and job store and + binds it for remote access. + + The name for the scheduler. + The instance ID for the scheduler. + The thread pool for executing jobs + Thread executor. + The type of job store + + The idle wait time. You can specify TimeSpan.Zero for + the default value, which is currently 30000 ms. + The db failure retry interval. + The maximum batch size of triggers, when acquiring them + The time window for which it is allowed to "pre-acquire" triggers to fire + + + + Returns a handle to the Scheduler produced by this factory. + + you must call createRemoteScheduler or createScheduler methods before + calling getScheduler() + + + + SchedulerException + + + + Returns a handle to the Scheduler with the given name, if it exists. + + + + + Gets the log. + + The log. + + + + Gets the instance. + + The instance. + + + + Returns a handle to all known Schedulers (made by any + StdSchedulerFactory instance.). + + + + + + Conveys the detail properties of a given job instance. + + + Quartz does not store an actual instance of a type, but + instead allows you to define an instance of one, through the use of a . + + s have a name and group associated with them, which + should uniquely identify them within a single . + + + s are the 'mechanism' by which s + are scheduled. Many s can point to the same , + but a single can only point to one . + + + + + + + + James House + Marko Lahma (.NET) + + + + Conveys the detail properties of a given job instance. + JobDetails are to be created/defined with . + + + Quartz does not store an actual instance of a type, but + instead allows you to define an instance of one, through the use of a . + + s have a name and group associated with them, which + should uniquely identify them within a single . + + + s are the 'mechanism' by which s + are scheduled. Many s can point to the same , + but a single can only point to one . + + + + + + + + James House + Marko Lahma (.NET) + + + + Get a that is configured to produce a + identical to this one. + + + + + The key that identifies this jobs uniquely. + + + + + Get or set the description given to the instance by its + creator (if any). + + + + + Get or sets the instance of that will be executed. + + + + + Get or set the that is associated with the . + + + + + Whether or not the should remain stored after it is + orphaned (no s point to it). + + + If not explicitly set, the default value is . + + + if the Job should remain persisted after being orphaned. + + + + + Whether the associated Job class carries the . + + + + + + Whether the associated Job class carries the . + + + + + + Set whether or not the the should re-Execute + the if a 'recovery' or 'fail-over' situation is + encountered. + + + If not explicitly set, the default value is . + + + + + + Create a with no specified name or group, and + the default settings of all the other properties. + + Note that the , and + properties must be set before the job can be + placed into a . + + + + + + Create a with the given name, default group, and + the default settings of all the other properties. + If , Scheduler.DefaultGroup will be used. + + + If name is null or empty, or the group is an empty string. + + + + + Create a with the given name, and group, and + the default settings of all the other properties. + If , Scheduler.DefaultGroup will be used. + + + If name is null or empty, or the group is an empty string. + + + + + Create a with the given name, and group, and + the given settings of all the other properties. + + The name. + if , Scheduler.DefaultGroup will be used. + Type of the job. + if set to true, job will be durable. + if set to true, job will request recovery. + + ArgumentException if name is null or empty, or the group is an empty string. + + + + + Validates whether the properties of the are + valid for submission into a . + + + + + Return a simple string representation of this object. + + + + + Creates a new object that is a copy of the current instance. + + + A new object that is a copy of this instance. + + + + + Determines whether the specified detail is equal to this instance. + + The detail to examine. + + true if the specified detail is equal; otherwise, false. + + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + if the specified is equal to the + current ; otherwise, . + + + + + Checks equality between given job detail and this instance. + + The detail to compare this instance with. + + + + + Serves as a hash function for a particular type, suitable + for use in hashing algorithms and data structures like a hash table. + + + A hash code for the current . + + + + + Get or sets the name of this . + + + if name is null or empty. + + + + + Get or sets the group of this . + If , will be used. + + + If the group is an empty string. + + + + + Returns the 'full name' of the in the format + "group.name". + + + + + Gets the key. + + The key. + + + + Get or set the description given to the instance by its + creator (if any). + + + May be useful for remembering/displaying the purpose of the job, though the + description has no meaning to Quartz. + + + + + Get or sets the instance of that will be executed. + + + if jobType is null or the class is not a . + + + + + Get or set the that is associated with the . + + + + + Set whether or not the the should re-Execute + the if a 'recovery' or 'fail-over' situation is + encountered. + + If not explicitly set, the default value is . + + + + + + + Whether or not the should remain stored after it is + orphaned (no s point to it). + + If not explicitly set, the default value is . + + + + if the Job should remain persisted after + being orphaned. + + + + + Whether the associated Job class carries the attribute. + + + + + Whether the associated Job class carries the attribute. + + + + + A context bundle containing handles to various environment information, that + is given to a instance as it is + executed, and to a instance after the + execution completes. + + + + The found on this object (via the + method) serves as a convenience - + it is a merge of the found on the + and the one found on the , with + the value in the latter overriding any same-named values in the former. + It is thus considered a 'best practice' that the Execute code of a Job + retrieve data from the JobDataMap found on this object + + + NOTE: Do not + expect value 'set' into this JobDataMap to somehow be set back onto a + job's own JobDataMap. + + + + s are also returned from the + + method. These are the same instances as those past into the jobs that are + currently executing within the scheduler. The exception to this is when your + application is using Quartz remotely (i.e. via remoting or WCF) - in which case you get + a clone of the s, and their references to + the and instances have been lost (a + clone of the is still available - just not a handle + to the job instance that is running). + + + + + + + + James House + Marko Lahma (.NET) + + + + A context bundle containing handles to various environment information, that + is given to a instance as it is + executed, and to a instance after the + execution completes. + + + + + Put the specified value into the context's data map with the given key. + Possibly useful for sharing data between listeners and jobs. + + NOTE: this data is volatile - it is lost after the job execution + completes, and all TriggerListeners and JobListeners have been + notified. + + + + + + + + + + Get the value with the given key from the context's data map. + + + + + + + Get a handle to the instance that fired the + . + + + + + Get a handle to the instance that fired the + . + + + + + Get a handle to the referenced by the + instance that fired the . + + + + + If the is being re-executed because of a 'recovery' + situation, this method will return . + + + + + Gets the refire count. + + The refire count. + + + + Get the convenience of this execution context. + + + + The found on this object serves as a convenience - + it is a merge of the found on the + and the one found on the , with + the value in the latter overriding any same-named values in the former. + It is thus considered a 'best practice' that the Execute code of a Job + retrieve data from the JobDataMap found on this object. + + + NOTE: Do not expect value 'set' into this JobDataMap to somehow be + set back onto a job's own JobDataMap. + + + Attempts to change the contents of this map typically result in an + illegal state. + + + + + + Get the associated with the . + + + + + Get the instance of the that was created for this + execution. + + Note: The Job instance is not available through remote scheduler + interfaces. + + + + + + The actual time the trigger fired. For instance the scheduled time may + have been 10:00:00 but the actual fire time may have been 10:00:03 if + the scheduler was too busy. + + Returns the fireTimeUtc. + + + + + The scheduled time the trigger fired for. For instance the scheduled + time may have been 10:00:00 but the actual fire time may have been + 10:00:03 if the scheduler was too busy. + + Returns the scheduledFireTimeUtc. + + + + + Gets the previous fire time. + + The previous fire time. + + + + Gets the next fire time. + + The next fire time. + + + + Get the unique Id that identifies this particular firing instance of the + trigger that triggered this job execution. It is unique to this + JobExecutionContext instance as well. + + the unique fire instance id + + + + + Returns the result (if any) that the set before its + execution completed (the type of object set as the result is entirely up + to the particular job). + + + + The result itself is meaningless to Quartz, but may be informative + to s or + s that are watching the job's + execution. + + + Set the result (if any) of the 's execution (the type of + object set as the result is entirely up to the particular job). + + + The result itself is meaningless to Quartz, but may be informative + to s or + s that are watching the job's + execution. + + + + + + The amount of time the job ran for. The returned + value will be until the job has actually completed (or thrown an + exception), and is therefore generally only useful to + s and s. + + + + + Create a JobExcecutionContext with the given context data. + + + + + Increments the refire count. + + + + + Returns a that represents the current . + + + A that represents the current . + + + + + Put the specified value into the context's data map with the given key. + Possibly useful for sharing data between listeners and jobs. + + NOTE: this data is volatile - it is lost after the job execution + completes, and all TriggerListeners and JobListeners have been + notified. + + + + + + + + + + Get the value with the given key from the context's data map. + + + + + + + Get a handle to the instance that fired the + . + + + + + Get a handle to the instance that fired the + . + + + + + Get a handle to the referenced by the + instance that fired the . + + + + + If the is being re-executed because of a 'recovery' + situation, this method will return . + + + + + Gets the refire count. + + The refire count. + + + + Get the convenience of this execution context. + + + + The found on this object serves as a convenience - + it is a merge of the found on the + and the one found on the , with + the value in the latter overriding any same-named values in the former. + It is thus considered a 'best practice' that the Execute code of a Job + retrieve data from the JobDataMap found on this object. + + + NOTE: Do not expect value 'set' into this JobDataMap to somehow be + set back onto a job's own JobDataMap. + + + Attempts to change the contents of this map typically result in an + illegal state. + + + + + + Get the associated with the . + + + + + Get the instance of the that was created for this + execution. + + Note: The Job instance is not available through remote scheduler + interfaces. + + + + + + The actual time the trigger fired. For instance the scheduled time may + have been 10:00:00 but the actual fire time may have been 10:00:03 if + the scheduler was too busy. + + Returns the fireTimeUtc. + + + + + The scheduled time the trigger fired for. For instance the scheduled + time may have been 10:00:00 but the actual fire time may have been + 10:00:03 if the scheduler was too busy. + + Returns the scheduledFireTimeUtc. + + + + + Gets the previous fire time. + + The previous fire time. + + + + Gets the next fire time. + + The next fire time. + + + + Returns the result (if any) that the set before its + execution completed (the type of object set as the result is entirely up + to the particular job). + + + + The result itself is meaningless to Quartz, but may be informative + to s or + s that are watching the job's + execution. + + + Set the result (if any) of the 's execution (the type of + object set as the result is entirely up to the particular job). + + + The result itself is meaningless to Quartz, but may be informative + to s or + s that are watching the job's + execution. + + + + + + The amount of time the job ran for. The returned + value will be until the job has actually completed (or thrown an + exception), and is therefore generally only useful to + s and s. + + + + + Returns the fire instace id. + + + + + An implementation of the interface that remotely + proxies all method calls to the equivalent call on a given + instance, via remoting or similar technology. + + + + James House + Marko Lahma (.NET) + + + + This is the main interface of a Quartz Scheduler. + + + + A maintains a registry of + s and s. Once + registered, the is responsible for executing + s when their associated s + fire (when their scheduled time arrives). + + + instances are produced by a + . A scheduler that has already been + created/initialized can be found and used through the same factory that + produced it. After a has been created, it is in + "stand-by" mode, and must have its method + called before it will fire any s. + + + s are to be created by the 'client program', by + defining a class that implements the interface. + objects are then created (also by the client) to + define a individual instances of the . + instances can then be registered with the + via the %IScheduler.ScheduleJob(JobDetail, + Trigger)% or %IScheduler.AddJob(JobDetail, bool)% method. + + + s can then be defined to fire individual + instances based on given schedules. + s are most useful for one-time firings, or + firing at an exact moment in time, with N repeats with a given delay between + them. s allow scheduling based on time of day, + day of week, day of month, and month of year. + + + s and s have a name and + group associated with them, which should uniquely identify them within a single + . The 'group' feature may be useful for creating + logical groupings or categorizations of s and + s. If you don't have need for assigning a group to a + given s of s, then you can use + the constant defined on + this interface. + + + Stored s can also be 'manually' triggered through the + use of the %IScheduler.TriggerJob(string, string)% function. + + + Client programs may also be interested in the 'listener' interfaces that are + available from Quartz. The interface provides + notifications of executions. The + interface provides notifications of + firings. The + interface provides notifications of events and + errors. Listeners can be associated with local schedulers through the + interface. + + + The setup/configuration of a instance is very + customizable. Please consult the documentation distributed with Quartz. + + + + + + + + + Marko Lahma (.NET) + + + + returns true if the given JobGroup + is paused + + + + + + + returns true if the given TriggerGroup + is paused + + + + + + + Get a object describing the settings + and capabilities of the scheduler instance. + + + Note that the data returned is an 'instantaneous' snap-shot, and that as + soon as it's returned, the meta data values may be different. + + + + + Return a list of objects that + represent all currently executing Jobs in this Scheduler instance. + + + + This method is not cluster aware. That is, it will only return Jobs + currently executing in this Scheduler instance, not across the entire + cluster. + + + Note that the list returned is an 'instantaneous' snap-shot, and that as + soon as it's returned, the true list of executing jobs may be different. + Also please read the doc associated with - + especially if you're using remoting. + + + + + + + Get the names of all known groups. + + + + + Get the names of all known groups. + + + + + Get the names of all groups that are paused. + + + + + Starts the 's threads that fire s. + When a scheduler is first created it is in "stand-by" mode, and will not + fire triggers. The scheduler can also be put into stand-by mode by + calling the method. + + + The misfire/recovery process will be started, if it is the initial call + to this method on this scheduler instance. + + + + + + + + Calls after the indicated delay. + (This call does not block). This can be useful within applications that + have initializers that create the scheduler immediately, before the + resources needed by the executing jobs have been fully initialized. + + + + + + + + Temporarily halts the 's firing of s. + + + + When is called (to bring the scheduler out of + stand-by mode), trigger misfire instructions will NOT be applied + during the execution of the method - any misfires + will be detected immediately afterward (by the 's + normal process). + + + The scheduler is not destroyed, and can be re-started at any time. + + + + + + + + Halts the 's firing of s, + and cleans up all resources associated with the Scheduler. Equivalent to + . + + + The scheduler cannot be re-started. + + + + + + Halts the 's firing of s, + and cleans up all resources associated with the Scheduler. + + + The scheduler cannot be re-started. + + + if the scheduler will not allow this method + to return until all currently executing jobs have completed. + + + + + + Add the given to the + Scheduler, and associate the given with + it. + + + If the given Trigger does not reference any , then it + will be set to reference the Job passed with it into this method. + + + + + Schedule the given with the + identified by the 's settings. + + + + + Schedule all of the given jobs with the related set of triggers. + + + If any of the given jobs or triggers already exist (or more + specifically, if the keys are not unique) and the replace + parameter is not set to true then an exception will be thrown. + + + + + Remove the indicated from the scheduler. + If the related job does not have any other triggers, and the job is + not durable, then the job will also be deleted. + + + + + Remove all of the indicated s from the scheduler. + + + If the related job does not have any other triggers, and the job is + not durable, then the job will also be deleted. + Note that while this bulk operation is likely more efficient than + invoking several + times, it may have the adverse affect of holding data locks for a + single long duration of time (rather than lots of small durations + of time). + + + + + Remove (delete) the with the + given key, and store the new given one - which must be associated + with the same job (the new trigger must have the job name & group specified) + - however, the new trigger need not have the same name as the old trigger. + + The to be replaced. + + The new to be stored. + + + if a with the given + name and group was not found and removed from the store (and the + new trigger is therefore not stored), otherwise + the first fire time of the newly scheduled trigger. + + + + + Add the given to the Scheduler - with no associated + . The will be 'dormant' until + it is scheduled with a , or + is called for it. + + + The must by definition be 'durable', if it is not, + SchedulerException will be thrown. + + + + + Delete the identified from the Scheduler - and any + associated s. + + true if the Job was found and deleted. + + + + Delete the identified jobs from the Scheduler - and any + associated s. + + + Note that while this bulk operation is likely more efficient than + invoking several + times, it may have the adverse affect of holding data locks for a + single long duration of time (rather than lots of small durations + of time). + + + true if all of the Jobs were found and deleted, false if + one or more were not deleted. + + + + + Trigger the identified + (Execute it now). + + + + + Trigger the identified (Execute it now). + + + the (possibly ) JobDataMap to be + associated with the trigger that fires the job immediately. + + + The of the to be executed. + + + + + Pause the with the given + key - by pausing all of its current s. + + + + + Pause all of the s in the + matching groups - by pausing all of their s. + + + + The Scheduler will "remember" that the groups are paused, and impose the + pause on any new jobs that are added to any of those groups until it is resumed. + + NOTE: There is a limitation that only exactly matched groups + can be remembered as paused. For example, if there are pre-existing + job in groups "aaa" and "bbb" and a matcher is given to pause + groups that start with "a" then the group "aaa" will be remembered + as paused and any subsequently added jobs in group "aaa" will be paused, + however if a job is added to group "axx" it will not be paused, + as "axx" wasn't known at the time the "group starts with a" matcher + was applied. HOWEVER, if there are pre-existing groups "aaa" and + "bbb" and a matcher is given to pause the group "axx" (with a + group equals matcher) then no jobs will be paused, but it will be + remembered that group "axx" is paused and later when a job is added + in that group, it will become paused. + + + + + + Pause the with the given key. + + + + + Pause all of the s in the groups matching. + + + + The Scheduler will "remember" all the groups paused, and impose the + pause on any new triggers that are added to any of those groups until it is resumed. + + NOTE: There is a limitation that only exactly matched groups + can be remembered as paused. For example, if there are pre-existing + triggers in groups "aaa" and "bbb" and a matcher is given to pause + groups that start with "a" then the group "aaa" will be remembered as + paused and any subsequently added triggers in that group be paused, + however if a trigger is added to group "axx" it will not be paused, + as "axx" wasn't known at the time the "group starts with a" matcher + was applied. HOWEVER, if there are pre-existing groups "aaa" and + "bbb" and a matcher is given to pause the group "axx" (with a + group equals matcher) then no triggers will be paused, but it will be + remembered that group "axx" is paused and later when a trigger is added + in that group, it will become paused. + + + + + + Resume (un-pause) the with + the given key. + + + If any of the 's s missed one + or more fire-times, then the 's misfire + instruction will be applied. + + + + + Resume (un-pause) all of the s + in matching groups. + + + If any of the s had s that + missed one or more fire-times, then the 's + misfire instruction will be applied. + + + + + + Resume (un-pause) the with the given + key. + + + If the missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + Resume (un-pause) all of the s in matching groups. + + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Pause all triggers - similar to calling + on every group, however, after using this method + must be called to clear the scheduler's state of 'remembering' that all + new triggers will be paused as they are added. + + + When is called (to un-pause), trigger misfire + instructions WILL be applied. + + + + + + + + Resume (un-pause) all triggers - similar to calling + on every group. + + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Get the keys of all the s in the matching groups. + + + + + Get all s that are associated with the + identified . + + + The returned Trigger objects will be snap-shots of the actual stored + triggers. If you wish to modify a trigger, you must re-store the + trigger afterward (e.g. see ). + + + + + Get the names of all the s in the given + groups. + + + + + Get the for the + instance with the given key . + + + The returned JobDetail object will be a snap-shot of the actual stored + JobDetail. If you wish to modify the JobDetail, you must re-store the + JobDetail afterward (e.g. see ). + + + + + Get the instance with the given key. + + + The returned Trigger object will be a snap-shot of the actual stored + trigger. If you wish to modify the trigger, you must re-store the + trigger afterward (e.g. see ). + + + + + Get the current state of the identified . + + + + + + + + + + + Add (register) the given to the Scheduler. + + Name of the calendar. + The calendar. + if set to true [replace]. + whether or not to update existing triggers that + referenced the already existing calendar so that they are 'correct' + based on the new trigger. + + + + Delete the identified from the Scheduler. + + Name of the calendar. + + true if the Calendar was found and deleted. + + + + + Get the instance with the given name. + + + + + Get the names of all registered . + + + + + Request the interruption, within this Scheduler instance, of all + currently executing instances of the identified , which + must be an implementor of the interface. + + + + If more than one instance of the identified job is currently executing, + the method will be called on + each instance. However, there is a limitation that in the case that + on one instances throws an exception, all + remaining instances (that have not yet been interrupted) will not have + their method called. + + + + If you wish to interrupt a specific instance of a job (when more than + one is executing) you can do so by calling + to obtain a handle + to the job instance, and then invoke on it + yourself. + + + This method is not cluster aware. That is, it will only interrupt + instances of the identified InterruptableJob currently executing in this + Scheduler instance, not across the entire cluster. + + + + true is at least one instance of the identified job was found and interrupted. + + + + + + + Request the interruption, within this Scheduler instance, of the + identified executing job instance, which + must be an implementor of the interface. + + + This method is not cluster aware. That is, it will only interrupt + instances of the identified InterruptableJob currently executing in this + Scheduler instance, not across the entire cluster. + + + + + + + the unique identifier of the job instance to be interrupted (see + + true if the identified job instance was found and interrupted. + + + + Determine whether a with the given identifier already + exists within the scheduler. + + the identifier to check for + true if a Job exists with the given identifier + + + + Determine whether a with the given identifier already + exists within the scheduler. + + the identifier to check for + true if a Trigger exists with the given identifier + + + + Clears (deletes!) all scheduling data - all s, s + s. + + + + + Returns the name of the . + + + + + Returns the instance Id of the . + + + + + Returns the of the . + + + + + Reports whether the is in stand-by mode. + + + + + + + Reports whether the has been Shutdown. + + + + + Set the that will be responsible for producing + instances of classes. + + + JobFactories may be of use to those wishing to have their application + produce instances via some special mechanism, such as to + give the opportunity for dependency injection. + + + + + + Get a reference to the scheduler's , + through which listeners may be registered. + + the scheduler's + + + + + + + + Whether the scheduler has been started. + + + Note: This only reflects whether has ever + been called on this Scheduler, so it will return even + if the is currently in standby mode or has been + since shutdown. + + + + + + + + Construct a instance to proxy the given + RemoteableQuartzScheduler instance. + + + + + returns true if the given JobGroup + is paused + + + + + + + returns true if the given TriggerGroup + is paused + + + + + + + Get a object describiing the settings + and capabilities of the scheduler instance. + + Note that the data returned is an 'instantaneous' snap-shot, and that as + soon as it's returned, the meta data values may be different. + + + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Get the names of all groups that are paused. + + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Get the names of all registered . + + + + + + Calls the equivalent method on the 'proxied' . + + + + + Returns the name of the . + + + + + Returns the instance Id of the . + + + + + Returns the of the . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Set the that will be responsible for producing + instances of classes. + + JobFactories may be of use to those wishing to have their application + produce instances via some special mechanism, such as to + give the opertunity for dependency injection. + + + + + SchedulerException + + + + Whether the scheduler has been started. + + + + Note: This only reflects whether has ever + been called on this Scheduler, so it will return even + if the is currently in standby mode or has been + since shutdown. + + + + + + + + This utility calls methods reflectively on the given objects even though the + methods are likely on a proper interface (ThreadPool, JobStore, etc). The + motivation is to be tolerant of older implementations that have not been + updated for the changes in the interfaces (eg. LocalTaskExecutorThreadPool in + spring quartz helpers) + + teck + Marko Lahma (.NET) + + + + Holds references to Scheduler instances - ensuring uniqueness, and + preventing garbage collection, and allowing 'global' lookups. + + James House + Marko Lahma (.NET) + + + + Binds the specified sched. + + The sched. + + + + Removes the specified sched name. + + Name of the sched. + + + + + Lookups the specified sched name. + + Name of the sched. + + + + + Lookups all. + + + + + + Gets the singleton instance. + + The instance. + + + + Responsible for creating the instances of + to be used within the instance. + + James House + Marko Lahma (.NET) + + + + Initialize the factory, providing a handle to the + that should be made available within the and + the s within it. + + + + + Called by the to obtain instances of + . + + + + + An implementation of the interface that directly + proxies all method calls to the equivalent call on a given + instance. + + + + James House + Marko Lahma (.NET) + + + + returns true if the given JobGroup + is paused + + + + + + + returns true if the given TriggerGroup + is paused + + + + + + + Get a object describiing the settings + and capabilities of the scheduler instance. + + Note that the data returned is an 'instantaneous' snap-shot, and that as + soon as it's returned, the meta data values may be different. + + + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Construct a instance to proxy the given + instance. + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Get the names of all registered . + + + + + + Request the interruption, within this Scheduler instance, of all + currently executing instances of the identified , which + must be an implementor of the interface. + + + + If more than one instance of the identified job is currently executing, + the method will be called on + each instance. However, there is a limitation that in the case that + on one instances throws an exception, all + remaining instances (that have not yet been interrupted) will not have + their method called. + + + If you wish to interrupt a specific instance of a job (when more than + one is executing) you can do so by calling + to obtain a handle + to the job instance, and then invoke on it + yourself. + + + This method is not cluster aware. That is, it will only interrupt + instances of the identified InterruptableJob currently executing in this + Scheduler instance, not across the entire cluster. + + + true is at least one instance of the identified job was found and interrupted. + UnableToInterruptJobException if the job does not implement + + + + + + Returns the name of the . + + + + + Returns the instance Id of the . + + + + + Returns the of the . + + + + + Whether the scheduler has been started. + + + + Note: This only reflects whether has ever + been called on this Scheduler, so it will return even + if the is currently in standby mode or has been + since shutdown. + + + + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + + + + + An implementation of that + does all of it's work of creating a instance + based on the contents of a properties file. + + + + By default a properties are loaded from App.config's quartz section. + If that fails, then the file is loaded "quartz.properties". If file does not exist, + default configration located (as a embedded resource) in Quartz.dll is loaded. If you + wish to use a file other than these defaults, you must define the system + property 'quartz.properties' to point to the file you want. + + + See the sample properties that are distributed with Quartz for + information about the various settings available within the file. + + + Alternativly, you can explicitly Initialize the factory by calling one of + the methods before calling . + + + Instances of the specified , + , classes will be created + by name, and then any additional properties specified for them in the config + file will be set on the instance by calling an equivalent 'set' method. For + example if the properties file contains the property 'quartz.jobStore. + myProp = 10' then after the JobStore class has been instantiated, the property + 'MyProp' will be set with the value. Type conversion to primitive CLR types + (int, long, float, double, boolean, enum and string) are performed before calling + the property's setter method. + + + James House + Anthony Eden + Mohammad Rezaei + Marko Lahma (.NET) + + + + Returns a handle to the default Scheduler, creating it if it does not + yet exist. + + + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The props. + + + + Initialize the . + + + By default a properties file named "quartz.properties" is loaded from + the 'current working directory'. If that fails, then the + "quartz.properties" file located (as an embedded resource) in the Quartz.NET + assembly is loaded. If you wish to use a file other than these defaults, + you must define the system property 'quartz.properties' to point to + the file you want. + + + + + Creates a new name value collection and overrides its values + with system values (environment variables). + + The base properties to override. + A new NameValueCollection instance. + + + + Initialize the with + the contents of the given key value collection object. + + + + + + + + Needed while loadhelper is not constructed. + + + + + + + Returns a handle to the Scheduler produced by this factory. + + + If one of the methods has not be previously + called, then the default (no-arg) method + will be called by this method. + + + + + Returns a handle to the Scheduler with the given name, if it exists (if + it has already been instantiated). + + + + + + Returns a handle to all known Schedulers (made by any + StdSchedulerFactory instance.). + + + + + + Inspects a directory and compares whether any files' "last modified dates" + have changed since the last time it was inspected. If one or more files + have been updated (or created), the job invokes a "call-back" method on an + identified that can be found in the + . + + pl47ypus + James House + Marko Lahma (.NET) + + + + + The interface to be implemented by classes which represent a 'job' to be + performed. + + + Instances of this interface must have a + no-argument constructor. provides a mechanism for 'instance member data' + that may be required by some implementations of this interface. + + + + + + + + James House + Marko Lahma (.NET) + + + + Called by the when a + fires that is associated with the . + + + The implementation may wish to set a result object on the + JobExecutionContext before this method exits. The result itself + is meaningless to Quartz, but may be informative to + s or + s that are watching the job's + execution. + + The execution context. + + + key with which to specify the directory to be + monitored - an absolute path is recommended. + + + key with which to specify the + to be + notified when the directory contents change. + + + key with which to specify a + value that represents the minimum number of milliseconds that must have + passed since the file's last modified time in order to consider the file + new/altered. This is necessary because another process may still be + in the middle of writing to the file when the scan occurs, and the + file may therefore not yet be ready for processing. + If this parameter is not specified, a default value of 5000 (five seconds) will be used. + + + + This is the main entry point for job execution. The scheduler will call this method on the + job once it is triggered. + + The that + the job will use during execution. + + + + Inspects a file and compares whether it's "last modified date" has changed + since the last time it was inspected. If the file has been updated, the + job invokes a "call-back" method on an identified + that can be found in the + . + + James House + Marko Lahma (.NET) + + + + + JobDataMap key with which to specify the name of the file to monitor. + + + + + JobDataMap key with which to specify the + to be notified when the file contents change. + + + + + key with which to specify a long + value that represents the minimum number of milliseconds that must have + past since the file's last modified time in order to consider the file + new/altered. This is necessary because another process may still be + in the middle of writing to the file when the scan occurs, and the + file may therefore not yet be ready for processing. + + If this parameter is not specified, a default value of + 5000 (five seconds) will be used. + + + + + Initializes a new instance of the class. + + + + + Called by the when a + fires that is associated with the . + + The implementation may wish to set a result object on the + JobExecutionContext before this method exits. The result itself + is meaningless to Quartz, but may be informative to + s or + s that are watching the job's + execution. + + + The execution context. + + + + + + Gets the last modified date. + + Name of the file. + + + + + Gets the log. + + The log. + + + Interface for objects wishing to receive a 'call-back' from a + Instances should be stored in the such that the + can find it. + James House + Marko Lahma (.NET) + + + An array of objects that were updated/added + since the last scan of the directory + + + + Interface for objects wishing to receive a 'call-back' from a + . + + James House + Marko Lahma (.NET) + + + + + Ãnforms that certain file has been updated. + + Name of the file. + + + + Built in job for executing native executables in a separate process. + + + + JobDetail job = new JobDetail("dumbJob", null, typeof(Quartz.Jobs.NativeJob)); + job.JobDataMap.Put(Quartz.Jobs.NativeJob.PropertyCommand, "echo \"hi\" >> foobar.txt"); + Trigger trigger = TriggerUtils.MakeSecondlyTrigger(5); + trigger.Name = "dumbTrigger"; + sched.ScheduleJob(job, trigger); + + If PropertyWaitForProcess is true, then the integer exit value of the process + will be saved as the job execution result in the JobExecutionContext. + + Matthew Payne + James House + Steinar Overbeck Cook + Marko Lahma (.NET) + + + + Required parameter that specifies the name of the command (executable) + to be ran. + + + + + Optional parameter that specifies the parameters to be passed to the + executed command. + + + + + Optional parameter (value should be 'true' or 'false') that specifies + whether the job should wait for the execution of the native process to + complete before it completes. + + Defaults to . + + + + + Optional parameter (value should be 'true' or 'false') that specifies + whether the spawned process's stdout and stderr streams should be + consumed. If the process creates output, it is possible that it might + 'hang' if the streams are not consumed. + + Defaults to . + + + + + Optional parameter that specifies the workling directory to be used by + the executed command. + + + + + Initializes a new instance of the class. + + + + + Called by the when a + fires that is associated with the . + + The implementation may wish to set a result object on the + JobExecutionContext before this method exits. The result itself + is meaningless to Quartz, but may be informative to + s or + s that are watching the job's + execution. + + + + + + + Gets the log. + + The log. + + + + Consumes data from the given input stream until EOF and prints the data to stdout + + cooste + James House + + + + Initializes a new instance of the class. + + The enclosing instance. + The input stream. + The type. + + + + Runs this object as a separate thread, printing the contents of the input stream + supplied during instantiation, to either Console. or stderr + + + + + An implementation of Job, that does absolutely nothing - useful for system + which only wish to use s + and s, rather than writing + Jobs that perform work. + + James House + Marko Lahma (.NET) + + + + Do nothing. + + + + + A Job which sends an e-mail with the configured content to the configured + recipient. + + James House + Marko Lahma (.NET) + + + The host name of the smtp server. REQUIRED. + + + The e-mail address to send the mail to. REQUIRED. + + + The e-mail address to cc the mail to. Optional. + + + The e-mail address to claim the mail is from. REQUIRED. + + + The e-mail address the message should say to reply to. Optional. + + + The subject to place on the e-mail. REQUIRED. + + + The e-mail message body. REQUIRED. + + + + Executes the job. + + The job execution context. + + + + Holds a List of references to JobListener instances and broadcasts all + events to them (in order). + + + The broadcasting behavior of this listener to delegate listeners may be + more convenient than registering all of the listeners directly with the + Scheduler, and provides the flexibility of easily changing which listeners + get notified. + + + + + James House (jhouse AT revolition DOT net) + + + + Construct an instance with the given name. + + + (Remember to add some delegate listeners!) + + the name of this instance + + + + Construct an instance with the given name, and List of listeners. + + + + the name of this instance + the initial List of JobListeners to broadcast to. + + + + Holds a List of references to SchedulerListener instances and broadcasts all + events to them (in order). + + + This may be more convenient than registering all of the listeners + directly with the Scheduler, and provides the flexibility of easily changing + which listeners get notified. + + + + James House + Marko Lahma (.NET) + + + + Construct an instance with the given List of listeners. + + The initial List of SchedulerListeners to broadcast to. + + + + Holds a List of references to TriggerListener instances and broadcasts all + events to them (in order). + + + The broadcasting behavior of this listener to delegate listeners may be + more convenient than registering all of the listeners directly with the + Scheduler, and provides the flexibility of easily changing which listeners + get notified. + + + + + James House (jhouse AT revolition DOT net) + + + + The interface to be implemented by classes that want to be informed when a + fires. In general, applications that use a + will not have use for this mechanism. + + + + + + + James House + Marko Lahma (.NET) + + + + Called by the when a + has fired, and it's associated + is about to be executed. + + It is called before the method of this + interface. + + + The that has fired. + + The that will be passed to the 's method. + + + + + Called by the when a + has fired, and it's associated + is about to be executed. + + It is called after the method of this + interface. If the implementation vetos the execution (via + returning ), the job's execute method will not be called. + + + The that has fired. + The that will be passed to + the 's method. + Returns true if job execution should be vetoed, false otherwise. + + + + Called by the when a + has misfired. + + Consideration should be given to how much time is spent in this method, + as it will affect all triggers that are misfiring. If you have lots + of triggers misfiring at once, it could be an issue it this method + does a lot. + + + The that has misfired. + + + + Called by the when a + has fired, it's associated + has been executed, and it's method has been + called. + + The that was fired. + + The that was passed to the + 's method. + + + The result of the call on the 's method. + + + + + Get the name of the . + + + + + Construct an instance with the given name. + + + (Remember to add some delegate listeners!) + + the name of this instance + + + + Construct an instance with the given name, and List of listeners. + + + + the name of this instance + the initial List of TriggerListeners to broadcast to. + + + + Keeps a collection of mappings of which Job to trigger after the completion + of a given job. If this listener is notified of a job completing that has a + mapping, then it will then attempt to trigger the follow-up job. This + achieves "job chaining", or a "poor man's workflow". + + + + Generally an instance of this listener would be registered as a global + job listener, rather than being registered directly to a given job. + + + If for some reason there is a failure creating the trigger for the + follow-up job (which would generally only be caused by a rare serious + failure in the system, or the non-existence of the follow-up job), an error + messsage is logged, but no other action is taken. If you need more rigorous + handling of the error, consider scheduling the triggering of the flow-up + job within your job itself. + + + James House + Marko Lahma (.NET) + + + + A helpful abstract base class for implementors of . + + + + The methods in this class are empty so you only need to override the + subset for the events you care about. + + + + You are required to implement + to return the unique name of your . + + + Marko Lahma (.NET) + + + + + Initializes a new instance of the class. + + + + + Called by the when a + is about to be executed (an associated + has occured). + + This method will not be invoked if the execution of the Job was vetoed + by a . + + + + + + + + Called by the when a + was about to be executed (an associated + has occured), but a vetoed it's + execution. + + + + + + + Called by the after a + has been executed, and be for the associated 's + method has been called. + + + + + + + Get the for this class's category. + This should be used by subclasses for logging. + + + + + Get the name of the . + + + + + + Construct an instance with the given name. + + The name of this instance. + + + + Add a chain mapping - when the Job identified by the first key completes + the job identified by the second key will be triggered. + + a JobKey with the name and group of the first job + a JobKey with the name and group of the follow-up job + + + + A helpful abstract base class for implementors of + . + + + + The methods in this class are empty so you only need to override the + subset for the events + you care about. + + + + You are required to implement + to return the unique name of your . + + + Marko Lahma (.NET) + + + + + Get the for this + class's category. This should be used by subclasses for logging. + + + + + Get the name of the . + + + + + + Logs a history of all job executions (and execution vetos) via common + logging. + + + + The logged message is customizable by setting one of the following message + properties to a string that conforms to the syntax of . + + + JobToBeFiredMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Job's Name.
1StringThe Job's Group.
2DateThe current time.
3StringThe Trigger's name.
4StringThe Triggers's group.
5DateThe scheduled fire time.
6DateThe next scheduled fire time.
7IntegerThe re-fire count from the JobExecutionContext.
+ The default message text is "Job {1}.{0} fired (by trigger {4}.{3}) at: + {2, date, HH:mm:ss MM/dd/yyyy" +
+ + JobSuccessMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Job's Name.
1StringThe Job's Group.
2DateThe current time.
3StringThe Trigger's name.
4StringThe Triggers's group.
5DateThe scheduled fire time.
6DateThe next scheduled fire time.
7IntegerThe re-fire count from the JobExecutionContext.
8ObjectThe string value (toString() having been called) of the result (if any) + that the Job set on the JobExecutionContext, with on it. "NULL" if no + result was set.
+ The default message text is "Job {1}.{0} execution complete at {2, date, + HH:mm:ss MM/dd/yyyy} and reports: {8" +
+ + JobFailedMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Job's Name.
1StringThe Job's Group.
2DateThe current time.
3StringThe Trigger's name.
4StringThe Triggers's group.
5DateThe scheduled fire time.
6DateThe next scheduled fire time.
7IntegerThe re-fire count from the JobExecutionContext.
8StringThe message from the thrown JobExecution Exception. +
+ The default message text is "Job {1}.{0} execution failed at {2, date, + HH:mm:ss MM/dd/yyyy} and reports: {8" +
+ + JobWasVetoedMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Job's Name.
1StringThe Job's Group.
2DateThe current time.
3StringThe Trigger's name.
4StringThe Triggers's group.
5DateThe scheduled fire time.
6DateThe next scheduled fire time.
7IntegerThe re-fire count from the JobExecutionContext.
+ The default message text is "Job {1}.{0} was vetoed. It was to be fired + (by trigger {4}.{3}) at: {2, date, HH:mm:ss MM/dd/yyyy" +
+
+ Marko Lahma (.NET) +
+ + + Provides an interface for a class to become a "plugin" to Quartz. + + + Plugins can do virtually anything you wish, though the most interesting ones + will obviously interact with the scheduler in some way - either actively: by + invoking actions on the scheduler, or passively: by being a , + , and/or . + + If you use to + Initialize your Scheduler, it can also create and Initialize your plugins - + look at the configuration docs for details. + + + If you need direct access your plugin, you can have it explicitly put a + reference to itself in the 's + as part of its + method. + + + James House + Marko Lahma (.NET) + + + + Called during creation of the in order to give + the a chance to Initialize. + + + At this point, the Scheduler's is not yet + + If you need direct access your plugin, you can have it explicitly put a + reference to itself in the 's + as part of its + method. + + + + The name by which the plugin is identified. + + + The scheduler to which the plugin is registered. + + + + + Called when the associated is started, in order + to let the plug-in know it can now make calls into the scheduler if it + needs to. + + + + + Called in order to inform the that it + should free up all of it's resources because the scheduler is shutting + down. + + + + + Called during creation of the in order to give + the a chance to Initialize. + + + + + Called when the associated is started, in order + to let the plug-in know it can now make calls into the scheduler if it + needs to. + + + + + Called in order to inform the that it + should free up all of it's resources because the scheduler is shutting + down. + + + + + Called by the when a is + about to be executed (an associated has occurred). + + This method will not be invoked if the execution of the Job was vetoed by a + . + + + + + + + Called by the after a + has been executed, and be for the associated 's + method has been called. + + + + + + + Called by the when a + was about to be executed (an associated + has occured), but a vetoed it's + execution. + + + + + + + Logger instance to use. Defaults to common logging. + + + + + Get or sets the message that is logged when a Job successfully completes its + execution. + + + + + Get or sets the message that is logged when a Job fails its + execution. + + + + + Gets or sets the message that is logged when a Job is about to Execute. + + + + + Gets or sets the message that is logged when a Job execution is vetoed by a + trigger listener. + + + + + Get the name of the . + + + + + + Logs a history of all trigger firings via the Jakarta Commons-Logging + framework. + + + + The logged message is customizable by setting one of the following message + properties to a string that conforms to the syntax of . + + + + TriggerFiredMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Trigger's Name.
1StringThe Trigger's Group.
2DateThe scheduled fire time.
3DateThe next scheduled fire time.
4DateThe actual fire time.
5StringThe Job's name.
6StringThe Job's group.
7IntegerThe re-fire count from the JobExecutionContext.
+ + The default message text is "Trigger {1}.{0} fired job {6}.{5} at: {4, + date, HH:mm:ss MM/dd/yyyy" +
+ + + TriggerMisfiredMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Trigger's Name.
1StringThe Trigger's Group.
2DateThe scheduled fire time.
3DateThe next scheduled fire time.
4DateThe actual fire time. (the time the misfire was detected/handled)
5StringThe Job's name.
6StringThe Job's group.
+ + The default message text is "Trigger {1}.{0} misfired job {6}.{5} at: + {4, date, HH:mm:ss MM/dd/yyyy}. Should have fired at: {3, date, HH:mm:ss + MM/dd/yyyy" +
+ + + TriggerCompleteMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Trigger's Name.
1StringThe Trigger's Group.
2DateThe scheduled fire time.
3DateThe next scheduled fire time.
4DateThe job completion time.
5StringThe Job's name.
6StringThe Job's group.
7IntegerThe re-fire count from the JobExecutionContext.
8IntegerThe trigger's resulting instruction code.
9StringA human-readable translation of the trigger's resulting instruction + code.
+ + The default message text is "Trigger {1}.{0} completed firing job + {6}.{5} at {4, date, HH:mm:ss MM/dd/yyyy} with resulting trigger instruction + code: {9" +
+
+ James House + Marko Lahma (.NET) +
+ + + Called during creation of the in order to give + the a chance to Initialize. + + + + + Called when the associated is started, in order + to let the plug-in know it can now make calls into the scheduler if it + needs to. + + + + + Called in order to inform the that it + should free up all of it's resources because the scheduler is shutting + down. + + + + + Called by the when a + has fired, and it's associated + is about to be executed. + + It is called before the method of this + interface. + + + The that has fired. + The that will be passed to the 's method. + + + + Called by the when a + has misfired. + + Consideration should be given to how much time is spent in this method, + as it will affect all triggers that are misfiring. If you have lots + of triggers misfiring at once, it could be an issue it this method + does a lot. + + + The that has misfired. + + + + Called by the when a + has fired, it's associated + has been executed, and it's method has been + called. + + The that was fired. + The that was passed to the + 's method. + The result of the call on the 's method. + + + + Called by the when a + has fired, and it's associated + is about to be executed. + + It is called after the method of this + interface. + + + The that has fired. + The that will be passed to + the 's method. + + + + + Logger instance to use. Defaults to common logging. + + + + + Get or set the message that is printed upon the completion of a trigger's + firing. + + + + + Get or set the message that is printed upon a trigger's firing. + + + + + Get or set the message that is printed upon a trigger's mis-firing. + + + + + Get the name of the . + + + + + + This plugin catches the event of the VM terminating (such as upon a CRTL-C) + and tells the scheuler to Shutdown. + + + James House + Marko Lahma (.NET) + + + + Called during creation of the in order to give + the a chance to Initialize. + + + + + Called when the associated is started, in order + to let the plug-in know it can now make calls into the scheduler if it + needs to. + + + + + Called in order to inform the that it + should free up all of it's resources because the scheduler is shutting + down. + + + + + Determine whether or not the plug-in is configured to cause a clean + Shutdown of the scheduler. + + The default value is . + + + + + + + This plugin loads XML file(s) to add jobs and schedule them with triggers + as the scheduler is initialized, and can optionally periodically scan the + file for changes. + + + The periodically scanning of files for changes is not currently supported in a + clustered environment. + + James House + Pierre Awaragi + + + + Initializes a new instance of the class. + + + + + + + + + + + Called during creation of the in order to give + the a chance to initialize. + + The name. + The scheduler. + SchedulerConfigException + + + + Called when the associated is started, in order + to let the plug-in know it can now make calls into the scheduler if it + needs to. + + + + + Helper method for generating unique job/trigger name for the + file scanning jobs (one per FileJob). The unique names are saved + in jobTriggerNameSet. + + + + + + + Called in order to inform the that it + should free up all of it's resources because the scheduler is shutting + down. + + + + + Gets the log. + + The log. + + + + Comma separated list of file names (with paths) to the XML files that should be read. + + + + + The interval at which to scan for changes to the file. + If the file has been changed, it is re-loaded and parsed. The default + value for the interval is 0, which disables scanning. + + + + + Whether or not initialization of the plugin should fail (throw an + exception) if the file cannot be found. Default is . + + + + + Information about a file that should be processed by . + + + + + Default object serialization strategy that uses + under the hood. + + Marko Lahma + + + + Interface for object serializers. + + Marko Lahma + + + + + Serializes given object as bytes + that can be stored to permanent stores. + + Object to serialize, always non-null. + + + + Deserializes object from byte array presentation. + + Data to deserialize object from, always non-null and non-empty. + + + + Serializes given object as bytes + that can be stored to permanent stores. + + Object to serialize. + + + + Deserializes object from byte array presentation. + + Data to deserialize object from. + + + + that names the scheduler instance using + just the machine hostname. + + + This class is useful when you know that your scheduler instance will be the + only one running on a particular machine. Each time the scheduler is + restarted, it will get the same instance id as long as the machine is not + renamed. + + Marko Lahma (.NET) + + + + + + An IInstanceIdGenerator is responsible for generating the clusterwide unique + instance id for a node. + + + This interface may be of use to those wishing to have specific control over + the mechanism by which the instances in their + application are named. + + + Marko Lahma (.NET) + + + + Generate the instance id for a + + The clusterwide unique instance id. + + + + + Generate the instance id for a + + The clusterwide unique instance id. + + + + A JobFactory that instantiates the Job instance (using the default no-arg + constructor, or more specifically: ), and + then attempts to set all values from the and + the 's merged onto + properties of the job. + + + Set the WarnIfPropertyNotFound property to true if you'd like noisy logging in + the case of values in the not mapping to properties on your job + class. This may be useful for troubleshooting typos of property names, etc. + but very noisy if you regularly (and purposely) have extra things in your + . + Also of possible interest is the ThrowIfPropertyNotFound property which + will throw exceptions on unmatched JobDataMap keys. + + + + + + + + James Houser + Marko Lahma (.NET) + + + + The default JobFactory used by Quartz - simply calls + on the job class. + + + + James House + Marko Lahma (.NET) + + + + A JobFactory is responsible for producing instances of + classes. + + + This interface may be of use to those wishing to have their application + produce instances via some special mechanism, such as to + give the opertunity for dependency injection. + + + + + James House + Marko Lahma (.NET) + + + + Called by the scheduler at the time of the trigger firing, in order to + produce a instance on which to call Execute. + + + It should be extremely rare for this method to throw an exception - + basically only the the case where there is no way at all to instantiate + and prepare the Job for execution. When the exception is thrown, the + Scheduler will move all triggers associated with the Job into the + state, which will require human + intervention (e.g. an application restart after fixing whatever + configuration problem led to the issue wih instantiating the Job. + + + The TriggerFiredBundle from which the + and other info relating to the trigger firing can be obtained. + + a handle to the scheduler that is about to execute the job + SchedulerException if there is a problem instantiating the Job. + the newly instantiated Job + + + + + Called by the scheduler at the time of the trigger firing, in order to + produce a instance on which to call Execute. + + + It should be extremely rare for this method to throw an exception - + basically only the the case where there is no way at all to instantiate + and prepare the Job for execution. When the exception is thrown, the + Scheduler will move all triggers associated with the Job into the + state, which will require human + intervention (e.g. an application restart after fixing whatever + configuration problem led to the issue wih instantiating the Job. + + The TriggerFiredBundle from which the + and other info relating to the trigger firing can be obtained. + + the newly instantiated Job + SchedulerException if there is a problem instantiating the Job. + + + + Called by the scheduler at the time of the trigger firing, in order to + produce a instance on which to call Execute. + + + + It should be extremely rare for this method to throw an exception - + basically only the the case where there is no way at all to instantiate + and prepare the Job for execution. When the exception is thrown, the + Scheduler will move all triggers associated with the Job into the + state, which will require human + intervention (e.g. an application restart after fixing whatever + configuration problem led to the issue wih instantiating the Job. + + + The TriggerFiredBundle from which the + and other info relating to the trigger firing can be obtained. + + the newly instantiated Job + SchedulerException if there is a problem instantiating the Job. + + + + Sets the object properties. + + The object to set properties to. + The data to set. + + + + Whether the JobInstantiation should fail and throw and exception if + a key (name) and value (type) found in the JobDataMap does not + correspond to a proptery setter on the Job class. + + + + + Get or set whether a warning should be logged if + a key (name) and value (type) found in the JobDataMap does not + correspond to a proptery setter on the Job class. + + + + + This class implements a that + utilizes RAM as its storage device. + + As you should know, the ramification of this is that access is extrememly + fast, but the data is completely volatile - therefore this + should not be used if true persistence between program shutdowns is + required. + + + James House + Sharada Jambula + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + + + + Gets the fired trigger record id. + + The fired trigger record id. + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + Called by the QuartzScheduler to inform the that + the scheduler has started. + + + + + Called by the QuartzScheduler to inform the JobStore that + the scheduler has been paused. + + + + + Called by the QuartzScheduler to inform the JobStore that + the scheduler has resumed after being paused. + + + + + Called by the QuartzScheduler to inform the that + it should free up all of it's resources because the scheduler is + shutting down. + + + + + Clears (deletes!) all scheduling data - all s, s + s. + + + + + Store the given and . + + The to be stored. + The to be stored. + + + + Returns true if the given job group is paused. + + Job group name + + + + + returns true if the given TriggerGroup is paused. + + + + + + + Store the given . + + The to be stored. + If , any existing in the + with the same name and group should be + over-written. + + + + Remove (delete) the with the given + name, and any s that reference + it. + + + if a with the given name and + group was found and removed from the store. + + + + + Remove (delete) the with the + given name. + + + if a with the given + name and group was found and removed from the store. + + + + + Store the given . + + The to be stored. + If , any existing in + the with the same name and group should + be over-written. + + + + Remove (delete) the with the + given name. + + + + if a with the given + name and group was found and removed from the store. + + The to be removed. + Whether to delete orpahaned job details from scheduler if job becomes orphaned from removing the trigger. + + + + Replaces the trigger. + + The of the to be replaced. + The new trigger. + + + + + Retrieve the for the given + . + + + The desired , or null if there is no match. + + + + + Retrieve the given . + + + The desired , or null if there is no match. + + + + + Determine whether a with the given identifier already + exists within the scheduler. + + the identifier to check for + true if a Job exists with the given identifier + + + + Determine whether a with the given identifier already + exists within the scheduler. + + triggerKey the identifier to check for + true if a Trigger exists with the given identifier + + + + Get the current state of the identified . + + + + + + + + + + + Store the given . + + The name. + The to be stored. + If , any existing + in the with the same name and group + should be over-written. + If , any s existing + in the that reference an existing + Calendar with the same name with have their next fire time + re-computed with the new . + + + + Remove (delete) the with the + given name. + + If removal of the would result in + s pointing to non-existent calendars, then a + will be thrown. + + The name of the to be removed. + + if a with the given name + was found and removed from the store. + + + + + Retrieve the given . + + The name of the to be retrieved. + + The desired , or null if there is no match. + + + + + Get the number of s that are + stored in the . + + + + + Get the number of s that are + stored in the . + + + + + Get the number of s that are + stored in the . + + + + + Get the names of all of the s that + match the given group matcher. + + + + + Get the names of all of the s + in the . + + If there are no ICalendars in the given group name, the result should be + a zero-length array (not ). + + + + + + Get the names of all of the s + that have the given group name. + + + + + Get the names of all of the + groups. + + + + + Get the names of all of the groups. + + + + + Get all of the Triggers that are associated to the given Job. + + If there are no matches, a zero-length array should be returned. + + + + + + Gets the trigger wrappers for job. + + + + + + Gets the trigger wrappers for calendar. + + Name of the cal. + + + + + Pause the with the given name. + + + + + Pause all of the s in the given group. + + The JobStore should "remember" that the group is paused, and impose the + pause on any new triggers that are added to the group while the group is + paused. + + + + + + Pause the with the given + name - by pausing all of its current s. + + + + + Pause all of the s in the + given group - by pausing all of their s. + + The JobStore should "remember" that the group is paused, and impose the + pause on any new jobs that are added to the group while the group is + paused. + + + + + + Resume (un-pause) the with the given key. + + + If the missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + Resume (un-pause) all of the s in the + given group. + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Resume (un-pause) the with + the given name. + + If any of the 's s missed one + or more fire-times, then the 's misfire + instruction will be applied. + + + + + + Resume (un-pause) all of the s + in the given group. + + If any of the s had s that + missed one or more fire-times, then the 's + misfire instruction will be applied. + + + + + + Pause all triggers - equivalent of calling + on every group. + + When is called (to un-pause), trigger misfire + instructions WILL be applied. + + + + + + + Resume (un-pause) all triggers - equivalent of calling + on every trigger group and setting all job groups unpaused />. + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + + Applies the misfire. + + The trigger wrapper. + + + + + Get a handle to the next trigger to be fired, and mark it as 'reserved' + by the calling scheduler. + + + + + + Inform the that the scheduler no longer plans to + fire the given , that it had previously acquired + (reserved). + + + + + Inform the that the scheduler is now firing the + given (executing its associated ), + that it had previously acquired (reserved). + + + + + Inform the that the scheduler has completed the + firing of the given (and the execution its + associated ), and that the + in the given should be updated if the + is stateful. + + + + + Sets the state of all triggers of job to specified state. + + + + + Peeks the triggers. + + + + + + + + + The time span by which a trigger must have missed its + next-fire-time, in order for it to be considered "misfired" and thus + have its misfire instruction applied. + + + + + Returns whether this instance supports persistence. + + + + + + + Inform the of the Scheduler instance's Id, + prior to initialize being invoked. + + + + + Inform the of the Scheduler instance's name, + prior to initialize being invoked. + + + + + Comparer for trigger wrappers. + + + + + Indicates whether the current object is equal to another object of the same type. + + + true if the current object is equal to the parameter; otherwise, false. + + An object to compare with this object. + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + 2 + + + + Possible internal trigger states + in RAMJobStore + + + + + Waiting + + + + + Acquired + + + + + Executing + + + + + Complete + + + + + Paused + + + + + Blocked + + + + + Paused and Blocked + + + + + Error + + + + + Helper wrapper class + + + + + The key used + + + + + Job's key + + + + + The trigger + + + + + Current state + + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + + Serves as a hash function for a particular type. is suitable for use in hashing algorithms and data structures like a hash table. + + + A hash code for the current . + + + + + Scheduler exporter that exports scheduler to remoting context. + + Marko Lahma + + + + Service interface for scheduler exporters. + + Marko Lahma + + + + Binds (exports) scheduler to external context. + + + + + + Unbinds scheduler from external context. + + + + + + Registers remoting channel if needed. This is determined + by checking whether there is a positive value for port. + + + + + Gets or sets the port used for remoting. + + + + + Gets or sets the name to use when exporting + scheduler to remoting context. + + + + + Gets or sets the name to use when binding to + tcp channel. + + + + + Sets the channel type when registering remoting. + + + + + + Sets the used when + exporting to remoting context. Defaults to + . + + + + + A implementation that creates + connection to remote scheduler using remoting. + + + + + Client Proxy to a IRemotableQuartzScheduler + + + + + Returns a client proxy to a remote . + + + + + Returns a client proxy to a remote . + + + + + Gets or sets the remote scheduler address. + + The remote scheduler address. + + + + The default InstanceIdGenerator used by Quartz when instance id is to be + automatically generated. Instance id is of the form HOSTNAME + CURRENT_TIME. + + Marko Lahma (.NET) + + + + + + Generate the instance id for a + + The clusterwide unique instance id. + + + + This is class is a simple implementation of a thread pool, based on the + interface. + + + objects are sent to the pool with the + method, which blocks until a becomes available. + + The pool has a fixed number of s, and does not grow or + shrink based on demand. + + James House + Juergen Donnerstag + Marko Lahma (.NET) + + + + The interface to be implemented by classes that want to provide a thread + pool for the 's use. + + + implementation instances should ideally be made + for the sole use of Quartz. Most importantly, when the method + returns a value of 1 or greater, + there must still be at least one available thread in the pool when the + method is called a few moments (or + many moments) later. If this assumption does not hold true, it may + result in extra JobStore queries and updates, and if clustering features + are being used, it may result in greater imballance of load. + + + James House + Marko Lahma (.NET) + + + + Execute the given in the next + available . + + + The implementation of this interface should not throw exceptions unless + there is a serious problem (i.e. a serious misconfiguration). If there + are no available threads, rather it should either queue the Runnable, or + block until a thread is available, depending on the desired strategy. + + + + + Determines the number of threads that are currently available in in + the pool. Useful for determining the number of times + can be called before returning + false. + + + The implementation of this method should block until there is at + least one available thread. + + the number of currently available threads + + + + Must be called before the is + used, in order to give the it a chance to Initialize. + + + Typically called by the . + + + + + Called by the QuartzScheduler to inform the + that it should free up all of it's resources because the scheduler is + shutting down. + + + + + Get the current number of threads in the . + + + + + Inform the of the Scheduler instance's Id, + prior to initialize being invoked. + + + + + Inform the of the Scheduler instance's name, + prior to initialize being invoked. + + + + + Create a new (unconfigured) . + + + + + Create a new with the specified number + of s that have the given priority. + + + the number of worker s in the pool, must + be > 0. + + + the thread priority for the worker threads. + + + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + Terminate any worker threads in this thread group. + Jobs currently in progress will complete. + + + + + Run the given object in the next available + . If while waiting the thread pool is asked to + shut down, the Runnable is executed immediately within a new additional + thread. + + The to be added. + + + + Creates the worker threads. + + The thread count. + + + + + Terminate any worker threads in this thread group. + Jobs currently in progress will complete. + + + + + Gets or sets the number of worker threads in the pool. + Set has no effect after has been called. + + + + + Get or set the thread priority of worker threads in the pool. + Set operation has no effect after has been called. + + + + + Gets or sets the thread name prefix. + + The thread name prefix. + + + + Gets or sets the value of makeThreadsDaemons. + + + + + Gets the size of the pool. + + The size of the pool. + + + + Inform the of the Scheduler instance's Id, + prior to initialize being invoked. + + + + + Inform the of the Scheduler instance's name, + prior to initialize being invoked. + + + + + A Worker loops, waiting to Execute tasks. + + + + + Create a worker thread and start it. Waiting for the next Runnable, + executing it, and waiting for the next Runnable, until the Shutdown + flag is set. + + + + + Create a worker thread, start it, Execute the runnable and terminate + the thread (one time execution). + + + + + Signal the thread that it should terminate. + + + + + Loop, executing targets as they are received. + + + + + A that simply calls . + + + James House + Marko Lahma (.NET) + + + + Called to give the ClassLoadHelper a chance to Initialize itself, + including the oportunity to "steal" the class loader off of the calling + thread, which is the thread that is initializing Quartz. + + + + Return the class with the given name. + + + + Finds a resource with a given name. This method returns null if no + resource with this name is found. + + name of the desired resource + + a Uri object + + + + Finds a resource with a given name. This method returns null if no + resource with this name is found. + + name of the desired resource + + a Stream object + + + + + InstanceIdGenerator that will use a to configure the scheduler. + If no value set for the property, a is thrown. + Alex Snaps + + + + + System property to read the instanceId from. + + + + + Returns the cluster wide value for this scheduler instance's id, based on a system property. + + + + + This is class is a simple implementation of a zero size thread pool, based on the + interface. + + + The pool has zero s and does not grow or shrink based on demand. + Which means it is obviously not useful for most scenarios. When it may be useful + is to prevent creating any worker threads at all - which may be desirable for + the sole purpose of preserving system resources in the case where the scheduler + instance only exists in order to schedule jobs, but which will never execute + jobs (e.g. will never have Start() called on it). + + Wayne Fay + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + Shutdowns this instance. + + + + + Called by the QuartzScheduler to inform the + that it should free up all of it's resources because the scheduler is + shutting down. + + + + + + Execute the given in the next + available . + + + + + The implementation of this interface should not throw exceptions unless + there is a serious problem (i.e. a serious misconfiguration). If there + are no available threads, rather it should either queue the Runnable, or + block until a thread is available, depending on the desired strategy. + + + + + Determines the number of threads that are currently available in in + the pool. Useful for determining the number of times + can be called before returning + false. + + + the number of currently available threads + + + The implementation of this method should block until there is at + least one available thread. + + + + + Gets the log. + + The log. + + + + Gets the size of the pool. + + The size of the pool. + + + + Inform the of the Scheduler instance's Id, + prior to initialize being invoked. + + + + + Inform the of the Scheduler instance's name, + prior to initialize being invoked. + + + + + A simple class (structure) used for returning execution-time data from the + JobStore to the . + + + James House + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + The job. + The trigger. + The calendar. + if set to true [job is recovering]. + The fire time. + The scheduled fire time. + The previous fire time. + The next fire time. + + + + Gets the job detail. + + The job detail. + + + + Gets the trigger. + + The trigger. + + + + Gets the calendar. + + The calendar. + + + + Gets a value indicating whether this is recovering. + + true if recovering; otherwise, false. + + + + Returns the UTC fire time. + + + + + Gets the next UTC fire time. + + The next fire time. + Returns the nextFireTimeUtc. + + + + Gets the previous UTC fire time. + + The previous fire time. + Returns the previous fire time. + + + + Returns the scheduled UTC fire time. + + + + + Result holder for trigger firing event. + + + + + Constructor. + + + + + + Constructor. + + + + + Bundle. + + + + + Possible exception. + + + + + Extension methods for . + + + + + Tries to read value and returns the value if successfully read. Otherwise return default value + for value's type. + + + + + + + + + + Extension methods for simplified access. + + + + + Returns string from given column name, or null if DbNull. + + + + + Returns int from given column name. + + + + + Returns long from given column name. + + + + + Returns long from given column name, or null if DbNull. + + + + + Returns decimal from given column name. + + + + + Manages a collection of IDbProviders, and provides transparent access + to their database. + + + James House + Sharada Jambula + Mohammad Rezaei + Marko Lahma (.NET) + + + + Private constructor + + + + + Adds the connection provider. + + Name of the data source. + The provider. + + + + Get a database connection from the DataSource with the given name. + + a database connection + + + + Shuts down database connections from the DataSource with the given name, + if applicable for the underlying provider. + + a database connection + + + + Gets the db provider. + + Name of the ds. + + + + + Get the class instance. + + an instance of this class + + + + + An implementation of that wraps another + and flags itself 'dirty' when it is modified. + + James House + Marko Lahma (.NET) + + + + Create a DirtyFlagMap that 'wraps' a . + + + + + Create a DirtyFlagMap that 'wraps' a that has the + given initial capacity. + + + + + Serialization constructor. + + + + + + + Creates a new object that is a copy of the current instance. + + + A new object that is a copy of this instance. + + + + + When implemented by a class, removes all elements from the . + + + The is read-only. + + + + + When implemented by a class, determines whether the contains an element with the specified key. + + The key to locate in the . + + if the contains an element with the key; otherwise, . + + + is . + + + + When implemented by a class, removes the element with the + specified key from the . + + The key of the element to remove. + + is . + + The is read-only. + -or- + The has a fixed size. + + + + + When implemented by a class, returns an + for the . + + + An for the . + + + + + When implemented by a class, adds an element with the provided key and value to the . + + The to use as the key of the element to add. + The to use as the value of the element to add. + is . + + An element with the same key already exists in the . + + + The is read-only. + -or- + The has a fixed size. + + + + + When implemented by a class, copies the elements of + the to an , starting at a particular index. + + The one-dimensional that is the destination of the elements copied from . The must have zero-based indexing. + The zero-based index in at which copying begins. + + is . + + is less than zero. + + + is multidimensional. + -or- + + is equal to or greater than the length of . + -or- + The number of elements in the source is greater than the available space from to the end of the destination . + + The type of the source cannot be cast automatically to the type of the destination . + + + + Clear the 'dirty' flag (set dirty flag to ). + + + + + Determines whether the specified obj contains value. + + The obj. + + true if the specified obj contains value; otherwise, false. + + + + + Gets the entries as a set. + + + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + if the specified is equal to the + current ; otherwise, . + + + + + Serves as a hash function for a particular type, suitable + for use in hashing algorithms and data structures like a hash table. + + + A hash code for the current . + + + + + Gets keyset for this map. + + + + + + Puts the value behind a specified key. + + The key. + The val. + + + + + Puts all. + + The t. + + + + Determine whether the is flagged dirty. + + + + + Get a direct handle to the underlying Map. + + + + + Gets a value indicating whether this instance is empty. + + true if this instance is empty; otherwise, false. + + + + Gets or sets the with the specified key. + + + + + + When implemented by a class, gets the number of + elements contained in the . + + + + + + When implemented by a class, gets an containing the values in the . + + + + + + When implemented by a class, gets an containing the keys of the . + + + + + + When implemented by a class, gets a value indicating whether the + is read-only. + + + + + + When implemented by a class, gets a value indicating whether the + has a fixed size. + + + + + + When implemented by a class, gets an object that + can be used to synchronize access to the . + + + + + + When implemented by a class, gets a value + indicating whether access to the is synchronized + (thread-safe). + + + + + + Utility class for file handling related things. + + Marko Lahma + + + + Resolves file to actual file if for example relative '~' used. + + File name to check + Expanded file name or actual no resolving was done. + + + + Object representing a job or trigger key. + + Jeffrey Wescott + Marko Lahma (.NET) + + + + The default group for scheduling entities, with the value "DEFAULT". + + + + + Construct a new key with the given name and group. + + the name + the group + + + + Return the string representation of the key. The format will be: + <group>.<name>. + + + + the string representation of the key + + + + + Get the name portion of the key. + + the name + + + + + Get the group portion of the key. + + + + the group + + + + + Wrapper class to access thread local data. + Data is either accessed from thread or HTTP Context's + data if HTTP Context is avaiable. + + Marko Lahma .NET + + + + Retrieves an object with the specified name. + + The name of the item. + The object in the call context associated with the specified name or null if no object has been stored previously + + + + Stores a given object and associates it with the specified name. + + The name with which to associate the new item. + The object to store in the call context. + + + + Empties a data slot with the specified name. + + The name of the data slot to empty. + + + + Generic extension methods for objects. + + + + + Creates a deep copy of object by serializing to memory stream. + + + + + + Utility methods that are used to convert objects from one type into another. + + Aleksandar Seovic + Marko Lahma + + + + Convert the value to the required (if necessary from a string). + + The proposed change value. + + The we must convert to. + + The new value, possibly the result of type conversion. + + + + Determines whether value is assignable to required type. + + The value to check. + Type of the required. + + true if value can be assigned as given type; otherwise, false. + + + + + Instantiates an instance of the type specified. + + + + + + Sets the object properties using reflection. + + + + + Sets the object properties using reflection. + + The object to set values to. + The properties to set to object. + + + + This is an utility class used to parse the properties. + + James House + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + The props. + + + + Gets the string property. + + The name. + + + + + Gets the string property. + + The name. + The default value. + + + + + Gets the string array property. + + The name. + + + + + Gets the string array property. + + The name. + The default value. + + + + + Gets the boolean property. + + The name. + + + + + Gets the boolean property. + + The name. + if set to true [defaultValue]. + + + + + Gets the byte property. + + The name. + + + + + Gets the byte property. + + The name. + The default value. + + + + + Gets the char property. + + The name. + + + + + Gets the char property. + + The name. + The default value. + + + + + Gets the double property. + + The name. + + + + + Gets the double property. + + The name. + The default value. + + + + + Gets the float property. + + The name. + + + + + Gets the float property. + + The name. + The default value. + + + + + Gets the int property. + + The name. + + + + + Gets the int property. + + The name. + The default value. + + + + + Gets the int array property. + + The name. + + + + + Gets the int array property. + + The name. + The default value. + + + + + Gets the long property. + + The name. + + + + + Gets the long property. + + The name. + The def. + + + + + Gets the TimeSpan property. + + The name. + The def. + + + + + Gets the short property. + + The name. + + + + + Gets the short property. + + The name. + The default value. + + + + + Gets the property groups. + + The prefix. + + + + + Gets the property group. + + The prefix. + + + + + Gets the property group. + + The prefix. + if set to true [strip prefix]. + + + + + Get all properties that start with the given prefix. + + The prefix for which to search. If it does not end in a "." then one will be added to it for search purposes. + Whether to strip off the given in the result's keys. + Optional array of fully qualified prefixes to exclude. For example if is "a.b.c", then might be "a.b.c.ignore". + Group of that start with the given prefix, optionally have that prefix removed, and do not include properties that start with one of the given excluded prefixes. + + + + Reads the properties from assembly (embedded resource). + + The file name to read resources from. + + + + + Reads the properties from file system. + + The file name to read resources from. + + + + + Gets the underlying properties. + + The underlying properties. + + + + Extension methods for . + + + + + Allows null-safe trimming of string. + + + + + + + Trims string and if resulting string is empty, null is returned. + + + + + + + An implementation of that wraps another + and flags itself 'dirty' when it is modified, enforces that all keys are + strings. + + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The initial capacity. + + + + Serialization constructor. + + + + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + if the specified is equal to the + current ; otherwise, . + + + + + Serves as a hash function for a particular type, suitable + for use in hashing algorithms and data structures like a hash table. + + + A hash code for the current . + + + + + Gets the keys. + + + + + + Adds the name-value pairs in the given to the . + + All keys must be s, and all values must be serializable. + + + + + + Adds the given value to the 's + data map. + + + + + Adds the given value to the 's + data map. + + + + + Adds the given value to the 's + data map. + + + + + Adds the given value to the 's + data map. + + + + + Adds the given value to the 's + data map. + + + + + Adds the given value to the 's + data map. + + + + + Adds the given value to the 's + data map. + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Reports JobSchedulingDataProcessor validation exceptions. + + Chris Bonham + Marko Lahma (.NET) + + + + Constructor for ValidationException. + + + + + Constructor for ValidationException. + + exception message. + + + + Constructor for ValidationException. + + collection of validation exceptions. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + Gets the validation exceptions. + + The validation exceptions. + + + + Returns the detail message string. + + + + + Parses an XML file that declares Jobs and their schedules (Triggers). + + + + The xml document must conform to the format defined in "job_scheduling_data_2_0.xsd" + + + + After creating an instance of this class, you should call one of the + functions, after which you may call the ScheduledJobs() + function to get a handle to the defined Jobs and Triggers, which can then be + scheduled with the . Alternatively, you could call + the function to do all of this + in one step. + + + + The same instance can be used again and again, with the list of defined Jobs + being cleared each time you call a method, + however a single instance is not thread-safe. + + + Chris Bonham + James House + Marko Lahma (.NET) + + + + Constructor for XMLSchedulingDataProcessor. + + + + + Process the xml file in the default location (a file named + "quartz_jobs.xml" in the current working directory). + + + + + Process the xml file named . + + meta data file name. + + + + Process the xmlfile named with the given system + ID. + + Name of the file. + The system id. + + + + Process the xmlfile named with the given system + ID. + + The stream. + The system id. + + + + Process the xml file in the default location, and schedule all of the jobs defined within it. + + Note that we will set overWriteExistingJobs after the default xml is parsed. + + + + + + Process the xml file in the default location, and schedule all of the + jobs defined within it. + + + + + Process the xml file in the given location, and schedule all of the + jobs defined within it. + + meta data file name. + The scheduler. + + + + Process the xml file in the given location, and schedule all of the + jobs defined within it. + + Name of the file. + The system id. + The sched. + + + + Schedules the given sets of jobs and triggers. + + The sched. + + + + Adds a detected validation exception. + + The exception. + + + + Resets the the number of detected validation exceptions. + + + + + Throws a ValidationException if the number of validationExceptions + detected is greater than zero. + + + DTD validation exception. + + + + + Whether the existing scheduling data (with same identifiers) will be + overwritten. + + + If false, and is not false, and jobs or + triggers with the same names already exist as those in the file, an + error will occur. + + + + + + If true (and is false) then any + job/triggers encountered in this file that have names that already exist + in the scheduler will be ignored, and no error will be produced. + + + + + + Gets the log. + + The log. + + + + Helper class to map constant names to their values. + + + + + CalendarIntervalScheduleBuilder is a + that defines calendar time (day, week, month, year) interval-based + schedules for Triggers. + + + + Quartz provides a builder-style API for constructing scheduling-related + entities via a Domain-Specific Language (DSL). The DSL can best be + utilized through the usage of static imports of the methods on the classes + , , + , , + and the various implementations. + + Client code can then use the DSL to write code such as this: + + JobDetail job = JobBuilder.Create<MyJob>() + .WithIdentity("myJob") + .Build(); + Trigger trigger = TriggerBuilder.Create() + .WithIdentity("myTrigger", "myTriggerGroup") + .WithSimpleSchedule(x => x + .WithIntervalInHours(1) + .RepeatForever()) + .StartAt(DateBuilder.FutureDate(10, IntervalUnit.Minute)) + .Build(); + scheduler.scheduleJob(job, trigger); + + + + + + + + + + + Base class for implementors. + + + + + + Schedule builders offer fluent interface and are responsible for creating schedules. + + + + + + + + + Build the actual Trigger -- NOT intended to be invoked by end users, + but will rather be invoked by a TriggerBuilder which this + ScheduleBuilder is given to. + + + + + + Build the actual Trigger -- NOT intended to be invoked by end users, + but will rather be invoked by a TriggerBuilder which this + ScheduleBuilder is given to. + + + + + + Create a CalendarIntervalScheduleBuilder. + + + + + + Build the actual Trigger -- NOT intended to be invoked by end users, + but will rather be invoked by a TriggerBuilder which this + ScheduleBuilder is given to. + + + + + + Specify the time unit and interval for the Trigger to be produced. + + + + the interval at which the trigger should repeat. + the time unit (IntervalUnit) of the interval. + the updated CalendarIntervalScheduleBuilder + + + + + + Specify an interval in the IntervalUnit.SECOND that the produced + Trigger will repeat at. + + + + the number of seconds at which the trigger should repeat. + the updated CalendarIntervalScheduleBuilder + + + + + + Specify an interval in the IntervalUnit.MINUTE that the produced + Trigger will repeat at. + + + + the number of minutes at which the trigger should repeat. + the updated CalendarIntervalScheduleBuilder + + + + + + Specify an interval in the IntervalUnit.HOUR that the produced + Trigger will repeat at. + + + + the number of hours at which the trigger should repeat. + the updated CalendarIntervalScheduleBuilder + + + + + + Specify an interval in the IntervalUnit.DAY that the produced + Trigger will repeat at. + + + + the number of days at which the trigger should repeat. + the updated CalendarIntervalScheduleBuilder + + + + + + Specify an interval in the IntervalUnit.WEEK that the produced + Trigger will repeat at. + + + + the number of weeks at which the trigger should repeat. + the updated CalendarIntervalScheduleBuilder + + + + + + Specify an interval in the IntervalUnit.MONTH that the produced + Trigger will repeat at. + + + + the number of months at which the trigger should repeat. + the updated CalendarIntervalScheduleBuilder + + + + + + Specify an interval in the IntervalUnit.YEAR that the produced + Trigger will repeat at. + + + + the number of years at which the trigger should repeat. + the updated CalendarIntervalScheduleBuilder + + + + + + If the Trigger misfires, use the + instruction. + + + + the updated CronScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + + + the updated CalendarIntervalScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + + + the updated CalendarIntervalScheduleBuilder + + + + + Extension methods that attach to . + + + + + Provides a parser and evaluator for unix-like cron expressions. Cron + expressions provide the ability to specify complex time combinations such as + "At 8:00am every Monday through Friday" or "At 1:30am every + last Friday of the month". + + + + Cron expressions are comprised of 6 required fields and one optional field + separated by white space. The fields respectively are described as follows: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Name Allowed Values Allowed Special Characters
Seconds 0-59 , - /// /
Minutes 0-59 , - /// /
Hours 0-23 , - /// /
Day-of-month 1-31 , - /// ? / L W C
Month 1-12 or JAN-DEC , - /// /
Day-of-Week 1-7 or SUN-SAT , - /// ? / L #
Year (Optional) empty, 1970-2199 , - /// /
+ + The '*' character is used to specify all values. For example, "*" + in the minute field means "every minute". + + + The '?' character is allowed for the day-of-month and day-of-week fields. It + is used to specify 'no specific value'. This is useful when you need to + specify something in one of the two fields, but not the other. + + + The '-' character is used to specify ranges For example "10-12" in + the hour field means "the hours 10, 11 and 12". + + + The ',' character is used to specify additional values. For example + "MON,WED,FRI" in the day-of-week field means "the days Monday, + Wednesday, and Friday". + + + The '/' character is used to specify increments. For example "0/15" + in the seconds field means "the seconds 0, 15, 30, and 45". And + "5/15" in the seconds field means "the seconds 5, 20, 35, and + 50". Specifying '*' before the '/' is equivalent to specifying 0 is + the value to start with. Essentially, for each field in the expression, there + is a set of numbers that can be turned on or off. For seconds and minutes, + the numbers range from 0 to 59. For hours 0 to 23, for days of the month 0 to + 31, and for months 1 to 12. The "/" character simply helps you turn + on every "nth" value in the given set. Thus "7/6" in the + month field only turns on month "7", it does NOT mean every 6th + month, please note that subtlety. + + + The 'L' character is allowed for the day-of-month and day-of-week fields. + This character is short-hand for "last", but it has different + meaning in each of the two fields. For example, the value "L" in + the day-of-month field means "the last day of the month" - day 31 + for January, day 28 for February on non-leap years. If used in the + day-of-week field by itself, it simply means "7" or + "SAT". But if used in the day-of-week field after another value, it + means "the last xxx day of the month" - for example "6L" + means "the last friday of the month". You can also specify an offset + from the last day of the month, such as "L-3" which would mean the third-to-last + day of the calendar month. When using the 'L' option, it is important not to + specify lists, or ranges of values, as you'll get confusing/unexpected results. + + + The 'W' character is allowed for the day-of-month field. This character + is used to specify the weekday (Monday-Friday) nearest the given day. As an + example, if you were to specify "15W" as the value for the + day-of-month field, the meaning is: "the nearest weekday to the 15th of + the month". So if the 15th is a Saturday, the trigger will fire on + Friday the 14th. If the 15th is a Sunday, the trigger will fire on Monday the + 16th. If the 15th is a Tuesday, then it will fire on Tuesday the 15th. + However if you specify "1W" as the value for day-of-month, and the + 1st is a Saturday, the trigger will fire on Monday the 3rd, as it will not + 'jump' over the boundary of a month's days. The 'W' character can only be + specified when the day-of-month is a single day, not a range or list of days. + + + The 'L' and 'W' characters can also be combined for the day-of-month + expression to yield 'LW', which translates to "last weekday of the + month". + + + The '#' character is allowed for the day-of-week field. This character is + used to specify "the nth" XXX day of the month. For example, the + value of "6#3" in the day-of-week field means the third Friday of + the month (day 6 = Friday and "#3" = the 3rd one in the month). + Other examples: "2#1" = the first Monday of the month and + "4#5" = the fifth Wednesday of the month. Note that if you specify + "#5" and there is not 5 of the given day-of-week in the month, then + no firing will occur that month. If the '#' character is used, there can + only be one expression in the day-of-week field ("3#1,6#3" is + not valid, since there are two expressions). + + + + + + The legal characters and the names of months and days of the week are not + case sensitive. + + + NOTES: +
    +
  • Support for specifying both a day-of-week and a day-of-month value is + not complete (you'll need to use the '?' character in one of these fields). +
  • +
  • Overflowing ranges is supported - that is, having a larger number on + the left hand side than the right. You might do 22-2 to catch 10 o'clock + at night until 2 o'clock in the morning, or you might have NOV-FEB. It is + very important to note that overuse of overflowing ranges creates ranges + that don't make sense and no effort has been made to determine which + interpretation CronExpression chooses. An example would be + "0 0 14-6 ? * FRI-MON".
  • +
+
+
+ Sharada Jambula + James House + Contributions from Mads Henderson + Refactoring from CronTrigger to CronExpression by Aaron Craven + Marko Lahma (.NET) +
+ + + Field specification for second. + + + + + Field specification for minute. + + + + + Field specification for hour. + + + + + Field specification for day of month. + + + + + Field specification for month. + + + + + Field specification for day of week. + + + + + Field specification for year. + + + + + Field specification for all wildcard value '*'. + + + + + Field specification for not specified value '?'. + + + + + Field specification for wildcard '*'. + + + + + Field specification for no specification at all '?'. + + + + + Seconds. + + + + + minutes. + + + + + Hours. + + + + + Days of month. + + + + + Months. + + + + + Days of week. + + + + + Years. + + + + + Last day of week. + + + + + Nth day of week. + + + + + Last day of month. + + + + + Nearest weekday. + + + + + Calendar day of week. + + + + + Calendar day of month. + + + + + Expression parsed. + + + + + Constructs a new based on the specified + parameter. + + + String representation of the cron expression the new object should represent + + + + + + Indicates whether the given date satisfies the cron expression. + + + Note that milliseconds are ignored, so two Dates falling on different milliseconds + of the same second will always have the same result here. + + The date to evaluate. + a boolean indicating whether the given date satisfies the cron expression + + + + Returns the next date/time after the given date/time which + satisfies the cron expression. + + the date/time at which to begin the search for the next valid date/time + the next valid date/time + + + + Returns the next date/time after the given date/time which does + not satisfy the expression. + + the date/time at which to begin the search for the next invalid date/time + the next valid date/time + + + + Returns the string representation of the + + The string representation of the + + + + Indicates whether the specified cron expression can be parsed into a + valid cron expression + + the expression to evaluate + a boolean indicating whether the given expression is a valid cron + expression + + + + Builds the expression. + + The expression. + + + + Stores the expression values. + + The position. + The string to traverse. + The type of value. + + + + + Checks the next value. + + The position. + The string to check. + The value. + The type to search. + + + + + Gets the expression summary. + + + + + + Gets the expression set summary. + + The data. + + + + + Skips the white space. + + The i. + The s. + + + + + Finds the next white space. + + The i. + The s. + + + + + Adds to set. + + The val. + The end. + The incr. + The type. + + + + Gets the set of given type. + + The type of set to get. + + + + + Gets the value. + + The v. + The s. + The i. + + + + + Gets the numeric value from string. + + The string to parse from. + The i. + + + + + Gets the month number. + + The string to map with. + + + + + Gets the day of week number. + + The s. + + + + + Gets the time from given time parts. + + The seconds. + The minutes. + The hours. + The day of month. + The month. + + + + + Gets the next fire time after the given time. + + The UTC time to start searching from. + + + + + Creates the date time without milliseconds. + + The time. + + + + + Advance the calendar to the particular hour paying particular attention + to daylight saving problems. + + The date. + The hour. + + + + + Gets the time before. + + The end time. + + + + + NOT YET IMPLEMENTED: Returns the final time that the + will match. + + + + + + Determines whether given year is a leap year. + + The year. + + true if the specified year is a leap year; otherwise, false. + + + + + Gets the last day of month. + + The month num. + The year. + + + + + Creates a new object that is a copy of the current instance. + + + A new object that is a copy of this instance. + + + + + Determines whether the specified is equal to the current . + + + true if the specified is equal to the current ; otherwise, false. + + The to compare with the current . + + + + Determines whether the specified is equal to the current . + + + true if the specified is equal to the current ; otherwise, false. + + The to compare with the current . + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + 2 + + + + Sets or gets the time zone for which the of this + will be resolved. + + + + + Gets the cron expression string. + + The cron expression string. + + + + Helper class for cron expression handling. + + + + + The value. + + + + + The position. + + + + + CronScheduleBuilder is a that defines + -based schedules for s. + + + + Quartz provides a builder-style API for constructing scheduling-related + entities via a Domain-Specific Language (DSL). The DSL can best be + utilized through the usage of static imports of the methods on the classes + , , + , , + and the various implementations. + + + Client code can then use the DSL to write code such as this: + + + IJobDetail job = JobBuilder.Create<MyJob>() + .WithIdentity("myJob") + .Build(); + ITrigger trigger = newTrigger() + .WithIdentity(triggerKey("myTrigger", "myTriggerGroup")) + .WithSimpleSchedule(x => x.WithIntervalInHours(1).RepeatForever()) + .StartAt(DateBuilder.FutureDate(10, IntervalUnit.Minute)) + .Build(); + scheduler.scheduleJob(job, trigger); + + + + + + + + + + + + Build the actual Trigger -- NOT intended to be invoked by end users, + but will rather be invoked by a TriggerBuilder which this + ScheduleBuilder is given to. + + + + + + Create a CronScheduleBuilder with the given cron-expression - which + is presumed to b e valid cron expression (and hence only a RuntimeException + will be thrown if it is not). + + + + the cron expression to base the schedule on. + the new CronScheduleBuilder + + + + + Create a CronScheduleBuilder with the given cron-expression string - which + may not be a valid cron expression (and hence a ParseException will be thrown + f it is not). + + the cron expression string to base the schedule on + the new CronScheduleBuilder + + + + + Create a CronScheduleBuilder with the given cron-expression. + + the cron expression to base the schedule on. + the new CronScheduleBuilder + + + + + Create a CronScheduleBuilder with a cron-expression that sets the + schedule to fire every day at the given time (hour and minute). + + + + the hour of day to fire + the minute of the given hour to fire + the new CronScheduleBuilder + + + + + Create a CronScheduleBuilder with a cron-expression that sets the + schedule to fire at the given day at the given time (hour and minute) on the given days of the week. + + the hour of day to fire + the minute of the given hour to fire + the days of the week to fire + the new CronScheduleBuilder + + + + + Create a CronScheduleBuilder with a cron-expression that sets the + schedule to fire one per week on the given day at the given time + (hour and minute). + + + + the day of the week to fire + the hour of day to fire + the minute of the given hour to fire + the new CronScheduleBuilder + + + + + Create a CronScheduleBuilder with a cron-expression that sets the + schedule to fire one per month on the given day of month at the given + time (hour and minute). + + + + the day of the month to fire + the hour of day to fire + the minute of the given hour to fire + the new CronScheduleBuilder + + + + + The in which to base the schedule. + + + + the time-zone for the schedule. + the updated CronScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + + + the updated CronScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + + + the updated CronScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + + + the updated CronScheduleBuilder + + + + + Extension methods that attach to . + + + + + A implementation that build schedule for DailyTimeIntervalTrigger. + + + + This builder provide an extra convenient method for you to set the trigger's EndTimeOfDay. You may + use either endingDailyAt() or EndingDailyAfterCount() to set the value. The later will auto calculate + your EndTimeOfDay by using the interval, IntervalUnit and StartTimeOfDay to perform the calculation. + + + When using EndingDailyAfterCount(), you should note that it is used to calculating EndTimeOfDay. So + if your startTime on the first day is already pass by a time that would not add up to the count you + expected, until the next day comes. Remember that DailyTimeIntervalTrigger will use StartTimeOfDay + and endTimeOfDay as fresh per each day! + + + Quartz provides a builder-style API for constructing scheduling-related + entities via a Domain-Specific Language (DSL). The DSL can best be + utilized through the usage of static imports of the methods on the classes + , , + , , + and the various implementations. + + Client code can then use the DSL to write code such as this: + + IJobDetail job = JobBuilder.Create<MyJob>() + .WithIdentity("myJob") + .Build(); + + ITrigger trigger = TriggerBuilder.Create() + .WithIdentity(triggerKey("myTrigger", "myTriggerGroup")) + .WithDailyTimeIntervalSchedule(x => + x.WithIntervalInMinutes(15) + .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(8, 0)) + .Build(); + + scheduler.scheduleJob(job, trigger); + + + James House + Zemian Deng saltnlight5@gmail.com + Nuno Maia (.NET) + + + + A set of all days of the week. + + + The set contains all values between and + + + + + A set of the business days of the week (for locales similar to the USA). + + + The set contains all values between and + + + + + A set of the weekend days of the week (for locales similar to the USA). + + + The set contains and + + + + + Create a DailyTimeIntervalScheduleBuilder + + The new DailyTimeIntervalScheduleBuilder + + + + Build the actual Trigger -- NOT intended to be invoked by end users, + but will rather be invoked by a TriggerBuilder which this + ScheduleBuilder is given to. + + + + + + Specify the time unit and interval for the Trigger to be produced. + + + + the interval at which the trigger should repeat. + the time unit (IntervalUnit) of the interval. + the updated CalendarIntervalScheduleBuilder + + + + + + Specify an interval in the IntervalUnit.Second that the produced + Trigger will repeat at. + + The number of seconds at which the trigger should repeat. + the updated DailyTimeIntervalScheduleBuilder> + + + + + + Specify an interval in the IntervalUnit.Minute that the produced + Trigger will repeat at. + + The number of minutes at which the trigger should repeat. + the updated DailyTimeIntervalScheduleBuilder> + + + + + + Specify an interval in the IntervalUnit.Hour that the produced + Trigger will repeat at. + + The number of hours at which the trigger should repeat. + the updated DailyTimeIntervalScheduleBuilder> + + + + + + Set the trigger to fire on the given days of the week. + + a Set containing the integers representing the days of the week, defined by - . + + the updated DailyTimeIntervalScheduleBuilder + + + + Set the trigger to fire on the given days of the week. + + a variable length list of week days representing the days of the week + the updated DailyTimeIntervalScheduleBuilder + + + + Set the trigger to fire on the days from Monday through Friday. + + the updated DailyTimeIntervalScheduleBuilder + + + + Set the trigger to fire on the days Saturday and Sunday. + + the updated DailyTimeIntervalScheduleBuilder + + + + Set the trigger to fire on all days of the week. + + the updated DailyTimeIntervalScheduleBuilder + + + + Set the trigger to begin firing each day at the given time. + + + the updated DailyTimeIntervalScheduleBuilder + + + + Set the startTimeOfDay for this trigger to end firing each day at the given time. + + + the updated DailyTimeIntervalScheduleBuilder + + + + Calculate and set the EndTimeOfDay using count, interval and StarTimeOfDay. This means + that these must be set before this method is call. + + + the updated DailyTimeIntervalScheduleBuilder + + + + If the Trigger misfires, use the + instruction. + + the updated DailyTimeIntervalScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + the updated DailyTimeIntervalScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + the updated DailyTimeIntervalScheduleBuilder + + + + + Set number of times for interval to repeat. + + + Note: if you want total count = 1 (at start time) + repeatCount + + + + + + + Extension methods that attach to . + + + + + DateBuilder is used to conveniently create + instances that meet particular criteria. + + + + Quartz provides a builder-style API for constructing scheduling-related + entities via a Domain-Specific Language (DSL). The DSL can best be + utilized through the usage of static imports of the methods on the classes + , , + , , + and the various implementations. + + Client code can then use the DSL to write code such as this: + + IJobDetail job = JobBuilder.Create<MyJob>() + .WithIdentity("myJob") + .Build(); + ITrigger trigger = newTrigger() + .WithIdentity(triggerKey("myTrigger", "myTriggerGroup")) + .WithSimpleSchedule(x => x + .WithIntervalInHours(1) + .RepeatForever()) + .StartAt(DateBuilder.FutureDate(10, IntervalUnit.Minutes)) + .Build(); + scheduler.scheduleJob(job, trigger); + + + + + + + + Create a DateBuilder, with initial settings for the current date + and time in the system default timezone. + + + + + Create a DateBuilder, with initial settings for the current date and time in the given timezone. + + + + + + Create a DateBuilder, with initial settings for the current date and time in the system default timezone. + + + + + + Create a DateBuilder, with initial settings for the current date and time in the given timezone. + + Time zone to use. + + + + + Build the defined by this builder instance. + + New date time based on builder parameters. + + + + Set the hour (0-23) for the Date that will be built by this builder. + + + + + + + Set the minute (0-59) for the Date that will be built by this builder. + + + + + + + Set the second (0-59) for the Date that will be built by this builder, and truncate the milliseconds to 000. + + + + + + + Set the day of month (1-31) for the Date that will be built by this builder. + + + + + + + Set the month (1-12) for the Date that will be built by this builder. + + + + + + + Set the year for the Date that will be built by this builder. + + + + + + + Set the TimeZoneInfo for the Date that will be built by this builder (if "null", system default will be used) + + + + + + + Get a object that represents the given time, on + tomorrow's date. + + + + + + + + + Get a object that represents the given time, on + today's date (equivalent to . + + + + + + + + + Get a object that represents the given time, on today's date. + + The value (0-59) to give the seconds field of the date + The value (0-59) to give the minutes field of the date + The value (0-23) to give the hours field of the date + the new date + + + + Get a object that represents the given time, on the + given date. + + The value (0-59) to give the seconds field of the date + The value (0-59) to give the minutes field of the date + The value (0-23) to give the hours field of the date + The value (1-31) to give the day of month field of the date + The value (1-12) to give the month field of the date + the new date + + + + Get a object that represents the given time, on the + given date. + + + + The value (0-59) to give the seconds field of the date + The value (0-59) to give the minutes field of the date + The value (0-23) to give the hours field of the date + The value (1-31) to give the day of month field of the date + The value (1-12) to give the month field of the date + The value (1970-2099) to give the year field of the date + the new date + + + + Returns a date that is rounded to the next even hour after the current time. + + + For example a current time of 08:13:54 would result in a date + with the time of 09:00:00. If the date's time is in the 23rd hour, the + date's 'day' will be promoted, and the time will be set to 00:00:00. + + the new rounded date + + + + Returns a date that is rounded to the next even hour above the given date. + + + For example an input date with a time of 08:13:54 would result in a date + with the time of 09:00:00. If the date's time is in the 23rd hour, the + date's 'day' will be promoted, and the time will be set to 00:00:00. + + the Date to round, if the current time will + be used + the new rounded date + + + + Returns a date that is rounded to the previous even hour below the given date. + + + For example an input date with a time of 08:13:54 would result in a date + with the time of 08:00:00. + + the Date to round, if the current time will + be used + the new rounded date + + + + + Returns a date that is rounded to the next even minute after the current time. + + + + For example a current time of 08:13:54 would result in a date + with the time of 08:14:00. If the date's time is in the 59th minute, + then the hour (and possibly the day) will be promoted. + + the new rounded date + + + + Returns a date that is rounded to the next even minute above the given date. + + + For example an input date with a time of 08:13:54 would result in a date + with the time of 08:14:00. If the date's time is in the 59th minute, + then the hour (and possibly the day) will be promoted. + + The Date to round, if the current time will be used + The new rounded date + + + + Returns a date that is rounded to the previous even minute below the given date. + + + For example an input date with a time of 08:13:54 would result in a date + with the time of 08:13:00. + + the Date to round, if the current time will + be used + the new rounded date + + + + Returns a date that is rounded to the next even second after the current time. + + the new rounded date + + + + Returns a date that is rounded to the next even second above the given date. + + + the Date to round, if the current time will + be used + the new rounded date + + + + Returns a date that is rounded to the previous even second below the + given date. + + + + For example an input date with a time of 08:13:54.341 would result in a + date with the time of 08:13:00.000. + + + + the Date to round, if the current time will + be used + the new rounded date + + + + Returns a date that is rounded to the next even multiple of the given + minute. + + + + For example an input date with a time of 08:13:54, and an input + minute-base of 5 would result in a date with the time of 08:15:00. The + same input date with an input minute-base of 10 would result in a date + with the time of 08:20:00. But a date with the time 08:53:31 and an + input minute-base of 45 would result in 09:00:00, because the even-hour + is the next 'base' for 45-minute intervals. + + + More examples: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Input TimeMinute-BaseResult Time
11:16:412011:20:00
11:36:412011:40:00
11:46:412012:00:00
11:26:413011:30:00
11:36:413012:00:00
11:16:411711:17:00
11:17:411711:34:00
11:52:411712:00:00
11:52:41511:55:00
11:57:41512:00:00
11:17:41012:00:00
11:17:41111:08:00
+
+
+ + the Date to round, if the current time will + be used + + the base-minute to set the time on + the new rounded date + +
+ + + + Returns a date that is rounded to the next even multiple of the given + minute. + + + + The rules for calculating the second are the same as those for + calculating the minute in the method . + + the Date to round, if the current time will + be used + the base-second to set the time on + the new rounded date + + + + + An attribute that marks a class as one that must not have multiple + instances executed concurrently (where instance is based-upon a + definition - or in other words based upon a . + + + This can be used in lieu of implementing the StatefulJob marker interface that + was used prior to Quartz 2.0 + + + James House + Marko Lahma (.NET) + + + + The interface to be implemented by s that provide a + mechanism for having their execution interrupted. It is NOT a requirement + for jobs to implement this interface - in fact, for most people, none of + their jobs will. + + + + The means of actually interrupting the Job must be implemented within the + itself (the method of this + interface is simply a means for the scheduler to inform the + that a request has been made for it to be interrupted). The mechanism that + your jobs use to interrupt themselves might vary between implementations. + However the principle idea in any implementation should be to have the + body of the job's periodically check some flag to + see if an interruption has been requested, and if the flag is set, somehow + abort the performance of the rest of the job's work. An example of + interrupting a job can be found in the java source for the class + . It is legal to use + some combination of and + synchronization within and + in order to have the method block until the + signals that it has noticed the set flag. + + + + If the Job performs some form of blocking I/O or similar functions, you may + want to consider having the method store a + reference to the calling as a member variable. Then the + implementation of this interfaces method can call + on that Thread. Before attempting this, make + sure that you fully understand what + does and doesn't do. Also make sure that you clear the Job's member + reference to the Thread when the Execute(..) method exits (preferably in a + block. + + + + + + James House + Marko Lahma (.NET) + + + + Called by the when a user + interrupts the . + + void (nothing) if job interrupt is successful. + + + + Supported interval units used by . + + + + + A marker interface for s that + wish to have their state maintained between executions. + + + instances follow slightly different rules from + regular instances. The key difference is that their + associated is re-persisted after every + execution of the job, thus preserving state for the next execution. The + other difference is that stateful jobs are not allowed to Execute + concurrently, which means new triggers that occur before the completion of + the method will be delayed. + + + + + + + + James House + Marko Lahma (.NET) + + + + JobBuilder is used to instantiate s. + + + + The builder will always try to keep itself in a valid state, with + reasonable defaults set for calling Build() at any point. For instance + if you do not invoke WithIdentity(..) a job name will be generated + for you. + + + Quartz provides a builder-style API for constructing scheduling-related + entities via a Domain-Specific Language (DSL). The DSL can best be + utilized through the usage of static imports of the methods on the classes + , , + , , + and the various implementations. + + + Client code can then use the DSL to write code such as this: + + + IJobDetail job = JobBuilder.Create<MyJob>() + .WithIdentity("myJob") + .Build(); + + ITrigger trigger = TriggerBuilder.Create() + .WithIdentity("myTrigger", "myTriggerGroup") + .WithSimpleSchedule(x => x.WithIntervalInHours(1).RepeatForever()) + .StartAt(DateBuilder.FutureDate(10, IntervalUnit.Minute)) + .Build(); + + scheduler.scheduleJob(job, trigger); + + + + + + + + + Create a JobBuilder with which to define a . + + a new JobBuilder + + + + Create a JobBuilder with which to define a , + and set the class name of the job to be executed. + + a new JobBuilder + + + + Create a JobBuilder with which to define a , + and set the class name of the job to be executed. + + a new JobBuilder + + + + Produce the instance defined by this JobBuilder. + + the defined JobDetail. + + + + Use a with the given name and default group to + identify the JobDetail. + + + If none of the 'withIdentity' methods are set on the JobBuilder, + then a random, unique JobKey will be generated. + + the name element for the Job's JobKey + the updated JobBuilder + + + + + + Use a with the given name and group to + identify the JobDetail. + + + If none of the 'withIdentity' methods are set on the JobBuilder, + then a random, unique JobKey will be generated. + + the name element for the Job's JobKey + the group element for the Job's JobKey + the updated JobBuilder + + + + + + Use a to identify the JobDetail. + + + If none of the 'withIdentity' methods are set on the JobBuilder, + then a random, unique JobKey will be generated. + + the Job's JobKey + the updated JobBuilder + + + + + + Set the given (human-meaningful) description of the Job. + + the description for the Job + the updated JobBuilder + + + + + Set the class which will be instantiated and executed when a + Trigger fires that is associated with this JobDetail. + + the updated JobBuilder + + + + + Set the class which will be instantiated and executed when a + Trigger fires that is associated with this JobDetail. + + the updated JobBuilder + + + + + Instructs the whether or not the job + should be re-executed if a 'recovery' or 'fail-over' situation is + encountered. + + + If not explicitly set, the default value is . + + the updated JobBuilder + + + + + Instructs the whether or not the job + should be re-executed if a 'recovery' or 'fail-over' situation is + encountered. + + + If not explicitly set, the default value is . + + + the updated JobBuilder + + + + Whether or not the job should remain stored after it is + orphaned (no s point to it). + + + If not explicitly set, the default value is . + + the updated JobBuilder + + + + + Whether or not the job should remain stored after it is + orphaned (no s point to it). + + + If not explicitly set, the default value is . + + the value to set for the durability property. + the updated JobBuilder + + + + + Add the given key-value pair to the JobDetail's . + + the updated JobBuilder + + + + + Add the given key-value pair to the JobDetail's . + + the updated JobBuilder + + + + + Add the given key-value pair to the JobDetail's . + + the updated JobBuilder + + + + + Add the given key-value pair to the JobDetail's . + + the updated JobBuilder + + + + + Add the given key-value pair to the JobDetail's . + + the updated JobBuilder + + + + + Add the given key-value pair to the JobDetail's . + + the updated JobBuilder + + + + + Set the JobDetail's , adding any values to it + that were already set on this JobBuilder using any of the + other 'usingJobData' methods. + + the updated JobBuilder + + + + + Holds state information for instances. + + + instances are stored once when the + is added to a scheduler. They are also re-persisted after every execution of + instances that have present. + + instances can also be stored with a + . This can be useful in the case where you have a Job + that is stored in the scheduler for regular/repeated use by multiple + Triggers, yet with each independent triggering, you want to supply the + Job with different data inputs. + + + The passed to a Job at execution time + also contains a convenience that is the result + of merging the contents of the trigger's JobDataMap (if any) over the + Job's JobDataMap (if any). + + + + + + + James House + Marko Lahma (.NET) + + + + Create an empty . + + + + + Create a with the given data. + + + + + Create a with the given data. + + + + + Serialization constructor. + + + + + + + Adds the given value as a string version to the + 's data map. + + + + + Adds the given value as a string version to the + 's data map. + + + + + Adds the given value as a string version to the + 's data map. + + + + + Adds the given value as a string version to the + 's data map. + + + + + Adds the given value as a string version to the + 's data map. + + + + + Adds the given value as a string version to the + 's data map. + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the + . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Gets the date time. + + The key. + + + + + Gets the value behind the specified key. + + The key. + + + + + An exception that can be thrown by a + to indicate to the Quartz that an error + occurred while executing, and whether or not the requests + to be re-fired immediately (using the same , + or whether it wants to be unscheduled. + + + Note that if the flag for 'refire immediately' is set, the flags for + unscheduling the Job are ignored. + + + + + James House + Marko Lahma (.NET) + + + + Create a JobExcecutionException, with the 're-fire immediately' flag set + to . + + + + + Create a JobExcecutionException, with the given cause. + + The cause. + + + + Create a JobExcecutionException, with the given message. + + + + + Initializes a new instance of the class. + + The message. + The original cause. + + + + Create a JobExcecutionException with the 're-fire immediately' flag set + to the given value. + + + + + Create a JobExcecutionException with the given underlying exception, and + the 're-fire immediately' flag set to the given value. + + + + + Create a JobExcecutionException with the given message, and underlying + exception, and the 're-fire immediately' flag set to the given value. + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + Creates and returns a string representation of the current exception. + + + A string representation of the current exception. + + + + + + Gets or sets a value indicating whether to unschedule firing trigger. + + + true if firing trigger should be unscheduled; otherwise, false. + + + + + Gets or sets a value indicating whether to unschedule all triggers. + + + true if all triggers should be unscheduled; otherwise, false. + + + + + Gets or sets a value indicating whether to refire immediately. + + true if to refire immediately; otherwise, false. + + + + Uniquely identifies a . + + + Keys are composed of both a name and group, and the name must be unique + within the group. If only a group is specified then the default group + name will be used. + + Quartz provides a builder-style API for constructing scheduling-related + entities via a Domain-Specific Language (DSL). The DSL can best be + utilized through the usage of static imports of the methods on the classes + , , + , , + and the various implementations. + + Client code can then use the DSL to write code such as this: + + IJobDetail job = JobBuilder.Create<MyJob>() + .WithIdentity("myJob") + .Build(); + ITrigger trigger = TriggerBuilder.Create() + .WithIdentity("myTrigger", "myTriggerGroup") + .WithSimpleSchedule(x => x + .WithIntervalInHours(1) + .RepeatForever()) + .StartAt(DateBuilder.FutureDate(10, IntervalUnit.Minute)) + .Build(); + scheduler.scheduleJob(job, trigger); + + + + + + + + Misfire instructions. + + Marko Lahma (.NET) + + + + Instruction not set (yet). + + + + + Use smart policy. + + + + + Instructs the that the + will never be evaluated for a misfire situation, + and that the scheduler will simply try to fire it as soon as it can, + and then update the Trigger as if it had fired at the proper time. + + + NOTE: if a trigger uses this instruction, and it has missed + several of its scheduled firings, then several rapid firings may occur + as the trigger attempt to catch back up to where it would have been. + For example, a SimpleTrigger that fires every 15 seconds which has + misfired for 5 minutes will fire 20 times once it gets the chance to + fire. + + + + + Misfire policy settings for SimpleTrigger. + + + + + Instructs the that upon a mis-fire + situation, the wants to be fired + now by . + + NOTE: This instruction should typically only be used for + 'one-shot' (non-repeating) Triggers. If it is used on a trigger with a + repeat count > 0 then it is equivalent to the instruction + . + + + + + + Instructs the that upon a mis-fire + situation, the wants to be + re-scheduled to 'now' (even if the associated + excludes 'now') with the repeat count left as-is. This does obey the + end-time however, so if 'now' is after the + end-time the will not fire again. + + + + NOTE: Use of this instruction causes the trigger to 'forget' + the start-time and repeat-count that it was originally setup with (this + is only an issue if you for some reason wanted to be able to tell what + the original values were at some later time). + + + + + + Instructs the that upon a mis-fire + situation, the wants to be + re-scheduled to 'now' (even if the associated + excludes 'now') with the repeat count set to what it would be, if it had + not missed any firings. This does obey the end-time + however, so if 'now' is after the end-time the will + not fire again. + + + NOTE: Use of this instruction causes the trigger to 'forget' + the start-time and repeat-count that it was originally setup with. + Instead, the repeat count on the trigger will be changed to whatever + the remaining repeat count is (this is only an issue if you for some + reason wanted to be able to tell what the original values were at some + later time). + + + + NOTE: This instruction could cause the + to go to the 'COMPLETE' state after firing 'now', if all the + repeat-fire-times where missed. + + + + + + Instructs the that upon a mis-fire + situation, the wants to be + re-scheduled to the next scheduled time after 'now' - taking into + account any associated , and with the + repeat count set to what it would be, if it had not missed any firings. + + + NOTE/WARNING: This instruction could cause the + to go directly to the 'COMPLETE' state if all fire-times where missed. + + + + + Instructs the that upon a mis-fire + situation, the wants to be + re-scheduled to the next scheduled time after 'now' - taking into + account any associated , and with the + repeat count left unchanged. + + + + NOTE/WARNING: This instruction could cause the + to go directly to the 'COMPLETE' state if all the end-time of the trigger + has arrived. + + + + + + misfire instructions for CronTrigger + + + + + Instructs the that upon a mis-fire + situation, the wants to be fired now + by . + + + + + Instructs the that upon a mis-fire + situation, the wants to have it's + next-fire-time updated to the next time in the schedule after the + current time (taking into account any associated , + but it does not want to be fired now. + + + + + misfire instructions for NthIncludedDayTrigger + + + + + Instructs the that upon a mis-fire situation, the + wants to be fired now by the + + + + + + Instructs the that upon a mis-fire situation, the + wants to have + nextFireTime updated to the next time in the schedule after + the current time, but it does not want to be fired now. + + + + + Misfire instructions for DateIntervalTrigger + + + + + Instructs the that upon a mis-fire + situation, the wants to be + fired now by . + + + + + Instructs the that upon a mis-fire + situation, the wants to have it's + next-fire-time updated to the next time in the schedule after the + current time (taking into account any associated , + but it does not want to be fired now. + + + + + Misfire instructions for DailyTimeIntervalTrigger + + + + + Instructs the that upon a mis-fire + situation, the wants to be + fired now by . + + + + + Instructs the that upon a mis-fire + situation, the wants to have it's + next-fire-time updated to the next time in the schedule after the + current time (taking into account any associated , + but it does not want to be fired now. + + + + + A trigger which fires on the Nth day of every interval type + , or + that is not excluded by the associated + calendar. + + + When determining what the Nth day of the month or year + is, will skip excluded days on the + associated calendar. This would commonly be used in an Nth + business day situation, in which the user wishes to fire a particular job on + the Nth business day (i.e. the 5th business day of + every month). Each also has an associated + which indicates at what time of day the trigger is + to fire. + + All s default to a monthly interval type + (fires on the Nth day of every month) with N = 1 (first + non-excluded day) and set to 12:00 PM (noon). These + values can be changed using the , , and + methods. Users may also want to note the + and + methods. + + + Take, for example, the following calendar: + + + July August September + Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa + 1 W 1 2 3 4 5 W 1 2 W + W H 5 6 7 8 W W 8 9 10 11 12 W W H 6 7 8 9 W + W 11 12 13 14 15 W W 15 16 17 18 19 W W 12 13 14 15 16 W + W 18 19 20 21 22 W W 22 23 24 25 26 W W 19 20 21 22 23 W + W 25 26 27 28 29 W W 29 30 31 W 26 27 28 29 30 + W + + Where W's represent weekend days, and H's represent holidays, all of which + are excluded on a calendar associated with an + with n=5 and + intervalType=IntervalTypeMonthly. In this case, the trigger + would fire on the 8th of July (because of the July 4 holiday), + the 5th of August, and the 8th of September (because + of Labor Day). + + Aaron Craven + Marko Lahma (.NET) + + + + Indicates a monthly trigger type (fires on the Nth included + day of every month). + + + + indicates a yearly trigger type (fires on the Nth included + day of every year). + + + + + Indicates a weekly trigger type (fires on the Nth included + day of every week). When using this interval type, care must be taken + not to think of the value of as an analog to + . Such a comparison can only + be drawn when there are no calendars associated with the trigger. To + illustrate, consider an with + n = 3 which is associated with a Calendar excluding + non-weekdays. The trigger would fire on the 3rd + included day of the week, which would be 4th + actual day of the week. + + + + + Create an with no specified name, + group, or . This will result initially in a + default monthly trigger that fires on the first day of every month at + 12:00 PM (n = 1, + intervalType=, + fireAtTime="12:00"). + + + Note that and , must be + called before the can be placed into + a . + + + + + Create an with the given name and + default group but no specified . This will result + initially in a default monthly trigger that fires on the first day of + every month at 12:00 PM (=1, + intervalType=, + fireAtTime=12:00"). + + Note that must + be called before the can be placed + into a . + + + the name for the + + + + + Create an with the given name and + group but no specified . This will result + initially in a default monthly trigger that fires on the first day of + every month at 12:00 PM (=1, + intervalType=, + fireAtTime=12:00"). + + Note that must + be called before the can be placed + into a . + + + the name for the + + the group for the + + + + + Create an with the given name and + group and the specified . This will result + initially in a default monthly trigger that fires on the first day of + every month at 12:00 PM (=1, + intervalType=, + fireAtTime="12:00"). + + The name for the . + The group for the . + The name of the job to associate with the . + The group containing the job to associate with the . + + + + Returns the next UTC time at which the + will fire. If the trigger will not fire again, will be + returned. + + + + Because of the conceptual design of , + it is not always possible to decide with certainty that the trigger + will never fire again. Therefore, it will search for the next + fire time up to a given cutoff. These cutoffs can be changed by using the + property. The default cutoff is 12 + of the intervals specified by intervalType. + + + The returned value is not guaranteed to be valid until after + the trigger has been added to the scheduler. + + + the next fire time for the trigger + + + + + Returns the previous UTC time at which the + fired. If the trigger has not yet + fired, will be returned. + + the previous fire time for the trigger + + + + Returns the first time the will fire + after the specified date. + + + + Because of the conceptual design of , + it is not always possible to decide with certainty that the trigger + will never fire again. Therefore, it will search for the next + fire time up to a given cutoff. These cutoffs can be changed by using the + property. The default cutoff is 12 + of the intervals specified by intervalType. + + + Therefore, for triggers with intervalType = + , if the trigger + will not fire within 12 + weeks after the given date/time, will be returned. For + triggers with intervalType = + + , if the trigger will not fire within 12 + months after the given date/time, will be returned. + For triggers with intervalType = + + , if the trigger will not fire within 12 + years after the given date/time, will be returned. In + all cases, if the trigger will not fire before , + will be returned. + + + The time after which to find the nearest fire time. + This argument is treated as exclusive 舒 that is, + if afterTime is a valid fire time for the trigger, it + will not be returned as the next fire time. + + + the first time the trigger will fire following the specified date + + + + + Called when the has decided to 'fire' the trigger + (Execute the associated ), in order to give the + a chance to update itself for its next triggering + (if any). + + + + + Called by the scheduler at the time a is first + added to the scheduler, in order to have the + compute its first fire time, based on any associated calendar. + + After this method has been called, + should return a valid answer. + + + + the first time at which the will be fired + by the scheduler, which is also the same value + will return (until after the first + firing of the ). + + + + + Called after the has executed the + associated with the in order + to get the final instruction code from the trigger. + + + The that was used by the + 's method. + + + The thrown by the + , if any (may be ) + + one of the Trigger.INSTRUCTION_XXX constants. + + + + + Used by the to determine whether or not it is + possible for this to fire again. + ' + + + If the returned value is then the + may remove the from the + + + + + A boolean indicator of whether the trigger could potentially fire + again. + + + + + Indicates whether is a valid misfire + instruction for this . + + Whether is valid. + + + Updates the 's state based on the + MisfireInstruction that was selected when the + was created +

+ If the misfire instruction is set to MISFIRE_INSTRUCTION_SMART_POLICY, + then the instruction will be interpreted as + . +

+
+ a new or updated calendar to use for the trigger + +
+ + + Updates the 's state based on the + given new version of the associated . + + A new or updated calendar to use for the trigger + the amount of time that must + be between "now" and the time the next + firing of the trigger is supposed to occur. + + + + + Calculates the first time an with + intervalType = IntervalTypeWeekly will fire + after the specified date. See for more + information. + + The time after which to find the nearest fire time. + This argument is treated as exclusive 舒 that is, + if afterTime is a valid fire time for the trigger, it + will not be returned as the next fire time. + + the first time the trigger will fire following the specified + date + + + + + Calculates the first UTC time an with + intervalType = will fire + after the specified date. See for more + information. + + + The UTC time after which to find the nearest fire time. + This argument is treated as exclusive 舒 that is, + if afterTime is a valid fire time for the trigger, it + will not be returned as the next fire time. + + the first time the trigger will fire following the specified date + + + + Calculates the first time an with + intervalType = will fire + after the specified date. See for more + information. + + + The UTC time after which to find the nearest fire time. + This argument is treated as exclusive 舒 that is, + if afterTime is a valid fire time for the trigger, it + will not be returned as the next fire time. + + the first time the trigger will fire following the specified + date + + + + + Get a that is configured to produce a + schedule identical to this trigger's schedule. + + + + + + + Gets or sets the day of the interval on which the + should fire. If the Nth + day of the interval does not exist (i.e. the 32nd of a + month), the trigger simply will never fire. N may not be less than 1. + + + + + Returns the interval type for the . + + + Sets the interval type for the . If + , the trigger will fire on the + Nth included day of every month. If + , the trigger will fire on the + Nth included day of every year. If + , the trigger will fire on the + Nth included day of every week. + + + + + + + + Returns the fire time for the as a + string with the format "HH:MM[:SS]", with HH representing the + 24-hour clock hour of the fire time. Seconds are optional and their + inclusion depends on whether or not they were provided to + . + + + + + Returns the for the + . + + + + Because of the conceptual design of , + it is not always possible to decide with certainty that the trigger + will never fire again. Therefore, it will search for the next + fire time up to a given cutoff. These cutoffs can be changed by using the + property. The default cutoff is 12 + of the intervals specified by intervalType" />. + + + Because of the conceptual design of , + it is not always possible to decide with certainty that the trigger + will never fire again. Therefore, it will search for the next + fire time up to a given cutoff. These cutoffs can be changed by using the + method. The default cutoff is 12 + of the intervals specified by intervalType". + + + In most cases, the default value of this setting (12) is sufficient (it + is highly unlikely, for example, that you will need to look at more than + 12 months of dates to ensure that your trigger will never fire again). + However, this setting is included to allow for the rare exceptions where + this might not be true. + + + For example, if your trigger is associated with a calendar that excludes + a great many dates in the next 12 months, and hardly any following that, + it is possible (if is large enough) that you could run + into this situation. + + + + + + Returns the last UTC time the will fire. + If the trigger will not fire at any point between + and , will be returned. + + the last time the trigger will fire. + + + + Tells whether this Trigger instance can handle events + in millisecond precision. + + + + + + Sets or gets the time zone in which the will be resolved. + If no time zone is provided, then the default time zone will be used. + + + + + + + Gets or sets the trigger's calendar week rule. + + The trigger calendar week rule. + + + + Gets or sets the trigger's calendar first day of week rule. + + The trigger calendar first day of week. + + + + An exception that is thrown to indicate that an attempt to store a new + object (i.e. , + or ) in a + failed, because one with the same name and group already exists. + + James House + Marko Lahma (.NET) + + + + Create a with the given + message. + + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + Create a and auto-generate a + message using the name/group from the given . + + + + The message will read:
"Unable to store Job with name: '__' and + group: '__', because one already exists with this identification." +
+
+
+ + + Create a and auto-generate a + message using the name/group from the given . + + + + The message will read:
"Unable to store Trigger with name: '__' and + group: '__', because one already exists with this identification." +
+
+
+ + + An attribute that marks a class as one that makes updates to its + during execution, and wishes the scheduler to re-store the + when execution completes. + + + + Jobs that are marked with this annotation should also seriously consider + using the attribute, to avoid data + storage race conditions with concurrently executing job instances. + + + This can be used in lieu of implementing the StatefulJob marker interface that + was used prior to Quartz 2.0 + + + + James House + Marko Lahma (.NET) + + + + An exception that is thrown to indicate that there is a misconfiguration of + the - or one of the components it + configures. + + James House + Marko Lahma (.NET) + + + + Create a with the given message. + + + + + Create a with the given message + and cause. + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + Scheduler constants. + + Marko Lahma (.NET) + + + + A (possibly) useful constant that can be used for specifying the group + that and instances belong to. + + + + + A constant group name used internally by the + scheduler - clients should not use the value of this constant + ("RECOVERING_JOBS") for thename of a 's group. + + + + + A constant group name used internally by the + scheduler - clients should not use the value of this constant + ("FAILED_OVER_JOBS") for thename of a 's group. + + + + + A constant key that can be used to retrieve the + name of the original from a recovery trigger's + data map in the case of a job recovering after a failed scheduler + instance. + + + + + + A constant key that can be used to retrieve the + group of the original from a recovery trigger's + data map in the case of a job recovering after a failed scheduler + instance. + + + + + + A constant key that can be used to retrieve the + scheduled fire time of the original from a recovery + trigger's data map in the case of a job recovering after a failed scheduler + instance. + + + + + + Holds context/environment data that can be made available to Jobs as they + are executed. + + + Future versions of Quartz may make distinctions on how it propagates + data in between instances of proxies to a + single scheduler instance - i.e. if Quartz is being used via WCF of Remoting. + + + James House + Marko Lahma (.NET) + + + + Create an empty . + + + + + Create a with the given data. + + + + + Serialization constructor. + + + + + + + Instructs Scheduler what to do with a trigger and job. + + Marko Lahma (.NET) + + + + Instructs the that the + has no further instructions. + + + + + Instructs the that the + wants the to re-Execute + immediately. If not in a 'RECOVERING' or 'FAILED_OVER' situation, the + execution context will be re-used (giving the the + ability to 'see' anything placed in the context by its last execution). + + + + + Instructs the that the + should be put in the state. + + + + + Instructs the that the + wants itself deleted. + + + + + Instructs the that all + s referencing the same as + this one should be put in the state. + + + + + Instructs the that all + s referencing the same as + this one should be put in the state. + + + + + Instructs the that the + should be put in the state. + + + + + Describes the settings and capabilities of a given + instance. + + James House + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + Name of the scheduler. + The scheduler instance. + The scheduler type. + if set to true, scheduler is a remote scheduler. + if set to true, scheduler is started. + if set to true, scheduler is in standby mode. + if set to true, scheduler is shutdown. + The start time. + The number of jobs executed. + The job store type. + if set to true, job store is persistent. + if set to true, the job store is clustered + The thread pool type. + Size of the thread pool. + The version string. + + + + Returns a formatted (human readable) string describing all the 's + meta-data values. + + + + The format of the string looks something like this: +
+            Quartz Scheduler 'SchedulerName' with instanceId 'SchedulerInstanceId' Scheduler class: 'Quartz.Impl.StdScheduler' - running locally. Running since: '11:33am on Jul 19, 2002' Not currently paused. Number of Triggers fired: '123' Using thread pool 'Quartz.Simpl.SimpleThreadPool' - with '8' threads Using job-store 'Quartz.Impl.JobStore' - which supports persistence.
+            
+
+
+
+ + + Return a simple string representation of this object. + + + + + Returns the name of the . + + + + + Returns the instance Id of the . + + + + + Returns the class-name of the instance. + + + + + Returns whether the is being used remotely (via remoting). + + + + + Returns whether the scheduler has been started. + + + Note: may return even if + returns . + + + + + Reports whether the is in standby mode. + + + Note: may return even if + returns . + + + + + Reports whether the has been Shutdown. + + + + + Returns the class-name of the instance that is + being used by the . + + + + + Returns the type name of the instance that is + being used by the . + + + + + Returns the number of threads currently in the 's + + + + + Returns the version of Quartz that is running. + + + + + Returns the at which the Scheduler started running. + + null if the scheduler has not been started. + + + + + Returns the number of jobs executed since the + started.. + + + + + Returns whether or not the 's + instance supports persistence. + + + + + Returns whether or not the 's + is clustered. + + + + + SimpleScheduleBuilder is a + that defines strict/literal interval-based schedules for + s. + + + + Quartz provides a builder-style API for constructing scheduling-related + entities via a Domain-Specific Language (DSL). The DSL can best be + utilized through the usage of static imports of the methods on the classes + , , + , , + and the various implementations. + + Client code can then use the DSL to write code such as this: + + JobDetail job = JobBuilder.Create<MyJob>() + .WithIdentity("myJob") + .Build(); + Trigger trigger = TriggerBuilder.Create() + .WithIdentity(triggerKey("myTrigger", "myTriggerGroup")) + .WithSimpleSchedule(x => x + .WithIntervalInHours(1) + .RepeatForever()) + .StartAt(DateBuilder.FutureDate(10, IntervalUnit.Minute)) + .Build(); + scheduler.scheduleJob(job, trigger); + + + + + + + + + + + Create a SimpleScheduleBuilder. + + + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat forever with a 1 minute interval. + + + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat forever with an interval + of the given number of minutes. + + + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat forever with a 1 second interval. + + + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat forever with an interval + of the given number of seconds. + + + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat forever with a 1 hour interval. + + + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat forever with an interval + of the given number of hours. + + + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat the given number + of times - 1 with a 1 minute interval. + + + Note: Total count = 1 (at start time) + repeat count + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat the given number + of times - 1 with an interval of the given number of minutes. + + + Note: Total count = 1 (at start time) + repeat count + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat the given number + of times - 1 with a 1 second interval. + + + Note: Total count = 1 (at start time) + repeat count + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat the given number + of times - 1 with an interval of the given number of seconds. + + + Note: Total count = 1 (at start time) + repeat count + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat the given number + of times - 1 with a 1 hour interval. + + + Note: Total count = 1 (at start time) + repeat count + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat the given number + of times - 1 with an interval of the given number of hours. + + + Note: Total count = 1 (at start time) + repeat count + + the new SimpleScheduleBuilder + + + + Build the actual Trigger -- NOT intended to be invoked by end users, + but will rather be invoked by a TriggerBuilder which this + ScheduleBuilder is given to. + + + + + + + + Specify a repeat interval in milliseconds. + + + + the time span at which the trigger should repeat. + the updated SimpleScheduleBuilder + + + + + + Specify a repeat interval in seconds. + + + + the time span at which the trigger should repeat. + the updated SimpleScheduleBuilder + + + + + + Specify a the number of time the trigger will repeat - total number of + firings will be this number + 1. + + + + the number of seconds at which the trigger should repeat. + the updated SimpleScheduleBuilder + + + + + + Specify that the trigger will repeat indefinitely. + + + + the updated SimpleScheduleBuilder + + + + + + + If the Trigger misfires, use the + instruction. + + + + the updated CronScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + + + the updated SimpleScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + + + the updated SimpleScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + + + the updated SimpleScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + + + the updated SimpleScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + + + the updated SimpleScheduleBuilder + + + + + Extension methods that attach to . + + + + + A time source for Quartz.NET that returns the current time. + Original idea by Ayende Rahien: + http://ayende.com/Blog/archive/2008/07/07/Dealing-with-time-in-tests.aspx + + + + + Return current UTC time via . Allows easier unit testing. + + + + + Return current time in current time zone via . Allows easier unit testing. + + + + + Represents a time in hour, minute and second of any given day. + + + The hour is in 24-hour convention, meaning values are from 0 to 23. + + + + + James House + Zemian Deng saltnlight5@gmail.com + Nuno Maia (.NET) + + + + Create a TimeOfDay instance for the given hour, minute and second. + + The hour of day, between 0 and 23. + The minute of the hour, between 0 and 59. + The second of the minute, between 0 and 59. + + + + Create a TimeOfDay instance for the given hour, minute (at the zero second of the minute). + + The hour of day, between 0 and 23. + The minute of the hour, between 0 and 59. + + + + Create a TimeOfDay instance for the given hour, minute and second. + + The hour of day, between 0 and 23. + The minute of the hour, between 0 and 59. + The second of the minute, between 0 and 59. + + + + + Create a TimeOfDay instance for the given hour, minute (at the zero second of the minute).. + + The hour of day, between 0 and 23. + The minute of the hour, between 0 and 59. + The newly instantiated TimeOfDay + + + + Determine with this time of day is before the given time of day. + + + True this time of day is before the given time of day. + + + + Return a date with time of day reset to this object values. The millisecond value will be zero. + + + + + + The hour of the day (between 0 and 23). + + + + + The minute of the hour (between 0 and 59). + + + + + The second of the minute (between 0 and 59). + + + + + Attribute to use with public properties that + can be set with Quartz configuration. Attribute can be used to advice + parsing to use correct type of time span (milliseconds, seconds, minutes, hours) + as it may depend on property. + + Marko Lahma (.NET) + + + + + Initializes a new instance of the class. + + The rule. + + + + Gets the rule. + + The rule. + + + + Possible parse rules for s. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TriggerBuilder is used to instantiate s. + + + + The builder will always try to keep itself in a valid state, with + reasonable defaults set for calling build() at any point. For instance + if you do not invoke WithSchedule(..) method, a default schedule + of firing once immediately will be used. As another example, if you + do not invoked WithIdentity(..) a trigger name will be generated + for you. + + + Quartz provides a builder-style API for constructing scheduling-related + entities via a Domain-Specific Language (DSL). The DSL can best be + utilized through the usage of static imports of the methods on the classes + , , + , , + and the various implementations. + + + Client code can then use the DSL to write code such as this: + + + IJobDetail job = JobBuilder.Create<MyJob>() + .WithIdentity("myJob") + .Build(); + ITrigger trigger = TriggerBuilder.Create() + .WithIdentity("myTrigger", "myTriggerGroup") + .WithSimpleSchedule(x => x + .WithIntervalInHours(1) + .RepeatForever()) + .StartAt(DateBuilder.FutureDate(10, IntervalUnit.Minute)) + .Build(); + scheduler.scheduleJob(job, trigger); + + + + + + + + + + Create a new TriggerBuilder with which to define a + specification for a Trigger. + + + + the new TriggerBuilder + + + + Produce the . + + + + a Trigger that meets the specifications of the builder. + + + + Use a with the given name and default group to + identify the Trigger. + + + If none of the 'withIdentity' methods are set on the TriggerBuilder, + then a random, unique TriggerKey will be generated. + + the name element for the Trigger's TriggerKey + the updated TriggerBuilder + + + + + + Use a TriggerKey with the given name and group to + identify the Trigger. + + + If none of the 'withIdentity' methods are set on the TriggerBuilder, + then a random, unique TriggerKey will be generated. + + the name element for the Trigger's TriggerKey + the group element for the Trigger's TriggerKey + the updated TriggerBuilder + + + + + + Use the given TriggerKey to identify the Trigger. + + + If none of the 'withIdentity' methods are set on the TriggerBuilder, + then a random, unique TriggerKey will be generated. + + the TriggerKey for the Trigger to be built + the updated TriggerBuilder + + + + + + Set the given (human-meaningful) description of the Trigger. + + + + the description for the Trigger + the updated TriggerBuilder + + + + + Set the Trigger's priority. When more than one Trigger have the same + fire time, the scheduler will fire the one with the highest priority + first. + + + + the priority for the Trigger + the updated TriggerBuilder + + + + + + Set the name of the that should be applied to this + Trigger's schedule. + + + + the name of the Calendar to reference. + the updated TriggerBuilder + + + + + + Set the time the Trigger should start at - the trigger may or may + not fire at this time - depending upon the schedule configured for + the Trigger. However the Trigger will NOT fire before this time, + regardless of the Trigger's schedule. + + + + the start time for the Trigger. + the updated TriggerBuilder + + + + + + Set the time the Trigger should start at to the current moment - + the trigger may or may not fire at this time - depending upon the + schedule configured for the Trigger. + + + + the updated TriggerBuilder + + + + + Set the time at which the Trigger will no longer fire - even if it's + schedule has remaining repeats. + + + + the end time for the Trigger. If null, the end time is indefinite. + the updated TriggerBuilder + + + + + + Set the that will be used to define the + Trigger's schedule. + + + The particular used will dictate + the concrete type of Trigger that is produced by the TriggerBuilder. + + the SchedulerBuilder to use. + the updated TriggerBuilder + + + + + + + + Set the identity of the Job which should be fired by the produced + Trigger. + + + + the identity of the Job to fire. + the updated TriggerBuilder + + + + + Set the identity of the Job which should be fired by the produced + Trigger - a will be produced with the given + name and default group. + + + + the name of the job (in default group) to fire. + the updated TriggerBuilder + + + + + Set the identity of the Job which should be fired by the produced + Trigger - a will be produced with the given + name and group. + + + + the name of the job to fire. + the group of the job to fire. + the updated TriggerBuilder + + + + + Set the identity of the Job which should be fired by the produced + Trigger, by extracting the JobKey from the given job. + + + + the Job to fire. + the updated TriggerBuilder + + + + + Add the given key-value pair to the Trigger's . + + + + the updated TriggerBuilder + + + + + Add the given key-value pair to the Trigger's . + + + + the updated TriggerBuilder + + + + + Add the given key-value pair to the Trigger's . + + + + the updated TriggerBuilder + + + + + Add the given key-value pair to the Trigger's . + + + + the updated TriggerBuilder + + + + + Add the given key-value pair to the Trigger's . + + + + the updated TriggerBuilder + + + + + Add the given key-value pair to the Trigger's . + + + + the updated TriggerBuilder + + + + + Add the given key-value pair to the Trigger's . + + + + the updated TriggerBuilder + + + + + Add the given key-value pair to the Trigger's . + + + + the updated TriggerBuilder + + + + + Common constants for triggers. + + + + + The default value for priority. + + + + + Uniquely identifies a . + + + Keys are composed of both a name and group, and the name must be unique + within the group. If only a name is specified then the default group + name will be used. + + + Quartz provides a builder-style API for constructing scheduling-related + entities via a Domain-Specific Language (DSL). The DSL can best be + utilized through the usage of static imports of the methods on the classes + , , + , , + and the various implementations. + + + Client code can then use the DSL to write code such as this: + + + IJobDetail job = JobBuilder.Create<MyJob>() + .WithIdentity("myJob") + .Build(); + ITrigger trigger = TriggerBuilder.Create() + .WithIdentity("myTrigger", "myTriggerGroup") + .WithSimpleSchedule(x => x + .WithIntervalInHours(1) + .RepeatForever()) + .StartAt(DateBuilder.FutureDate(10, IntervalUnit.Minute)) + .Build(); + scheduler.scheduleJob(job, trigger); + + + + + + + + All trigger states known to Scheduler. + + Marko Lahma (.NET) + + + + Indicates that the is in the "normal" state. + + + + + Indicates that the is in the "paused" state. + + + + + Indicates that the is in the "complete" state. + + + "Complete" indicates that the trigger has not remaining fire-times in + its schedule. + + + + + Indicates that the is in the "error" state. + + + + A arrives at the error state when the scheduler + attempts to fire it, but cannot due to an error creating and executing + its related job. Often this is due to the 's + class not existing in the classpath. + + + + When the trigger is in the error state, the scheduler will make no + attempts to fire it. + + + + + + Indicates that the is in the "blocked" state. + + + A arrives at the blocked state when the job that + it is associated with has a and it is + currently executing. + + + + + + Indicates that the does not exist. + + + + + A Comparator that compares trigger's next fire times, or in other words, + sorts them according to earliest next fire time. If the fire times are + the same, then the triggers are sorted according to priority (highest + value first), if the priorities are the same, then they are sorted + by key. + + + + + Convenience and utility methods for simplifying the construction and + configuration of s and DateTimeOffsetOffsets. + + + + James House + Marko Lahma (.NET) + + + + Returns a list of Dates that are the next fire times of a + . + The input trigger will be cloned before any work is done, so you need + not worry about its state being altered by this method. + + The trigger upon which to do the work + The calendar to apply to the trigger's schedule + The number of next fire times to produce + List of java.util.Date objects + + + + Compute the that is 1 second after the Nth firing of + the given , taking the triger's associated + into consideration. + + + The input trigger will be cloned before any work is done, so you need + not worry about its state being altered by this method. + + The trigger upon which to do the work + The calendar to apply to the trigger's schedule + The number of next fire times to produce + the computed Date, or null if the trigger (as configured) will not fire that many times + + + + Returns a list of Dates that are the next fire times of a + that fall within the given date range. The input trigger will be cloned + before any work is done, so you need not worry about its state being + altered by this method. + + NOTE: if this is a trigger that has previously fired within the given + date range, then firings which have already occurred will not be listed + in the output List. + + + The trigger upon which to do the work + The calendar to apply to the trigger's schedule + The starting date at which to find fire times + The ending date at which to stop finding fire times + List of java.util.Date objects + + + + An exception that is thrown to indicate that a call to + failed without interrupting the Job. + + + James House + Marko Lahma (.NET) + + + + Create a with the given message. + + + + + Create a with the given cause. + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + diff --git a/lib/Quartz20/mono/4.0/C5.dll b/lib/Quartz20/mono/4.0/C5.dll new file mode 100644 index 0000000000000000000000000000000000000000..2130d1fa206f3d5b518d8863687feda53fa93395 GIT binary patch literal 272384 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 DUP$wm#uw^Tg;I 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

ayY#ifgtA)}+iwJ-(*5>hh?SNzUp-ZmXII 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 literal 0 HcmV?d00001 diff --git a/lib/Quartz20/mono/4.0/Quartz.xml b/lib/Quartz20/mono/4.0/Quartz.xml new file mode 100644 index 00000000..c983e3df --- /dev/null +++ b/lib/Quartz20/mono/4.0/Quartz.xml @@ -0,0 +1,19889 @@ + + + + Quartz + + + +

+ A wrapper for generic HashSet that brings a common interface. + + + + + + Represents a collection ob objects that contains no duplicate elements. + + Marko Lahma (.NET) + + + + A sorted set. + + Marko Lahma (.NET) + + + + Returns a portion of the list whose elements are greater than the limit object parameter. + + The start element of the portion to extract. + The portion of the collection whose elements are greater than the limit object parameter. + + + + Returns the first item in the set. + + First object. + + + + Returns the object in the specified index. + + + + + + + Simple C5 wrapper for common interface. + + + + + + Default constructor. + + + + + Constructor that accepts comparer. + + Comparer to use. + + + + Constructor that prepolutates. + + + + + + Returns the first element. + + + + + + Return items from given range. + + + + + + + Indexer. + + + + + + + Only for backwards compatibility with serialization! + + + + + Responsible for creating the instances of + to be used within the instance. + + James House + Marko Lahma (.NET) + + + + Initialize the factory, providing a handle to the + that should be made available within the and + the s within it. + + + + + Called by the + to obtain instances of . + + + + + JobRunShell instances are responsible for providing the 'safe' environment + for s to run in, and for performing all of the work of + executing the , catching ANY thrown exceptions, updating + the with the 's completion code, + etc. + + A instance is created by a + on behalf of the which then runs the + shell in a thread from the configured when the + scheduler determines that a has been triggered. + + + + + + + James House + Marko Lahma (.NET) + + + + A helpful abstract base class for implementors of + . + + + The methods in this class are empty so you only need to override the + subset for the events you care about. + + Marko Lahma (.NET) + + + + + The interface to be implemented by classes that want to be informed of major + events. + + + + + James House + Marko Lahma (.NET) + + + + Called by the when a + is scheduled. + + + + + Called by the when a + is unscheduled. + + + + + + Called by the when a + has reached the condition in which it will never fire again. + + + + + Called by the a s has been paused. + + + + + Called by the a group of + s has been paused. + + + If a all groups were paused, then the parameter + will be null. + + The trigger group. + + + + Called by the when a + has been un-paused. + + + + + Called by the when a + group of s has been un-paused. + + + If all groups were resumed, then the parameter + will be null. + + The trigger group. + + + + Called by the when a + has been added. + + + + + + Called by the when a + has been deleted. + + + + + Called by the when a + has been paused. + + + + + Called by the when a + group of s has been paused. + + If all groups were paused, then the parameter will be + null. If all jobs were paused, then both parameters will be null. + + + The job group. + + + + Called by the when a + has been un-paused. + + + + + Called by the when a + has been un-paused. + + The job group. + + + + Called by the when a serious error has + occurred within the scheduler - such as repeated failures in the , + or the inability to instantiate a instance when its + has fired. + + + + + Called by the to inform the listener + that it has move to standby mode. + + + + + Called by the to inform the listener + that it has started. + + + + + Called by the to inform the listener + that it has Shutdown. + + + + + Called by the to inform the listener + that it has begun the shutdown sequence. + + + + + Called by the to inform the listener + that all jobs, triggers and calendars were deleted. + + + + + Get the for this + type's category. This should be used by subclasses for logging. + + + + + This interface should be implemented by any class whose instances are intended + to be executed by a thread. + + Marko Lahma (.NET) + + + + This method has to be implemented in order that starting of the thread causes the object's + run method to be called in that separately executing thread. + + + + + Create a JobRunShell instance with the given settings. + + The instance that should be made + available within the . + + + + + Initializes the job execution context with given scheduler and bundle. + + The scheduler. + + + + Requests the Shutdown. + + + + + This method has to be implemented in order that starting of the thread causes the object's + run method to be called in that separately executing thread. + + + + + Runs begin procedures on this instance. + + + + + Completes the execution. + + if set to true [successful execution]. + + + + Passivates this instance. + + + + + Completes the trigger retry loop. + + The trigger. + The job detail. + The inst code. + + + + + Vetoeds the job retry loop. + + The trigger. + The job detail. + The inst code. + + + + + Default concrete implementation of . + + + + + Client programs may be interested in the 'listener' interfaces that are + available from Quartz. The interface + provides notifications of Job executions. The + interface provides notifications of + firings. The + interface provides notifications of scheduler events and + errors. Listeners can be associated with local schedulers through the + interface. + + + + jhouse + 2.0 - previously listeners were managed directly on the Scheduler interface. + + + + Add the given to the, + and register it to receive events for Jobs that are matched by ANY of the + given Matchers. + + + If no matchers are provided, the will be used. + + + + + + + Add the given to the, + and register it to receive events for Jobs that are matched by ANY of the + given Matchers. + + + If no matchers are provided, the will be used. + + + + + + + Add the given Matcher to the set of matchers for which the listener + will receive events if ANY of the matchers match. + + + + the name of the listener to add the matcher to + the additional matcher to apply for selecting events + true if the identified listener was found and updated + + + + Remove the given Matcher to the set of matchers for which the listener + will receive events if ANY of the matchers match. + + + + the name of the listener to add the matcher to + the additional matcher to apply for selecting events + true if the given matcher was found and removed from the listener's list of matchers + + + + Set the set of Matchers for which the listener + will receive events if ANY of the matchers match. + + + Removes any existing matchers for the identified listener! + + the name of the listener to add the matcher to + the matchers to apply for selecting events + true if the given matcher was found and removed from the listener's list of matchers + + + + Get the set of Matchers for which the listener + will receive events if ANY of the matchers match. + + + + the name of the listener to add the matcher to + the matchers registered for selecting events for the identified listener + + + + Remove the identified from the. + + + + true if the identified listener was found in the list, and removed. + + + + Get a List containing all of the s in + the. + + + + + Get the that has the given name. + + + + + Add the given to the, + and register it to receive events for Triggers that are matched by ANY of the + given Matchers. + + + If no matcher is provided, the will be used. + + + + + + + Add the given to the, + and register it to receive events for Triggers that are matched by ANY of the + given Matchers. + + + If no matcher is provided, the will be used. + + + + + + + Add the given Matcher to the set of matchers for which the listener + will receive events if ANY of the matchers match. + + + + the name of the listener to add the matcher to + the additional matcher to apply for selecting events + true if the identified listener was found and updated + + + + Remove the given Matcher to the set of matchers for which the listener + will receive events if ANY of the matchers match. + + + + the name of the listener to add the matcher to + the additional matcher to apply for selecting events + true if the given matcher was found and removed from the listener's list of matchers + + + + Set the set of Matchers for which the listener + will receive events if ANY of the matchers match. + + + Removes any existing matchers for the identified listener! + + the name of the listener to add the matcher to + the matchers to apply for selecting events + true if the given matcher was found and removed from the listener's list of matchers + + + + Get the set of Matchers for which the listener + will receive events if ANY of the matchers match. + + + + the name of the listener to add the matcher to + the matchers registered for selecting events for the identified listener + + + + Remove the identified from the. + + + + true if the identified listener was found in the list, and + removed. + + + + Get a List containing all of the s + in the. + + + + + Get the that has the given name. + + + + + Register the given with the + . + + + + + Remove the given from the + . + + + + true if the identified listener was found in the list, and removed. + + + + Get a List containing all of the s + registered with the. + + + + + This is the heart of Quartz, an indirect implementation of the + interface, containing methods to schedule s, + register instances, etc. + + + + + + James House + Marko Lahma (.NET) + + + + Remote scheduler service interface. + + Marko Lahma (.NET) + + + + Starts this instance. + + + + + Standbies this instance. + + + + + Shutdowns this instance. + + + + + returns true if the given JobGroup + is paused + + + + + + + returns true if the given TriggerGroup + is paused + + + + + + + Initializes the class. + + + + + Register the given with the + 's list of internal listeners. + + + + + + Remove the given from the + 's list of internal listeners. + + + true if the identified listener was found in the list, andremoved. + + + + Create a with the given configuration + properties. + + + + + + Bind the scheduler to remoting infrastructure. + + + + + Un-bind the scheduler from remoting infrastructure. + + + + + Adds an object that should be kept as reference to prevent + it from being garbage collected. + + The obj. + + + + Removes the object from garbae collection protected list. + + The obj. + + + + + Starts the 's threads that fire s. + + All s that have misfired will + be passed to the appropriate TriggerListener(s). + + + + + + Temporarily halts the 's firing of s. + + The scheduler is not destroyed, and can be re-started at any time. + + + + + + Halts the 's firing of s, + and cleans up all resources associated with the QuartzScheduler. + Equivalent to . + + The scheduler cannot be re-started. + + + + + + Halts the 's firing of s, + and cleans up all resources associated with the QuartzScheduler. + + The scheduler cannot be re-started. + + + + if the scheduler will not allow this method + to return until all currently executing jobs have completed. + + + + + Validates the state. + + + + + Add the identified by the given + to the Scheduler, and + associate the given with it. + + If the given Trigger does not reference any , then it + will be set to reference the Job passed with it into this method. + + + + + + Schedule the given with the + identified by the 's settings. + + + + + Add the given to the Scheduler - with no associated + . The will be 'dormant' until + it is scheduled with a , or + is called for it. + + The must by definition be 'durable', if it is not, + SchedulerException will be thrown. + + + + + + Delete the identified from the Scheduler - and any + associated s. + + true if the Job was found and deleted. + + + + Remove the indicated from the + scheduler. + + + + + Remove (delete) the with the + given name, and store the new given one - which must be associated + with the same job. + + the key of the trigger + The new to be stored. + + if a with the given + name and group was not found and removed from the store, otherwise + the first fire time of the newly scheduled trigger. + + + + + Creates a new positive random number + + The last random obtained + Returns a new positive random number + + + + Trigger the identified (Execute it now) - with a non-volatile trigger. + + + + + Store and schedule the identified + + + + + + Pause the with the given name. + + + + + Pause all of the s in the given group. + + + + + Pause the with the given + name - by pausing all of its current s. + + + + + Pause all of the s in the + given group - by pausing all of their s. + + + + + Resume (un-pause) the with the given + name. + + If the missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Resume (un-pause) all of the s in the + matching groups. + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Gets the paused trigger groups. + + + + + + Resume (un-pause) the with + the given name. + + If any of the 's s missed one + or more fire-times, then the 's misfire + instruction will be applied. + + + + + + Resume (un-pause) all of the s + in the matching groups. + + If any of the s had s that + missed one or more fire-times, then the 's + misfire instruction will be applied. + + + + + + Pause all triggers - equivalent of calling + with a matcher matching all known groups. + + When is called (to un-pause), trigger misfire + instructions WILL be applied. + + + + + + + + Resume (un-pause) all triggers - equivalent of calling + on every group. + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + + Get the names of all known groups. + + + + + Get the names of all the s in the + given group. + + + + + Get all s that are associated with the + identified . + + + + + Get the names of all known + groups. + + + + + Get the names of all the s in + the matching groups. + + + + + Get the for the + instance with the given name and group. + + + + + Get the instance with the given name and + group. + + + + + Determine whether a with the given identifier already + exists within the scheduler. + + + + the identifier to check for + true if a Job exists with the given identifier + + + + Determine whether a with the given identifier already + exists within the scheduler. + + + + the identifier to check for + true if a Trigger exists with the given identifier + + + + Clears (deletes!) all scheduling data - all s, s + s. + + + + + Get the current state of the identified . + + + + + + Add (register) the given to the Scheduler. + + + + + Delete the identified from the Scheduler. + + true if the Calendar was found and deleted. + + + + Get the instance with the given name. + + + + + Get the names of all registered s. + + + + + Add the given to the + 's internal list. + + + + + + Remove the identified from the 's + list of internal listeners. + + + true if the identified listener was found in the list, and removed. + + + + Get the internal + that has the given name. + + + + + + + Add the given to the + 's internal list. + + + + + + Remove the identified from the 's + list of internal listeners. + + + true if the identified listener was found in the list, and removed. + + + + Get the internal that + has the given name. + + + + + + + Notifies the job store job complete. + + The trigger. + The detail. + The instruction code. + + + + Notifies the scheduler thread. + + + + + Notifies the trigger listeners about fired trigger. + + The job execution context. + + + + + Notifies the trigger listeners about misfired trigger. + + The trigger. + + + + Notifies the trigger listeners of completion. + + The job executution context. + The instruction code to report to triggers. + + + + Notifies the job listeners about job to be executed. + + The jec. + + + + Notifies the job listeners that job exucution was vetoed. + + The job execution context. + + + + Notifies the job listeners that job was executed. + + The jec. + The je. + + + + Notifies the scheduler listeners about scheduler error. + + The MSG. + The se. + + + + Notifies the scheduler listeners about job that was scheduled. + + The trigger. + + + + Notifies the scheduler listeners about job that was unscheduled. + + + + + Notifies the scheduler listeners about finalized trigger. + + The trigger. + + + + Notifies the scheduler listeners about paused trigger. + + The group. + + + + Notifies the scheduler listeners about paused trigger. + + + + + Notifies the scheduler listeners resumed trigger. + + The group. + + + + Notifies the scheduler listeners resumed trigger. + + + + + Notifies the scheduler listeners about paused job. + + + + + Notifies the scheduler listeners about paused job. + + The group. + + + + Notifies the scheduler listeners about resumed job. + + + + + Notifies the scheduler listeners about resumed job. + + The group. + + + + Notifies the scheduler listeners about scheduler shutdown. + + + + + Interrupt all instances of the identified InterruptableJob. + + + + + Interrupt all instances of the identified InterruptableJob executing in this Scheduler instance. + + + This method is not cluster aware. That is, it will only interrupt + instances of the identified InterruptableJob currently executing in this + Scheduler instance, not across the entire cluster. + + + + + + + + Obtains a lifetime service object to control the lifetime policy for this instance. + + + + + Gets the version of the Quartz Scheduler. + + The version. + + + + Gets the version major. + + The version major. + + + + Gets the version minor. + + The version minor. + + + + Gets the version iteration. + + The version iteration. + + + + Gets the scheduler signaler. + + The scheduler signaler. + + + + Returns the name of the . + + + + + Returns the instance Id of the . + + + + + Returns the of the . + + + + + Gets or sets a value indicating whether to signal on scheduling change. + + + true if schduler should signal on scheduling change; otherwise, false. + + + + + Reports whether the is paused. + + + + + Gets the job store class. + + The job store class. + + + + Gets the thread pool class. + + The thread pool class. + + + + Gets the size of the thread pool. + + The size of the thread pool. + + + + Reports whether the has been Shutdown. + + + + + Return a list of objects that + represent all currently executing Jobs in this Scheduler instance. + + This method is not cluster aware. That is, it will only return Jobs + currently executing in this Scheduler instance, not across the entire + cluster. + + + Note that the list returned is an 'instantaneous' snap-shot, and that as + soon as it's returned, the true list of executing jobs may be different. + + + + + + Get a List containing all of the internal s + registered with the . + + + + + Gets or sets the job factory. + + The job factory. + + + + Gets the running since. + + The running since. + + + + Gets the number of jobs executed. + + The number of jobs executed. + + + + Gets a value indicating whether this scheduler supports persistence. + + true if supports persistence; otherwise, false. + + + + Get a List containing all of the s + in the 's internal list. + + + + + + Get a list containing all of the s + in the 's internal list. + + + + + Helper class to start scheduler in a delayed fashion. + + + + + ErrorLogger - Scheduler Listener Class + + + + + The interface to be implemented by classes that want to be informed when a + executes. In general, applications that use a + will not have use for this mechanism. + + + + + + + + James House + Marko Lahma (.NET) + + + + Called by the when a + is about to be executed (an associated + has occurred). + + This method will not be invoked if the execution of the Job was vetoed + by a . + + + + + + + Called by the when a + was about to be executed (an associated + has occurred), but a vetoed it's + execution. + + + + + + Called by the after a + has been executed, and be for the associated 's + method has been called. + + + + + Get the name of the . + + + + + Contains all of the resources (,, + etc.) necessary to create a instance. + + + James House + Marko Lahma (.NET) + + + + Gets the unique identifier. + + Name of the scheduler. + The scheduler instance id. + + + + + Gets the unique identifier. + + + + + + Add the given for the + to use. This method expects the plugin's + "initialize" method to be invoked externally (either before or after + this method is called). + + + + + + Get or set the name for the . + + + if name is null or empty. + + + + + Get or set the instance Id for the . + + + if name is null or empty. + + + + + Get or set the name for the . + + + if name is null or empty. + + + + + Get or set the for the + to use. + + + if threadPool is null. + + + + + Get or set the for the + to use. + + + if jobStore is null. + + + + + Get or set the for the + to use. + + + if jobRunShellFactory is null. + + + + + Get the of all s for the + to use. + + + + + + Gets or sets a value indicating whether to make scheduler thread daemon. + + + true if scheduler should be thread daemon; otherwise, false. + + + + + Gets or sets the scheduler exporter. + + The scheduler exporter. + + + + The ThreadExecutor which runs the QuartzSchedulerThread. + + + + + Gets or sets the batch time window. + + + + + The thread responsible for performing the work of firing + s that are registered with the . + + + + + James House + Marko Lahma (.NET) + + + + Support class used to handle threads + + Marko Lahma (.NET) + + + + The instance of System.Threading.Thread + + + + + Initializes a new instance of the QuartzThread class + + + + + Initializes a new instance of the Thread class. + + The name of the thread + + + + This method has no functionality unless the method is overridden + + + + + Causes the operating system to change the state of the current thread instance to ThreadState.Running + + + + + Interrupts a thread that is in the WaitSleepJoin thread state + + + + + Blocks the calling thread until a thread terminates + + + + + Obtain a string that represents the current object + + A string that represents the current object + + + + Gets or sets the name of the thread + + + + + Gets or sets a value indicating the scheduling priority of a thread + + + + + Gets or sets a value indicating whether or not a thread is a background thread. + + + + + Gets the randomized idle wait time. + + The randomized idle wait time. + + + + Construct a new for the given + as a non-daemon + with normal priority. + + + + + Construct a new for the given + as a with the given + attributes. + + + + + Signals the main processing loop to pause at the next possible point. + + + + + Signals the main processing loop to pause at the next possible point. + + + + + Signals the main processing loop that a change in scheduling has been + made - in order to interrupt any sleeping that may be occuring while + waiting for the fire time to arrive. + + + the time when the newly scheduled trigger + will fire. If this method is being called do to some other even (rather + than scheduling a trigger), the caller should pass null. + + + + + The main processing loop of the . + + + + + Trigger retry loop that is executed on error condition. + + The bndle. + + + + Releases the trigger retry loop. + + The trigger. + + + + Gets the log. + + The log. + + + + Sets the idle wait time. + + The idle wait time. + + + + Gets a value indicating whether this is paused. + + true if paused; otherwise, false. + + + + Gets or sets the db failure retry interval. + + The db failure retry interval. + + + + An interface to be used by instances in order to + communicate signals back to the . + + James House + Marko Lahma (.NET) + + + + An interface to be used by instances in order to + communicate signals back to the . + + James House + Marko Lahma (.NET) + + + + Notifies the scheduler about misfired trigger. + + The trigger that misfired. + + + + Notifies the scheduler about finalized trigger. + + The trigger that has finalized. + + + + Signals the scheduling change. + + + + + Notifies the scheduler about misfired trigger. + + The trigger that misfired. + + + + Notifies the scheduler about finalized trigger. + + The trigger that has finalized. + + + + Signals the scheduling change. + + + + + Metadata information about specific ADO.NET driver library. Metadata is used to + create correct types of object instances to interact with the underlying + database. + + Marko Lahma + + + + Initializes this instance. Parses information and initializes startup + values. + + + + + Gets the name of the parameter which includes the parameter prefix for this + database. + + Name of the parameter. + + + Gets or sets the name of the assembly that holds the connection library. + The name of the assembly. + + + + Gets or sets the name of the product. + + The name of the product. + + + + Gets or sets the type of the connection. + + The type of the connection. + + + + Gets or sets the type of the command. + + The type of the command. + + + + Gets or sets the type of the parameter. + + The type of the parameter. + + + + Gets the type of the command builder. + + The type of the command builder. + + + Gets the command builder's derive parameters method. + The command builder derive parameters method. + + + + Gets or sets the parameter name prefix. + + The parameter name prefix. + + + + Gets or sets the type of the exception that is thrown when using driver + library. + + The type of the exception. + + + + Gets or sets a value indicating whether parameters are bind by name when using + ADO.NET parameters. + + true if parameters are bind by name; otherwise, false. + + + Gets or sets the type of the database parameters. + The type of the parameter db. + + + + Gets the parameter db type property. + + The parameter db type property. + + + + Gets the parameter is nullable property. + + The parameter is nullable property. + + + + Gets or sets the type of the db binary column. This is a string representation of + Enum element because this information is database driver specific. + + The type of the db binary. + + + Gets the type of the db binary. + The type of the db binary. + + + + Sets the name of the parameter db type property. + + The name of the parameter db type property. + + + + Gets or sets a value indicating whether [use parameter name prefix in parameter collection]. + + + true if [use parameter name prefix in parameter collection]; otherwise, false. + + + + + Concrete implementation of . + + Marko Lahma + + + + Data access provider interface. + + Marko Lahma + + + + Returns a new command object for executing SQL statments/Stored Procedures + against the database. + + An new + + + + Returns a new instance of the providers CommandBuilder class. + + In .NET 1.1 there was no common base class or interface + for command builders, hence the return signature is object to + be portable (but more loosely typed) across .NET 1.1/2.0 + A new Command Builder + + + + Returns a new connection object to communicate with the database. + + A new + + + + Returns a new parameter object for binding values to parameter + placeholders in SQL statements or Stored Procedure variables. + + A new + + + + Shutdowns this instance. + + + + + Connection string used to create connections. + + + + + Registers DB metadata information for given provider name. + + + + + + + Initializes a new instance of the class. + + Name of the db provider. + The connection string. + + + + Returns a new command object for executing SQL statments/Stored Procedures + against the database. + + An new + + + + Returns a new instance of the providers CommandBuilder class. + + A new Command Builder + In .NET 1.1 there was no common base class or interface + for command builders, hence the return signature is object to + be portable (but more loosely typed) across .NET 1.1/2.0 + + + + Returns a new connection object to communicate with the database. + + A new + + + + Returns a new parameter object for binding values to parameter + placeholders in SQL statements or Stored Procedure variables. + + A new + + + + Shutdowns this instance. + + + + + Connection string used to create connections. + + + + + + Gets the metadata. + + The metadata. + + + + This interface can be implemented by any + class that needs to use the constants contained herein. + + Jeffrey Wescott + James House + Marko Lahma(.NET) + + + + Simple Trigger type. + + + + + Cron Trigger type. + + + + + Calendar Interval Trigger type. + + + + + Daily Time Interval Trigger type. + + + + + A general blob Trigger type. + + + + + This class contains utility functions for use in all delegate classes. + + Jeffrey Wescott + Marko Lahma (.NET) + + + + Replace the table prefix in a query by replacing any occurrences of + "{0}" with the table prefix. + + The unsubstitued query + The table prefix + the scheduler name + The query, with proper table prefix substituted + + + + Common helper methods for working with ADO.NET. + + Marko Lahma + + + + Persist a CalendarIntervalTriggerImpl by converting internal fields to and from + SimplePropertiesTriggerProperties. + + + + + + + A base implementation of that persists + trigger fields in the "QRTZ_SIMPROP_TRIGGERS" table. This allows extending + concrete classes to simply implement a couple methods that do the work of + getting/setting the trigger's fields, and creating the + for the particular type of trigger. + + + jhouse + Marko Lahma (.NET) + + + + An interface which provides an implementation for storing a particular + type of 's extended properties. + + jhouse + + + + Initializes the persistence delegate. + + + + + Returns whether the trigger type can be handled by delegate. + + + + + Returns database discriminator value for trigger type. + + + + + Inserts trigger's special properties. + + + + + Updates trigger's special properties. + + + + + Deletes trigger's special properties. + + + + + Loads trigger's special properties. + + + + + Returns whether the trigger type can be handled by delegate. + + + + + Returns database discriminator value for trigger type. + + + + + Utility class to keep track of both active transaction + and connection. + + Marko Lahma + + + + Initializes a new instance of the class. + + The connection. + The transaction. + + + + Gets or sets the connection. + + The connection. + + + + Gets or sets the transaction. + + The transaction. + + + + Persist a CronTriggerImpl. + + + + + + + Persist a DailyTimeIntervalTrigger by converting internal fields to and from + SimplePropertiesTriggerProperties. + + + + Zemian Deng saltnlight5@gmail.com + Nuno Maia (.NET) + + + + + + + + + + Base class for database based lock handlers for providing thread/resource locking + in order to protect resources from being altered by multiple threads at the + same time. + + Marko Lahma (.NET) + + + + This class extends + to include the query string constants in use by the + class. + + Jeffrey Wescott + Marko Lahma (.NET) + + + + An interface for providing thread/resource locking in order to protect + resources from being altered by multiple threads at the same time. + + James House + Marko Lahma (.NET) + + + + Grants a lock on the identified resource to the calling thread (blocking + until it is available). + + true if the lock was obtained. + + + + Release the lock on the identified resource if it is held by the calling + thread. + + + + + Determine whether the calling thread owns a lock on the identified + resource. + + + + + Whether this Semaphore implementation requires a database connection for + its lock management operations. + + + + + + + + Interface for Quartz objects that need to know what the table prefix of + the tables used by a ADO.NET JobStore is. + + Marko Lahma (.NET) + + + + Table prefix to use. + + + + + Initializes a new instance of the class. + + The table prefix. + the scheduler name + The SQL. + The default SQL. + The db provider. + + + + Execute the SQL that will lock the proper database row. + + + + + + + + + Grants a lock on the identified resource to the calling thread (blocking + until it is available). + + + + + true if the lock was obtained. + + + + Release the lock on the identified resource if it is held by the calling + thread. + + + + + + + Determine whether the calling thread owns a lock on the identified + resource. + + + + + + + + Gets or sets the lock owners. + + The lock owners. + + + + Gets the log. + + The log. + + + + This Semaphore implementation does use the database. + + + + + Gets or sets the table prefix. + + The table prefix. + + + + Initialization argumens holder for implementations. + + + + + Whether simple should be used (for serialization safety). + + + + + The logger to use during execution. + + + + + The prefix of all table names. + + + + + The instance's name. + + + + + The instance id. + + + + + The db provider. + + + + + The type loading strategy. + + + + + Object serializer and deserializer strategy to use. + + + + + Custom driver delegate initialization. + + + initStrings are of the format: + settingName=settingValue|otherSettingName=otherSettingValue|... + + + + + Conveys the state of a fired-trigger record. + + James House + Marko Lahma (.NET) + + + + Gets or sets the fire instance id. + + The fire instance id. + + + + Gets or sets the fire timestamp. + + The fire timestamp. + + + + Gets or sets a value indicating whether job disallows concurrent execution. + + + + + Gets or sets the job key. + + The job key. + + + + Gets or sets the scheduler instance id. + + The scheduler instance id. + + + + Gets or sets the trigger key. + + The trigger key. + + + + Gets or sets the state of the fire instance. + + The state of the fire instance. + + + + Gets or sets a value indicating whether [job requests recovery]. + + true if [job requests recovery]; otherwise, false. + + + + Gets or sets the priority. + + The priority. + + + + Service interface or modifying parameters + and resultset values. + + + + + Prepares a to be used to access database. + + Connection and tranasction pair + SQL to run + + + + + Adds a parameter to . + + Command to add parameter to + Parameter's name + Parameter's value + + + + Adds a parameter to . + + Command to add parameter to + Parameter's name + Parameter's value + Parameter's data type + + + + Gets the db presentation for boolean value. Subclasses can overwrite this behaviour. + + Value to map to database. + + + + + Gets the boolean value from db presentation. Subclasses can overwrite this behaviour. + + Value to map from database. + + + + + Gets the db presentation for date/time value. Subclasses can overwrite this behaviour. + + Value to map to database. + + + + + Gets the date/time value from db presentation. Subclasses can overwrite this behaviour. + + Value to map from database. + + + + + Gets the db presentation for time span value. Subclasses can overwrite this behaviour. + + Value to map to database. + + + + + Gets the time span value from db presentation. Subclasses can overwrite this behaviour. + + Value to map from database. + + + + + This is the base interface for all driver delegate classes. + + + + This interface is very similar to the + interface except each method has an additional + parameter. + + + Unless a database driver has some extremely-DB-specific + requirements, any IDriverDelegate implementation classes should extend the + class. + + + Jeffrey Wescott + James House + Marko Lahma (.NET) + + + + Initializes the driver delegate with configuration data. + + + + + + Update all triggers having one of the two given states, to the given new + state. + + The DB Connection + The new state for the triggers + The first old state to update + The second old state to update + Number of rows updated + + + + Get the names of all of the triggers that have misfired - according to + the given timestamp. + + The DB Connection + The timestamp. + An array of objects + + + + Get the names of all of the triggers in the given state that have + misfired - according to the given timestamp. + + The DB Connection + The state. + The time stamp. + An array of objects + + + + Get the names of all of the triggers in the given group and state that + have misfired - according to the given timestamp. + + The DB Connection + Name of the group. + The state. + The timestamp. + An array of objects + + + + Select all of the triggers for jobs that are requesting recovery. The + returned trigger objects will have unique "recoverXXX" trigger names and + will be in the trigger group. + + + In order to preserve the ordering of the triggers, the fire time will be + set from the ColumnFiredTime column in the TableFiredTriggers + table. The caller is responsible for calling + on each returned trigger. It is also up to the caller to insert the + returned triggers to ensure that they are fired. + + The DB Connection + An array of objects + + + + Delete all fired triggers. + + The DB Connection + The number of rows deleted + + + + Delete all fired triggers of the given instance. + + The DB Connection + The instance id. + The number of rows deleted + + + + Insert the job detail record. + + The DB Connection + The job to insert. + Number of rows inserted. + + + + Update the job detail record. + + The DB Connection. + The job to update. + Number of rows updated. + + + + Get the names of all of the triggers associated with the given job. + + + + The DB Connection + The key identifying the job. + + + + Delete the job detail record for the given job. + + The DB Connection + The key identifying the job. + the number of rows deleted + + + + Check whether or not the given job is stateful. + + The DB Connection + The key identifying the job. + true if the job exists and is stateful, false otherwise + + + + Check whether or not the given job exists. + + The DB Connection + The key identifying the job. + true if the job exists, false otherwise + + + + Update the job data map for the given job. + + The DB Connection + The job. + the number of rows updated + + + + Select the JobDetail object for a given job name / group name. + + The DB Connection + The key identifying the job. + The class load helper. + The populated JobDetail object + + + + Select the total number of jobs stored. + + The DB Connection + the total number of jobs stored + + + + Select all of the job group names that are stored. + + The DB Connection. + an array of group names + + + + Select all of the jobs contained in a given group. + + The DB Connection + + an array of job names + + + + Insert the base trigger data. + + The DB Connection + The trigger to insert. + The state that the trigger should be stored in. + The job detail. + The number of rows inserted + + + + Insert the blob trigger data. + + The DB Connection + The trigger to insert + The number of rows inserted + + + + Update the base trigger data. + + the DB Connection + The trigger. + The state. + The job detail. + the number of rows updated + + + + Update the blob trigger data. + + the DB Connection + The trigger. + the number of rows updated + + + + Check whether or not a trigger exists. + + the DB Connection + The key identifying the trigger. + the number of rows updated + + + + Update the state for a given trigger. + + The DB Connection + The key identifying the trigger. + The new state for the trigger. + the number of rows updated + + + + Update the given trigger to the given new state, if it is in the given + old state. + + The DB connection + The key identifying the trigger. + The new state for the trigger + The old state the trigger must be in + int the number of rows updated + + + + Update the given trigger to the given new state, if it is one of the + given old states. + + The DB connection + The key identifying the trigger. + The new state for the trigger + One of the old state the trigger must be in + One of the old state the trigger must be in + One of the old state the trigger must be in + + int the number of rows updated + + SQLException + + + + Update all triggers in the given group to the given new state, if they + are in one of the given old states. + + The DB connection + + The new state for the trigger + One of the old state the trigger must be in + One of the old state the trigger must be in + One of the old state the trigger must be in + The number of rows updated + + + + Update all of the triggers of the given group to the given new state, if + they are in the given old state. + + The DB connection + + The new state for the trigger group + The old state the triggers must be in. + int the number of rows updated + + + + Update the states of all triggers associated with the given job. + + The DB Connection + The key identifying the job. + The new state for the triggers. + The number of rows updated + + + + Update the states of any triggers associated with the given job, that + are the given current state. + + The DB Connection + The key identifying the job. + The new state for the triggers + The old state of the triggers + the number of rows updated + + + + Delete the BLOB trigger data for a trigger. + + The DB Connection + The key identifying the trigger. + The number of rows deleted + + + + Delete the base trigger data for a trigger. + + The DB Connection + The key identifying the trigger. + the number of rows deleted + + + + Select the number of triggers associated with a given job. + + The DB Connection + The key identifying the job. + the number of triggers for the given job + + + + Select the job to which the trigger is associated. + + The DB Connection + The key identifying the trigger. + The load helper. + + The object associated with the given trigger + + + + + Select the triggers for a job> + + The DB Connection + The key identifying the job. + an array of objects associated with a given job. + + + + Select the triggers for a calendar + + The DB Connection. + Name of the calendar. + + An array of objects associated with a given job. + + + + + Select a trigger. + + The DB Connection. + The key identifying the trigger. + The object. + + + + + Select a trigger's JobDataMap. + + The DB Connection. + The key identifying the trigger. + The of the Trigger, never null, but possibly empty. + + + + Select a trigger's state value. + + The DB Connection. + The key identifying the trigger. + The object. + + + + Select a triggers status (state and next fire time). + + The DB Connection. + The key identifying the trigger. + A object, or null + + + + Select the total number of triggers stored. + + The DB Connection. + The total number of triggers stored. + + + + Select all of the trigger group names that are stored. + + The DB Connection. + An array of group names. + + + + Select all of the triggers contained in a given group. + + The DB Connection. + + An array of trigger names. + + + + Select all of the triggers in a given state. + + The DB Connection. + The state the triggers must be in. + An array of trigger s. + + + + Inserts the paused trigger group. + + The conn. + Name of the group. + + + + + Deletes the paused trigger group. + + The conn. + Name of the group. + + + + + Deletes all paused trigger groups. + + The conn. + + + + + Determines whether the specified trigger group is paused. + + The conn. + Name of the group. + + true if trigger group is paused; otherwise, false. + + + + + Selects the paused trigger groups. + + The DB Connection. + + + + + Determines whether given trigger group already exists. + + The conn. + Name of the group. + + true if trigger group exists; otherwise, false. + + + + + Insert a new calendar. + + The DB Connection. + The name for the new calendar. + The calendar. + The number of rows inserted. + + + + Update a calendar. + + The DB Connection. + The name for the new calendar. + The calendar. + The number of rows updated. + + + + Check whether or not a calendar exists. + + The DB Connection. + The name of the calendar. + true if the trigger exists, false otherwise. + + + + Select a calendar. + + The DB Connection. + The name of the calendar. + The Calendar. + + + + Check whether or not a calendar is referenced by any triggers. + + The DB Connection. + The name of the calendar. + true if any triggers reference the calendar, false otherwise + + + + Delete a calendar. + + The DB Connection + The name of the trigger. + The number of rows deleted. + + + + Select the total number of calendars stored. + + The DB Connection + The total number of calendars stored. + + + + Select all of the stored calendars. + + The DB Connection + An array of calendar names. + + + + Select the trigger that will be fired at the given fire time. + + The DB Connection + The time that the trigger will be fired. + + A representing the + trigger that will be fired at the given fire time, or null if no + trigger will be fired at that time + + + + + Insert a fired trigger. + + The DB Connection + The trigger. + The state that the trigger should be stored in. + The job detail. + The number of rows inserted. + + + + Select the states of all fired-trigger records for a given trigger, or + trigger group if trigger name is . + + The DB Connection + Name of the trigger. + Name of the group. + A list of FiredTriggerRecord objects. + + + + Select the states of all fired-trigger records for a given job, or job + group if job name is . + + The DB Connection + Name of the job. + Name of the group. + A List of FiredTriggerRecord objects. + + + + Select the states of all fired-trigger records for a given scheduler + instance. + + The DB Connection + Name of the instance. + A list of FiredTriggerRecord objects. + + + + Delete a fired trigger. + + The DB Connection + The fired trigger entry to delete. + The number of rows deleted. + + + + Get the number instances of the identified job currently executing. + + The DB Connection + The key identifying the job. + + The number instances of the identified job currently executing. + + + + + Insert a scheduler-instance state record. + + The DB Connection + The instance id. + The check in time. + The interval. + The number of inserted rows. + + + + Delete a scheduler-instance state record. + + The DB Connection + The instance id. + The number of deleted rows. + + + + Update a scheduler-instance state record. + + The DB Connection + The instance id. + The check in time. + The number of updated rows. + + + + A List of all current s. + + If instanceId is not null, then only the record for the identified + instance will be returned. + + + The DB Connection + The instance id. + + + + + Select the next trigger which will fire to fire between the two given timestamps + in ascending order of fire time, and then descending by priority. + + The conn. + highest value of of the triggers (exclusive) + highest value of of the triggers (inclusive) + maximum number of trigger keys allow to acquired in the returning list. + A (never null, possibly empty) list of the identifiers (Key objects) of the next triggers to be fired. + + + + Select the distinct instance names of all fired-trigger records. + + + This is useful when trying to identify orphaned fired triggers (a + fired trigger without a scheduler state record.) + + The conn. + + + + + Counts the misfired triggers in states. + + The conn. + The state1. + The ts. + + + + + Selects the misfired triggers in states. + + The conn. + The state1. + The ts. + The count. + The result list. + + + + + Clear (delete!) all scheduling data - all s, s + s. + + + + + + Exception class for when a driver delegate cannot be found for a given + configuration, or lack thereof. + + Jeffrey Wescott + Marko Lahma (.NET) + + + + Base class for exceptions thrown by the Quartz . + + + SchedulerExceptions may contain a reference to another + , which was the underlying cause of the SchedulerException. + + James House + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The MSG. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + Initializes a new instance of the class. + + The cause. + + + + Initializes a new instance of the class. + + The MSG. + The cause. + + + + Creates and returns a string representation of the current exception. + + + A string representation of the current exception. + + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + is meant to be used in an application-server + or other software framework environment that provides + container-managed-transactions. No commit / rollback will be handled by this class. + + + If you need commit / rollback, use + instead. + + Jeffrey Wescott + James House + Srinivas Venkatarangaiah + Marko Lahma (.NET) + + + + Contains base functionality for ADO.NET-based JobStore implementations. + + Jeffrey Wescott + James House + Marko Lahma (.NET) + + + + The interface to be implemented by classes that want to provide a + and storage mechanism for the + 's use. + + + Storage of s and s should be keyed + on the combination of their name and group for uniqueness. + + + + + + + + James House + Marko Lahma (.NET) + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + Called by the QuartzScheduler to inform the that + the scheduler has started. + + + + + Called by the QuartzScheduler to inform the JobStore that + the scheduler has been paused. + + + + + Called by the QuartzScheduler to inform the JobStore that + the scheduler has resumed after being paused. + + + + + Called by the QuartzScheduler to inform the that + it should free up all of it's resources because the scheduler is + shutting down. + + + + + Store the given and . + + The to be stored. + The to be stored. + ObjectAlreadyExistsException + + + + returns true if the given JobGroup is paused + + + + + + + returns true if the given TriggerGroup + is paused + + + + + + + Store the given . + + The to be stored. + + If , any existing in the + with the same name and group should be + over-written. + + + + + Remove (delete) the with the given + key, and any s that reference + it. + + + If removal of the results in an empty group, the + group should be removed from the 's list of + known group names. + + + if a with the given name and + group was found and removed from the store. + + + + + Retrieve the for the given + . + + + The desired , or null if there is no match. + + + + + Store the given . + + The to be stored. + If , any existing in + the with the same name and group should + be over-written. + ObjectAlreadyExistsException + + + + Remove (delete) the with the given key. + + + + If removal of the results in an empty group, the + group should be removed from the 's list of + known group names. + + + If removal of the results in an 'orphaned' + that is not 'durable', then the should be deleted + also. + + + + if a with the given + name and group was found and removed from the store. + + + + + Remove (delete) the with the + given name, and store the new given one - which must be associated + with the same job. + + The to be replaced. + The new to be stored. + + if a with the given + name and group was found and removed from the store. + + + + + Retrieve the given . + + + The desired , or null if there is no + match. + + + + + Determine whether a with the given identifier already + exists within the scheduler. + + + + the identifier to check for + true if a job exists with the given identifier + + + + Determine whether a with the given identifier already + exists within the scheduler. + + + + the identifier to check for + true if a trigger exists with the given identifier + + + + Clear (delete!) all scheduling data - all s, s + s. + + + + + + + Store the given . + + The name. + The to be stored. + If , any existing + in the with the same name and group + should be over-written. + If , any s existing + in the that reference an existing + Calendar with the same name with have their next fire time + re-computed with the new . + ObjectAlreadyExistsException + + + + Remove (delete) the with the + given name. + + + If removal of the would result in + s pointing to non-existent calendars, then a + will be thrown. + + The name of the to be removed. + + if a with the given name + was found and removed from the store. + + + + + Retrieve the given . + + The name of the to be retrieved. + + The desired , or null if there is no + match. + + + + + Get the number of s that are + stored in the . + + + + + + Get the number of s that are + stored in the . + + + + + + Get the number of s that are + stored in the . + + + + + + Get the names of all of the s that + have the given group name. + + If there are no jobs in the given group name, the result should be a + zero-length array (not ). + + + + + + + + Get the names of all of the s + that have the given group name. + + If there are no triggers in the given group name, the result should be a + zero-length array (not ). + + + + + + Get the names of all of the + groups. + + If there are no known group names, the result should be a zero-length + array (not ). + + + + + + Get the names of all of the + groups. + + If there are no known group names, the result should be a zero-length + array (not ). + + + + + + Get the names of all of the s + in the . + + + If there are no Calendars in the given group name, the result should be + a zero-length array (not ). + + + + + + Get all of the Triggers that are associated to the given Job. + + + If there are no matches, a zero-length array should be returned. + + + + + Get the current state of the identified . + + + + + + Pause the with the given key. + + + + + Pause all of the s in the + given group. + + + The JobStore should "remember" that the group is paused, and impose the + pause on any new triggers that are added to the group while the group is + paused. + + + + + Pause the with the given key - by + pausing all of its current s. + + + + + Pause all of the s in the given + group - by pausing all of their s. + + The JobStore should "remember" that the group is paused, and impose the + pause on any new jobs that are added to the group while the group is + paused. + + + + + + + + Resume (un-pause) the with the + given key. + + + If the missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + + + Resume (un-pause) all of the s + in the given group. + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Gets the paused trigger groups. + + + + + + Resume (un-pause) the with the + given key. + + If any of the 's s missed one + or more fire-times, then the 's misfire + instruction will be applied. + + + + + + Resume (un-pause) all of the s in + the given group. + + If any of the s had s that + missed one or more fire-times, then the 's + misfire instruction will be applied. + + + + + + Pause all triggers - equivalent of calling + on every group. + + When is called (to un-pause), trigger misfire + instructions WILL be applied. + + + + + + + Resume (un-pause) all triggers - equivalent of calling + on every group. + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + + + Get a handle to the next trigger to be fired, and mark it as 'reserved' + by the calling scheduler. + + If > 0, the JobStore should only return a Trigger + that will fire no later than the time represented in this value as + milliseconds. + + + + + + + + + Inform the that the scheduler no longer plans to + fire the given , that it had previously acquired + (reserved). + + + + + Inform the that the scheduler is now firing the + given (executing its associated ), + that it had previously acquired (reserved). + + + May return null if all the triggers or their calendars no longer exist, or + if the trigger was not successfully put into the 'executing' + state. Preference is to return an empty list if none of the triggers + could be fired. + + + + + Inform the that the scheduler has completed the + firing of the given (and the execution its + associated ), and that the + in the given should be updated if the + is stateful. + + + + + Indicates whether job store supports persistence. + + + + + + How long (in milliseconds) the implementation + estimates that it will take to release a trigger and acquire a new one. + + + + + Whether or not the implementation is clustered. + + + + + + Inform the of the Scheduler instance's Id, + prior to initialize being invoked. + + + + + Inform the of the Scheduler instance's name, + prior to initialize being invoked. + + + + + Tells the JobStore the pool size used to execute jobs. + + + + + Initializes a new instance of the class. + + + + + Gets the connection and starts a new transaction. + + + + + + Called by the QuartzScheduler before the is + used, in order to give it a chance to Initialize. + + + + + + + + Called by the QuartzScheduler to inform the JobStore that + the scheduler has been paused. + + + + + Called by the QuartzScheduler to inform the JobStore that + the scheduler has resumed after being paused. + + + + + Called by the QuartzScheduler to inform the that + it should free up all of it's resources because the scheduler is + shutting down. + + + + + Will recover any failed or misfired jobs and clean up the data store as + appropriate. + + + + + Will recover any failed or misfired jobs and clean up the data store as + appropriate. + + + + + Store the given and . + + Job to be stored. + Trigger to be stored. + + + + returns true if the given JobGroup + is paused + + + + + + + returns true if the given TriggerGroup + is paused + + + + + + + Stores the given . + + The to be stored. + + If , any existing in the + with the same name & group should be over-written. + + + + + Insert or update a job. + + + + + + Check existence of a given job. + + + + + Store the given . + + The to be stored. + + If , any existing in + the with the same name & group should + be over-written. + + + if a with the same name/group already + exists, and replaceExisting is set to false. + + + + + Insert or update a trigger. + + + + + Check existence of a given trigger. + + + + + Remove (delete) the with the given + name, and any s that reference + it. + + + + If removal of the results in an empty group, the + group should be removed from the 's list of + known group names. + + + if a with the given name & + group was found and removed from the store. + + + + + Delete a job and its listeners. + + + + + + + Delete a trigger, its listeners, and its Simple/Cron/BLOB sub-table entry. + + + + + + + + Retrieve the for the given + . + + The key identifying the job. + The desired , or null if there is no match. + + + + Remove (delete) the with the + given name. + + + + + If removal of the results in an empty group, the + group should be removed from the 's list of + known group names. + + + + If removal of the results in an 'orphaned' + that is not 'durable', then the should be deleted + also. + + + The key identifying the trigger. + + if a with the given + name & group was found and removed from the store. + + + + + + + + Retrieve the given . + + The key identifying the trigger. + The desired , or null if there is no match. + + + + Get the current state of the identified . + + + + + + + + + + Gets the state of the trigger. + + The conn. + The key identifying the trigger. + + + + + Store the given . + + The name of the calendar. + The to be stored. + + If , any existing + in the with the same name & group + should be over-written. + + + + if a with the same name already + exists, and replaceExisting is set to false. + + + + + Remove (delete) the with the given name. + + + If removal of the would result in + s pointing to non-existent calendars, then a + will be thrown. + + The name of the to be removed. + + if a with the given name + was found and removed from the store. + + + + + Retrieve the given . + + The name of the to be retrieved. + The desired , or null if there is no match. + + + + Get the number of s that are + stored in the . + + + + + Get the number of s that are + stored in the . + + + + + Get the number of s that are + stored in the . + + + + + Get the names of all of the s that + have the given group name. + + + If there are no jobs in the given group name, the result should be a + zero-length array (not ). + + + + + Determine whether a with the given identifier already + exists within the scheduler. + + + + the identifier to check for + true if a Job exists with the given identifier + + + + Determine whether a with the given identifier already + exists within the scheduler. + + + + the identifier to check for + true if a Trigger exists with the given identifier + + + + Clear (delete!) all scheduling data - all s, s + s. + + + + + + + Get the names of all of the s + that have the given group name. + + + If there are no triggers in the given group name, the result should be a + zero-length array (not ). + + + + + Get the names of all of the + groups. + + + + If there are no known group names, the result should be a zero-length + array (not ). + + + + + Get the names of all of the + groups. + + + + If there are no known group names, the result should be a zero-length + array (not ). + + + + + Get the names of all of the s + in the . + + + If there are no Calendars in the given group name, the result should be + a zero-length array (not ). + + + + + Get all of the Triggers that are associated to the given Job. + + + If there are no matches, a zero-length array should be returned. + + + + + Pause the with the given name. + + + + + Pause the with the given name. + + + + + Pause the with the given name - by + pausing all of its current s. + + + + + + Pause all of the s in the given + group - by pausing all of their s. + + + + + + Determines if a Trigger for the given job should be blocked. + State can only transition to StatePausedBlocked/StateBlocked from + StatePaused/StateWaiting respectively. + + StatePausedBlocked, StateBlocked, or the currentState. + + + + Resume (un-pause) the with the + given name. + + + If the missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + Resume (un-pause) the with the + given name. + + + If any of the 's s missed one + or more fire-times, then the 's misfire + instruction will be applied. + + + + + + Resume (un-pause) all of the s in + the given group. + + + If any of the s had s that + missed one or more fire-times, then the 's + misfire instruction will be applied. + + + + + + Pause all of the s in the given group. + + + + + + Pause all of the s in the given group. + + + + + Pause all of the s in the + given group. + + + + + Resume (un-pause) all of the s + in the given group. + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Pause all triggers - equivalent of calling + on every group. + + When is called (to un-pause), trigger misfire + instructions WILL be applied. + + + + + + + + Resume (un-pause) all triggers - equivalent of calling + on every group. + + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Resume (un-pause) all triggers - equivalent of calling + on every group. + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + + Get a handle to the next N triggers to be fired, and mark them as 'reserved' + by the calling scheduler. + + + + + + Inform the that the scheduler no longer plans to + fire the given , that it had previously acquired + (reserved). + + + + + Inform the that the scheduler has completed the + firing of the given (and the execution its + associated ), and that the + in the given should be updated if the + is stateful. + + + + + Get a list of all scheduler instances in the cluster that may have failed. + This includes this scheduler if it is checking in for the first time. + + + + + Create dummy objects for fired triggers + that have no scheduler state record. Checkin timestamp and interval are + left as zero on these dummy objects. + + + List of all current s + + + + Cleanup the given database connection. This means restoring + any modified auto commit or transaction isolation connection + attributes, and then closing the underlying connection. + + + + This is separate from closeConnection() because the Spring + integration relies on being able to overload closeConnection() and + expects the same connection back that it originally returned + from the datasource. + + + + + + Closes the supplied connection. + + (Optional) + + + + Rollback the supplied connection. + + (Optional) + + JobPersistenceException thrown if a SQLException occurs when the + connection is rolled back + + + + + Commit the supplied connection. + + The CTH. + if set to true opens a new transaction. + JobPersistenceException thrown if a SQLException occurs when the + + + + Execute the given callback in a transaction. Depending on the JobStore, + the surrounding transaction may be assumed to be already present + (managed). + + + This method just forwards to ExecuteInLock() with a null lockName. + + + + + + Execute the given callback having acquired the given lock. + Depending on the JobStore, the surrounding transaction may be + assumed to be already present (managed). This version is just a + handy wrapper around executeInLock that doesn't require a return + value. + + + The name of the lock to acquire, for example + "TRIGGER_ACCESS". If null, then no lock is acquired, but the + lockCallback is still executed in a transaction. + + + The callback to excute after having acquired the given lock. + + + + + + Execute the given callback having acquired the given lock. + Depending on the JobStore, the surrounding transaction may be + assumed to be already present (managed). + + + The name of the lock to acquire, for example + "TRIGGER_ACCESS". If null, then no lock is acquired, but the + lockCallback is still executed in a transaction. + + + The callback to excute after having acquired the given lock. + + + + + Execute the given callback having optionally acquired the given lock. + This uses the non-managed transaction connection. This version is just a + handy wrapper around executeInNonManagedTXLock that doesn't require a return + value. + + + The name of the lock to acquire, for example + "TRIGGER_ACCESS". If null, then no lock is acquired, but the + lockCallback is still executed in a non-managed transaction. + + + + The callback to excute after having acquired the given lock. + + + + + Execute the given callback having optionally acquired the given lock. + This uses the non-managed transaction connection. + + + The name of the lock to acquire, for example + "TRIGGER_ACCESS". If null, then no lock is acquired, but the + lockCallback is still executed in a non-managed transaction. + + + The callback to excute after having acquired the given lock. + + + + + Get or set the datasource name. + + + + + Gets the log. + + The log. + + + + Get or sets the prefix that should be pre-pended to all table names. + + + + + Set whether string-only properties will be handled in JobDataMaps. + + + + + Get or set the instance Id of the Scheduler (must be unique within a cluster). + + + + + Get or set the instance Id of the Scheduler (must be unique within this server instance). + + + + + Get or set whether this instance is part of a cluster. + + + + + Get or set the frequency at which this instance "checks-in" + with the other instances of the cluster. -- Affects the rate of + detecting failed instances. + + + + + Get or set the maximum number of misfired triggers that the misfire handling + thread will try to recover at one time (within one transaction). The + default is 20. + + + + + Gets or sets the database retry interval. + + The db retry interval. + + + + Get or set whether this instance should use database-based thread + synchronization. + + + + + Whether or not to obtain locks when inserting new jobs/triggers. + Defaults to , which is safest - some db's (such as + MS SQLServer) seem to require this to avoid deadlocks under high load, + while others seem to do fine without. + + + Setting this property to will provide a + significant performance increase during the addition of new jobs + and triggers. + + + + + The time span by which a trigger must have missed its + next-fire-time, in order for it to be considered "misfired" and thus + have its misfire instruction applied. + + + + + Don't call set autocommit(false) on connections obtained from the + DataSource. This can be helpfull in a few situations, such as if you + have a driver that complains if it is called when it is already off. + + + + + Set the transaction isolation level of DB connections to sequential. + + + + + Whether or not the query and update to acquire a Trigger for firing + should be performed after obtaining an explicit DB lock (to avoid + possible race conditions on the trigger's db row). This is + is considered unnecessary for most databases (due to the nature of + the SQL update that is performed), and therefore a superfluous performance hit. + + + However, if batch acquisition is used, it is important for this behavior + to be used for all dbs. + + + + + Get or set the ADO.NET driver delegate class name. + + + + + The driver delegate's initialization string. + + + + + set the SQL statement to use to select and lock a row in the "locks" + table. + + + + + + Get whether the threads spawned by this JobStore should be + marked as daemon. Possible threads include the + and the . + + + + + + Get whether to check to see if there are Triggers that have misfired + before actually acquiring the lock to recover them. This should be + set to false if the majority of the time, there are are misfired + Triggers. + + + + + + Get the driver delegate for DB operations. + + + + + Get whether String-only properties will be handled in JobDataMaps. + + + + + Indicates whether this job store supports persistence. + + + + + + + An interface for classes wishing to provide the service of loading classes + and resources within the scheduler... + + James House + Marko Lahma (.NET) + + + + Called to give the ClassLoadHelper a chance to Initialize itself, + including the oportunity to "steal" the class loader off of the calling + thread, which is the thread that is initializing Quartz. + + + + + Return the class with the given name. + + + + + Finds a resource with a given name. This method returns null if no + resource with this name is found. + + name of the desired resource + + a java.net.URL object + + + + + Finds a resource with a given name. This method returns null if no + resource with this name is found. + + name of the desired resource + + a java.io.InputStream object + + + + + Helper class for returning the composite result of trying + to recover misfired jobs. + + + + + Initializes a new instance of the class. + + if set to true [has more misfired triggers]. + The processed misfired trigger count. + + + + + Gets a value indicating whether this instance has more misfired triggers. + + + true if this instance has more misfired triggers; otherwise, false. + + + + + Gets the processed misfired trigger count. + + The processed misfired trigger count. + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + + + Called by the QuartzScheduler to inform the that + it should free up all of it's resources because the scheduler is + shutting down. + + + + + Gets the non managed TX connection. + + + + + + Execute the given callback having optionally acquired the given lock. + Because CMT assumes that the connection is already part of a managed + transaction, it does not attempt to commit or rollback the + enclosing transaction. + + + + + + + The name of the lock to acquire, for example + "TRIGGER_ACCESS". If null, then no lock is acquired, but the + txCallback is still executed in a transaction. + + Callback to execute. + + + + is meant to be used in a standalone environment. + Both commit and rollback will be handled by this class. + + Jeffrey Wescott + James House + Marko Lahma (.NET) + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + + + For , the non-managed TX connection is just + the normal connection because it is not CMT. + + + + + + Execute the given callback having optionally aquired the given lock. + For , because it manages its own transactions + and only has the one datasource, this is the same behavior as + . + + + The name of the lock to aquire, for example "TRIGGER_ACCESS". + If null, then no lock is aquired, but the lockCallback is still + executed in a transaction. + + Callback to execute. + + + + + + + + + Exception class for when there is a failure obtaining or releasing a + resource lock. + + + James House + Marko Lahma (.NET) + + + + An exception that is thrown to indicate that there has been a failure in the + scheduler's underlying persistence mechanism. + + James House + Marko Lahma (.NET) + + + + Create a with the given message. + + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + Create a with the given message + and cause. + + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + This is a driver delegate for the MySQL ADO.NET driver. + + Marko Lahma + + + + This is meant to be an abstract base class for most, if not all, + implementations. Subclasses should override only those methods that need + special handling for the DBMS driver in question. + + Jeffrey Wescott + James House + Marko Lahma (.NET) + + + + Initializes the driver delegate. + + + + + Insert the job detail record. + + the DB Connection + the new state for the triggers + the first old state to update + the second old state to update + number of rows updated + + + + Get the names of all of the triggers that have misfired. + + the DB Connection + The ts. + an array of objects + + + + Select all of the triggers in a given state. + + The DB Connection + The state the triggers must be in + an array of trigger s + + + + Get the names of all of the triggers in the given state that have + misfired - according to the given timestamp. + + The DB Connection + The state. + The time stamp. + An array of objects + + + + Get the names of all of the triggers in the given state that have + misfired - according to the given timestamp. No more than count will + be returned. + + The conn. + The state1. + The ts. + The most misfired triggers to return, negative for all + + Output parameter. A List of objects. Must not be null + + Whether there are more misfired triggers left to find beyond the given count. + + + + Get the number of triggers in the given state that have + misfired - according to the given timestamp. + + + + + + + + + Get the names of all of the triggers in the given group and state that + have misfired. + + The DB Connection + Name of the group. + The state. + The timestamp. + an array of objects + + + + Select all of the triggers for jobs that are requesting recovery. The + returned trigger objects will have unique "recoverXXX" trigger names and + will be in the + trigger group. + + + In order to preserve the ordering of the triggers, the fire time will be + set from the ColumnFiredTime column in the TableFiredTriggers + table. The caller is responsible for calling + on each returned trigger. It is also up to the caller to insert the + returned triggers to ensure that they are fired. + + The DB Connection + an array of objects + + + + Delete all fired triggers. + + The DB Connection. + The number of rows deleted. + + + + Delete all fired triggers of the given instance. + + The DB Connection + The instance id. + The number of rows deleted + + + + Clear (delete!) all scheduling data - all s, s + s. + + + + + + + Insert the job detail record. + + The DB Connection. + The job to insert. + Number of rows inserted. + + + + Gets the db presentation for boolean value. Subclasses can overwrite this behaviour. + + Value to map to database. + + + + + Gets the boolean value from db presentation. Subclasses can overwrite this behaviour. + + Value to map from database. + + + + + Gets the db presentation for date/time value. Subclasses can overwrite this behaviour. + + Value to map to database. + + + + + Gets the date/time value from db presentation. Subclasses can overwrite this behaviour. + + Value to map from database. + + + + + Gets the db presentation for time span value. Subclasses can overwrite this behaviour. + + Value to map to database. + + + + + Gets the time span value from db presentation. Subclasses can overwrite this behaviour. + + Value to map from database. + + + + + Update the job detail record. + + The DB Connection. + The job to update. + Number of rows updated. + + + + Get the names of all of the triggers associated with the given job. + + The DB Connection. + The key identifying the job. + An array of objects + + + + Delete the job detail record for the given job. + + the DB Connection + The key identifying the job. + the number of rows deleted + + + + Check whether or not the given job is stateful. + + the DB Connection + The key identifying the job. + + true if the job exists and is stateful, false otherwise + + + + + Check whether or not the given job exists. + + the DB Connection + The key identifying the job. + true if the job exists, false otherwise + + + + Update the job data map for the given job. + + The conn. + the job to update + the number of rows updated + + + + Select the JobDetail object for a given job name / group name. + + The DB Connection. + The key identifying the job. + The load helper. + The populated JobDetail object. + + + build Map from java.util.Properties encoding. + + + + Select the total number of jobs stored. + + The DB Connection. + The total number of jobs stored. + + + + Select all of the job group names that are stored. + + The DB Connection. + An array of group names. + + + + Select all of the jobs contained in a given group. + + The DB Connection. + + An array of job names. + + + + Insert the base trigger data. + + the DB Connection + the trigger to insert + the state that the trigger should be stored in + The job detail. + the number of rows inserted + + + + Insert the blob trigger data. + + The DB Connection. + The trigger to insert. + The number of rows inserted. + + + + Update the base trigger data. + + The DB Connection. + The trigger to insert. + The state that the trigger should be stored in. + The job detail. + The number of rows updated. + + + + Update the blob trigger data. + + The DB Connection. + The trigger to insert. + The number of rows updated. + + + + Check whether or not a trigger exists. + + The DB Connection. + the key of the trigger + true if the trigger exists, false otherwise + + + + Update the state for a given trigger. + + The DB Connection. + the key of the trigger + The new state for the trigger. + The number of rows updated. + + + + Update the given trigger to the given new state, if it is one of the + given old states. + + The DB connection. + the key of the trigger + The new state for the trigger. + One of the old state the trigger must be in. + One of the old state the trigger must be in. + One of the old state the trigger must be in. + The number of rows updated. + + + + Update all triggers in the given group to the given new state, if they + are in one of the given old states. + + The DB connection. + + The new state for the trigger. + One of the old state the trigger must be in. + One of the old state the trigger must be in. + One of the old state the trigger must be in. + The number of rows updated. + + + + Update the given trigger to the given new state, if it is in the given + old state. + + the DB connection + the key of the trigger + the new state for the trigger + the old state the trigger must be in + int the number of rows updated + + + + Update all of the triggers of the given group to the given new state, if + they are in the given old state. + + the DB connection + + the new state for the trigger group + the old state the triggers must be in + int the number of rows updated + + + + Update the states of all triggers associated with the given job. + + the DB Connection + the key of the job + the new state for the triggers + the number of rows updated + + + + Updates the state of the trigger states for job from other. + + The conn. + Key of the job. + The state. + The old state. + + + + + Delete the cron trigger data for a trigger. + + the DB Connection + the key of the trigger + the number of rows deleted + + + + Delete the base trigger data for a trigger. + + the DB Connection + the key of the trigger + the number of rows deleted + + + + Select the number of triggers associated with a given job. + + the DB Connection + the key of the job + the number of triggers for the given job + + + + Select the job to which the trigger is associated. + + the DB Connection + the key of the trigger + The load helper. + The object associated with the given trigger + + + + Select the triggers for a job + + the DB Connection + the key of the job + + an array of objects + associated with a given job. + + + + + Select the triggers for a calendar + + The DB Connection. + Name of the calendar. + + An array of objects associated with a given job. + + + + + Select a trigger. + + the DB Connection + the key of the trigger + The object + + + + Select a trigger's JobDataMap. + + the DB Connection + the key of the trigger + The of the Trigger, never null, but possibly empty. + + + + Select a trigger's state value. + + the DB Connection + the key of the trigger + The object + + + + Select a trigger status (state and next fire time). + + the DB Connection + the key of the trigger + + a object, or null + + + + + Select the total number of triggers stored. + + the DB Connection + the total number of triggers stored + + + + Select all of the trigger group names that are stored. + + the DB Connection + + an array of group names + + + + + Select all of the triggers contained in a given group. + + the DB Connection + + + an array of trigger names + + + + + Inserts the paused trigger group. + + The conn. + Name of the group. + + + + + Deletes the paused trigger group. + + The conn. + Name of the group. + + + + + Deletes all paused trigger groups. + + The conn. + + + + + Determines whether the specified trigger group is paused. + + The conn. + Name of the group. + + true if trigger group is paused; otherwise, false. + + + + + Determines whether given trigger group already exists. + + The conn. + Name of the group. + + true if trigger group exists; otherwise, false. + + + + + Insert a new calendar. + + the DB Connection + The name for the new calendar. + The calendar. + the number of rows inserted + IOException + + + + Update a calendar. + + the DB Connection + The name for the new calendar. + The calendar. + the number of rows updated + IOException + + + + Check whether or not a calendar exists. + + the DB Connection + The name of the calendar. + + true if the trigger exists, false otherwise + + + + + Select a calendar. + + the DB Connection + The name of the calendar. + the Calendar + ClassNotFoundException + IOException + + + + Check whether or not a calendar is referenced by any triggers. + + the DB Connection + The name of the calendar. + + true if any triggers reference the calendar, false otherwise + + + + + Delete a calendar. + + the DB Connection + The name of the trigger. + the number of rows deleted + + + + Select the total number of calendars stored. + + the DB Connection + the total number of calendars stored + + + + Select all of the stored calendars. + + the DB Connection + + an array of calendar names + + + + + Select the trigger that will be fired at the given fire time. + + the DB Connection + the time that the trigger will be fired + + a representing the + trigger that will be fired at the given fire time, or null if no + trigger will be fired at that time + + + + + Select the next trigger which will fire to fire between the two given timestamps + in ascending order of fire time, and then descending by priority. + + The conn. + highest value of of the triggers (exclusive) + highest value of of the triggers (inclusive) + maximum number of trigger keys allow to acquired in the returning list. + A (never null, possibly empty) list of the identifiers (Key objects) of the next triggers to be fired. + + + + Insert a fired trigger. + + the DB Connection + the trigger + the state that the trigger should be stored in + The job. + the number of rows inserted + + + + + Update a fired trigger. + + + + + + the DB Connection + + the trigger + + + the state that the trigger should be stored in + the number of rows inserted + + + + Select the states of all fired-trigger records for a given trigger, or + trigger group if trigger name is . + + The DB connection. + Name of the trigger. + Name of the group. + a List of objects. + + + + Select the states of all fired-trigger records for a given job, or job + group if job name is . + + The DB connection. + Name of the job. + Name of the group. + a List of objects. + + + + Select the states of all fired-trigger records for a given scheduler + instance. + + The DB Connection + Name of the instance. + A list of FiredTriggerRecord objects. + + + + Select the distinct instance names of all fired-trigger records. + + The conn. + + + This is useful when trying to identify orphaned fired triggers (a + fired trigger without a scheduler state record.) + + + + + Delete a fired trigger. + + the DB Connection + the fired trigger entry to delete + the number of rows deleted + + + + Selects the job execution count. + + The DB connection. + The key of the job. + + + + + Inserts the state of the scheduler. + + The conn. + The instance id. + The check in time. + The interval. + + + + + Deletes the state of the scheduler. + + The database connection. + The instance id. + + + + + Updates the state of the scheduler. + + The database connection. + The instance id. + The check in time. + + + + + A List of all current s. + + If instanceId is not null, then only the record for the identified + instance will be returned. + + + The DB Connection + The instance id. + + + + + Replace the table prefix in a query by replacing any occurrences of + "{0}" with the table prefix. + + The unsubstitued query + The query, with proper table prefix substituted + + + + Create a serialized version of an Object. + + the object to serialize + Serialized object as byte array. + + + + Remove the transient data from and then create a serialized + version of a and returns the underlying bytes. + + The data. + the serialized data as byte array + + + + serialize + + The data. + + + + + Convert the JobDataMap into a list of properties. + + + + + Convert the JobDataMap into a list of properties. + + + + + This method should be overridden by any delegate subclasses that need + special handling for BLOBs. The default implementation uses standard + ADO.NET operations. + + The data reader, already queued to the correct row. + The column index for the BLOB. + The deserialized object from the DataReader BLOB. + + + + This method should be overridden by any delegate subclasses that need + special handling for BLOBs for job details. + + The result set, already queued to the correct row. + The column index for the BLOB. + The deserialized Object from the ResultSet BLOB. + + + + Selects the paused trigger groups. + + The DB Connection. + + + + + Gets the select next trigger to acquire SQL clause. + MySQL version with LIMIT support. + + + + + + Exception class for when a driver delegate cannot be found for a given + configuration, or lack thereof. + + Jeffrey Wescott + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + This is a driver delegate for the Oracle database. + + Marko Lahma + + + + Creates the SQL for select next trigger to acquire. + + + + + Gets the db presentation for boolean value. For Oracle we use true/false of "1"/"0". + + Value to map to database. + + + + + Conveys a scheduler-instance state record. + + James House + Marko Lahma (.NET) + + + + Gets or sets the checkin interval. + + The checkin interval. + + + + Gets or sets the checkin timestamp. + + The checkin timestamp. + + + + Gets or sets the scheduler instance id. + + The scheduler instance id. + + + + Internal in-memory lock handler for providing thread/resource locking in + order to protect resources from being altered by multiple threads at the + same time. + + James House + Marko Lahma (.NET) + + + + Grants a lock on the identified resource to the calling thread (blocking + until it is available). + + True if the lock was obtained. + + + Release the lock on the identified resource if it is held by the calling + thread. + + + + + Determine whether the calling thread owns a lock on the identified + resource. + + + + + Gets the thread locks. + + The thread locks. + + + + Whether this Semaphore implementation requires a database connection for + its lock management operations. + + + + + + + + + This is a driver delegate for the SQLiteDelegate ADO.NET driver. + + Marko Lahma + + + + Gets the select next trigger to acquire SQL clause. + SQLite version with LIMIT support. + + + + + + A SQL Server specific driver delegate. + + Marko Lahma + + + + Gets the select next trigger to acquire SQL clause. + SQL Server specific version with TOP functionality + + + + + + Internal database based lock handler for providing thread/resource locking + in order to protect resources from being altered by multiple threads at the + same time. + + James House + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + The table prefix. + the scheduler name + The select with lock SQL. + + + + + Execute the SQL select for update that will lock the proper database row. + + + + + Property name and value holder for trigger state data. + + + + + Object representing a job or trigger key. + + James House + Marko Lahma (.NET) + + + + Construct a new TriggerStatus with the status name and nextFireTime. + + The trigger's status + The next time trigger will fire + + + + Return the string representation of the TriggerStatus. + + + + + + Provide thread/resource locking in order to protect + resources from being altered by multiple threads at the same time using + a db row update. + + + + Note: This Semaphore implementation is useful for databases that do + not support row locking via "SELECT FOR UPDATE" or SQL Server's type syntax. + + + As of Quartz.NET 2.0 version there is no need to use this implementation for + SQL Server databases. + + + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + + + + Execute the SQL that will lock the proper database row. + + + + + + + + + This implementation of the Calendar excludes a set of days of the year. You + may use it to exclude bank holidays which are on the same date every year. + + + + Juergen Donnerstag + Marko Lahma (.NET) + + + + This implementation of the Calendar may be used (you don't have to) as a + base class for more sophisticated one's. It merely implements the base + functionality required by each Calendar. + + + Regarded as base functionality is the treatment of base calendars. Base + calendar allow you to chain (stack) as much calendars as you may need. For + example to exclude weekends you may use WeeklyCalendar. In order to exclude + holidays as well you may define a WeeklyCalendar instance to be the base + calendar for HolidayCalendar instance. + + + Juergen Donnerstag + James House + Marko Lahma (.NET) + + + + An interface to be implemented by objects that define spaces of time during + which an associated may (not) fire. Calendars + do not define actual fire times, but rather are used to limit a + from firing on its normal schedule if necessary. Most + Calendars include all times by default and allow the user to specify times + to exclude. + + + As such, it is often useful to think of Calendars as being used to exclude a block + of time - as opposed to include a block of time. (i.e. the + schedule "fire every five minutes except on Sundays" could be + implemented with a and a + which excludes Sundays) + + Implementations MUST take care of being properly cloneable and Serializable. + + + James House + Juergen Donnerstag + Marko Lahma (.NET) + + + + Determine whether the given UTC time is 'included' by the + Calendar. + + + + + Determine the next UTC time that is 'included' by the + Calendar after the given UTC time. + + + + + Gets or sets a description for the instance - may be + useful for remembering/displaying the purpose of the calendar, though + the description has no meaning to Quartz. + + + + + Set a new base calendar or remove the existing one. + Get the base calendar. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The base calendar. + + + + Initializes a new instance of the class. + + The time zone. + + + + Initializes a new instance of the class. + + The base calendar. + The time zone. + + + + Serialization constructor. + + + + + + + checks whether two arrays have + the same length and + for any given place there are equal elements + in both arrays + + + + + + Get the base calendar. Will be null, if not set. + + + + + Check if date/time represented by timeStamp is included. If included + return true. The implementation of BaseCalendar simply calls the base + calendars IsTimeIncluded() method if base calendar is set. + + + + + + Determine the next UTC time (in milliseconds) that is 'included' by the + Calendar after the given time. Return the original value if timeStamp is + included. Return 0 if all days are excluded. + + + + + + Creates a new object that is a copy of the current instance. + + A new object that is a copy of this instance. + + + + Gets or sets the time zone. + + The time zone. + + + + Gets or sets the description given to the instance by + its creator (if any). + + + + + Set a new base calendar or remove the existing one + + + + + + Constructor + + + + + Constructor + + The base calendar. + + + + Serialization constructor. + + + + + + + Return true, if day is defined to be exluded. + + + + + Redefine a certain day to be excluded (true) or included (false). + + + + + Determine whether the given UTC time (in milliseconds) is 'included' by the + Calendar. + + Note that this Calendar is only has full-day precision. + + + + + + Determine the next UTC time (in milliseconds) that is 'included' by the + Calendar after the given time. Return the original value if timeStampUtc is + included. Return 0 if all days are excluded. + + Note that this Calendar is only has full-day precision. + + + + + + Get or the array which defines the exclude-value of each day of month. + Setting will redefine the array of days excluded. The array must of size greater or + equal 31. + + + + + This implementation of the Calendar excludes the set of times expressed by a + given CronExpression. + + + For example, you could use this calendar to exclude all but business hours (8AM - 5PM) every + day using the expression "* * 0-7,18-23 ? * *". + + It is important to remember that the cron expression here describes a set of + times to be excluded from firing. Whereas the cron expression in + CronTrigger describes a set of times that can + be included for firing. Thus, if a has a + given cron expression and is associated with a with + the same expression, the calendar will exclude all the times the + trigger includes, and they will cancel each other out. + + + Aaron Craven + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + a string representation of the desired cron expression + + + + Create a with the given cron expression and + . + + + the base calendar for this calendar instance + see BaseCalendar for more information on base + calendar functionality + + a string representation of the desired cron expression + + + + Create a with the given cron expression and + . + + + the base calendar for this calendar instance + see BaseCalendar for more information on base + calendar functionality + + a string representation of the desired cron expression + + + + + Serialization constructor. + + + + + + + Determine whether the given time is 'included' by the + Calendar. + + the time to test + a boolean indicating whether the specified time is 'included' by the CronCalendar + + + + Determine the next time that is 'included' by the + Calendar after the given time. Return the original value if timeStamp is + included. Return 0 if all days are excluded. + + + + + + + Creates a new object that is a copy of the current instance. + + A new object that is a copy of this instance. + + + + Returns a that represents the current . + + + A that represents the current . + + + + + Sets the cron expression for the calendar to a new value. + + The expression. + + + + Returns the object representation of the cron expression that defines the + dates and times this calendar excludes. + + + + + This implementation of the Calendar excludes (or includes - see below) a + specified time range each day. + + + For example, you could use this calendar to + exclude business hours (8AM - 5PM) every day. Each + only allows a single time range to be specified, and that time range may not + * cross daily boundaries (i.e. you cannot specify a time range from 8PM - 5AM). + If the property is (default), + the time range defines a range of times in which triggers are not allowed to + * fire. If is , the time range + is inverted: that is, all times outside the defined time range + are excluded. + + Note when using , it behaves on the same principals + as, for example, WeeklyCalendar defines a set of days that are + excluded every week. Likewise, defines a + set of times that are excluded every day. + + + Mike Funk + Aaron Craven + Marko Lahma (.NET) + + + + Create a with a time range defined by the + specified strings and no baseCalendar. + and + must be in the format "HH:MM[:SS[:mmm]]" where: +
    +
  • + HH is the hour of the specified time. The hour should be + specified using military (24-hour) time and must be in the range + 0 to 23. +
  • +
  • + MM is the minute of the specified time and must be in the range + 0 to 59. +
  • +
  • + SS is the second of the specified time and must be in the range + 0 to 59. +
  • +
  • + mmm is the millisecond of the specified time and must be in the + range 0 to 999. +
  • +
  • items enclosed in brackets ('[', ']') are optional.
  • +
  • + The time range starting time must be before the time range ending + time. Note this means that a time range may not cross daily + boundaries (10PM - 2AM) +
  • +
+
+
+ + + Create a with a time range defined by the + specified strings and the specified baseCalendar. + and + must be in the format "HH:MM[:SS[:mmm]]" where: +
    +
  • + HH is the hour of the specified time. The hour should be + specified using military (24-hour) time and must be in the range + 0 to 23. +
  • +
  • + MM is the minute of the specified time and must be in the range + 0 to 59. +
  • +
  • + SS is the second of the specified time and must be in the range + 0 to 59. +
  • +
  • + mmm is the millisecond of the specified time and must be in the + range 0 to 999. +
  • +
  • + items enclosed in brackets ('[', ']') are optional. +
  • +
  • + The time range starting time must be before the time range ending + time. Note this means that a time range may not cross daily + boundaries (10PM - 2AM) +
  • +
+
+ The base calendar for this calendar instance see BaseCalendar for more + information on base calendar functionality. +
+ + + Create a with a time range defined by the + specified values and no baseCalendar. Values are subject to + the following validations: +
    +
  • + Hours must be in the range 0-23 and are expressed using military + (24-hour) time. +
  • +
  • Minutes must be in the range 0-59
  • +
  • Seconds must be in the range 0-59
  • +
  • Milliseconds must be in the range 0-999
  • +
  • + The time range starting time must be before the time range ending + time. Note this means that a time range may not cross daily + boundaries (10PM - 2AM) +
  • +
+
+ The range starting hour of day. + The range starting minute. + The range starting second. + The range starting millis. + The range ending hour of day. + The range ending minute. + The range ending second. + The range ending millis. +
+ + + Create a with a time range defined by the + specified values and the specified . Values are + subject to the following validations: +
    +
  • + Hours must be in the range 0-23 and are expressed using military + (24-hour) time. +
  • +
  • Minutes must be in the range 0-59
  • +
  • Seconds must be in the range 0-59
  • +
  • Milliseconds must be in the range 0-999
  • +
  • + The time range starting time must be before the time range ending + time. Note this means that a time range may not cross daily + boundaries (10PM - 2AM) +
  • +
+
+ The range starting hour of day. + The range starting minute. + The range starting second. + The range starting millis. + The range ending hour of day. + The range ending minute. + The range ending second. + The range ending millis. +
+ + + Create a with a time range defined by the + specified s and no + baseCalendar. The Calendars are subject to the following + considerations: +
    +
  • + Only the time-of-day fields of the specified Calendars will be + used (the date fields will be ignored) +
  • +
  • + The starting time must be before the ending time of the defined + time range. Note this means that a time range may not cross + daily boundaries (10PM - 2AM). (because only time fields are + are used, it is possible for two Calendars to represent a valid + time range and + rangeStartingCalendar.after(rangeEndingCalendar) == true) + +
  • +
+
+ The range starting calendar. + The range ending calendar. +
+ + + Create a with a time range defined by the + specified s and the specified + . The Calendars are subject to the following + considerations: +
    +
  • + Only the time-of-day fields of the specified Calendars will be + used (the date fields will be ignored) +
  • +
  • + The starting time must be before the ending time of the defined + time range. Note this means that a time range may not cross + daily boundaries (10PM - 2AM). (because only time fields are + are used, it is possible for two Calendars to represent a valid + time range and + rangeStartingCalendarUtc > rangeEndingCalendarUtc == true) +
  • +
+
+ The range starting calendar. + The range ending calendar. +
+ + + Create a with a time range defined by the + specified values and no baseCalendar. The values are + subject to the following considerations: +
    +
  • + Only the time-of-day portion of the specified values will be + used +
  • +
  • + The starting time must be before the ending time of the defined + time range. Note this means that a time range may not cross + daily boundaries (10PM - 2AM). (because only time value are + are used, it is possible for the two values to represent a valid + time range and rangeStartingTime > rangeEndingTime) +
  • +
+
+ The range starting time in millis. + The range ending time in millis. +
+ + + Create a with a time range defined by the + specified values and the specified . The values + are subject to the following considerations: +
    +
  • + Only the time-of-day portion of the specified values will be + used +
  • +
  • + The starting time must be before the ending time of the defined + time range. Note this means that a time range may not cross + daily boundaries (10PM - 2AM). (because only time value are + are used, it is possible for the two values to represent a valid + time range and rangeStartingTime > rangeEndingTime) +
  • +
+
+ The range starting time in millis. + The range ending time in millis. +
+ + + Serialization constructor. + + + + + + + Determine whether the given time is 'included' by the + Calendar. + + + + + + + Determine the next time (in milliseconds) that is 'included' by the + Calendar after the given time. Return the original value if timeStamp is + included. Return 0 if all days are excluded. + + + + + + + + Returns the start time of the time range of the day + specified in . + + + a DateTime representing the start time of the + time range for the specified date. + + + + + Returns the end time of the time range of the day + specified in + + + A DateTime representing the end time of the + time range for the specified date. + + + + + Returns a that represents the current . + + + A that represents the current . + + + + + Sets the time range for the to the times + represented in the specified Strings. + + The range starting time string. + The range ending time string. + + + + Sets the time range for the to the times + represented in the specified values. + + The range starting hour of day. + The range starting minute. + The range starting second. + The range starting millis. + The range ending hour of day. + The range ending minute. + The range ending second. + The range ending millis. + + + + Sets the time range for the to the times + represented in the specified s. + + The range starting calendar. + The range ending calendar. + + + + Sets the time range for the to the times + represented in the specified values. + + The range starting time. + The range ending time. + + + + Gets the start of day, practically zeroes time part. + + The time. + + + + + Gets the end of day, pratically sets time parts to maximum allowed values. + + The time. + + + + + Checks the specified values for validity as a set of time values. + + The hour of day. + The minute. + The second. + The millis. + + + + Indicates whether the time range represents an inverted time range (see + class description). + + true if invert time range; otherwise, false. + + + + This implementation of the Calendar stores a list of holidays (full days + that are excluded from scheduling). + + + The implementation DOES take the year into consideration, so if you want to + exclude July 4th for the next 10 years, you need to add 10 entries to the + exclude list. + + Sharada Jambula + Juergen Donnerstag + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The base calendar. + + + + Serialization constructor. + + + + + + + Determine whether the given time (in milliseconds) is 'included' by the + Calendar. + + Note that this Calendar is only has full-day precision. + + + + + + Determine the next time (in milliseconds) that is 'included' by the + Calendar after the given time. + + Note that this Calendar is only has full-day precision. + + + + + + Creates a new object that is a copy of the current instance. + + A new object that is a copy of this instance. + + + + Add the given Date to the list of excluded days. Only the month, day and + year of the returned dates are significant. + + + + + Removes the excluded date. + + The date to remove. + + + + Returns a of Dates representing the excluded + days. Only the month, day and year of the returned dates are + significant. + + + + + This implementation of the Calendar excludes a set of days of the month. You + may use it to exclude every 1. of each month for example. But you may define + any day of a month. + + + + Juergen Donnerstag + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + + + + Constructor + + The base calendar. + + + + Serialization constructor. + + + + + + + Initialize internal variables + + + + + Return true, if mday is defined to be exluded. + + + + + Redefine a certain day of the month to be excluded (true) or included + (false). + + + + + Check if all days are excluded. That is no day is included. + + boolean + + + + + Determine whether the given time (in milliseconds) is 'included' by the + Calendar. + + Note that this Calendar is only has full-day precision. + + + + + + Determine the next time (in milliseconds) that is 'included' by the + Calendar after the given time. Return the original value if timeStamp is + included. Return DateTime.MinValue if all days are excluded. + + Note that this Calendar is only has full-day precision. + + + + + + Creates a new object that is a copy of the current instance. + + A new object that is a copy of this instance. + + + + Get or set the array which defines the exclude-value of each day of month + Setting will redefine the array of days excluded. The array must of size greater or + equal 31. + + + + + This implementation of the Calendar excludes a set of days of the week. You + may use it to exclude weekends for example. But you may define any day of + the week. + + + + Juergen Donnerstag + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The base calendar. + + + + Serialization constructor. + + + + + + + Initialize internal variables + + + + + Return true, if wday is defined to be exluded. E. g. + saturday and sunday. + + + + + Redefine a certain day of the week to be excluded (true) or included + (false). Use java.util.Calendar's constants like MONDAY to determine the + wday. + + + + + Check if all week ays are excluded. That is no day is included. + + + + + Determine whether the given time (in milliseconds) is 'included' by the + Calendar. + + Note that this Calendar is only has full-day precision. + + + + + + Determine the next time (in milliseconds) that is 'included' by the + Calendar after the given time. Return the original value if timeStamp is + included. Return DateTime.MinValue if all days are excluded. + + Note that this Calendar is only has full-day precision. + + + + + + Get the array with the week days. + Setting will redefine the array of days excluded. The array must of size greater or + equal 8. java.util.Calendar's constants like MONDAY should be used as + index. A value of true is regarded as: exclude it. + + + + + Matches using an AND operator on two Matcher operands. + + James House + Marko Lahma (.NET) + + + + Matchers can be used in various API methods to + select the entities that should be operated upon. + + James House + + + + + Create an AndMatcher that depends upon the result of both of the given matchers. + + + + + + + + + Matches on the complete key being equal (both name and group). + + + + jhouse + + + + Create an EverythingMatcher that matches all jobs. + + + + + + Create an EverythingMatcher that matches all triggers. + + + + + + Matches on group (ignores name) property of Keys. + + James House + Marko Lahma (.NET) + + + + An abstract base class for some types of matchers. + + James House + Marko Lahma (.NET) + + + + Create a GroupMatcher that matches groups equaling the given string. + + + + + + + Create a GroupMatcher that matches groups starting with the given string. + + + + + + + Create a GroupMatcher that matches groups ending with the given string. + + + + + + + Create a GroupMatcher that matches groups containing the given string. + + + + + + + Matches on the complete key being equal (both name and group). + + James House + Marko Lahma (.NET) + + + + Create a KeyMatcher that matches Keys that equal the given key. + + + + + + + + Matches on name (ignores group) property of Keys. + + James House + Marko Lahma (.NET) + + + + Create a NameMatcher that matches names equaling the given string. + + + + + + + Create a NameMatcher that matches names starting with the given string. + + + + + + + Create a NameMatcher that matches names ending with the given string. + + + + + + + Create a NameMatcher that matches names containing the given string. + + + + + + + Matches using an NOT operator on another Matcher. + + James House + Marko Lahma (.NET) + + + + Create a NotMatcher that reverses the result of the given matcher. + + + + + + + + Matches using an OR operator on two Matcher operands. + + James House + Marko Lahma (.NET) + + + + Create an OrMatcher that depends upon the result of at least one of the given matchers. + + + + + + + + + Operators available for comparing string values. + + + + + The base abstract class to be extended by all triggers. + + + + s have a name and group associated with them, which + should uniquely identify them within a single . + + + + s are the 'mechanism' by which s + are scheduled. Many s can point to the same , + but a single can only point to one . + + + + Triggers can 'send' parameters/data to s by placing contents + into the on the . + + + + + + + + James House + Sharada Jambula + Marko Lahma (.NET) + + + + Internal interface for managing triggers. This interface should not be used by the Quartz client. + + + + + Should not be used by end users. + + + + + The base interface with properties common to all s - + use to instantiate an actual Trigger. + + + + s have a associated with them, which + should uniquely identify them within a single . + + + + s are the 'mechanism' by which s + are scheduled. Many s can point to the same , + but a single can only point to one . + + + + Triggers can 'send' parameters/data to s by placing contents + into the on the . + + + + + + + + + + James House + Sharada Jambula + Marko Lahma (.NET) + + + + Get a that is configured to produce a + schedule identical to this trigger's schedule. + + + + + + Used by the to determine whether or not + it is possible for this to fire again. + + If the returned value is then the + may remove the from the . + + + + + + Returns the next time at which the is scheduled to fire. If + the trigger will not fire again, will be returned. Note that + the time returned can possibly be in the past, if the time that was computed + for the trigger to next fire has already arrived, but the scheduler has not yet + been able to fire the trigger (which would likely be due to lack of resources + e.g. threads). + + + The value returned is not guaranteed to be valid until after the + has been added to the scheduler. + + + + + + Returns the previous time at which the fired. + If the trigger has not yet fired, will be returned. + + + + + Returns the next time at which the will fire, + after the given time. If the trigger will not fire after the given time, + will be returned. + + + + + Get or set the description given to the instance by + its creator (if any). + + + + + Get or set the with the given name with + this Trigger. Use when setting to dis-associate a Calendar. + + + + + Get or set the that is associated with the + . + + Changes made to this map during job execution are not re-persisted, and + in fact typically result in an illegal state. + + + + + + Returns the last UTC time at which the will fire, if + the Trigger will repeat indefinitely, null will be returned. + + Note that the return time *may* be in the past. + + + + + + Get or set the instruction the should be given for + handling misfire situations for this - the + concrete type that you are using will have + defined a set of additional MISFIRE_INSTRUCTION_XXX + constants that may be set to this property. + + If not explicitly set, the default value is . + + + + + + + + + Gets and sets the date/time on which the trigger must stop firing. This + defines the final boundary for trigger firings 舒 the trigger will + not fire after to this date and time. If this value is null, no end time + boundary is assumed, and the trigger can continue indefinitely. + + + + + The time at which the trigger's scheduling should start. May or may not + be the first actual fire time of the trigger, depending upon the type of + trigger and the settings of the other properties of the trigger. However + the first actual first time will not be before this date. + + + Setting a value in the past may cause a new trigger to compute a first + fire time that is in the past, which may cause an immediate misfire + of the trigger. + + + + + The priority of a acts as a tie breaker such that if + two s have the same scheduled fire time, then Quartz + will do its best to give the one with the higher priority first access + to a worker thread. + + + If not explicitly set, the default value is 5. + + + + + + + Set a description for the instance - may be + useful for remembering/displaying the purpose of the trigger, though the + description has no meaning to Quartz. + + + + + Associate the with the given name with this Trigger. + + + + + Set the to be associated with the + . + + + + + The priority of a acts as a tie breaker such that if + two s have the same scheduled fire time, then Quartz + will do its best to give the one with the higher priority first access + to a worker thread. + + + If not explicitly set, the default value is 5. + + + + + + + The time at which the trigger's scheduling should start. May or may not + be the first actual fire time of the trigger, depending upon the type of + trigger and the settings of the other properties of the trigger. However + the first actual first time will not be before this date. + + + Setting a value in the past may cause a new trigger to compute a first + fire time that is in the past, which may cause an immediate misfire + of the trigger. + + ew DateTimeOffset StartTimeUtc { get; set; } + + + + + + Set the time at which the should quit repeating - + regardless of any remaining repeats (based on the trigger's particular + repeat settings). + + + + + + + + Set the instruction the should be given for + handling misfire situations for this - the + concrete type that you are using will have + defined a set of additional MisfireInstruction.XXX + constants that may be passed to this method. + + + If not explicitly set, the default value is . + + + + + + + + This method should not be used by the Quartz client. + + + Called when the has decided to 'fire' + the trigger (Execute the associated ), in order to + give the a chance to update itself for its next + triggering (if any). + + + + + + This method should not be used by the Quartz client. + + + + Called by the scheduler at the time a is first + added to the scheduler, in order to have the + compute its first fire time, based on any associated calendar. + + + + After this method has been called, + should return a valid answer. + + + + The first time at which the will be fired + by the scheduler, which is also the same value + will return (until after the first firing of the ). + + + + + This method should not be used by the Quartz client. + + + Called after the has executed the + associated with the + in order to get the final instruction code from the trigger. + + + is the that was used by the + 's method. + is the thrown by the + , if any (may be null). + + + One of the members. + + + + + + + + + + This method should not be used by the Quartz client. + + To be implemented by the concrete classes that extend this class. + + + The implementation should update the 's state + based on the MISFIRE_INSTRUCTION_XXX that was selected when the + was created. + + + + + + This method should not be used by the Quartz client. + + The implementation should update the 's state + based on the given new version of the associated + (the state should be updated so that it's next fire time is appropriate + given the Calendar's new settings). + + + + + + + + Validates whether the properties of the are + valid for submission into a . + + + + + This method should not be used by the Quartz client. + + + Usable by + implementations, in order to facilitate 'recognizing' instances of fired + s as their jobs complete execution. + + + + + Returns the previous time at which the fired. + If the trigger has not yet fired, will be returned. + + + + + Create a with no specified name, group, or . + + + Note that the , and + the and properties + must be set before the can be placed into a + . + + + + + Create a with the given name, and default group. + + + Note that the and + properties must be set before the + can be placed into a . + + The name. + + + + Create a with the given name, and group. + + + Note that the and + properties must be set before the + can be placed into a . + + The name. + if , Scheduler.DefaultGroup will be used. + + + + Create a with the given name, and group. + + The name. + if , Scheduler.DefaultGroup will be used. + Name of the job. + The job group. + ArgumentException + if name is null or empty, or the group is an empty string. + + + + + This method should not be used by the Quartz client. + + + Called when the has decided to 'fire' + the trigger (Execute the associated ), in order to + give the a chance to update itself for its next + triggering (if any). + + + + + + This method should not be used by the Quartz client. + + + + Called by the scheduler at the time a is first + added to the scheduler, in order to have the + compute its first fire time, based on any associated calendar. + + + + After this method has been called, + should return a valid answer. + + + + The first time at which the will be fired + by the scheduler, which is also the same value + will return (until after the first firing of the ). + + + + + This method should not be used by the Quartz client. + + + Called after the has executed the + associated with the + in order to get the final instruction code from the trigger. + + + is the that was used by the + 's method. + is the thrown by the + , if any (may be null). + + + One of the members. + + + + + + + Used by the to determine whether or not + it is possible for this to fire again. + + If the returned value is then the + may remove the from the . + + + + + + Returns the next time at which the is scheduled to fire. If + the trigger will not fire again, will be returned. Note that + the time returned can possibly be in the past, if the time that was computed + for the trigger to next fire has already arrived, but the scheduler has not yet + been able to fire the trigger (which would likely be due to lack of resources + e.g. threads). + + + The value returned is not guaranteed to be valid until after the + has been added to the scheduler. + + + + + + Returns the next time at which the will fire, + after the given time. If the trigger will not fire after the given time, + will be returned. + + + + + Validates the misfire instruction. + + The misfire instruction. + + + + + This method should not be used by the Quartz client. + + To be implemented by the concrete classes that extend this class. + + + The implementation should update the 's state + based on the MISFIRE_INSTRUCTION_XXX that was selected when the + was created. + + + + + + This method should not be used by the Quartz client. + + The implementation should update the 's state + based on the given new version of the associated + (the state should be updated so that it's next fire time is appropriate + given the Calendar's new settings). + + + + + + + + Validates whether the properties of the are + valid for submission into a . + + + + + Return a simple string representation of this object. + + + + + Compare the next fire time of this to that of + another by comparing their keys, or in other words, sorts them + according to the natural (i.e. alphabetical) order of their keys. + + + + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + + Trigger equality is based upon the equality of the TriggerKey. + + + true if the key of this Trigger equals that of the given Trigger + + + + Serves as a hash function for a particular type. is suitable for use in hashing algorithms and data structures like a hash table. + + + A hash code for the current . + + + + + Creates a new object that is a copy of the current instance. + + + A new object that is a copy of this instance. + + + + + Get or sets the name of this . + + If name is null or empty. + + + + Get the group of this . If , Scheduler.DefaultGroup will be used. + + + if group is an empty string. + + + + + Get or set the name of the associated . + + + if jobName is null or empty. + + + + + Gets or sets the name of the associated 's + group. If set with , Scheduler.DefaultGroup will be used. + + ArgumentException + if group is an empty string. + + + + + Returns the 'full name' of the in the format + "group.name". + + + + + Gets the key. + + The key. + + + + Returns the 'full name' of the that the + points to, in the format "group.name". + + + + + Get or set the description given to the instance by + its creator (if any). + + + + + Get or set the with the given name with + this Trigger. Use when setting to dis-associate a Calendar. + + + + + Get or set the that is associated with the + . + + Changes made to this map during job execution are not re-persisted, and + in fact typically result in an illegal state. + + + + + + Returns the last UTC time at which the will fire, if + the Trigger will repeat indefinitely, null will be returned. + + Note that the return time *may* be in the past. + + + + + + Get or set the instruction the should be given for + handling misfire situations for this - the + concrete type that you are using will have + defined a set of additional MISFIRE_INSTRUCTION_XXX + constants that may be passed to this method. + + If not explicitly set, the default value is . + + + + + + + + + + This method should not be used by the Quartz client. + + + Usable by + implementations, in order to facilitate 'recognizing' instances of fired + s as their jobs complete execution. + + + + + Gets and sets the date/time on which the trigger must stop firing. This + defines the final boundary for trigger firings 舒 the trigger will + not fire after to this date and time. If this value is null, no end time + boundary is assumed, and the trigger can continue indefinitely. + + + + + The time at which the trigger's scheduling should start. May or may not + be the first actual fire time of the trigger, depending upon the type of + trigger and the settings of the other properties of the trigger. However + the first actual first time will not be before this date. + + + Setting a value in the past may cause a new trigger to compute a first + fire time that is in the past, which may cause an immediate misfire + of the trigger. + + + + + Tells whether this Trigger instance can handle events + in millisecond precision. + + + + + The priority of a acts as a tie breaker such that if + two s have the same scheduled fire time, then Quartz + will do its best to give the one with the higher priority first access + to a worker thread. + + + If not explicitly set, the default value is 5. + + + + + + + Gets a value indicating whether this instance has additional properties + that should be considered when for example saving to database. + + + If trigger implementation has additional properties that need to be saved + with base properties you need to make your class override this property with value true. + Returning true will effectively mean that ADOJobStore needs to serialize + this trigger instance to make sure additional properties are also saved. + + + true if this instance has additional properties; otherwise, false. + + + + + A concrete that is used to fire a + based upon repeating calendar time intervals. + + + The trigger will fire every N (see ) units of calendar time + (see ) as specified in the trigger's definition. + This trigger can achieve schedules that are not possible with (e.g + because months are not a fixed number of seconds) or (e.g. because + "every 5 months" is not an even divisor of 12). + + If you use an interval unit of then care should be taken when setting + a value that is on a day near the end of the month. For example, + if you choose a start time that occurs on January 31st, and have a trigger with unit + and interval 1, then the next fire time will be February 28th, + and the next time after that will be March 28th - and essentially each subsequent firing will + occur on the 28th of the month, even if a 31st day exists. If you want a trigger that always + fires on the last day of the month - regardless of the number of days in the month, + you should use . + + + + + + + 2.0 + James House + Marko Lahma (.NET) + + + + A that is used to fire a + based upon repeating calendar time intervals. + + + + + Get or set the interval unit - the time unit on with the interval applies. + + + + + Get the the time interval that will be added to the 's + fire time (in the set repeat interval unit) in order to calculate the time of the + next trigger repeat. + + + + + Get the number of times the has already fired. + + + + + Create a with no settings. + + + + + Create a that will occur immediately, and + repeat at the the given interval. + + Name for the trigger instance. + The repeat interval unit (minutes, days, months, etc). + The number of milliseconds to pause between the repeat firing. + + + + Create a that will occur immediately, and + repeat at the the given interval + + Name for the trigger instance. + Group for the trigger instance. + The repeat interval unit (minutes, days, months, etc). + The number of milliseconds to pause between the repeat firing. + + + + Create a that will occur at the given time, + and repeat at the the given interval until the given end time. + + Name for the trigger instance. + A set to the time for the to fire. + A set to the time for the to quit repeat firing. + The repeat interval unit (minutes, days, months, etc). + The number of milliseconds to pause between the repeat firing. + + + + Create a that will occur at the given time, + and repeat at the the given interval until the given end time. + + Name for the trigger instance. + Group for the trigger instance. + A set to the time for the to fire. + A set to the time for the to quit repeat firing. + The repeat interval unit (minutes, days, months, etc). + The number of milliseconds to pause between the repeat firing. + + + + Create a that will occur at the given time, + and repeat at the the given interval until the given end time. + + Name for the trigger instance. + Group for the trigger instance. + Name of the associated job. + Group of the associated job. + A set to the time for the to fire. + A set to the time for the to quit repeat firing. + The repeat interval unit (minutes, days, months, etc). + The number of milliseconds to pause between the repeat firing. + + + + Validates the misfire instruction. + + The misfire instruction. + + + + + Updates the 's state based on the + MisfireInstruction.XXX that was selected when the + was created. + + + If the misfire instruction is set to , + then the following scheme will be used: +
    +
  • The instruction will be interpreted as
  • +
+
+
+ + + This method should not be used by the Quartz client. + + Called when the has decided to 'fire' + the trigger (Execute the associated ), in order to + give the a chance to update itself for its next + triggering (if any). + + + + + + + This method should not be used by the Quartz client. + + The implementation should update the 's state + based on the given new version of the associated + (the state should be updated so that it's next fire time is appropriate + given the Calendar's new settings). + + + + + + + + This method should not be used by the Quartz client. + + + + Called by the scheduler at the time a is first + added to the scheduler, in order to have the + compute its first fire time, based on any associated calendar. + + + + After this method has been called, + should return a valid answer. + + + + The first time at which the will be fired + by the scheduler, which is also the same value + will return (until after the first firing of the ). + + + + + Returns the next time at which the is scheduled to fire. If + the trigger will not fire again, will be returned. Note that + the time returned can possibly be in the past, if the time that was computed + for the trigger to next fire has already arrived, but the scheduler has not yet + been able to fire the trigger (which would likely be due to lack of resources + e.g. threads). + + + The value returned is not guaranteed to be valid until after the + has been added to the scheduler. + + + + + + Returns the previous time at which the fired. + If the trigger has not yet fired, will be returned. + + + + + Returns the next time at which the will fire, + after the given time. If the trigger will not fire after the given time, + will be returned. + + + + + Determines whether or not the will occur + again. + + + + + + Validates whether the properties of the are + valid for submission into a . + + + + + Get a that is configured to produce a + schedule identical to this trigger's schedule. + + + + + + + + Get the time at which the should occur. + + + + + Tells whether this Trigger instance can handle events + in millisecond precision. + + + + + Get the time at which the should quit + repeating. + + + + + Get or set the interval unit - the time unit on with the interval applies. + + + + + Get the the time interval that will be added to the 's + fire time (in the set repeat interval unit) in order to calculate the time of the + next trigger repeat. + + + + + Get the number of times the has already fired. + + + + + Returns the final time at which the will + fire, if there is no end time set, null will be returned. + + + Note that the return time may be in the past. + + + + A concrete that is used to fire a + at given moments in time, defined with Unix 'cron-like' definitions. + + + + For those unfamiliar with "cron", this means being able to create a firing + schedule such as: "At 8:00am every Monday through Friday" or "At 1:30am + every last Friday of the month". + + + + The format of a "Cron-Expression" string is documented on the + class. + + + + Here are some full examples:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Expression Meaning
"0 0 12 * * ?"" /> Fire at 12pm (noon) every day" />
"0 15 10 ? * *"" /> Fire at 10:15am every day" />
"0 15 10 * * ?"" /> Fire at 10:15am every day" />
"0 15 10 * * ? *"" /> Fire at 10:15am every day" />
"0 15 10 * * ? 2005"" /> Fire at 10:15am every day during the year 2005" /> +
"0 * 14 * * ?"" /> Fire every minute starting at 2pm and ending at 2:59pm, every day" /> +
"0 0/5 14 * * ?"" /> Fire every 5 minutes starting at 2pm and ending at 2:55pm, every day" /> +
"0 0/5 14,18 * * ?"" /> Fire every 5 minutes starting at 2pm and ending at 2:55pm, AND fire every 5 minutes starting at 6pm and ending at 6:55pm, every day" /> +
"0 0-5 14 * * ?"" /> Fire every minute starting at 2pm and ending at 2:05pm, every day" /> +
"0 10,44 14 ? 3 WED"" /> Fire at 2:10pm and at 2:44pm every Wednesday in the month of March." /> +
"0 15 10 ? * MON-FRI"" /> Fire at 10:15am every Monday, Tuesday, Wednesday, Thursday and Friday" /> +
"0 15 10 15 * ?"" /> Fire at 10:15am on the 15th day of every month" /> +
"0 15 10 L * ?"" /> Fire at 10:15am on the last day of every month" /> +
"0 15 10 ? * 6L"" /> Fire at 10:15am on the last Friday of every month" /> +
"0 15 10 ? * 6L"" /> Fire at 10:15am on the last Friday of every month" /> +
"0 15 10 ? * 6L 2002-2005"" /> Fire at 10:15am on every last Friday of every month during the years 2002, 2003, 2004 and 2005" /> +
"0 15 10 ? * 6#3"" /> Fire at 10:15am on the third Friday of every month" /> +
+
+ + + Pay attention to the effects of '?' and '*' in the day-of-week and + day-of-month fields! + + + + NOTES: +
    +
  • Support for specifying both a day-of-week and a day-of-month value is + not complete (you'll need to use the '?' character in on of these fields). +
  • +
  • Be careful when setting fire times between mid-night and 1:00 AM - + "daylight savings" can cause a skip or a repeat depending on whether the + time moves back or jumps forward.
  • +
+
+
+ + + Sharada Jambula + James House + Contributions from Mads Henderson + Marko Lahma (.NET) +
+ + + The public interface for inspecting settings specific to a CronTrigger, + which is used to fire a + at given moments in time, defined with Unix 'cron-like' schedule definitions. + + + + For those unfamiliar with "cron", this means being able to create a firing + schedule such as: "At 8:00am every Monday through Friday" or "At 1:30am + every last Friday of the month". + + + + The format of a "Cron-Expression" string is documented on the + class. + + + + Here are some full examples:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Expression Meaning
"0 0 12 * * ?"" /> Fire at 12pm (noon) every day" />
"0 15 10 ? * *"" /> Fire at 10:15am every day" />
"0 15 10 * * ?"" /> Fire at 10:15am every day" />
"0 15 10 * * ? *"" /> Fire at 10:15am every day" />
"0 15 10 * * ? 2005"" /> Fire at 10:15am every day during the year 2005" /> +
"0 * 14 * * ?"" /> Fire every minute starting at 2pm and ending at 2:59pm, every day" /> +
"0 0/5 14 * * ?"" /> Fire every 5 minutes starting at 2pm and ending at 2:55pm, every day" /> +
"0 0/5 14,18 * * ?"" /> Fire every 5 minutes starting at 2pm and ending at 2:55pm, AND fire every 5 minutes starting at 6pm and ending at 6:55pm, every day" /> +
"0 0-5 14 * * ?"" /> Fire every minute starting at 2pm and ending at 2:05pm, every day" /> +
"0 10,44 14 ? 3 WED"" /> Fire at 2:10pm and at 2:44pm every Wednesday in the month of March." /> +
"0 15 10 ? * MON-FRI"" /> Fire at 10:15am every Monday, Tuesday, Wednesday, Thursday and Friday" /> +
"0 15 10 15 * ?"" /> Fire at 10:15am on the 15th day of every month" /> +
"0 15 10 L * ?"" /> Fire at 10:15am on the last day of every month" /> +
"0 15 10 ? * 6L"" /> Fire at 10:15am on the last Friday of every month" /> +
"0 15 10 ? * 6L"" /> Fire at 10:15am on the last Friday of every month" /> +
"0 15 10 ? * 6L 2002-2005"" /> Fire at 10:15am on every last Friday of every month during the years 2002, 2003, 2004 and 2005" /> +
"0 15 10 ? * 6#3"" /> Fire at 10:15am on the third Friday of every month" /> +
+
+ + + Pay attention to the effects of '?' and '*' in the day-of-week and + day-of-month fields! + + + + NOTES: +
    +
  • Support for specifying both a day-of-week and a day-of-month value is + not complete (you'll need to use the '?' character in on of these fields). +
  • +
  • Be careful when setting fire times between mid-night and 1:00 AM - + "daylight savings" can cause a skip or a repeat depending on whether the + time moves back or jumps forward.
  • +
+
+
+ + + Sharada Jambula + James House + Contributions from Mads Henderson + Marko Lahma (.NET) +
+ + + Gets the expression summary. + + + + + + Gets or sets the cron expression string. + + The cron expression string. + + + + Sets the time zone for which the of this + will be resolved. + + + If is set after this + property, the TimeZone setting on the CronExpression will "win". However + if is set after this property, the + time zone applied by this method will remain in effect, since the + string cron expression does not carry a time zone! + + The time zone. + + + + Create a with no settings. + + + The start-time will also be set to the current time, and the time zone + will be set the the system's default time zone. + + + + + Create a with the given name and default group. + + + The start-time will also be set to the current time, and the time zone + will be set the the system's default time zone. + + The name of the + + + + Create a with the given name and group. + + + The start-time will also be set to the current time, and the time zone + will be set the the system's default time zone. + + The name of the + The group of the + + + + Create a with the given name, group and + expression. + + + The start-time will also be set to the current time, and the time zone + will be set the the system's default time zone. + + The name of the + The group of the + A cron expression dictating the firing sequence of the + + + + Create a with the given name and group, and + associated with the identified . + + + The start-time will also be set to the current time, and the time zone + will be set the the system's default time zone. + + The name of the . + The group of the + name of the executed on firetime + Group of the executed on firetime + + + + Create a with the given name and group, + associated with the identified , + and with the given "cron" expression. + + + The start-time will also be set to the current time, and the time zone + will be set the the system's default time zone. + + The name of the + The group of the + name of the executed on firetime + Group of the executed on firetime + A cron expression dictating the firing sequence of the + + + + Create a with the given name and group, + associated with the identified , + and with the given "cron" expression resolved with respect to the . + + The name of the + The group of the + name of the executed on firetime + Group of the executed on firetime + A cron expression dictating the firing sequence of the + + Specifies for which time zone the cronExpression should be interpreted, + i.e. the expression 0 0 10 * * ?, is resolved to 10:00 am in this time zone. + + + + + Create a that will occur at the given time, + until the given end time. + + If null, the start-time will also be set to the current time, the time + zone will be set the the system's default. + + + The name of the + The group of the + name of the executed on firetime + Group of the executed on firetime + A set to the earliest time for the to start firing. + A set to the time for the to quit repeat firing. + A cron expression dictating the firing sequence of the + + + + Create a with fire time dictated by the + resolved with respect to the specified + occurring from the until + the given . + + The name of the + The group of the + name of the executed on firetime + Group of the executed on firetime + A set to the earliest time for the to start firing. + A set to the time for the to quit repeat firing. + + + + Clones this instance. + + + + + + Returns the next time at which the is scheduled to fire. If + the trigger will not fire again, will be returned. Note that + the time returned can possibly be in the past, if the time that was computed + for the trigger to next fire has already arrived, but the scheduler has not yet + been able to fire the trigger (which would likely be due to lack of resources + e.g. threads). + + + The value returned is not guaranteed to be valid until after the + has been added to the scheduler. + + + + + + Returns the previous time at which the fired. + If the trigger has not yet fired, will be returned. + + + + + + Sets the next fire time. + + This method should not be invoked by client code. + + + The fire time. + + + + Sets the previous fire time. + + This method should not be invoked by client code. + + + The fire time. + + + + Returns the next time at which the will fire, + after the given time. If the trigger will not fire after the given time, + will be returned. + + + + + + + Used by the to determine whether or not + it is possible for this to fire again. + + If the returned value is then the + may remove the from the . + + + + + + + Validates the misfire instruction. + + The misfire instruction. + + + + + This method should not be used by the Quartz client. + + To be implemented by the concrete classes that extend this class. + + + The implementation should update the 's state + based on the MISFIRE_INSTRUCTION_XXX that was selected when the + was created. + + + + + + + + Determines whether the date and (optionally) time of the given Calendar + instance falls on a scheduled fire-time of this trigger. + + + + Equivalent to calling . + + + The date to compare. + + + + + Determines whether the date and (optionally) time of the given Calendar + instance falls on a scheduled fire-time of this trigger. + + Note that the value returned is NOT validated against the related + ICalendar (if any). + + + The date to compare + If set to true, the method will only determine if the + trigger will fire during the day represented by the given Calendar + (hours, minutes and seconds will be ignored). + + + + + Called when the has decided to 'fire' + the trigger (Execute the associated ), in order to + give the a chance to update itself for its next + triggering (if any). + + + + + + + Updates the trigger with new calendar. + + The calendar to update with. + The misfire threshold. + + + + Called by the scheduler at the time a is first + added to the scheduler, in order to have the + compute its first fire time, based on any associated calendar. + + After this method has been called, + should return a valid answer. + + + + + the first time at which the will be fired + by the scheduler, which is also the same value + will return (until after the first firing of the ). + + + + + Gets the expression summary. + + + + + + Gets the next time to fire after the given time. + + The time to compute from. + + + + + NOT YET IMPLEMENTED: Returns the time before the given time + that this will fire. + + The date. + + + + + Gets or sets the cron expression string. + + The cron expression string. + + + + Set the CronExpression to the given one. The TimeZone on the passed-in + CronExpression over-rides any that was already set on the Trigger. + + The cron expression. + + + + Returns the date/time on which the trigger may begin firing. This + defines the initial boundary for trigger firings the trigger + will not fire prior to this date and time. + + + + + + Get or sets the time at which the CronTrigger should quit + repeating - even if repeastCount isn't yet satisfied. + + + + + Sets the time zone for which the of this + will be resolved. + + + If is set after this + property, the TimeZone setting on the CronExpression will "win". However + if is set after this property, the + time zone applied by this method will remain in effect, since the + string cron expression does not carry a time zone! + + The time zone. + + + + Returns the last UTC time at which the will fire, if + the Trigger will repeat indefinitely, null will be returned. + + Note that the return time *may* be in the past. + + + + + + Tells whether this Trigger instance can handle events + in millisecond precision. + + + + + + A concrete implementation of DailyTimeIntervalTrigger that is used to fire a + based upon daily repeating time intervals. + + + + The trigger will fire every N ( ) seconds, minutes or hours + (see ) during a given time window on specified days of the week. + + + For example#1, a trigger can be set to fire every 72 minutes between 8:00 and 11:00 everyday. It's fire times would + be 8:00, 9:12, 10:24, then next day would repeat: 8:00, 9:12, 10:24 again. + + + For example#2, a trigger can be set to fire every 23 minutes between 9:20 and 16:47 Monday through Friday. + + + On each day, the starting fire time is reset to startTimeOfDay value, and then it will add repeatInterval value to it until + the endTimeOfDay is reached. If you set daysOfWeek values, then fire time will only occur during those week days period. Again, + remember this trigger will reset fire time each day with startTimeOfDay, regardless of your interval or endTimeOfDay! + + + The default values for fields if not set are: startTimeOfDay defaults to 00:00:00, the endTimeOfDay default to 23:59:59, + and daysOfWeek is default to every day. The startTime default to current time-stamp now, while endTime has not value. + + + If startTime is before startTimeOfDay, then startTimeOfDay will be used and startTime has no affect. Else if startTime is + after startTimeOfDay, then the first fire time for that day will be the next interval after the startTime. For example, if + you set startingTimeOfDay=9am, endingTimeOfDay=11am, interval=15 mins, and startTime=9:33am, then the next fire time will + be 9:45pm. Note also that if you do not set startTime value, the trigger builder will default to current time, and current time + maybe before or after the startTimeOfDay! So be aware how you set your startTime. + + + This trigger also supports "repeatCount" feature to end the trigger fire time after + a certain number of count is reached. Just as the SimpleTrigger, setting repeatCount=0 + means trigger will fire once only! Setting any positive count then the trigger will repeat + count + 1 times. Unlike SimpleTrigger, the default value of repeatCount of this trigger + is set to REPEAT_INDEFINITELY instead of 0 though. + + + + + 2.0 + James House + Zemian Deng saltnlight5@gmail.com + Nuno Maia (.NET) + + + + A that is used to fire a + based upon daily repeating time intervals. + + + The trigger will fire every N (see ) seconds, minutes or hours + (see during a given time window on specified days of the week. + + For example#1, a trigger can be set to fire every 72 minutes between 8:00 and 11:00 everyday. It's fire times + be 8:00, 9:12, 10:24, then next day would repeat: 8:00, 9:12, 10:24 again. + + For example#2, a trigger can be set to fire every 23 minutes between 9:20 and 16:47 Monday through Friday. + + On each day, the starting fire time is reset to startTimeOfDay value, and then it will add repeatInterval value to it until + the endTimeOfDay is reached. If you set daysOfWeek values, then fire time will only occur during those week days period. + + The default values for fields if not set are: startTimeOfDay defaults to 00:00:00, the endTimeOfDay default to 23:59:59, + and daysOfWeek is default to every day. The startTime default to current time-stamp now, while endTime has not value. + + If startTime is before startTimeOfDay, then it has no affect. Else if startTime after startTimeOfDay, then the first fire time + for that day will be normal startTimeOfDay incremental values after startTime value. Same reversal logic is applied to endTime + with endTimeOfDay. + + + + James House + Zemian Deng saltnlight5@gmail.com + Nuno Maia (.NET) + + + + + + + + + Get the the number of times for interval this trigger should repeat, + after which it will be automatically deleted. + + + + + Get the interval unit - the time unit on with the interval applies. + The only intervals that are valid for this type of trigger are , + , and + + + + + Get the the time interval that will be added to the 's + fire time (in the set repeat interval unit) in order to calculate the time of the + next trigger repeat. + + + + + The time of day to start firing at the given interval. + + + + + The time of day to complete firing at the given interval. + + + + + The days of the week upon which to fire. + + + A Set containing the integers representing the days of the week, per the values 0-6 as defined by + DayOfWees.Sunday - DayOfWeek.Saturday. + + + + + Get the number of times the has already fired. + + + + + Used to indicate the 'repeat count' of the trigger is indefinite. Or in + other words, the trigger should repeat continually until the trigger's + ending timestamp. + + + + + Create a with no settings. + + + + + Create a that will occur immediately, and + repeat at the the given interval. + + + The that the repeating should begin occurring. + The that the repeating should stop occurring. + The repeat interval unit. The only intervals that are valid for this type of trigger are + , , and . + + + + + Create a that will occur immediately, and + repeat at the the given interval. + + + + The that the repeating should begin occurring. + The that the repeating should stop occurring. + The repeat interval unit. The only intervals that are valid for this type of trigger are + , , and . + + + + + Create a that will occur at the given time, + and repeat at the the given interval until the given end time. + + + A set to the time for the to fire. + A set to the time for the to quit repeat firing. + The that the repeating should begin occurring. + The that the repeating should stop occurring. + The repeat interval unit. The only intervals that are valid for this type of trigger are + , , and . + The number of milliseconds to pause between the repeat firing. + + + + Create a that will occur at the given time, + and repeat at the the given interval until the given end time. + + + + A set to the time for the to fire. + A set to the time for the to quit repeat firing. + The that the repeating should begin occurring. + The that the repeating should stop occurring. + The repeat interval unit. The only intervals that are valid for this type of trigger are + , , and . + The number of milliseconds to pause between the repeat firing. + + + + Create a that will occur at the given time, + fire the identified job and repeat at the the given + interval until the given end time. + + + + + + A set to the time for the to fire. + A set to the time for the to quit repeat firing. + The that the repeating should begin occurring. + The that the repeating should stop occurring. + The repeat interval unit. The only intervals that are valid for this type of trigger are + , , and . + The number of milliseconds to pause between the repeat firing. + + + + Updates the 's state based on the + MisfireInstruction.XXX that was selected when the + was created. + + + If the misfire instruction is set to , + then the following scheme will be used: +
    +
  • The instruction will be interpreted as
  • +
+
+
+ + + Called when the scheduler has decided to 'fire' + the trigger (execute the associated job), in order to + give the trigger a chance to update itself for its next + triggering (if any). + + + + + + + + + + + + + + + This method should not be used by the Quartz client. + + + + Called by the scheduler at the time a is first + added to the scheduler, in order to have the + compute its first fire time, based on any associated calendar. + + + + After this method has been called, + should return a valid answer. + + + + The first time at which the will be fired + by the scheduler, which is also the same value + will return (until after the first firing of the ). + + + + + Returns the next time at which the is scheduled to fire. If + the trigger will not fire again, will be returned. Note that + the time returned can possibly be in the past, if the time that was computed + for the trigger to next fire has already arrived, but the scheduler has not yet + been able to fire the trigger (which would likely be due to lack of resources + e.g. threads). + + + The value returned is not guaranteed to be valid until after the + has been added to the scheduler. + + + + + + Returns the previous time at which the fired. + If the trigger has not yet fired, will be returned. + + + + + Set the next time at which the should fire. + + + This method should not be invoked by client code. + + + + + + Set the previous time at which the fired. + + + This method should not be invoked by client code. + + + + + + Returns the next time at which the will + fire, after the given time. If the trigger will not fire after the given + time, will be returned. + + + + + + + Given fireTime time, we need to advance/calculate and return a time of next available week day. + + given next fireTime. + flag to whether to advance day without check existing week day. This scenario + can happen when a caller determine fireTime has passed the endTimeOfDay that fireTime should move to next day anyway. + + a next day fireTime. + + + + Determines whether or not the will occur + again. + + + + + + Validates whether the properties of the are + valid for submission into a . + + + + + Get a that is configured to produce a + schedule identical to this trigger's schedule. + + + + + + + The time at which the should occur. + + + + + the time at which the should quit repeating. + + + + + + Get the the number of times for interval this trigger should repeat, + after which it will be automatically deleted. + + + + + the interval unit - the time unit on with the interval applies. + + + The repeat interval unit. The only intervals that are valid for this type of trigger are + , , and . + + + + + the the time interval that will be added to the 's + fire time (in the set repeat interval unit) in order to calculate the time of the + next trigger repeat. + + + + + the number of times the has already + fired. + + + + + Returns the final time at which the will + fire, if there is no end time set, null will be returned. + + Note that the return time may be in the past. + + + + + The days of the week upon which to fire. + + + A Set containing the integers representing the days of the week, per the values 0-6 as defined by + DayOfWees.Sunday - DayOfWeek.Saturday. + + + + + The time of day to start firing at the given interval. + + + + + The time of day to complete firing at the given interval. + + + + + This trigger has no additional properties besides what's defined in this class. + + + + + + Tells whether this Trigger instance can handle events + in millisecond precision. + + + + + A concrete that is used to fire a + at a given moment in time, and optionally repeated at a specified interval. + + + + James House + Contributions by Lieven Govaerts of Ebitec Nv, Belgium. + Marko Lahma (.NET) + + + + A that is used to fire a + at a given moment in time, and optionally repeated at a specified interval. + + + + James House + Contributions by Lieven Govaerts of Ebitec Nv, Belgium. + Marko Lahma (.NET) + + + + Get or set thhe number of times the should + repeat, after which it will be automatically deleted. + + + + + + Get or set the the time interval at which the should repeat. + + + + + Get or set the number of times the has already + fired. + + + + + Used to indicate the 'repeat count' of the trigger is indefinite. Or in + other words, the trigger should repeat continually until the trigger's + ending timestamp. + + + + + Create a with no settings. + + + + + Create a that will occur immediately, and + not repeat. + + + + + Create a that will occur immediately, and + not repeat. + + + + + Create a that will occur immediately, and + repeat at the the given interval the given number of times. + + + + + Create a that will occur immediately, and + repeat at the the given interval the given number of times. + + + + + Create a that will occur at the given time, + and not repeat. + + + + + Create a that will occur at the given time, + and not repeat. + + + + + Create a that will occur at the given time, + and repeat at the the given interval the given number of times, or until + the given end time. + + The name. + A UTC set to the time for the to fire. + A UTC set to the time for the + to quit repeat firing. + The number of times for the to repeat + firing, use for unlimited times. + The time span to pause between the repeat firing. + + + + Create a that will occur at the given time, + and repeat at the the given interval the given number of times, or until + the given end time. + + The name. + The group. + A UTC set to the time for the to fire. + A UTC set to the time for the + to quit repeat firing. + The number of times for the to repeat + firing, use for unlimited times. + The time span to pause between the repeat firing. + + + + Create a that will occur at the given time, + fire the identified and repeat at the the given + interval the given number of times, or until the given end time. + + The name. + The group. + Name of the job. + The job group. + A set to the time for the + to fire. + A set to the time for the + to quit repeat firing. + The number of times for the to repeat + firing, use RepeatIndefinitely for unlimited times. + The time span to pause between the repeat firing. + + + + Validates the misfire instruction. + + The misfire instruction. + + + + + Updates the 's state based on the + MisfireInstruction value that was selected when the + was created. + + + If MisfireSmartPolicyEnabled is set to true, + then the following scheme will be used:
+
    +
  • If the Repeat Count is 0, then the instruction will + be interpreted as .
  • +
  • If the Repeat Count is , then + the instruction will be interpreted as . + WARNING: using MisfirePolicy.SimpleTrigger.RescheduleNowWithRemainingRepeatCount + with a trigger that has a non-null end-time may cause the trigger to + never fire again if the end-time arrived during the misfire time span. +
  • +
  • If the Repeat Count is > 0, then the instruction + will be interpreted as . +
  • +
+
+
+ + + Called when the has decided to 'fire' + the trigger (Execute the associated ), in order to + give the a chance to update itself for its next + triggering (if any). + + + + + + Updates the instance with new calendar. + + The calendar. + The misfire threshold. + + + + Called by the scheduler at the time a is first + added to the scheduler, in order to have the + compute its first fire time, based on any associated calendar. + + After this method has been called, + should return a valid answer. + + + + The first time at which the will be fired + by the scheduler, which is also the same value + will return (until after the first firing of the ). + + + + + Returns the next time at which the will + fire. If the trigger will not fire again, will be + returned. The value returned is not guaranteed to be valid until after + the has been added to the scheduler. + + + + + Returns the previous time at which the fired. + If the trigger has not yet fired, will be + returned. + + + + + Returns the next UTC time at which the will + fire, after the given UTC time. If the trigger will not fire after the given + time, will be returned. + + + + + Returns the last UTC time at which the will + fire, before the given time. If the trigger will not fire before the + given time, will be returned. + + + + + Computes the number of times fired between the two UTC date times. + + The UTC start date and time. + The UTC end date and time. + + + + + Determines whether or not the will occur + again. + + + + + Validates whether the properties of the are + valid for submission into a . + + + + + Get or set thhe number of times the should + repeat, after which it will be automatically deleted. + + + + + + Get or set the the time interval at which the should repeat. + + + + + Get or set the number of times the has already + fired. + + + + + Returns the final UTC time at which the will + fire, if repeatCount is RepeatIndefinitely, null will be returned. + + Note that the return time may be in the past. + + + + + + Tells whether this Trigger instance can handle events + in millisecond precision. + + + + + + Schedules work on a newly spawned thread. This is the default Quartz behavior. + + matt.accola + + + + Allows different strategies for scheduling threads. The + method is required to be called before the first call to + . The Thread containing the work to be performed is + passed to execute and the work is scheduled by the underlying implementation. + + matt.accola + + + + Submit a task for execution. + + Thread to execute. + + + + Initialize any state prior to calling . + + + + + A singleton implementation of . + + + Here are some examples of using this class: + + To create a scheduler that does not write anything to the database (is not + persistent), you can call : + + + DirectSchedulerFactory.Instance.CreateVolatileScheduler(10); // 10 threads + // don't forget to start the scheduler: + DirectSchedulerFactory.Instance.GetScheduler().Start(); + + + Several create methods are provided for convenience. All create methods + eventually end up calling the create method with all the parameters: + + + public void CreateScheduler(string schedulerName, string schedulerInstanceId, IThreadPool threadPool, IJobStore jobStore) + + + Here is an example of using this method: + + + // create the thread pool + SimpleThreadPool threadPool = new SimpleThreadPool(maxThreads, ThreadPriority.Normal); + threadPool.Initialize(); + // create the job store + JobStore jobStore = new RAMJobStore(); + + DirectSchedulerFactory.Instance.CreateScheduler("My Quartz Scheduler", "My Instance", threadPool, jobStore); + // don't forget to start the scheduler: + DirectSchedulerFactory.Instance.GetScheduler("My Quartz Scheduler", "My Instance").Start(); + + > + Mohammad Rezaei + James House + Marko Lahma (.NET) + + + + + + Provides a mechanism for obtaining client-usable handles to + instances. + + + + James House + Marko Lahma (.NET) + + + + Returns a client-usable handle to a . + + + + + Returns a handle to the Scheduler with the given name, if it exists. + + + + + Returns handles to all known Schedulers (made by any SchedulerFactory + within this app domain.). + + + + + Initializes a new instance of the class. + + + + + Creates an in memory job store () + The thread priority is set to Thread.NORM_PRIORITY + + The number of threads in the thread pool + + + + Creates a proxy to a remote scheduler. This scheduler can be retrieved + via . + + SchedulerException + + + + Same as , + with the addition of specifying the scheduler name and instance ID. This + scheduler can only be retrieved via . + + The name for the scheduler. + The instance ID for the scheduler. + + SchedulerException + + + + Creates a scheduler using the specified thread pool and job store. This + scheduler can be retrieved via DirectSchedulerFactory#GetScheduler() + + + The thread pool for executing jobs + + + The type of job store + + SchedulerException + if initialization failed + + + + + Same as DirectSchedulerFactory#createScheduler(ThreadPool threadPool, JobStore jobStore), + with the addition of specifying the scheduler name and instance ID. This + scheduler can only be retrieved via DirectSchedulerFactory#getScheduler(String) + + The name for the scheduler. + The instance ID for the scheduler. + The thread pool for executing jobs + The type of job store + + + + Creates a scheduler using the specified thread pool and job store and + binds it for remote access. + + The name for the scheduler. + The instance ID for the scheduler. + The thread pool for executing jobs + The type of job store + The idle wait time. You can specify "-1" for + the default value, which is currently 30000 ms. + The db failure retry interval. + + + + Creates a scheduler using the specified thread pool and job store and + binds it for remote access. + + The name for the scheduler. + The instance ID for the scheduler. + The thread pool for executing jobs + The type of job store + + The idle wait time. You can specify TimeSpan.Zero for + the default value, which is currently 30000 ms. + The db failure retry interval. + + + + Creates a scheduler using the specified thread pool and job store and + binds it for remote access. + + The name for the scheduler. + The instance ID for the scheduler. + The thread pool for executing jobs + Thread executor. + The type of job store + + The idle wait time. You can specify TimeSpan.Zero for + the default value, which is currently 30000 ms. + The db failure retry interval. + + + + Creates a scheduler using the specified thread pool and job store and + binds it for remote access. + + The name for the scheduler. + The instance ID for the scheduler. + The thread pool for executing jobs + Thread executor. + The type of job store + + The idle wait time. You can specify TimeSpan.Zero for + the default value, which is currently 30000 ms. + The db failure retry interval. + The maximum batch size of triggers, when acquiring them + The time window for which it is allowed to "pre-acquire" triggers to fire + + + + Returns a handle to the Scheduler produced by this factory. + + you must call createRemoteScheduler or createScheduler methods before + calling getScheduler() + + + + SchedulerException + + + + Returns a handle to the Scheduler with the given name, if it exists. + + + + + Gets the log. + + The log. + + + + Gets the instance. + + The instance. + + + + Returns a handle to all known Schedulers (made by any + StdSchedulerFactory instance.). + + + + + + Conveys the detail properties of a given job instance. + + + Quartz does not store an actual instance of a type, but + instead allows you to define an instance of one, through the use of a . + + s have a name and group associated with them, which + should uniquely identify them within a single . + + + s are the 'mechanism' by which s + are scheduled. Many s can point to the same , + but a single can only point to one . + + + + + + + + James House + Marko Lahma (.NET) + + + + Conveys the detail properties of a given job instance. + JobDetails are to be created/defined with . + + + Quartz does not store an actual instance of a type, but + instead allows you to define an instance of one, through the use of a . + + s have a name and group associated with them, which + should uniquely identify them within a single . + + + s are the 'mechanism' by which s + are scheduled. Many s can point to the same , + but a single can only point to one . + + + + + + + + James House + Marko Lahma (.NET) + + + + Get a that is configured to produce a + identical to this one. + + + + + The key that identifies this jobs uniquely. + + + + + Get or set the description given to the instance by its + creator (if any). + + + + + Get or sets the instance of that will be executed. + + + + + Get or set the that is associated with the . + + + + + Whether or not the should remain stored after it is + orphaned (no s point to it). + + + If not explicitly set, the default value is . + + + if the Job should remain persisted after being orphaned. + + + + + Whether the associated Job class carries the . + + + + + + Whether the associated Job class carries the . + + + + + + Set whether or not the the should re-Execute + the if a 'recovery' or 'fail-over' situation is + encountered. + + + If not explicitly set, the default value is . + + + + + + Create a with no specified name or group, and + the default settings of all the other properties. + + Note that the , and + properties must be set before the job can be + placed into a . + + + + + + Create a with the given name, default group, and + the default settings of all the other properties. + If , Scheduler.DefaultGroup will be used. + + + If name is null or empty, or the group is an empty string. + + + + + Create a with the given name, and group, and + the default settings of all the other properties. + If , Scheduler.DefaultGroup will be used. + + + If name is null or empty, or the group is an empty string. + + + + + Create a with the given name, and group, and + the given settings of all the other properties. + + The name. + if , Scheduler.DefaultGroup will be used. + Type of the job. + if set to true, job will be durable. + if set to true, job will request recovery. + + ArgumentException if name is null or empty, or the group is an empty string. + + + + + Validates whether the properties of the are + valid for submission into a . + + + + + Return a simple string representation of this object. + + + + + Creates a new object that is a copy of the current instance. + + + A new object that is a copy of this instance. + + + + + Determines whether the specified detail is equal to this instance. + + The detail to examine. + + true if the specified detail is equal; otherwise, false. + + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + if the specified is equal to the + current ; otherwise, . + + + + + Checks equality between given job detail and this instance. + + The detail to compare this instance with. + + + + + Serves as a hash function for a particular type, suitable + for use in hashing algorithms and data structures like a hash table. + + + A hash code for the current . + + + + + Get or sets the name of this . + + + if name is null or empty. + + + + + Get or sets the group of this . + If , will be used. + + + If the group is an empty string. + + + + + Returns the 'full name' of the in the format + "group.name". + + + + + Gets the key. + + The key. + + + + Get or set the description given to the instance by its + creator (if any). + + + May be useful for remembering/displaying the purpose of the job, though the + description has no meaning to Quartz. + + + + + Get or sets the instance of that will be executed. + + + if jobType is null or the class is not a . + + + + + Get or set the that is associated with the . + + + + + Set whether or not the the should re-Execute + the if a 'recovery' or 'fail-over' situation is + encountered. + + If not explicitly set, the default value is . + + + + + + + Whether or not the should remain stored after it is + orphaned (no s point to it). + + If not explicitly set, the default value is . + + + + if the Job should remain persisted after + being orphaned. + + + + + Whether the associated Job class carries the attribute. + + + + + Whether the associated Job class carries the attribute. + + + + + A context bundle containing handles to various environment information, that + is given to a instance as it is + executed, and to a instance after the + execution completes. + + + + The found on this object (via the + method) serves as a convenience - + it is a merge of the found on the + and the one found on the , with + the value in the latter overriding any same-named values in the former. + It is thus considered a 'best practice' that the Execute code of a Job + retrieve data from the JobDataMap found on this object + + + NOTE: Do not + expect value 'set' into this JobDataMap to somehow be set back onto a + job's own JobDataMap. + + + + s are also returned from the + + method. These are the same instances as those past into the jobs that are + currently executing within the scheduler. The exception to this is when your + application is using Quartz remotely (i.e. via remoting or WCF) - in which case you get + a clone of the s, and their references to + the and instances have been lost (a + clone of the is still available - just not a handle + to the job instance that is running). + + + + + + + + James House + Marko Lahma (.NET) + + + + A context bundle containing handles to various environment information, that + is given to a instance as it is + executed, and to a instance after the + execution completes. + + + + + Put the specified value into the context's data map with the given key. + Possibly useful for sharing data between listeners and jobs. + + NOTE: this data is volatile - it is lost after the job execution + completes, and all TriggerListeners and JobListeners have been + notified. + + + + + + + + + + Get the value with the given key from the context's data map. + + + + + + + Get a handle to the instance that fired the + . + + + + + Get a handle to the instance that fired the + . + + + + + Get a handle to the referenced by the + instance that fired the . + + + + + If the is being re-executed because of a 'recovery' + situation, this method will return . + + + + + Gets the refire count. + + The refire count. + + + + Get the convenience of this execution context. + + + + The found on this object serves as a convenience - + it is a merge of the found on the + and the one found on the , with + the value in the latter overriding any same-named values in the former. + It is thus considered a 'best practice' that the Execute code of a Job + retrieve data from the JobDataMap found on this object. + + + NOTE: Do not expect value 'set' into this JobDataMap to somehow be + set back onto a job's own JobDataMap. + + + Attempts to change the contents of this map typically result in an + illegal state. + + + + + + Get the associated with the . + + + + + Get the instance of the that was created for this + execution. + + Note: The Job instance is not available through remote scheduler + interfaces. + + + + + + The actual time the trigger fired. For instance the scheduled time may + have been 10:00:00 but the actual fire time may have been 10:00:03 if + the scheduler was too busy. + + Returns the fireTimeUtc. + + + + + The scheduled time the trigger fired for. For instance the scheduled + time may have been 10:00:00 but the actual fire time may have been + 10:00:03 if the scheduler was too busy. + + Returns the scheduledFireTimeUtc. + + + + + Gets the previous fire time. + + The previous fire time. + + + + Gets the next fire time. + + The next fire time. + + + + Get the unique Id that identifies this particular firing instance of the + trigger that triggered this job execution. It is unique to this + JobExecutionContext instance as well. + + the unique fire instance id + + + + + Returns the result (if any) that the set before its + execution completed (the type of object set as the result is entirely up + to the particular job). + + + + The result itself is meaningless to Quartz, but may be informative + to s or + s that are watching the job's + execution. + + + Set the result (if any) of the 's execution (the type of + object set as the result is entirely up to the particular job). + + + The result itself is meaningless to Quartz, but may be informative + to s or + s that are watching the job's + execution. + + + + + + The amount of time the job ran for. The returned + value will be until the job has actually completed (or thrown an + exception), and is therefore generally only useful to + s and s. + + + + + Create a JobExcecutionContext with the given context data. + + + + + Increments the refire count. + + + + + Returns a that represents the current . + + + A that represents the current . + + + + + Put the specified value into the context's data map with the given key. + Possibly useful for sharing data between listeners and jobs. + + NOTE: this data is volatile - it is lost after the job execution + completes, and all TriggerListeners and JobListeners have been + notified. + + + + + + + + + + Get the value with the given key from the context's data map. + + + + + + + Get a handle to the instance that fired the + . + + + + + Get a handle to the instance that fired the + . + + + + + Get a handle to the referenced by the + instance that fired the . + + + + + If the is being re-executed because of a 'recovery' + situation, this method will return . + + + + + Gets the refire count. + + The refire count. + + + + Get the convenience of this execution context. + + + + The found on this object serves as a convenience - + it is a merge of the found on the + and the one found on the , with + the value in the latter overriding any same-named values in the former. + It is thus considered a 'best practice' that the Execute code of a Job + retrieve data from the JobDataMap found on this object. + + + NOTE: Do not expect value 'set' into this JobDataMap to somehow be + set back onto a job's own JobDataMap. + + + Attempts to change the contents of this map typically result in an + illegal state. + + + + + + Get the associated with the . + + + + + Get the instance of the that was created for this + execution. + + Note: The Job instance is not available through remote scheduler + interfaces. + + + + + + The actual time the trigger fired. For instance the scheduled time may + have been 10:00:00 but the actual fire time may have been 10:00:03 if + the scheduler was too busy. + + Returns the fireTimeUtc. + + + + + The scheduled time the trigger fired for. For instance the scheduled + time may have been 10:00:00 but the actual fire time may have been + 10:00:03 if the scheduler was too busy. + + Returns the scheduledFireTimeUtc. + + + + + Gets the previous fire time. + + The previous fire time. + + + + Gets the next fire time. + + The next fire time. + + + + Returns the result (if any) that the set before its + execution completed (the type of object set as the result is entirely up + to the particular job). + + + + The result itself is meaningless to Quartz, but may be informative + to s or + s that are watching the job's + execution. + + + Set the result (if any) of the 's execution (the type of + object set as the result is entirely up to the particular job). + + + The result itself is meaningless to Quartz, but may be informative + to s or + s that are watching the job's + execution. + + + + + + The amount of time the job ran for. The returned + value will be until the job has actually completed (or thrown an + exception), and is therefore generally only useful to + s and s. + + + + + Returns the fire instace id. + + + + + An implementation of the interface that remotely + proxies all method calls to the equivalent call on a given + instance, via remoting or similar technology. + + + + James House + Marko Lahma (.NET) + + + + This is the main interface of a Quartz Scheduler. + + + + A maintains a registry of + s and s. Once + registered, the is responsible for executing + s when their associated s + fire (when their scheduled time arrives). + + + instances are produced by a + . A scheduler that has already been + created/initialized can be found and used through the same factory that + produced it. After a has been created, it is in + "stand-by" mode, and must have its method + called before it will fire any s. + + + s are to be created by the 'client program', by + defining a class that implements the interface. + objects are then created (also by the client) to + define a individual instances of the . + instances can then be registered with the + via the %IScheduler.ScheduleJob(JobDetail, + Trigger)% or %IScheduler.AddJob(JobDetail, bool)% method. + + + s can then be defined to fire individual + instances based on given schedules. + s are most useful for one-time firings, or + firing at an exact moment in time, with N repeats with a given delay between + them. s allow scheduling based on time of day, + day of week, day of month, and month of year. + + + s and s have a name and + group associated with them, which should uniquely identify them within a single + . The 'group' feature may be useful for creating + logical groupings or categorizations of s and + s. If you don't have need for assigning a group to a + given s of s, then you can use + the constant defined on + this interface. + + + Stored s can also be 'manually' triggered through the + use of the %IScheduler.TriggerJob(string, string)% function. + + + Client programs may also be interested in the 'listener' interfaces that are + available from Quartz. The interface provides + notifications of executions. The + interface provides notifications of + firings. The + interface provides notifications of events and + errors. Listeners can be associated with local schedulers through the + interface. + + + The setup/configuration of a instance is very + customizable. Please consult the documentation distributed with Quartz. + + + + + + + + + Marko Lahma (.NET) + + + + returns true if the given JobGroup + is paused + + + + + + + returns true if the given TriggerGroup + is paused + + + + + + + Get a object describing the settings + and capabilities of the scheduler instance. + + + Note that the data returned is an 'instantaneous' snap-shot, and that as + soon as it's returned, the meta data values may be different. + + + + + Return a list of objects that + represent all currently executing Jobs in this Scheduler instance. + + + + This method is not cluster aware. That is, it will only return Jobs + currently executing in this Scheduler instance, not across the entire + cluster. + + + Note that the list returned is an 'instantaneous' snap-shot, and that as + soon as it's returned, the true list of executing jobs may be different. + Also please read the doc associated with - + especially if you're using remoting. + + + + + + + Get the names of all known groups. + + + + + Get the names of all known groups. + + + + + Get the names of all groups that are paused. + + + + + Starts the 's threads that fire s. + When a scheduler is first created it is in "stand-by" mode, and will not + fire triggers. The scheduler can also be put into stand-by mode by + calling the method. + + + The misfire/recovery process will be started, if it is the initial call + to this method on this scheduler instance. + + + + + + + + Calls after the indicated delay. + (This call does not block). This can be useful within applications that + have initializers that create the scheduler immediately, before the + resources needed by the executing jobs have been fully initialized. + + + + + + + + Temporarily halts the 's firing of s. + + + + When is called (to bring the scheduler out of + stand-by mode), trigger misfire instructions will NOT be applied + during the execution of the method - any misfires + will be detected immediately afterward (by the 's + normal process). + + + The scheduler is not destroyed, and can be re-started at any time. + + + + + + + + Halts the 's firing of s, + and cleans up all resources associated with the Scheduler. Equivalent to + . + + + The scheduler cannot be re-started. + + + + + + Halts the 's firing of s, + and cleans up all resources associated with the Scheduler. + + + The scheduler cannot be re-started. + + + if the scheduler will not allow this method + to return until all currently executing jobs have completed. + + + + + + Add the given to the + Scheduler, and associate the given with + it. + + + If the given Trigger does not reference any , then it + will be set to reference the Job passed with it into this method. + + + + + Schedule the given with the + identified by the 's settings. + + + + + Schedule all of the given jobs with the related set of triggers. + + + If any of the given jobs or triggers already exist (or more + specifically, if the keys are not unique) and the replace + parameter is not set to true then an exception will be thrown. + + + + + Remove the indicated from the scheduler. + If the related job does not have any other triggers, and the job is + not durable, then the job will also be deleted. + + + + + Remove all of the indicated s from the scheduler. + + + If the related job does not have any other triggers, and the job is + not durable, then the job will also be deleted. + Note that while this bulk operation is likely more efficient than + invoking several + times, it may have the adverse affect of holding data locks for a + single long duration of time (rather than lots of small durations + of time). + + + + + Remove (delete) the with the + given key, and store the new given one - which must be associated + with the same job (the new trigger must have the job name & group specified) + - however, the new trigger need not have the same name as the old trigger. + + The to be replaced. + + The new to be stored. + + + if a with the given + name and group was not found and removed from the store (and the + new trigger is therefore not stored), otherwise + the first fire time of the newly scheduled trigger. + + + + + Add the given to the Scheduler - with no associated + . The will be 'dormant' until + it is scheduled with a , or + is called for it. + + + The must by definition be 'durable', if it is not, + SchedulerException will be thrown. + + + + + Delete the identified from the Scheduler - and any + associated s. + + true if the Job was found and deleted. + + + + Delete the identified jobs from the Scheduler - and any + associated s. + + + Note that while this bulk operation is likely more efficient than + invoking several + times, it may have the adverse affect of holding data locks for a + single long duration of time (rather than lots of small durations + of time). + + + true if all of the Jobs were found and deleted, false if + one or more were not deleted. + + + + + Trigger the identified + (Execute it now). + + + + + Trigger the identified (Execute it now). + + + the (possibly ) JobDataMap to be + associated with the trigger that fires the job immediately. + + + The of the to be executed. + + + + + Pause the with the given + key - by pausing all of its current s. + + + + + Pause all of the s in the + matching groups - by pausing all of their s. + + + + The Scheduler will "remember" that the groups are paused, and impose the + pause on any new jobs that are added to any of those groups until it is resumed. + + NOTE: There is a limitation that only exactly matched groups + can be remembered as paused. For example, if there are pre-existing + job in groups "aaa" and "bbb" and a matcher is given to pause + groups that start with "a" then the group "aaa" will be remembered + as paused and any subsequently added jobs in group "aaa" will be paused, + however if a job is added to group "axx" it will not be paused, + as "axx" wasn't known at the time the "group starts with a" matcher + was applied. HOWEVER, if there are pre-existing groups "aaa" and + "bbb" and a matcher is given to pause the group "axx" (with a + group equals matcher) then no jobs will be paused, but it will be + remembered that group "axx" is paused and later when a job is added + in that group, it will become paused. + + + + + + Pause the with the given key. + + + + + Pause all of the s in the groups matching. + + + + The Scheduler will "remember" all the groups paused, and impose the + pause on any new triggers that are added to any of those groups until it is resumed. + + NOTE: There is a limitation that only exactly matched groups + can be remembered as paused. For example, if there are pre-existing + triggers in groups "aaa" and "bbb" and a matcher is given to pause + groups that start with "a" then the group "aaa" will be remembered as + paused and any subsequently added triggers in that group be paused, + however if a trigger is added to group "axx" it will not be paused, + as "axx" wasn't known at the time the "group starts with a" matcher + was applied. HOWEVER, if there are pre-existing groups "aaa" and + "bbb" and a matcher is given to pause the group "axx" (with a + group equals matcher) then no triggers will be paused, but it will be + remembered that group "axx" is paused and later when a trigger is added + in that group, it will become paused. + + + + + + Resume (un-pause) the with + the given key. + + + If any of the 's s missed one + or more fire-times, then the 's misfire + instruction will be applied. + + + + + Resume (un-pause) all of the s + in matching groups. + + + If any of the s had s that + missed one or more fire-times, then the 's + misfire instruction will be applied. + + + + + + Resume (un-pause) the with the given + key. + + + If the missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + Resume (un-pause) all of the s in matching groups. + + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Pause all triggers - similar to calling + on every group, however, after using this method + must be called to clear the scheduler's state of 'remembering' that all + new triggers will be paused as they are added. + + + When is called (to un-pause), trigger misfire + instructions WILL be applied. + + + + + + + + Resume (un-pause) all triggers - similar to calling + on every group. + + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Get the keys of all the s in the matching groups. + + + + + Get all s that are associated with the + identified . + + + The returned Trigger objects will be snap-shots of the actual stored + triggers. If you wish to modify a trigger, you must re-store the + trigger afterward (e.g. see ). + + + + + Get the names of all the s in the given + groups. + + + + + Get the for the + instance with the given key . + + + The returned JobDetail object will be a snap-shot of the actual stored + JobDetail. If you wish to modify the JobDetail, you must re-store the + JobDetail afterward (e.g. see ). + + + + + Get the instance with the given key. + + + The returned Trigger object will be a snap-shot of the actual stored + trigger. If you wish to modify the trigger, you must re-store the + trigger afterward (e.g. see ). + + + + + Get the current state of the identified . + + + + + + + + + + + Add (register) the given to the Scheduler. + + Name of the calendar. + The calendar. + if set to true [replace]. + whether or not to update existing triggers that + referenced the already existing calendar so that they are 'correct' + based on the new trigger. + + + + Delete the identified from the Scheduler. + + Name of the calendar. + + true if the Calendar was found and deleted. + + + + + Get the instance with the given name. + + + + + Get the names of all registered . + + + + + Request the interruption, within this Scheduler instance, of all + currently executing instances of the identified , which + must be an implementor of the interface. + + + + If more than one instance of the identified job is currently executing, + the method will be called on + each instance. However, there is a limitation that in the case that + on one instances throws an exception, all + remaining instances (that have not yet been interrupted) will not have + their method called. + + + + If you wish to interrupt a specific instance of a job (when more than + one is executing) you can do so by calling + to obtain a handle + to the job instance, and then invoke on it + yourself. + + + This method is not cluster aware. That is, it will only interrupt + instances of the identified InterruptableJob currently executing in this + Scheduler instance, not across the entire cluster. + + + + true is at least one instance of the identified job was found and interrupted. + + + + + + + Request the interruption, within this Scheduler instance, of the + identified executing job instance, which + must be an implementor of the interface. + + + This method is not cluster aware. That is, it will only interrupt + instances of the identified InterruptableJob currently executing in this + Scheduler instance, not across the entire cluster. + + + + + + + the unique identifier of the job instance to be interrupted (see + + true if the identified job instance was found and interrupted. + + + + Determine whether a with the given identifier already + exists within the scheduler. + + the identifier to check for + true if a Job exists with the given identifier + + + + Determine whether a with the given identifier already + exists within the scheduler. + + the identifier to check for + true if a Trigger exists with the given identifier + + + + Clears (deletes!) all scheduling data - all s, s + s. + + + + + Returns the name of the . + + + + + Returns the instance Id of the . + + + + + Returns the of the . + + + + + Reports whether the is in stand-by mode. + + + + + + + Reports whether the has been Shutdown. + + + + + Set the that will be responsible for producing + instances of classes. + + + JobFactories may be of use to those wishing to have their application + produce instances via some special mechanism, such as to + give the opportunity for dependency injection. + + + + + + Get a reference to the scheduler's , + through which listeners may be registered. + + the scheduler's + + + + + + + + Whether the scheduler has been started. + + + Note: This only reflects whether has ever + been called on this Scheduler, so it will return even + if the is currently in standby mode or has been + since shutdown. + + + + + + + + Construct a instance to proxy the given + RemoteableQuartzScheduler instance. + + + + + returns true if the given JobGroup + is paused + + + + + + + returns true if the given TriggerGroup + is paused + + + + + + + Get a object describiing the settings + and capabilities of the scheduler instance. + + Note that the data returned is an 'instantaneous' snap-shot, and that as + soon as it's returned, the meta data values may be different. + + + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Get the names of all groups that are paused. + + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Get the names of all registered . + + + + + + Calls the equivalent method on the 'proxied' . + + + + + Returns the name of the . + + + + + Returns the instance Id of the . + + + + + Returns the of the . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Set the that will be responsible for producing + instances of classes. + + JobFactories may be of use to those wishing to have their application + produce instances via some special mechanism, such as to + give the opertunity for dependency injection. + + + + + SchedulerException + + + + Whether the scheduler has been started. + + + + Note: This only reflects whether has ever + been called on this Scheduler, so it will return even + if the is currently in standby mode or has been + since shutdown. + + + + + + + + This utility calls methods reflectively on the given objects even though the + methods are likely on a proper interface (ThreadPool, JobStore, etc). The + motivation is to be tolerant of older implementations that have not been + updated for the changes in the interfaces (eg. LocalTaskExecutorThreadPool in + spring quartz helpers) + + teck + Marko Lahma (.NET) + + + + Holds references to Scheduler instances - ensuring uniqueness, and + preventing garbage collection, and allowing 'global' lookups. + + James House + Marko Lahma (.NET) + + + + Binds the specified sched. + + The sched. + + + + Removes the specified sched name. + + Name of the sched. + + + + + Lookups the specified sched name. + + Name of the sched. + + + + + Lookups all. + + + + + + Gets the singleton instance. + + The instance. + + + + Responsible for creating the instances of + to be used within the instance. + + James House + Marko Lahma (.NET) + + + + Initialize the factory, providing a handle to the + that should be made available within the and + the s within it. + + + + + Called by the to obtain instances of + . + + + + + An implementation of the interface that directly + proxies all method calls to the equivalent call on a given + instance. + + + + James House + Marko Lahma (.NET) + + + + returns true if the given JobGroup + is paused + + + + + + + returns true if the given TriggerGroup + is paused + + + + + + + Get a object describiing the settings + and capabilities of the scheduler instance. + + Note that the data returned is an 'instantaneous' snap-shot, and that as + soon as it's returned, the meta data values may be different. + + + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Construct a instance to proxy the given + instance. + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Get the names of all registered . + + + + + + Request the interruption, within this Scheduler instance, of all + currently executing instances of the identified , which + must be an implementor of the interface. + + + + If more than one instance of the identified job is currently executing, + the method will be called on + each instance. However, there is a limitation that in the case that + on one instances throws an exception, all + remaining instances (that have not yet been interrupted) will not have + their method called. + + + If you wish to interrupt a specific instance of a job (when more than + one is executing) you can do so by calling + to obtain a handle + to the job instance, and then invoke on it + yourself. + + + This method is not cluster aware. That is, it will only interrupt + instances of the identified InterruptableJob currently executing in this + Scheduler instance, not across the entire cluster. + + + true is at least one instance of the identified job was found and interrupted. + UnableToInterruptJobException if the job does not implement + + + + + + Returns the name of the . + + + + + Returns the instance Id of the . + + + + + Returns the of the . + + + + + Whether the scheduler has been started. + + + + Note: This only reflects whether has ever + been called on this Scheduler, so it will return even + if the is currently in standby mode or has been + since shutdown. + + + + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + + + + + An implementation of that + does all of it's work of creating a instance + based on the contents of a properties file. + + + + By default a properties are loaded from App.config's quartz section. + If that fails, then the file is loaded "quartz.properties". If file does not exist, + default configration located (as a embedded resource) in Quartz.dll is loaded. If you + wish to use a file other than these defaults, you must define the system + property 'quartz.properties' to point to the file you want. + + + See the sample properties that are distributed with Quartz for + information about the various settings available within the file. + + + Alternativly, you can explicitly Initialize the factory by calling one of + the methods before calling . + + + Instances of the specified , + , classes will be created + by name, and then any additional properties specified for them in the config + file will be set on the instance by calling an equivalent 'set' method. For + example if the properties file contains the property 'quartz.jobStore. + myProp = 10' then after the JobStore class has been instantiated, the property + 'MyProp' will be set with the value. Type conversion to primitive CLR types + (int, long, float, double, boolean, enum and string) are performed before calling + the property's setter method. + + + James House + Anthony Eden + Mohammad Rezaei + Marko Lahma (.NET) + + + + Returns a handle to the default Scheduler, creating it if it does not + yet exist. + + + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The props. + + + + Initialize the . + + + By default a properties file named "quartz.properties" is loaded from + the 'current working directory'. If that fails, then the + "quartz.properties" file located (as an embedded resource) in the Quartz.NET + assembly is loaded. If you wish to use a file other than these defaults, + you must define the system property 'quartz.properties' to point to + the file you want. + + + + + Creates a new name value collection and overrides its values + with system values (environment variables). + + The base properties to override. + A new NameValueCollection instance. + + + + Initialize the with + the contents of the given key value collection object. + + + + + + + + Needed while loadhelper is not constructed. + + + + + + + Returns a handle to the Scheduler produced by this factory. + + + If one of the methods has not be previously + called, then the default (no-arg) method + will be called by this method. + + + + + Returns a handle to the Scheduler with the given name, if it exists (if + it has already been instantiated). + + + + + + Returns a handle to all known Schedulers (made by any + StdSchedulerFactory instance.). + + + + + + Inspects a directory and compares whether any files' "last modified dates" + have changed since the last time it was inspected. If one or more files + have been updated (or created), the job invokes a "call-back" method on an + identified that can be found in the + . + + pl47ypus + James House + Marko Lahma (.NET) + + + + + The interface to be implemented by classes which represent a 'job' to be + performed. + + + Instances of this interface must have a + no-argument constructor. provides a mechanism for 'instance member data' + that may be required by some implementations of this interface. + + + + + + + + James House + Marko Lahma (.NET) + + + + Called by the when a + fires that is associated with the . + + + The implementation may wish to set a result object on the + JobExecutionContext before this method exits. The result itself + is meaningless to Quartz, but may be informative to + s or + s that are watching the job's + execution. + + The execution context. + + + key with which to specify the directory to be + monitored - an absolute path is recommended. + + + key with which to specify the + to be + notified when the directory contents change. + + + key with which to specify a + value that represents the minimum number of milliseconds that must have + passed since the file's last modified time in order to consider the file + new/altered. This is necessary because another process may still be + in the middle of writing to the file when the scan occurs, and the + file may therefore not yet be ready for processing. + If this parameter is not specified, a default value of 5000 (five seconds) will be used. + + + + This is the main entry point for job execution. The scheduler will call this method on the + job once it is triggered. + + The that + the job will use during execution. + + + + Inspects a file and compares whether it's "last modified date" has changed + since the last time it was inspected. If the file has been updated, the + job invokes a "call-back" method on an identified + that can be found in the + . + + James House + Marko Lahma (.NET) + + + + + JobDataMap key with which to specify the name of the file to monitor. + + + + + JobDataMap key with which to specify the + to be notified when the file contents change. + + + + + key with which to specify a long + value that represents the minimum number of milliseconds that must have + past since the file's last modified time in order to consider the file + new/altered. This is necessary because another process may still be + in the middle of writing to the file when the scan occurs, and the + file may therefore not yet be ready for processing. + + If this parameter is not specified, a default value of + 5000 (five seconds) will be used. + + + + + Initializes a new instance of the class. + + + + + Called by the when a + fires that is associated with the . + + The implementation may wish to set a result object on the + JobExecutionContext before this method exits. The result itself + is meaningless to Quartz, but may be informative to + s or + s that are watching the job's + execution. + + + The execution context. + + + + + + Gets the last modified date. + + Name of the file. + + + + + Gets the log. + + The log. + + + Interface for objects wishing to receive a 'call-back' from a + Instances should be stored in the such that the + can find it. + James House + Marko Lahma (.NET) + + + An array of objects that were updated/added + since the last scan of the directory + + + + Interface for objects wishing to receive a 'call-back' from a + . + + James House + Marko Lahma (.NET) + + + + + Ãnforms that certain file has been updated. + + Name of the file. + + + + Built in job for executing native executables in a separate process. + + + + JobDetail job = new JobDetail("dumbJob", null, typeof(Quartz.Jobs.NativeJob)); + job.JobDataMap.Put(Quartz.Jobs.NativeJob.PropertyCommand, "echo \"hi\" >> foobar.txt"); + Trigger trigger = TriggerUtils.MakeSecondlyTrigger(5); + trigger.Name = "dumbTrigger"; + sched.ScheduleJob(job, trigger); + + If PropertyWaitForProcess is true, then the integer exit value of the process + will be saved as the job execution result in the JobExecutionContext. + + Matthew Payne + James House + Steinar Overbeck Cook + Marko Lahma (.NET) + + + + Required parameter that specifies the name of the command (executable) + to be ran. + + + + + Optional parameter that specifies the parameters to be passed to the + executed command. + + + + + Optional parameter (value should be 'true' or 'false') that specifies + whether the job should wait for the execution of the native process to + complete before it completes. + + Defaults to . + + + + + Optional parameter (value should be 'true' or 'false') that specifies + whether the spawned process's stdout and stderr streams should be + consumed. If the process creates output, it is possible that it might + 'hang' if the streams are not consumed. + + Defaults to . + + + + + Optional parameter that specifies the workling directory to be used by + the executed command. + + + + + Initializes a new instance of the class. + + + + + Called by the when a + fires that is associated with the . + + The implementation may wish to set a result object on the + JobExecutionContext before this method exits. The result itself + is meaningless to Quartz, but may be informative to + s or + s that are watching the job's + execution. + + + + + + + Gets the log. + + The log. + + + + Consumes data from the given input stream until EOF and prints the data to stdout + + cooste + James House + + + + Initializes a new instance of the class. + + The enclosing instance. + The input stream. + The type. + + + + Runs this object as a separate thread, printing the contents of the input stream + supplied during instantiation, to either Console. or stderr + + + + + An implementation of Job, that does absolutely nothing - useful for system + which only wish to use s + and s, rather than writing + Jobs that perform work. + + James House + Marko Lahma (.NET) + + + + Do nothing. + + + + + A Job which sends an e-mail with the configured content to the configured + recipient. + + James House + Marko Lahma (.NET) + + + The host name of the smtp server. REQUIRED. + + + The e-mail address to send the mail to. REQUIRED. + + + The e-mail address to cc the mail to. Optional. + + + The e-mail address to claim the mail is from. REQUIRED. + + + The e-mail address the message should say to reply to. Optional. + + + The subject to place on the e-mail. REQUIRED. + + + The e-mail message body. REQUIRED. + + + + Executes the job. + + The job execution context. + + + + Holds a List of references to JobListener instances and broadcasts all + events to them (in order). + + + The broadcasting behavior of this listener to delegate listeners may be + more convenient than registering all of the listeners directly with the + Scheduler, and provides the flexibility of easily changing which listeners + get notified. + + + + + James House (jhouse AT revolition DOT net) + + + + Construct an instance with the given name. + + + (Remember to add some delegate listeners!) + + the name of this instance + + + + Construct an instance with the given name, and List of listeners. + + + + the name of this instance + the initial List of JobListeners to broadcast to. + + + + Holds a List of references to SchedulerListener instances and broadcasts all + events to them (in order). + + + This may be more convenient than registering all of the listeners + directly with the Scheduler, and provides the flexibility of easily changing + which listeners get notified. + + + + James House + Marko Lahma (.NET) + + + + Construct an instance with the given List of listeners. + + The initial List of SchedulerListeners to broadcast to. + + + + Holds a List of references to TriggerListener instances and broadcasts all + events to them (in order). + + + The broadcasting behavior of this listener to delegate listeners may be + more convenient than registering all of the listeners directly with the + Scheduler, and provides the flexibility of easily changing which listeners + get notified. + + + + + James House (jhouse AT revolition DOT net) + + + + The interface to be implemented by classes that want to be informed when a + fires. In general, applications that use a + will not have use for this mechanism. + + + + + + + James House + Marko Lahma (.NET) + + + + Called by the when a + has fired, and it's associated + is about to be executed. + + It is called before the method of this + interface. + + + The that has fired. + + The that will be passed to the 's method. + + + + + Called by the when a + has fired, and it's associated + is about to be executed. + + It is called after the method of this + interface. If the implementation vetos the execution (via + returning ), the job's execute method will not be called. + + + The that has fired. + The that will be passed to + the 's method. + Returns true if job execution should be vetoed, false otherwise. + + + + Called by the when a + has misfired. + + Consideration should be given to how much time is spent in this method, + as it will affect all triggers that are misfiring. If you have lots + of triggers misfiring at once, it could be an issue it this method + does a lot. + + + The that has misfired. + + + + Called by the when a + has fired, it's associated + has been executed, and it's method has been + called. + + The that was fired. + + The that was passed to the + 's method. + + + The result of the call on the 's method. + + + + + Get the name of the . + + + + + Construct an instance with the given name. + + + (Remember to add some delegate listeners!) + + the name of this instance + + + + Construct an instance with the given name, and List of listeners. + + + + the name of this instance + the initial List of TriggerListeners to broadcast to. + + + + Keeps a collection of mappings of which Job to trigger after the completion + of a given job. If this listener is notified of a job completing that has a + mapping, then it will then attempt to trigger the follow-up job. This + achieves "job chaining", or a "poor man's workflow". + + + + Generally an instance of this listener would be registered as a global + job listener, rather than being registered directly to a given job. + + + If for some reason there is a failure creating the trigger for the + follow-up job (which would generally only be caused by a rare serious + failure in the system, or the non-existence of the follow-up job), an error + messsage is logged, but no other action is taken. If you need more rigorous + handling of the error, consider scheduling the triggering of the flow-up + job within your job itself. + + + James House + Marko Lahma (.NET) + + + + A helpful abstract base class for implementors of . + + + + The methods in this class are empty so you only need to override the + subset for the events you care about. + + + + You are required to implement + to return the unique name of your . + + + Marko Lahma (.NET) + + + + + Initializes a new instance of the class. + + + + + Called by the when a + is about to be executed (an associated + has occured). + + This method will not be invoked if the execution of the Job was vetoed + by a . + + + + + + + + Called by the when a + was about to be executed (an associated + has occured), but a vetoed it's + execution. + + + + + + + Called by the after a + has been executed, and be for the associated 's + method has been called. + + + + + + + Get the for this class's category. + This should be used by subclasses for logging. + + + + + Get the name of the . + + + + + + Construct an instance with the given name. + + The name of this instance. + + + + Add a chain mapping - when the Job identified by the first key completes + the job identified by the second key will be triggered. + + a JobKey with the name and group of the first job + a JobKey with the name and group of the follow-up job + + + + A helpful abstract base class for implementors of + . + + + + The methods in this class are empty so you only need to override the + subset for the events + you care about. + + + + You are required to implement + to return the unique name of your . + + + Marko Lahma (.NET) + + + + + Get the for this + class's category. This should be used by subclasses for logging. + + + + + Get the name of the . + + + + + + Logs a history of all job executions (and execution vetos) via common + logging. + + + + The logged message is customizable by setting one of the following message + properties to a string that conforms to the syntax of . + + + JobToBeFiredMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Job's Name.
1StringThe Job's Group.
2DateThe current time.
3StringThe Trigger's name.
4StringThe Triggers's group.
5DateThe scheduled fire time.
6DateThe next scheduled fire time.
7IntegerThe re-fire count from the JobExecutionContext.
+ The default message text is "Job {1}.{0} fired (by trigger {4}.{3}) at: + {2, date, HH:mm:ss MM/dd/yyyy" +
+ + JobSuccessMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Job's Name.
1StringThe Job's Group.
2DateThe current time.
3StringThe Trigger's name.
4StringThe Triggers's group.
5DateThe scheduled fire time.
6DateThe next scheduled fire time.
7IntegerThe re-fire count from the JobExecutionContext.
8ObjectThe string value (toString() having been called) of the result (if any) + that the Job set on the JobExecutionContext, with on it. "NULL" if no + result was set.
+ The default message text is "Job {1}.{0} execution complete at {2, date, + HH:mm:ss MM/dd/yyyy} and reports: {8" +
+ + JobFailedMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Job's Name.
1StringThe Job's Group.
2DateThe current time.
3StringThe Trigger's name.
4StringThe Triggers's group.
5DateThe scheduled fire time.
6DateThe next scheduled fire time.
7IntegerThe re-fire count from the JobExecutionContext.
8StringThe message from the thrown JobExecution Exception. +
+ The default message text is "Job {1}.{0} execution failed at {2, date, + HH:mm:ss MM/dd/yyyy} and reports: {8" +
+ + JobWasVetoedMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Job's Name.
1StringThe Job's Group.
2DateThe current time.
3StringThe Trigger's name.
4StringThe Triggers's group.
5DateThe scheduled fire time.
6DateThe next scheduled fire time.
7IntegerThe re-fire count from the JobExecutionContext.
+ The default message text is "Job {1}.{0} was vetoed. It was to be fired + (by trigger {4}.{3}) at: {2, date, HH:mm:ss MM/dd/yyyy" +
+
+ Marko Lahma (.NET) +
+ + + Provides an interface for a class to become a "plugin" to Quartz. + + + Plugins can do virtually anything you wish, though the most interesting ones + will obviously interact with the scheduler in some way - either actively: by + invoking actions on the scheduler, or passively: by being a , + , and/or . + + If you use to + Initialize your Scheduler, it can also create and Initialize your plugins - + look at the configuration docs for details. + + + If you need direct access your plugin, you can have it explicitly put a + reference to itself in the 's + as part of its + method. + + + James House + Marko Lahma (.NET) + + + + Called during creation of the in order to give + the a chance to Initialize. + + + At this point, the Scheduler's is not yet + + If you need direct access your plugin, you can have it explicitly put a + reference to itself in the 's + as part of its + method. + + + + The name by which the plugin is identified. + + + The scheduler to which the plugin is registered. + + + + + Called when the associated is started, in order + to let the plug-in know it can now make calls into the scheduler if it + needs to. + + + + + Called in order to inform the that it + should free up all of it's resources because the scheduler is shutting + down. + + + + + Called during creation of the in order to give + the a chance to Initialize. + + + + + Called when the associated is started, in order + to let the plug-in know it can now make calls into the scheduler if it + needs to. + + + + + Called in order to inform the that it + should free up all of it's resources because the scheduler is shutting + down. + + + + + Called by the when a is + about to be executed (an associated has occurred). + + This method will not be invoked if the execution of the Job was vetoed by a + . + + + + + + + Called by the after a + has been executed, and be for the associated 's + method has been called. + + + + + + + Called by the when a + was about to be executed (an associated + has occured), but a vetoed it's + execution. + + + + + + + Logger instance to use. Defaults to common logging. + + + + + Get or sets the message that is logged when a Job successfully completes its + execution. + + + + + Get or sets the message that is logged when a Job fails its + execution. + + + + + Gets or sets the message that is logged when a Job is about to Execute. + + + + + Gets or sets the message that is logged when a Job execution is vetoed by a + trigger listener. + + + + + Get the name of the . + + + + + + Logs a history of all trigger firings via the Jakarta Commons-Logging + framework. + + + + The logged message is customizable by setting one of the following message + properties to a string that conforms to the syntax of . + + + + TriggerFiredMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Trigger's Name.
1StringThe Trigger's Group.
2DateThe scheduled fire time.
3DateThe next scheduled fire time.
4DateThe actual fire time.
5StringThe Job's name.
6StringThe Job's group.
7IntegerThe re-fire count from the JobExecutionContext.
+ + The default message text is "Trigger {1}.{0} fired job {6}.{5} at: {4, + date, HH:mm:ss MM/dd/yyyy" +
+ + + TriggerMisfiredMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Trigger's Name.
1StringThe Trigger's Group.
2DateThe scheduled fire time.
3DateThe next scheduled fire time.
4DateThe actual fire time. (the time the misfire was detected/handled)
5StringThe Job's name.
6StringThe Job's group.
+ + The default message text is "Trigger {1}.{0} misfired job {6}.{5} at: + {4, date, HH:mm:ss MM/dd/yyyy}. Should have fired at: {3, date, HH:mm:ss + MM/dd/yyyy" +
+ + + TriggerCompleteMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Trigger's Name.
1StringThe Trigger's Group.
2DateThe scheduled fire time.
3DateThe next scheduled fire time.
4DateThe job completion time.
5StringThe Job's name.
6StringThe Job's group.
7IntegerThe re-fire count from the JobExecutionContext.
8IntegerThe trigger's resulting instruction code.
9StringA human-readable translation of the trigger's resulting instruction + code.
+ + The default message text is "Trigger {1}.{0} completed firing job + {6}.{5} at {4, date, HH:mm:ss MM/dd/yyyy} with resulting trigger instruction + code: {9" +
+
+ James House + Marko Lahma (.NET) +
+ + + Called during creation of the in order to give + the a chance to Initialize. + + + + + Called when the associated is started, in order + to let the plug-in know it can now make calls into the scheduler if it + needs to. + + + + + Called in order to inform the that it + should free up all of it's resources because the scheduler is shutting + down. + + + + + Called by the when a + has fired, and it's associated + is about to be executed. + + It is called before the method of this + interface. + + + The that has fired. + The that will be passed to the 's method. + + + + Called by the when a + has misfired. + + Consideration should be given to how much time is spent in this method, + as it will affect all triggers that are misfiring. If you have lots + of triggers misfiring at once, it could be an issue it this method + does a lot. + + + The that has misfired. + + + + Called by the when a + has fired, it's associated + has been executed, and it's method has been + called. + + The that was fired. + The that was passed to the + 's method. + The result of the call on the 's method. + + + + Called by the when a + has fired, and it's associated + is about to be executed. + + It is called after the method of this + interface. + + + The that has fired. + The that will be passed to + the 's method. + + + + + Logger instance to use. Defaults to common logging. + + + + + Get or set the message that is printed upon the completion of a trigger's + firing. + + + + + Get or set the message that is printed upon a trigger's firing. + + + + + Get or set the message that is printed upon a trigger's mis-firing. + + + + + Get the name of the . + + + + + + This plugin catches the event of the VM terminating (such as upon a CRTL-C) + and tells the scheuler to Shutdown. + + + James House + Marko Lahma (.NET) + + + + Called during creation of the in order to give + the a chance to Initialize. + + + + + Called when the associated is started, in order + to let the plug-in know it can now make calls into the scheduler if it + needs to. + + + + + Called in order to inform the that it + should free up all of it's resources because the scheduler is shutting + down. + + + + + Determine whether or not the plug-in is configured to cause a clean + Shutdown of the scheduler. + + The default value is . + + + + + + + This plugin loads XML file(s) to add jobs and schedule them with triggers + as the scheduler is initialized, and can optionally periodically scan the + file for changes. + + + The periodically scanning of files for changes is not currently supported in a + clustered environment. + + James House + Pierre Awaragi + + + + Initializes a new instance of the class. + + + + + + + + + + + Called during creation of the in order to give + the a chance to initialize. + + The name. + The scheduler. + SchedulerConfigException + + + + Called when the associated is started, in order + to let the plug-in know it can now make calls into the scheduler if it + needs to. + + + + + Helper method for generating unique job/trigger name for the + file scanning jobs (one per FileJob). The unique names are saved + in jobTriggerNameSet. + + + + + + + Called in order to inform the that it + should free up all of it's resources because the scheduler is shutting + down. + + + + + Gets the log. + + The log. + + + + Comma separated list of file names (with paths) to the XML files that should be read. + + + + + The interval at which to scan for changes to the file. + If the file has been changed, it is re-loaded and parsed. The default + value for the interval is 0, which disables scanning. + + + + + Whether or not initialization of the plugin should fail (throw an + exception) if the file cannot be found. Default is . + + + + + Information about a file that should be processed by . + + + + + Default object serialization strategy that uses + under the hood. + + Marko Lahma + + + + Interface for object serializers. + + Marko Lahma + + + + + Serializes given object as bytes + that can be stored to permanent stores. + + Object to serialize, always non-null. + + + + Deserializes object from byte array presentation. + + Data to deserialize object from, always non-null and non-empty. + + + + Serializes given object as bytes + that can be stored to permanent stores. + + Object to serialize. + + + + Deserializes object from byte array presentation. + + Data to deserialize object from. + + + + that names the scheduler instance using + just the machine hostname. + + + This class is useful when you know that your scheduler instance will be the + only one running on a particular machine. Each time the scheduler is + restarted, it will get the same instance id as long as the machine is not + renamed. + + Marko Lahma (.NET) + + + + + + An IInstanceIdGenerator is responsible for generating the clusterwide unique + instance id for a node. + + + This interface may be of use to those wishing to have specific control over + the mechanism by which the instances in their + application are named. + + + Marko Lahma (.NET) + + + + Generate the instance id for a + + The clusterwide unique instance id. + + + + + Generate the instance id for a + + The clusterwide unique instance id. + + + + A JobFactory that instantiates the Job instance (using the default no-arg + constructor, or more specifically: ), and + then attempts to set all values from the and + the 's merged onto + properties of the job. + + + Set the WarnIfPropertyNotFound property to true if you'd like noisy logging in + the case of values in the not mapping to properties on your job + class. This may be useful for troubleshooting typos of property names, etc. + but very noisy if you regularly (and purposely) have extra things in your + . + Also of possible interest is the ThrowIfPropertyNotFound property which + will throw exceptions on unmatched JobDataMap keys. + + + + + + + + James Houser + Marko Lahma (.NET) + + + + The default JobFactory used by Quartz - simply calls + on the job class. + + + + James House + Marko Lahma (.NET) + + + + A JobFactory is responsible for producing instances of + classes. + + + This interface may be of use to those wishing to have their application + produce instances via some special mechanism, such as to + give the opertunity for dependency injection. + + + + + James House + Marko Lahma (.NET) + + + + Called by the scheduler at the time of the trigger firing, in order to + produce a instance on which to call Execute. + + + It should be extremely rare for this method to throw an exception - + basically only the the case where there is no way at all to instantiate + and prepare the Job for execution. When the exception is thrown, the + Scheduler will move all triggers associated with the Job into the + state, which will require human + intervention (e.g. an application restart after fixing whatever + configuration problem led to the issue wih instantiating the Job. + + + The TriggerFiredBundle from which the + and other info relating to the trigger firing can be obtained. + + a handle to the scheduler that is about to execute the job + SchedulerException if there is a problem instantiating the Job. + the newly instantiated Job + + + + + Called by the scheduler at the time of the trigger firing, in order to + produce a instance on which to call Execute. + + + It should be extremely rare for this method to throw an exception - + basically only the the case where there is no way at all to instantiate + and prepare the Job for execution. When the exception is thrown, the + Scheduler will move all triggers associated with the Job into the + state, which will require human + intervention (e.g. an application restart after fixing whatever + configuration problem led to the issue wih instantiating the Job. + + The TriggerFiredBundle from which the + and other info relating to the trigger firing can be obtained. + + the newly instantiated Job + SchedulerException if there is a problem instantiating the Job. + + + + Called by the scheduler at the time of the trigger firing, in order to + produce a instance on which to call Execute. + + + + It should be extremely rare for this method to throw an exception - + basically only the the case where there is no way at all to instantiate + and prepare the Job for execution. When the exception is thrown, the + Scheduler will move all triggers associated with the Job into the + state, which will require human + intervention (e.g. an application restart after fixing whatever + configuration problem led to the issue wih instantiating the Job. + + + The TriggerFiredBundle from which the + and other info relating to the trigger firing can be obtained. + + the newly instantiated Job + SchedulerException if there is a problem instantiating the Job. + + + + Sets the object properties. + + The object to set properties to. + The data to set. + + + + Whether the JobInstantiation should fail and throw and exception if + a key (name) and value (type) found in the JobDataMap does not + correspond to a proptery setter on the Job class. + + + + + Get or set whether a warning should be logged if + a key (name) and value (type) found in the JobDataMap does not + correspond to a proptery setter on the Job class. + + + + + This class implements a that + utilizes RAM as its storage device. + + As you should know, the ramification of this is that access is extrememly + fast, but the data is completely volatile - therefore this + should not be used if true persistence between program shutdowns is + required. + + + James House + Sharada Jambula + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + + + + Gets the fired trigger record id. + + The fired trigger record id. + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + Called by the QuartzScheduler to inform the that + the scheduler has started. + + + + + Called by the QuartzScheduler to inform the JobStore that + the scheduler has been paused. + + + + + Called by the QuartzScheduler to inform the JobStore that + the scheduler has resumed after being paused. + + + + + Called by the QuartzScheduler to inform the that + it should free up all of it's resources because the scheduler is + shutting down. + + + + + Clears (deletes!) all scheduling data - all s, s + s. + + + + + Store the given and . + + The to be stored. + The to be stored. + + + + Returns true if the given job group is paused. + + Job group name + + + + + returns true if the given TriggerGroup is paused. + + + + + + + Store the given . + + The to be stored. + If , any existing in the + with the same name and group should be + over-written. + + + + Remove (delete) the with the given + name, and any s that reference + it. + + + if a with the given name and + group was found and removed from the store. + + + + + Remove (delete) the with the + given name. + + + if a with the given + name and group was found and removed from the store. + + + + + Store the given . + + The to be stored. + If , any existing in + the with the same name and group should + be over-written. + + + + Remove (delete) the with the + given name. + + + + if a with the given + name and group was found and removed from the store. + + The to be removed. + Whether to delete orpahaned job details from scheduler if job becomes orphaned from removing the trigger. + + + + Replaces the trigger. + + The of the to be replaced. + The new trigger. + + + + + Retrieve the for the given + . + + + The desired , or null if there is no match. + + + + + Retrieve the given . + + + The desired , or null if there is no match. + + + + + Determine whether a with the given identifier already + exists within the scheduler. + + the identifier to check for + true if a Job exists with the given identifier + + + + Determine whether a with the given identifier already + exists within the scheduler. + + triggerKey the identifier to check for + true if a Trigger exists with the given identifier + + + + Get the current state of the identified . + + + + + + + + + + + Store the given . + + The name. + The to be stored. + If , any existing + in the with the same name and group + should be over-written. + If , any s existing + in the that reference an existing + Calendar with the same name with have their next fire time + re-computed with the new . + + + + Remove (delete) the with the + given name. + + If removal of the would result in + s pointing to non-existent calendars, then a + will be thrown. + + The name of the to be removed. + + if a with the given name + was found and removed from the store. + + + + + Retrieve the given . + + The name of the to be retrieved. + + The desired , or null if there is no match. + + + + + Get the number of s that are + stored in the . + + + + + Get the number of s that are + stored in the . + + + + + Get the number of s that are + stored in the . + + + + + Get the names of all of the s that + match the given group matcher. + + + + + Get the names of all of the s + in the . + + If there are no ICalendars in the given group name, the result should be + a zero-length array (not ). + + + + + + Get the names of all of the s + that have the given group name. + + + + + Get the names of all of the + groups. + + + + + Get the names of all of the groups. + + + + + Get all of the Triggers that are associated to the given Job. + + If there are no matches, a zero-length array should be returned. + + + + + + Gets the trigger wrappers for job. + + + + + + Gets the trigger wrappers for calendar. + + Name of the cal. + + + + + Pause the with the given name. + + + + + Pause all of the s in the given group. + + The JobStore should "remember" that the group is paused, and impose the + pause on any new triggers that are added to the group while the group is + paused. + + + + + + Pause the with the given + name - by pausing all of its current s. + + + + + Pause all of the s in the + given group - by pausing all of their s. + + The JobStore should "remember" that the group is paused, and impose the + pause on any new jobs that are added to the group while the group is + paused. + + + + + + Resume (un-pause) the with the given key. + + + If the missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + Resume (un-pause) all of the s in the + given group. + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Resume (un-pause) the with + the given name. + + If any of the 's s missed one + or more fire-times, then the 's misfire + instruction will be applied. + + + + + + Resume (un-pause) all of the s + in the given group. + + If any of the s had s that + missed one or more fire-times, then the 's + misfire instruction will be applied. + + + + + + Pause all triggers - equivalent of calling + on every group. + + When is called (to un-pause), trigger misfire + instructions WILL be applied. + + + + + + + Resume (un-pause) all triggers - equivalent of calling + on every trigger group and setting all job groups unpaused />. + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + + Applies the misfire. + + The trigger wrapper. + + + + + Get a handle to the next trigger to be fired, and mark it as 'reserved' + by the calling scheduler. + + + + + + Inform the that the scheduler no longer plans to + fire the given , that it had previously acquired + (reserved). + + + + + Inform the that the scheduler is now firing the + given (executing its associated ), + that it had previously acquired (reserved). + + + + + Inform the that the scheduler has completed the + firing of the given (and the execution its + associated ), and that the + in the given should be updated if the + is stateful. + + + + + Sets the state of all triggers of job to specified state. + + + + + Peeks the triggers. + + + + + + + + + The time span by which a trigger must have missed its + next-fire-time, in order for it to be considered "misfired" and thus + have its misfire instruction applied. + + + + + Returns whether this instance supports persistence. + + + + + + + Inform the of the Scheduler instance's Id, + prior to initialize being invoked. + + + + + Inform the of the Scheduler instance's name, + prior to initialize being invoked. + + + + + Comparer for trigger wrappers. + + + + + Indicates whether the current object is equal to another object of the same type. + + + true if the current object is equal to the parameter; otherwise, false. + + An object to compare with this object. + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + 2 + + + + Possible internal trigger states + in RAMJobStore + + + + + Waiting + + + + + Acquired + + + + + Executing + + + + + Complete + + + + + Paused + + + + + Blocked + + + + + Paused and Blocked + + + + + Error + + + + + Helper wrapper class + + + + + The key used + + + + + Job's key + + + + + The trigger + + + + + Current state + + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + + Serves as a hash function for a particular type. is suitable for use in hashing algorithms and data structures like a hash table. + + + A hash code for the current . + + + + + Scheduler exporter that exports scheduler to remoting context. + + Marko Lahma + + + + Service interface for scheduler exporters. + + Marko Lahma + + + + Binds (exports) scheduler to external context. + + + + + + Unbinds scheduler from external context. + + + + + + Registers remoting channel if needed. This is determined + by checking whether there is a positive value for port. + + + + + Gets or sets the port used for remoting. + + + + + Gets or sets the name to use when exporting + scheduler to remoting context. + + + + + Gets or sets the name to use when binding to + tcp channel. + + + + + Sets the channel type when registering remoting. + + + + + + Sets the used when + exporting to remoting context. Defaults to + . + + + + + A implementation that creates + connection to remote scheduler using remoting. + + + + + Client Proxy to a IRemotableQuartzScheduler + + + + + Returns a client proxy to a remote . + + + + + Returns a client proxy to a remote . + + + + + Gets or sets the remote scheduler address. + + The remote scheduler address. + + + + The default InstanceIdGenerator used by Quartz when instance id is to be + automatically generated. Instance id is of the form HOSTNAME + CURRENT_TIME. + + Marko Lahma (.NET) + + + + + + Generate the instance id for a + + The clusterwide unique instance id. + + + + This is class is a simple implementation of a thread pool, based on the + interface. + + + objects are sent to the pool with the + method, which blocks until a becomes available. + + The pool has a fixed number of s, and does not grow or + shrink based on demand. + + James House + Juergen Donnerstag + Marko Lahma (.NET) + + + + The interface to be implemented by classes that want to provide a thread + pool for the 's use. + + + implementation instances should ideally be made + for the sole use of Quartz. Most importantly, when the method + returns a value of 1 or greater, + there must still be at least one available thread in the pool when the + method is called a few moments (or + many moments) later. If this assumption does not hold true, it may + result in extra JobStore queries and updates, and if clustering features + are being used, it may result in greater imballance of load. + + + James House + Marko Lahma (.NET) + + + + Execute the given in the next + available . + + + The implementation of this interface should not throw exceptions unless + there is a serious problem (i.e. a serious misconfiguration). If there + are no available threads, rather it should either queue the Runnable, or + block until a thread is available, depending on the desired strategy. + + + + + Determines the number of threads that are currently available in in + the pool. Useful for determining the number of times + can be called before returning + false. + + + The implementation of this method should block until there is at + least one available thread. + + the number of currently available threads + + + + Must be called before the is + used, in order to give the it a chance to Initialize. + + + Typically called by the . + + + + + Called by the QuartzScheduler to inform the + that it should free up all of it's resources because the scheduler is + shutting down. + + + + + Get the current number of threads in the . + + + + + Inform the of the Scheduler instance's Id, + prior to initialize being invoked. + + + + + Inform the of the Scheduler instance's name, + prior to initialize being invoked. + + + + + Create a new (unconfigured) . + + + + + Create a new with the specified number + of s that have the given priority. + + + the number of worker s in the pool, must + be > 0. + + + the thread priority for the worker threads. + + + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + Terminate any worker threads in this thread group. + Jobs currently in progress will complete. + + + + + Run the given object in the next available + . If while waiting the thread pool is asked to + shut down, the Runnable is executed immediately within a new additional + thread. + + The to be added. + + + + Creates the worker threads. + + The thread count. + + + + + Terminate any worker threads in this thread group. + Jobs currently in progress will complete. + + + + + Gets or sets the number of worker threads in the pool. + Set has no effect after has been called. + + + + + Get or set the thread priority of worker threads in the pool. + Set operation has no effect after has been called. + + + + + Gets or sets the thread name prefix. + + The thread name prefix. + + + + Gets or sets the value of makeThreadsDaemons. + + + + + Gets the size of the pool. + + The size of the pool. + + + + Inform the of the Scheduler instance's Id, + prior to initialize being invoked. + + + + + Inform the of the Scheduler instance's name, + prior to initialize being invoked. + + + + + A Worker loops, waiting to Execute tasks. + + + + + Create a worker thread and start it. Waiting for the next Runnable, + executing it, and waiting for the next Runnable, until the Shutdown + flag is set. + + + + + Create a worker thread, start it, Execute the runnable and terminate + the thread (one time execution). + + + + + Signal the thread that it should terminate. + + + + + Loop, executing targets as they are received. + + + + + A that simply calls . + + + James House + Marko Lahma (.NET) + + + + Called to give the ClassLoadHelper a chance to Initialize itself, + including the oportunity to "steal" the class loader off of the calling + thread, which is the thread that is initializing Quartz. + + + + Return the class with the given name. + + + + Finds a resource with a given name. This method returns null if no + resource with this name is found. + + name of the desired resource + + a Uri object + + + + Finds a resource with a given name. This method returns null if no + resource with this name is found. + + name of the desired resource + + a Stream object + + + + + InstanceIdGenerator that will use a to configure the scheduler. + If no value set for the property, a is thrown. + Alex Snaps + + + + + System property to read the instanceId from. + + + + + Returns the cluster wide value for this scheduler instance's id, based on a system property. + + + + + This is class is a simple implementation of a zero size thread pool, based on the + interface. + + + The pool has zero s and does not grow or shrink based on demand. + Which means it is obviously not useful for most scenarios. When it may be useful + is to prevent creating any worker threads at all - which may be desirable for + the sole purpose of preserving system resources in the case where the scheduler + instance only exists in order to schedule jobs, but which will never execute + jobs (e.g. will never have Start() called on it). + + Wayne Fay + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + Shutdowns this instance. + + + + + Called by the QuartzScheduler to inform the + that it should free up all of it's resources because the scheduler is + shutting down. + + + + + + Execute the given in the next + available . + + + + + The implementation of this interface should not throw exceptions unless + there is a serious problem (i.e. a serious misconfiguration). If there + are no available threads, rather it should either queue the Runnable, or + block until a thread is available, depending on the desired strategy. + + + + + Determines the number of threads that are currently available in in + the pool. Useful for determining the number of times + can be called before returning + false. + + + the number of currently available threads + + + The implementation of this method should block until there is at + least one available thread. + + + + + Gets the log. + + The log. + + + + Gets the size of the pool. + + The size of the pool. + + + + Inform the of the Scheduler instance's Id, + prior to initialize being invoked. + + + + + Inform the of the Scheduler instance's name, + prior to initialize being invoked. + + + + + A simple class (structure) used for returning execution-time data from the + JobStore to the . + + + James House + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + The job. + The trigger. + The calendar. + if set to true [job is recovering]. + The fire time. + The scheduled fire time. + The previous fire time. + The next fire time. + + + + Gets the job detail. + + The job detail. + + + + Gets the trigger. + + The trigger. + + + + Gets the calendar. + + The calendar. + + + + Gets a value indicating whether this is recovering. + + true if recovering; otherwise, false. + + + + Returns the UTC fire time. + + + + + Gets the next UTC fire time. + + The next fire time. + Returns the nextFireTimeUtc. + + + + Gets the previous UTC fire time. + + The previous fire time. + Returns the previous fire time. + + + + Returns the scheduled UTC fire time. + + + + + Result holder for trigger firing event. + + + + + Constructor. + + + + + + Constructor. + + + + + Bundle. + + + + + Possible exception. + + + + + Extension methods for . + + + + + Tries to read value and returns the value if successfully read. Otherwise return default value + for value's type. + + + + + + + + + + Extension methods for simplified access. + + + + + Returns string from given column name, or null if DbNull. + + + + + Returns int from given column name. + + + + + Returns long from given column name. + + + + + Returns long from given column name, or null if DbNull. + + + + + Returns decimal from given column name. + + + + + Manages a collection of IDbProviders, and provides transparent access + to their database. + + + James House + Sharada Jambula + Mohammad Rezaei + Marko Lahma (.NET) + + + + Private constructor + + + + + Adds the connection provider. + + Name of the data source. + The provider. + + + + Get a database connection from the DataSource with the given name. + + a database connection + + + + Shuts down database connections from the DataSource with the given name, + if applicable for the underlying provider. + + a database connection + + + + Gets the db provider. + + Name of the ds. + + + + + Get the class instance. + + an instance of this class + + + + + An implementation of that wraps another + and flags itself 'dirty' when it is modified. + + James House + Marko Lahma (.NET) + + + + Create a DirtyFlagMap that 'wraps' a . + + + + + Create a DirtyFlagMap that 'wraps' a that has the + given initial capacity. + + + + + Serialization constructor. + + + + + + + Creates a new object that is a copy of the current instance. + + + A new object that is a copy of this instance. + + + + + When implemented by a class, removes all elements from the . + + + The is read-only. + + + + + When implemented by a class, determines whether the contains an element with the specified key. + + The key to locate in the . + + if the contains an element with the key; otherwise, . + + + is . + + + + When implemented by a class, removes the element with the + specified key from the . + + The key of the element to remove. + + is . + + The is read-only. + -or- + The has a fixed size. + + + + + When implemented by a class, returns an + for the . + + + An for the . + + + + + When implemented by a class, adds an element with the provided key and value to the . + + The to use as the key of the element to add. + The to use as the value of the element to add. + is . + + An element with the same key already exists in the . + + + The is read-only. + -or- + The has a fixed size. + + + + + When implemented by a class, copies the elements of + the to an , starting at a particular index. + + The one-dimensional that is the destination of the elements copied from . The must have zero-based indexing. + The zero-based index in at which copying begins. + + is . + + is less than zero. + + + is multidimensional. + -or- + + is equal to or greater than the length of . + -or- + The number of elements in the source is greater than the available space from to the end of the destination . + + The type of the source cannot be cast automatically to the type of the destination . + + + + Clear the 'dirty' flag (set dirty flag to ). + + + + + Determines whether the specified obj contains value. + + The obj. + + true if the specified obj contains value; otherwise, false. + + + + + Gets the entries as a set. + + + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + if the specified is equal to the + current ; otherwise, . + + + + + Serves as a hash function for a particular type, suitable + for use in hashing algorithms and data structures like a hash table. + + + A hash code for the current . + + + + + Gets keyset for this map. + + + + + + Puts the value behind a specified key. + + The key. + The val. + + + + + Puts all. + + The t. + + + + Determine whether the is flagged dirty. + + + + + Get a direct handle to the underlying Map. + + + + + Gets a value indicating whether this instance is empty. + + true if this instance is empty; otherwise, false. + + + + Gets or sets the with the specified key. + + + + + + When implemented by a class, gets the number of + elements contained in the . + + + + + + When implemented by a class, gets an containing the values in the . + + + + + + When implemented by a class, gets an containing the keys of the . + + + + + + When implemented by a class, gets a value indicating whether the + is read-only. + + + + + + When implemented by a class, gets a value indicating whether the + has a fixed size. + + + + + + When implemented by a class, gets an object that + can be used to synchronize access to the . + + + + + + When implemented by a class, gets a value + indicating whether access to the is synchronized + (thread-safe). + + + + + + Utility class for file handling related things. + + Marko Lahma + + + + Resolves file to actual file if for example relative '~' used. + + File name to check + Expanded file name or actual no resolving was done. + + + + Object representing a job or trigger key. + + Jeffrey Wescott + Marko Lahma (.NET) + + + + The default group for scheduling entities, with the value "DEFAULT". + + + + + Construct a new key with the given name and group. + + the name + the group + + + + Return the string representation of the key. The format will be: + <group>.<name>. + + + + the string representation of the key + + + + + Get the name portion of the key. + + the name + + + + + Get the group portion of the key. + + + + the group + + + + + Wrapper class to access thread local data. + Data is either accessed from thread or HTTP Context's + data if HTTP Context is avaiable. + + Marko Lahma .NET + + + + Retrieves an object with the specified name. + + The name of the item. + The object in the call context associated with the specified name or null if no object has been stored previously + + + + Stores a given object and associates it with the specified name. + + The name with which to associate the new item. + The object to store in the call context. + + + + Empties a data slot with the specified name. + + The name of the data slot to empty. + + + + Generic extension methods for objects. + + + + + Creates a deep copy of object by serializing to memory stream. + + + + + + Utility methods that are used to convert objects from one type into another. + + Aleksandar Seovic + Marko Lahma + + + + Convert the value to the required (if necessary from a string). + + The proposed change value. + + The we must convert to. + + The new value, possibly the result of type conversion. + + + + Determines whether value is assignable to required type. + + The value to check. + Type of the required. + + true if value can be assigned as given type; otherwise, false. + + + + + Instantiates an instance of the type specified. + + + + + + Sets the object properties using reflection. + + + + + Sets the object properties using reflection. + + The object to set values to. + The properties to set to object. + + + + This is an utility class used to parse the properties. + + James House + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + The props. + + + + Gets the string property. + + The name. + + + + + Gets the string property. + + The name. + The default value. + + + + + Gets the string array property. + + The name. + + + + + Gets the string array property. + + The name. + The default value. + + + + + Gets the boolean property. + + The name. + + + + + Gets the boolean property. + + The name. + if set to true [defaultValue]. + + + + + Gets the byte property. + + The name. + + + + + Gets the byte property. + + The name. + The default value. + + + + + Gets the char property. + + The name. + + + + + Gets the char property. + + The name. + The default value. + + + + + Gets the double property. + + The name. + + + + + Gets the double property. + + The name. + The default value. + + + + + Gets the float property. + + The name. + + + + + Gets the float property. + + The name. + The default value. + + + + + Gets the int property. + + The name. + + + + + Gets the int property. + + The name. + The default value. + + + + + Gets the int array property. + + The name. + + + + + Gets the int array property. + + The name. + The default value. + + + + + Gets the long property. + + The name. + + + + + Gets the long property. + + The name. + The def. + + + + + Gets the TimeSpan property. + + The name. + The def. + + + + + Gets the short property. + + The name. + + + + + Gets the short property. + + The name. + The default value. + + + + + Gets the property groups. + + The prefix. + + + + + Gets the property group. + + The prefix. + + + + + Gets the property group. + + The prefix. + if set to true [strip prefix]. + + + + + Get all properties that start with the given prefix. + + The prefix for which to search. If it does not end in a "." then one will be added to it for search purposes. + Whether to strip off the given in the result's keys. + Optional array of fully qualified prefixes to exclude. For example if is "a.b.c", then might be "a.b.c.ignore". + Group of that start with the given prefix, optionally have that prefix removed, and do not include properties that start with one of the given excluded prefixes. + + + + Reads the properties from assembly (embedded resource). + + The file name to read resources from. + + + + + Reads the properties from file system. + + The file name to read resources from. + + + + + Gets the underlying properties. + + The underlying properties. + + + + Extension methods for . + + + + + Allows null-safe trimming of string. + + + + + + + Trims string and if resulting string is empty, null is returned. + + + + + + + An implementation of that wraps another + and flags itself 'dirty' when it is modified, enforces that all keys are + strings. + + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The initial capacity. + + + + Serialization constructor. + + + + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + if the specified is equal to the + current ; otherwise, . + + + + + Serves as a hash function for a particular type, suitable + for use in hashing algorithms and data structures like a hash table. + + + A hash code for the current . + + + + + Gets the keys. + + + + + + Adds the name-value pairs in the given to the . + + All keys must be s, and all values must be serializable. + + + + + + Adds the given value to the 's + data map. + + + + + Adds the given value to the 's + data map. + + + + + Adds the given value to the 's + data map. + + + + + Adds the given value to the 's + data map. + + + + + Adds the given value to the 's + data map. + + + + + Adds the given value to the 's + data map. + + + + + Adds the given value to the 's + data map. + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Reports JobSchedulingDataProcessor validation exceptions. + + Chris Bonham + Marko Lahma (.NET) + + + + Constructor for ValidationException. + + + + + Constructor for ValidationException. + + exception message. + + + + Constructor for ValidationException. + + collection of validation exceptions. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + Gets the validation exceptions. + + The validation exceptions. + + + + Returns the detail message string. + + + + + Parses an XML file that declares Jobs and their schedules (Triggers). + + + + The xml document must conform to the format defined in "job_scheduling_data_2_0.xsd" + + + + After creating an instance of this class, you should call one of the + functions, after which you may call the ScheduledJobs() + function to get a handle to the defined Jobs and Triggers, which can then be + scheduled with the . Alternatively, you could call + the function to do all of this + in one step. + + + + The same instance can be used again and again, with the list of defined Jobs + being cleared each time you call a method, + however a single instance is not thread-safe. + + + Chris Bonham + James House + Marko Lahma (.NET) + + + + Constructor for XMLSchedulingDataProcessor. + + + + + Process the xml file in the default location (a file named + "quartz_jobs.xml" in the current working directory). + + + + + Process the xml file named . + + meta data file name. + + + + Process the xmlfile named with the given system + ID. + + Name of the file. + The system id. + + + + Process the xmlfile named with the given system + ID. + + The stream. + The system id. + + + + Process the xml file in the default location, and schedule all of the jobs defined within it. + + Note that we will set overWriteExistingJobs after the default xml is parsed. + + + + + + Process the xml file in the default location, and schedule all of the + jobs defined within it. + + + + + Process the xml file in the given location, and schedule all of the + jobs defined within it. + + meta data file name. + The scheduler. + + + + Process the xml file in the given location, and schedule all of the + jobs defined within it. + + Name of the file. + The system id. + The sched. + + + + Schedules the given sets of jobs and triggers. + + The sched. + + + + Adds a detected validation exception. + + The exception. + + + + Resets the the number of detected validation exceptions. + + + + + Throws a ValidationException if the number of validationExceptions + detected is greater than zero. + + + DTD validation exception. + + + + + Whether the existing scheduling data (with same identifiers) will be + overwritten. + + + If false, and is not false, and jobs or + triggers with the same names already exist as those in the file, an + error will occur. + + + + + + If true (and is false) then any + job/triggers encountered in this file that have names that already exist + in the scheduler will be ignored, and no error will be produced. + + + + + + Gets the log. + + The log. + + + + Helper class to map constant names to their values. + + + + + CalendarIntervalScheduleBuilder is a + that defines calendar time (day, week, month, year) interval-based + schedules for Triggers. + + + + Quartz provides a builder-style API for constructing scheduling-related + entities via a Domain-Specific Language (DSL). The DSL can best be + utilized through the usage of static imports of the methods on the classes + , , + , , + and the various implementations. + + Client code can then use the DSL to write code such as this: + + JobDetail job = JobBuilder.Create<MyJob>() + .WithIdentity("myJob") + .Build(); + Trigger trigger = TriggerBuilder.Create() + .WithIdentity("myTrigger", "myTriggerGroup") + .WithSimpleSchedule(x => x + .WithIntervalInHours(1) + .RepeatForever()) + .StartAt(DateBuilder.FutureDate(10, IntervalUnit.Minute)) + .Build(); + scheduler.scheduleJob(job, trigger); + + + + + + + + + + + Base class for implementors. + + + + + + Schedule builders offer fluent interface and are responsible for creating schedules. + + + + + + + + + Build the actual Trigger -- NOT intended to be invoked by end users, + but will rather be invoked by a TriggerBuilder which this + ScheduleBuilder is given to. + + + + + + Build the actual Trigger -- NOT intended to be invoked by end users, + but will rather be invoked by a TriggerBuilder which this + ScheduleBuilder is given to. + + + + + + Create a CalendarIntervalScheduleBuilder. + + + + + + Build the actual Trigger -- NOT intended to be invoked by end users, + but will rather be invoked by a TriggerBuilder which this + ScheduleBuilder is given to. + + + + + + Specify the time unit and interval for the Trigger to be produced. + + + + the interval at which the trigger should repeat. + the time unit (IntervalUnit) of the interval. + the updated CalendarIntervalScheduleBuilder + + + + + + Specify an interval in the IntervalUnit.SECOND that the produced + Trigger will repeat at. + + + + the number of seconds at which the trigger should repeat. + the updated CalendarIntervalScheduleBuilder + + + + + + Specify an interval in the IntervalUnit.MINUTE that the produced + Trigger will repeat at. + + + + the number of minutes at which the trigger should repeat. + the updated CalendarIntervalScheduleBuilder + + + + + + Specify an interval in the IntervalUnit.HOUR that the produced + Trigger will repeat at. + + + + the number of hours at which the trigger should repeat. + the updated CalendarIntervalScheduleBuilder + + + + + + Specify an interval in the IntervalUnit.DAY that the produced + Trigger will repeat at. + + + + the number of days at which the trigger should repeat. + the updated CalendarIntervalScheduleBuilder + + + + + + Specify an interval in the IntervalUnit.WEEK that the produced + Trigger will repeat at. + + + + the number of weeks at which the trigger should repeat. + the updated CalendarIntervalScheduleBuilder + + + + + + Specify an interval in the IntervalUnit.MONTH that the produced + Trigger will repeat at. + + + + the number of months at which the trigger should repeat. + the updated CalendarIntervalScheduleBuilder + + + + + + Specify an interval in the IntervalUnit.YEAR that the produced + Trigger will repeat at. + + + + the number of years at which the trigger should repeat. + the updated CalendarIntervalScheduleBuilder + + + + + + If the Trigger misfires, use the + instruction. + + + + the updated CronScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + + + the updated CalendarIntervalScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + + + the updated CalendarIntervalScheduleBuilder + + + + + Extension methods that attach to . + + + + + Provides a parser and evaluator for unix-like cron expressions. Cron + expressions provide the ability to specify complex time combinations such as + "At 8:00am every Monday through Friday" or "At 1:30am every + last Friday of the month". + + + + Cron expressions are comprised of 6 required fields and one optional field + separated by white space. The fields respectively are described as follows: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Name Allowed Values Allowed Special Characters
Seconds 0-59 , - /// /
Minutes 0-59 , - /// /
Hours 0-23 , - /// /
Day-of-month 1-31 , - /// ? / L W C
Month 1-12 or JAN-DEC , - /// /
Day-of-Week 1-7 or SUN-SAT , - /// ? / L #
Year (Optional) empty, 1970-2199 , - /// /
+ + The '*' character is used to specify all values. For example, "*" + in the minute field means "every minute". + + + The '?' character is allowed for the day-of-month and day-of-week fields. It + is used to specify 'no specific value'. This is useful when you need to + specify something in one of the two fields, but not the other. + + + The '-' character is used to specify ranges For example "10-12" in + the hour field means "the hours 10, 11 and 12". + + + The ',' character is used to specify additional values. For example + "MON,WED,FRI" in the day-of-week field means "the days Monday, + Wednesday, and Friday". + + + The '/' character is used to specify increments. For example "0/15" + in the seconds field means "the seconds 0, 15, 30, and 45". And + "5/15" in the seconds field means "the seconds 5, 20, 35, and + 50". Specifying '*' before the '/' is equivalent to specifying 0 is + the value to start with. Essentially, for each field in the expression, there + is a set of numbers that can be turned on or off. For seconds and minutes, + the numbers range from 0 to 59. For hours 0 to 23, for days of the month 0 to + 31, and for months 1 to 12. The "/" character simply helps you turn + on every "nth" value in the given set. Thus "7/6" in the + month field only turns on month "7", it does NOT mean every 6th + month, please note that subtlety. + + + The 'L' character is allowed for the day-of-month and day-of-week fields. + This character is short-hand for "last", but it has different + meaning in each of the two fields. For example, the value "L" in + the day-of-month field means "the last day of the month" - day 31 + for January, day 28 for February on non-leap years. If used in the + day-of-week field by itself, it simply means "7" or + "SAT". But if used in the day-of-week field after another value, it + means "the last xxx day of the month" - for example "6L" + means "the last friday of the month". You can also specify an offset + from the last day of the month, such as "L-3" which would mean the third-to-last + day of the calendar month. When using the 'L' option, it is important not to + specify lists, or ranges of values, as you'll get confusing/unexpected results. + + + The 'W' character is allowed for the day-of-month field. This character + is used to specify the weekday (Monday-Friday) nearest the given day. As an + example, if you were to specify "15W" as the value for the + day-of-month field, the meaning is: "the nearest weekday to the 15th of + the month". So if the 15th is a Saturday, the trigger will fire on + Friday the 14th. If the 15th is a Sunday, the trigger will fire on Monday the + 16th. If the 15th is a Tuesday, then it will fire on Tuesday the 15th. + However if you specify "1W" as the value for day-of-month, and the + 1st is a Saturday, the trigger will fire on Monday the 3rd, as it will not + 'jump' over the boundary of a month's days. The 'W' character can only be + specified when the day-of-month is a single day, not a range or list of days. + + + The 'L' and 'W' characters can also be combined for the day-of-month + expression to yield 'LW', which translates to "last weekday of the + month". + + + The '#' character is allowed for the day-of-week field. This character is + used to specify "the nth" XXX day of the month. For example, the + value of "6#3" in the day-of-week field means the third Friday of + the month (day 6 = Friday and "#3" = the 3rd one in the month). + Other examples: "2#1" = the first Monday of the month and + "4#5" = the fifth Wednesday of the month. Note that if you specify + "#5" and there is not 5 of the given day-of-week in the month, then + no firing will occur that month. If the '#' character is used, there can + only be one expression in the day-of-week field ("3#1,6#3" is + not valid, since there are two expressions). + + + + + + The legal characters and the names of months and days of the week are not + case sensitive. + + + NOTES: +
    +
  • Support for specifying both a day-of-week and a day-of-month value is + not complete (you'll need to use the '?' character in one of these fields). +
  • +
  • Overflowing ranges is supported - that is, having a larger number on + the left hand side than the right. You might do 22-2 to catch 10 o'clock + at night until 2 o'clock in the morning, or you might have NOV-FEB. It is + very important to note that overuse of overflowing ranges creates ranges + that don't make sense and no effort has been made to determine which + interpretation CronExpression chooses. An example would be + "0 0 14-6 ? * FRI-MON".
  • +
+
+
+ Sharada Jambula + James House + Contributions from Mads Henderson + Refactoring from CronTrigger to CronExpression by Aaron Craven + Marko Lahma (.NET) +
+ + + Field specification for second. + + + + + Field specification for minute. + + + + + Field specification for hour. + + + + + Field specification for day of month. + + + + + Field specification for month. + + + + + Field specification for day of week. + + + + + Field specification for year. + + + + + Field specification for all wildcard value '*'. + + + + + Field specification for not specified value '?'. + + + + + Field specification for wildcard '*'. + + + + + Field specification for no specification at all '?'. + + + + + Seconds. + + + + + minutes. + + + + + Hours. + + + + + Days of month. + + + + + Months. + + + + + Days of week. + + + + + Years. + + + + + Last day of week. + + + + + Nth day of week. + + + + + Last day of month. + + + + + Nearest weekday. + + + + + Calendar day of week. + + + + + Calendar day of month. + + + + + Expression parsed. + + + + + Constructs a new based on the specified + parameter. + + + String representation of the cron expression the new object should represent + + + + + + Indicates whether the given date satisfies the cron expression. + + + Note that milliseconds are ignored, so two Dates falling on different milliseconds + of the same second will always have the same result here. + + The date to evaluate. + a boolean indicating whether the given date satisfies the cron expression + + + + Returns the next date/time after the given date/time which + satisfies the cron expression. + + the date/time at which to begin the search for the next valid date/time + the next valid date/time + + + + Returns the next date/time after the given date/time which does + not satisfy the expression. + + the date/time at which to begin the search for the next invalid date/time + the next valid date/time + + + + Returns the string representation of the + + The string representation of the + + + + Indicates whether the specified cron expression can be parsed into a + valid cron expression + + the expression to evaluate + a boolean indicating whether the given expression is a valid cron + expression + + + + Builds the expression. + + The expression. + + + + Stores the expression values. + + The position. + The string to traverse. + The type of value. + + + + + Checks the next value. + + The position. + The string to check. + The value. + The type to search. + + + + + Gets the expression summary. + + + + + + Gets the expression set summary. + + The data. + + + + + Skips the white space. + + The i. + The s. + + + + + Finds the next white space. + + The i. + The s. + + + + + Adds to set. + + The val. + The end. + The incr. + The type. + + + + Gets the set of given type. + + The type of set to get. + + + + + Gets the value. + + The v. + The s. + The i. + + + + + Gets the numeric value from string. + + The string to parse from. + The i. + + + + + Gets the month number. + + The string to map with. + + + + + Gets the day of week number. + + The s. + + + + + Gets the time from given time parts. + + The seconds. + The minutes. + The hours. + The day of month. + The month. + + + + + Gets the next fire time after the given time. + + The UTC time to start searching from. + + + + + Creates the date time without milliseconds. + + The time. + + + + + Advance the calendar to the particular hour paying particular attention + to daylight saving problems. + + The date. + The hour. + + + + + Gets the time before. + + The end time. + + + + + NOT YET IMPLEMENTED: Returns the final time that the + will match. + + + + + + Determines whether given year is a leap year. + + The year. + + true if the specified year is a leap year; otherwise, false. + + + + + Gets the last day of month. + + The month num. + The year. + + + + + Creates a new object that is a copy of the current instance. + + + A new object that is a copy of this instance. + + + + + Determines whether the specified is equal to the current . + + + true if the specified is equal to the current ; otherwise, false. + + The to compare with the current . + + + + Determines whether the specified is equal to the current . + + + true if the specified is equal to the current ; otherwise, false. + + The to compare with the current . + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + 2 + + + + Sets or gets the time zone for which the of this + will be resolved. + + + + + Gets the cron expression string. + + The cron expression string. + + + + Helper class for cron expression handling. + + + + + The value. + + + + + The position. + + + + + CronScheduleBuilder is a that defines + -based schedules for s. + + + + Quartz provides a builder-style API for constructing scheduling-related + entities via a Domain-Specific Language (DSL). The DSL can best be + utilized through the usage of static imports of the methods on the classes + , , + , , + and the various implementations. + + + Client code can then use the DSL to write code such as this: + + + IJobDetail job = JobBuilder.Create<MyJob>() + .WithIdentity("myJob") + .Build(); + ITrigger trigger = newTrigger() + .WithIdentity(triggerKey("myTrigger", "myTriggerGroup")) + .WithSimpleSchedule(x => x.WithIntervalInHours(1).RepeatForever()) + .StartAt(DateBuilder.FutureDate(10, IntervalUnit.Minute)) + .Build(); + scheduler.scheduleJob(job, trigger); + + + + + + + + + + + + Build the actual Trigger -- NOT intended to be invoked by end users, + but will rather be invoked by a TriggerBuilder which this + ScheduleBuilder is given to. + + + + + + Create a CronScheduleBuilder with the given cron-expression - which + is presumed to b e valid cron expression (and hence only a RuntimeException + will be thrown if it is not). + + + + the cron expression to base the schedule on. + the new CronScheduleBuilder + + + + + Create a CronScheduleBuilder with the given cron-expression string - which + may not be a valid cron expression (and hence a ParseException will be thrown + f it is not). + + the cron expression string to base the schedule on + the new CronScheduleBuilder + + + + + Create a CronScheduleBuilder with the given cron-expression. + + the cron expression to base the schedule on. + the new CronScheduleBuilder + + + + + Create a CronScheduleBuilder with a cron-expression that sets the + schedule to fire every day at the given time (hour and minute). + + + + the hour of day to fire + the minute of the given hour to fire + the new CronScheduleBuilder + + + + + Create a CronScheduleBuilder with a cron-expression that sets the + schedule to fire at the given day at the given time (hour and minute) on the given days of the week. + + the hour of day to fire + the minute of the given hour to fire + the days of the week to fire + the new CronScheduleBuilder + + + + + Create a CronScheduleBuilder with a cron-expression that sets the + schedule to fire one per week on the given day at the given time + (hour and minute). + + + + the day of the week to fire + the hour of day to fire + the minute of the given hour to fire + the new CronScheduleBuilder + + + + + Create a CronScheduleBuilder with a cron-expression that sets the + schedule to fire one per month on the given day of month at the given + time (hour and minute). + + + + the day of the month to fire + the hour of day to fire + the minute of the given hour to fire + the new CronScheduleBuilder + + + + + The in which to base the schedule. + + + + the time-zone for the schedule. + the updated CronScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + + + the updated CronScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + + + the updated CronScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + + + the updated CronScheduleBuilder + + + + + Extension methods that attach to . + + + + + A implementation that build schedule for DailyTimeIntervalTrigger. + + + + This builder provide an extra convenient method for you to set the trigger's EndTimeOfDay. You may + use either endingDailyAt() or EndingDailyAfterCount() to set the value. The later will auto calculate + your EndTimeOfDay by using the interval, IntervalUnit and StartTimeOfDay to perform the calculation. + + + When using EndingDailyAfterCount(), you should note that it is used to calculating EndTimeOfDay. So + if your startTime on the first day is already pass by a time that would not add up to the count you + expected, until the next day comes. Remember that DailyTimeIntervalTrigger will use StartTimeOfDay + and endTimeOfDay as fresh per each day! + + + Quartz provides a builder-style API for constructing scheduling-related + entities via a Domain-Specific Language (DSL). The DSL can best be + utilized through the usage of static imports of the methods on the classes + , , + , , + and the various implementations. + + Client code can then use the DSL to write code such as this: + + IJobDetail job = JobBuilder.Create<MyJob>() + .WithIdentity("myJob") + .Build(); + + ITrigger trigger = TriggerBuilder.Create() + .WithIdentity(triggerKey("myTrigger", "myTriggerGroup")) + .WithDailyTimeIntervalSchedule(x => + x.WithIntervalInMinutes(15) + .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(8, 0)) + .Build(); + + scheduler.scheduleJob(job, trigger); + + + James House + Zemian Deng saltnlight5@gmail.com + Nuno Maia (.NET) + + + + A set of all days of the week. + + + The set contains all values between and + + + + + A set of the business days of the week (for locales similar to the USA). + + + The set contains all values between and + + + + + A set of the weekend days of the week (for locales similar to the USA). + + + The set contains and + + + + + Create a DailyTimeIntervalScheduleBuilder + + The new DailyTimeIntervalScheduleBuilder + + + + Build the actual Trigger -- NOT intended to be invoked by end users, + but will rather be invoked by a TriggerBuilder which this + ScheduleBuilder is given to. + + + + + + Specify the time unit and interval for the Trigger to be produced. + + + + the interval at which the trigger should repeat. + the time unit (IntervalUnit) of the interval. + the updated CalendarIntervalScheduleBuilder + + + + + + Specify an interval in the IntervalUnit.Second that the produced + Trigger will repeat at. + + The number of seconds at which the trigger should repeat. + the updated DailyTimeIntervalScheduleBuilder> + + + + + + Specify an interval in the IntervalUnit.Minute that the produced + Trigger will repeat at. + + The number of minutes at which the trigger should repeat. + the updated DailyTimeIntervalScheduleBuilder> + + + + + + Specify an interval in the IntervalUnit.Hour that the produced + Trigger will repeat at. + + The number of hours at which the trigger should repeat. + the updated DailyTimeIntervalScheduleBuilder> + + + + + + Set the trigger to fire on the given days of the week. + + a Set containing the integers representing the days of the week, defined by - . + + the updated DailyTimeIntervalScheduleBuilder + + + + Set the trigger to fire on the given days of the week. + + a variable length list of week days representing the days of the week + the updated DailyTimeIntervalScheduleBuilder + + + + Set the trigger to fire on the days from Monday through Friday. + + the updated DailyTimeIntervalScheduleBuilder + + + + Set the trigger to fire on the days Saturday and Sunday. + + the updated DailyTimeIntervalScheduleBuilder + + + + Set the trigger to fire on all days of the week. + + the updated DailyTimeIntervalScheduleBuilder + + + + Set the trigger to begin firing each day at the given time. + + + the updated DailyTimeIntervalScheduleBuilder + + + + Set the startTimeOfDay for this trigger to end firing each day at the given time. + + + the updated DailyTimeIntervalScheduleBuilder + + + + Calculate and set the EndTimeOfDay using count, interval and StarTimeOfDay. This means + that these must be set before this method is call. + + + the updated DailyTimeIntervalScheduleBuilder + + + + If the Trigger misfires, use the + instruction. + + the updated DailyTimeIntervalScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + the updated DailyTimeIntervalScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + the updated DailyTimeIntervalScheduleBuilder + + + + + Set number of times for interval to repeat. + + + Note: if you want total count = 1 (at start time) + repeatCount + + + + + + + Extension methods that attach to . + + + + + DateBuilder is used to conveniently create + instances that meet particular criteria. + + + + Quartz provides a builder-style API for constructing scheduling-related + entities via a Domain-Specific Language (DSL). The DSL can best be + utilized through the usage of static imports of the methods on the classes + , , + , , + and the various implementations. + + Client code can then use the DSL to write code such as this: + + IJobDetail job = JobBuilder.Create<MyJob>() + .WithIdentity("myJob") + .Build(); + ITrigger trigger = newTrigger() + .WithIdentity(triggerKey("myTrigger", "myTriggerGroup")) + .WithSimpleSchedule(x => x + .WithIntervalInHours(1) + .RepeatForever()) + .StartAt(DateBuilder.FutureDate(10, IntervalUnit.Minutes)) + .Build(); + scheduler.scheduleJob(job, trigger); + + + + + + + + Create a DateBuilder, with initial settings for the current date + and time in the system default timezone. + + + + + Create a DateBuilder, with initial settings for the current date and time in the given timezone. + + + + + + Create a DateBuilder, with initial settings for the current date and time in the system default timezone. + + + + + + Create a DateBuilder, with initial settings for the current date and time in the given timezone. + + Time zone to use. + + + + + Build the defined by this builder instance. + + New date time based on builder parameters. + + + + Set the hour (0-23) for the Date that will be built by this builder. + + + + + + + Set the minute (0-59) for the Date that will be built by this builder. + + + + + + + Set the second (0-59) for the Date that will be built by this builder, and truncate the milliseconds to 000. + + + + + + + Set the day of month (1-31) for the Date that will be built by this builder. + + + + + + + Set the month (1-12) for the Date that will be built by this builder. + + + + + + + Set the year for the Date that will be built by this builder. + + + + + + + Set the TimeZoneInfo for the Date that will be built by this builder (if "null", system default will be used) + + + + + + + Get a object that represents the given time, on + tomorrow's date. + + + + + + + + + Get a object that represents the given time, on + today's date (equivalent to . + + + + + + + + + Get a object that represents the given time, on today's date. + + The value (0-59) to give the seconds field of the date + The value (0-59) to give the minutes field of the date + The value (0-23) to give the hours field of the date + the new date + + + + Get a object that represents the given time, on the + given date. + + The value (0-59) to give the seconds field of the date + The value (0-59) to give the minutes field of the date + The value (0-23) to give the hours field of the date + The value (1-31) to give the day of month field of the date + The value (1-12) to give the month field of the date + the new date + + + + Get a object that represents the given time, on the + given date. + + + + The value (0-59) to give the seconds field of the date + The value (0-59) to give the minutes field of the date + The value (0-23) to give the hours field of the date + The value (1-31) to give the day of month field of the date + The value (1-12) to give the month field of the date + The value (1970-2099) to give the year field of the date + the new date + + + + Returns a date that is rounded to the next even hour after the current time. + + + For example a current time of 08:13:54 would result in a date + with the time of 09:00:00. If the date's time is in the 23rd hour, the + date's 'day' will be promoted, and the time will be set to 00:00:00. + + the new rounded date + + + + Returns a date that is rounded to the next even hour above the given date. + + + For example an input date with a time of 08:13:54 would result in a date + with the time of 09:00:00. If the date's time is in the 23rd hour, the + date's 'day' will be promoted, and the time will be set to 00:00:00. + + the Date to round, if the current time will + be used + the new rounded date + + + + Returns a date that is rounded to the previous even hour below the given date. + + + For example an input date with a time of 08:13:54 would result in a date + with the time of 08:00:00. + + the Date to round, if the current time will + be used + the new rounded date + + + + + Returns a date that is rounded to the next even minute after the current time. + + + + For example a current time of 08:13:54 would result in a date + with the time of 08:14:00. If the date's time is in the 59th minute, + then the hour (and possibly the day) will be promoted. + + the new rounded date + + + + Returns a date that is rounded to the next even minute above the given date. + + + For example an input date with a time of 08:13:54 would result in a date + with the time of 08:14:00. If the date's time is in the 59th minute, + then the hour (and possibly the day) will be promoted. + + The Date to round, if the current time will be used + The new rounded date + + + + Returns a date that is rounded to the previous even minute below the given date. + + + For example an input date with a time of 08:13:54 would result in a date + with the time of 08:13:00. + + the Date to round, if the current time will + be used + the new rounded date + + + + Returns a date that is rounded to the next even second after the current time. + + the new rounded date + + + + Returns a date that is rounded to the next even second above the given date. + + + the Date to round, if the current time will + be used + the new rounded date + + + + Returns a date that is rounded to the previous even second below the + given date. + + + + For example an input date with a time of 08:13:54.341 would result in a + date with the time of 08:13:00.000. + + + + the Date to round, if the current time will + be used + the new rounded date + + + + Returns a date that is rounded to the next even multiple of the given + minute. + + + + For example an input date with a time of 08:13:54, and an input + minute-base of 5 would result in a date with the time of 08:15:00. The + same input date with an input minute-base of 10 would result in a date + with the time of 08:20:00. But a date with the time 08:53:31 and an + input minute-base of 45 would result in 09:00:00, because the even-hour + is the next 'base' for 45-minute intervals. + + + More examples: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Input TimeMinute-BaseResult Time
11:16:412011:20:00
11:36:412011:40:00
11:46:412012:00:00
11:26:413011:30:00
11:36:413012:00:00
11:16:411711:17:00
11:17:411711:34:00
11:52:411712:00:00
11:52:41511:55:00
11:57:41512:00:00
11:17:41012:00:00
11:17:41111:08:00
+
+
+ + the Date to round, if the current time will + be used + + the base-minute to set the time on + the new rounded date + +
+ + + + Returns a date that is rounded to the next even multiple of the given + minute. + + + + The rules for calculating the second are the same as those for + calculating the minute in the method . + + the Date to round, if the current time will + be used + the base-second to set the time on + the new rounded date + + + + + An attribute that marks a class as one that must not have multiple + instances executed concurrently (where instance is based-upon a + definition - or in other words based upon a . + + + This can be used in lieu of implementing the StatefulJob marker interface that + was used prior to Quartz 2.0 + + + James House + Marko Lahma (.NET) + + + + The interface to be implemented by s that provide a + mechanism for having their execution interrupted. It is NOT a requirement + for jobs to implement this interface - in fact, for most people, none of + their jobs will. + + + + The means of actually interrupting the Job must be implemented within the + itself (the method of this + interface is simply a means for the scheduler to inform the + that a request has been made for it to be interrupted). The mechanism that + your jobs use to interrupt themselves might vary between implementations. + However the principle idea in any implementation should be to have the + body of the job's periodically check some flag to + see if an interruption has been requested, and if the flag is set, somehow + abort the performance of the rest of the job's work. An example of + interrupting a job can be found in the java source for the class + . It is legal to use + some combination of and + synchronization within and + in order to have the method block until the + signals that it has noticed the set flag. + + + + If the Job performs some form of blocking I/O or similar functions, you may + want to consider having the method store a + reference to the calling as a member variable. Then the + implementation of this interfaces method can call + on that Thread. Before attempting this, make + sure that you fully understand what + does and doesn't do. Also make sure that you clear the Job's member + reference to the Thread when the Execute(..) method exits (preferably in a + block. + + + + + + James House + Marko Lahma (.NET) + + + + Called by the when a user + interrupts the . + + void (nothing) if job interrupt is successful. + + + + Supported interval units used by . + + + + + A marker interface for s that + wish to have their state maintained between executions. + + + instances follow slightly different rules from + regular instances. The key difference is that their + associated is re-persisted after every + execution of the job, thus preserving state for the next execution. The + other difference is that stateful jobs are not allowed to Execute + concurrently, which means new triggers that occur before the completion of + the method will be delayed. + + + + + + + + James House + Marko Lahma (.NET) + + + + JobBuilder is used to instantiate s. + + + + The builder will always try to keep itself in a valid state, with + reasonable defaults set for calling Build() at any point. For instance + if you do not invoke WithIdentity(..) a job name will be generated + for you. + + + Quartz provides a builder-style API for constructing scheduling-related + entities via a Domain-Specific Language (DSL). The DSL can best be + utilized through the usage of static imports of the methods on the classes + , , + , , + and the various implementations. + + + Client code can then use the DSL to write code such as this: + + + IJobDetail job = JobBuilder.Create<MyJob>() + .WithIdentity("myJob") + .Build(); + + ITrigger trigger = TriggerBuilder.Create() + .WithIdentity("myTrigger", "myTriggerGroup") + .WithSimpleSchedule(x => x.WithIntervalInHours(1).RepeatForever()) + .StartAt(DateBuilder.FutureDate(10, IntervalUnit.Minute)) + .Build(); + + scheduler.scheduleJob(job, trigger); + + + + + + + + + Create a JobBuilder with which to define a . + + a new JobBuilder + + + + Create a JobBuilder with which to define a , + and set the class name of the job to be executed. + + a new JobBuilder + + + + Create a JobBuilder with which to define a , + and set the class name of the job to be executed. + + a new JobBuilder + + + + Produce the instance defined by this JobBuilder. + + the defined JobDetail. + + + + Use a with the given name and default group to + identify the JobDetail. + + + If none of the 'withIdentity' methods are set on the JobBuilder, + then a random, unique JobKey will be generated. + + the name element for the Job's JobKey + the updated JobBuilder + + + + + + Use a with the given name and group to + identify the JobDetail. + + + If none of the 'withIdentity' methods are set on the JobBuilder, + then a random, unique JobKey will be generated. + + the name element for the Job's JobKey + the group element for the Job's JobKey + the updated JobBuilder + + + + + + Use a to identify the JobDetail. + + + If none of the 'withIdentity' methods are set on the JobBuilder, + then a random, unique JobKey will be generated. + + the Job's JobKey + the updated JobBuilder + + + + + + Set the given (human-meaningful) description of the Job. + + the description for the Job + the updated JobBuilder + + + + + Set the class which will be instantiated and executed when a + Trigger fires that is associated with this JobDetail. + + the updated JobBuilder + + + + + Set the class which will be instantiated and executed when a + Trigger fires that is associated with this JobDetail. + + the updated JobBuilder + + + + + Instructs the whether or not the job + should be re-executed if a 'recovery' or 'fail-over' situation is + encountered. + + + If not explicitly set, the default value is . + + the updated JobBuilder + + + + + Instructs the whether or not the job + should be re-executed if a 'recovery' or 'fail-over' situation is + encountered. + + + If not explicitly set, the default value is . + + + the updated JobBuilder + + + + Whether or not the job should remain stored after it is + orphaned (no s point to it). + + + If not explicitly set, the default value is . + + the updated JobBuilder + + + + + Whether or not the job should remain stored after it is + orphaned (no s point to it). + + + If not explicitly set, the default value is . + + the value to set for the durability property. + the updated JobBuilder + + + + + Add the given key-value pair to the JobDetail's . + + the updated JobBuilder + + + + + Add the given key-value pair to the JobDetail's . + + the updated JobBuilder + + + + + Add the given key-value pair to the JobDetail's . + + the updated JobBuilder + + + + + Add the given key-value pair to the JobDetail's . + + the updated JobBuilder + + + + + Add the given key-value pair to the JobDetail's . + + the updated JobBuilder + + + + + Add the given key-value pair to the JobDetail's . + + the updated JobBuilder + + + + + Set the JobDetail's , adding any values to it + that were already set on this JobBuilder using any of the + other 'usingJobData' methods. + + the updated JobBuilder + + + + + Holds state information for instances. + + + instances are stored once when the + is added to a scheduler. They are also re-persisted after every execution of + instances that have present. + + instances can also be stored with a + . This can be useful in the case where you have a Job + that is stored in the scheduler for regular/repeated use by multiple + Triggers, yet with each independent triggering, you want to supply the + Job with different data inputs. + + + The passed to a Job at execution time + also contains a convenience that is the result + of merging the contents of the trigger's JobDataMap (if any) over the + Job's JobDataMap (if any). + + + + + + + James House + Marko Lahma (.NET) + + + + Create an empty . + + + + + Create a with the given data. + + + + + Create a with the given data. + + + + + Serialization constructor. + + + + + + + Adds the given value as a string version to the + 's data map. + + + + + Adds the given value as a string version to the + 's data map. + + + + + Adds the given value as a string version to the + 's data map. + + + + + Adds the given value as a string version to the + 's data map. + + + + + Adds the given value as a string version to the + 's data map. + + + + + Adds the given value as a string version to the + 's data map. + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the + . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Gets the date time. + + The key. + + + + + Gets the value behind the specified key. + + The key. + + + + + An exception that can be thrown by a + to indicate to the Quartz that an error + occurred while executing, and whether or not the requests + to be re-fired immediately (using the same , + or whether it wants to be unscheduled. + + + Note that if the flag for 'refire immediately' is set, the flags for + unscheduling the Job are ignored. + + + + + James House + Marko Lahma (.NET) + + + + Create a JobExcecutionException, with the 're-fire immediately' flag set + to . + + + + + Create a JobExcecutionException, with the given cause. + + The cause. + + + + Create a JobExcecutionException, with the given message. + + + + + Initializes a new instance of the class. + + The message. + The original cause. + + + + Create a JobExcecutionException with the 're-fire immediately' flag set + to the given value. + + + + + Create a JobExcecutionException with the given underlying exception, and + the 're-fire immediately' flag set to the given value. + + + + + Create a JobExcecutionException with the given message, and underlying + exception, and the 're-fire immediately' flag set to the given value. + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + Creates and returns a string representation of the current exception. + + + A string representation of the current exception. + + + + + + Gets or sets a value indicating whether to unschedule firing trigger. + + + true if firing trigger should be unscheduled; otherwise, false. + + + + + Gets or sets a value indicating whether to unschedule all triggers. + + + true if all triggers should be unscheduled; otherwise, false. + + + + + Gets or sets a value indicating whether to refire immediately. + + true if to refire immediately; otherwise, false. + + + + Uniquely identifies a . + + + Keys are composed of both a name and group, and the name must be unique + within the group. If only a group is specified then the default group + name will be used. + + Quartz provides a builder-style API for constructing scheduling-related + entities via a Domain-Specific Language (DSL). The DSL can best be + utilized through the usage of static imports of the methods on the classes + , , + , , + and the various implementations. + + Client code can then use the DSL to write code such as this: + + IJobDetail job = JobBuilder.Create<MyJob>() + .WithIdentity("myJob") + .Build(); + ITrigger trigger = TriggerBuilder.Create() + .WithIdentity("myTrigger", "myTriggerGroup") + .WithSimpleSchedule(x => x + .WithIntervalInHours(1) + .RepeatForever()) + .StartAt(DateBuilder.FutureDate(10, IntervalUnit.Minute)) + .Build(); + scheduler.scheduleJob(job, trigger); + + + + + + + + Misfire instructions. + + Marko Lahma (.NET) + + + + Instruction not set (yet). + + + + + Use smart policy. + + + + + Instructs the that the + will never be evaluated for a misfire situation, + and that the scheduler will simply try to fire it as soon as it can, + and then update the Trigger as if it had fired at the proper time. + + + NOTE: if a trigger uses this instruction, and it has missed + several of its scheduled firings, then several rapid firings may occur + as the trigger attempt to catch back up to where it would have been. + For example, a SimpleTrigger that fires every 15 seconds which has + misfired for 5 minutes will fire 20 times once it gets the chance to + fire. + + + + + Misfire policy settings for SimpleTrigger. + + + + + Instructs the that upon a mis-fire + situation, the wants to be fired + now by . + + NOTE: This instruction should typically only be used for + 'one-shot' (non-repeating) Triggers. If it is used on a trigger with a + repeat count > 0 then it is equivalent to the instruction + . + + + + + + Instructs the that upon a mis-fire + situation, the wants to be + re-scheduled to 'now' (even if the associated + excludes 'now') with the repeat count left as-is. This does obey the + end-time however, so if 'now' is after the + end-time the will not fire again. + + + + NOTE: Use of this instruction causes the trigger to 'forget' + the start-time and repeat-count that it was originally setup with (this + is only an issue if you for some reason wanted to be able to tell what + the original values were at some later time). + + + + + + Instructs the that upon a mis-fire + situation, the wants to be + re-scheduled to 'now' (even if the associated + excludes 'now') with the repeat count set to what it would be, if it had + not missed any firings. This does obey the end-time + however, so if 'now' is after the end-time the will + not fire again. + + + NOTE: Use of this instruction causes the trigger to 'forget' + the start-time and repeat-count that it was originally setup with. + Instead, the repeat count on the trigger will be changed to whatever + the remaining repeat count is (this is only an issue if you for some + reason wanted to be able to tell what the original values were at some + later time). + + + + NOTE: This instruction could cause the + to go to the 'COMPLETE' state after firing 'now', if all the + repeat-fire-times where missed. + + + + + + Instructs the that upon a mis-fire + situation, the wants to be + re-scheduled to the next scheduled time after 'now' - taking into + account any associated , and with the + repeat count set to what it would be, if it had not missed any firings. + + + NOTE/WARNING: This instruction could cause the + to go directly to the 'COMPLETE' state if all fire-times where missed. + + + + + Instructs the that upon a mis-fire + situation, the wants to be + re-scheduled to the next scheduled time after 'now' - taking into + account any associated , and with the + repeat count left unchanged. + + + + NOTE/WARNING: This instruction could cause the + to go directly to the 'COMPLETE' state if all the end-time of the trigger + has arrived. + + + + + + misfire instructions for CronTrigger + + + + + Instructs the that upon a mis-fire + situation, the wants to be fired now + by . + + + + + Instructs the that upon a mis-fire + situation, the wants to have it's + next-fire-time updated to the next time in the schedule after the + current time (taking into account any associated , + but it does not want to be fired now. + + + + + misfire instructions for NthIncludedDayTrigger + + + + + Instructs the that upon a mis-fire situation, the + wants to be fired now by the + + + + + + Instructs the that upon a mis-fire situation, the + wants to have + nextFireTime updated to the next time in the schedule after + the current time, but it does not want to be fired now. + + + + + Misfire instructions for DateIntervalTrigger + + + + + Instructs the that upon a mis-fire + situation, the wants to be + fired now by . + + + + + Instructs the that upon a mis-fire + situation, the wants to have it's + next-fire-time updated to the next time in the schedule after the + current time (taking into account any associated , + but it does not want to be fired now. + + + + + Misfire instructions for DailyTimeIntervalTrigger + + + + + Instructs the that upon a mis-fire + situation, the wants to be + fired now by . + + + + + Instructs the that upon a mis-fire + situation, the wants to have it's + next-fire-time updated to the next time in the schedule after the + current time (taking into account any associated , + but it does not want to be fired now. + + + + + A trigger which fires on the Nth day of every interval type + , or + that is not excluded by the associated + calendar. + + + When determining what the Nth day of the month or year + is, will skip excluded days on the + associated calendar. This would commonly be used in an Nth + business day situation, in which the user wishes to fire a particular job on + the Nth business day (i.e. the 5th business day of + every month). Each also has an associated + which indicates at what time of day the trigger is + to fire. + + All s default to a monthly interval type + (fires on the Nth day of every month) with N = 1 (first + non-excluded day) and set to 12:00 PM (noon). These + values can be changed using the , , and + methods. Users may also want to note the + and + methods. + + + Take, for example, the following calendar: + + + July August September + Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa + 1 W 1 2 3 4 5 W 1 2 W + W H 5 6 7 8 W W 8 9 10 11 12 W W H 6 7 8 9 W + W 11 12 13 14 15 W W 15 16 17 18 19 W W 12 13 14 15 16 W + W 18 19 20 21 22 W W 22 23 24 25 26 W W 19 20 21 22 23 W + W 25 26 27 28 29 W W 29 30 31 W 26 27 28 29 30 + W + + Where W's represent weekend days, and H's represent holidays, all of which + are excluded on a calendar associated with an + with n=5 and + intervalType=IntervalTypeMonthly. In this case, the trigger + would fire on the 8th of July (because of the July 4 holiday), + the 5th of August, and the 8th of September (because + of Labor Day). + + Aaron Craven + Marko Lahma (.NET) + + + + Indicates a monthly trigger type (fires on the Nth included + day of every month). + + + + indicates a yearly trigger type (fires on the Nth included + day of every year). + + + + + Indicates a weekly trigger type (fires on the Nth included + day of every week). When using this interval type, care must be taken + not to think of the value of as an analog to + . Such a comparison can only + be drawn when there are no calendars associated with the trigger. To + illustrate, consider an with + n = 3 which is associated with a Calendar excluding + non-weekdays. The trigger would fire on the 3rd + included day of the week, which would be 4th + actual day of the week. + + + + + Create an with no specified name, + group, or . This will result initially in a + default monthly trigger that fires on the first day of every month at + 12:00 PM (n = 1, + intervalType=, + fireAtTime="12:00"). + + + Note that and , must be + called before the can be placed into + a . + + + + + Create an with the given name and + default group but no specified . This will result + initially in a default monthly trigger that fires on the first day of + every month at 12:00 PM (=1, + intervalType=, + fireAtTime=12:00"). + + Note that must + be called before the can be placed + into a . + + + the name for the + + + + + Create an with the given name and + group but no specified . This will result + initially in a default monthly trigger that fires on the first day of + every month at 12:00 PM (=1, + intervalType=, + fireAtTime=12:00"). + + Note that must + be called before the can be placed + into a . + + + the name for the + + the group for the + + + + + Create an with the given name and + group and the specified . This will result + initially in a default monthly trigger that fires on the first day of + every month at 12:00 PM (=1, + intervalType=, + fireAtTime="12:00"). + + The name for the . + The group for the . + The name of the job to associate with the . + The group containing the job to associate with the . + + + + Returns the next UTC time at which the + will fire. If the trigger will not fire again, will be + returned. + + + + Because of the conceptual design of , + it is not always possible to decide with certainty that the trigger + will never fire again. Therefore, it will search for the next + fire time up to a given cutoff. These cutoffs can be changed by using the + property. The default cutoff is 12 + of the intervals specified by intervalType. + + + The returned value is not guaranteed to be valid until after + the trigger has been added to the scheduler. + + + the next fire time for the trigger + + + + + Returns the previous UTC time at which the + fired. If the trigger has not yet + fired, will be returned. + + the previous fire time for the trigger + + + + Returns the first time the will fire + after the specified date. + + + + Because of the conceptual design of , + it is not always possible to decide with certainty that the trigger + will never fire again. Therefore, it will search for the next + fire time up to a given cutoff. These cutoffs can be changed by using the + property. The default cutoff is 12 + of the intervals specified by intervalType. + + + Therefore, for triggers with intervalType = + , if the trigger + will not fire within 12 + weeks after the given date/time, will be returned. For + triggers with intervalType = + + , if the trigger will not fire within 12 + months after the given date/time, will be returned. + For triggers with intervalType = + + , if the trigger will not fire within 12 + years after the given date/time, will be returned. In + all cases, if the trigger will not fire before , + will be returned. + + + The time after which to find the nearest fire time. + This argument is treated as exclusive 舒 that is, + if afterTime is a valid fire time for the trigger, it + will not be returned as the next fire time. + + + the first time the trigger will fire following the specified date + + + + + Called when the has decided to 'fire' the trigger + (Execute the associated ), in order to give the + a chance to update itself for its next triggering + (if any). + + + + + Called by the scheduler at the time a is first + added to the scheduler, in order to have the + compute its first fire time, based on any associated calendar. + + After this method has been called, + should return a valid answer. + + + + the first time at which the will be fired + by the scheduler, which is also the same value + will return (until after the first + firing of the ). + + + + + Called after the has executed the + associated with the in order + to get the final instruction code from the trigger. + + + The that was used by the + 's method. + + + The thrown by the + , if any (may be ) + + one of the Trigger.INSTRUCTION_XXX constants. + + + + + Used by the to determine whether or not it is + possible for this to fire again. + ' + + + If the returned value is then the + may remove the from the + + + + + A boolean indicator of whether the trigger could potentially fire + again. + + + + + Indicates whether is a valid misfire + instruction for this . + + Whether is valid. + + + Updates the 's state based on the + MisfireInstruction that was selected when the + was created +

+ If the misfire instruction is set to MISFIRE_INSTRUCTION_SMART_POLICY, + then the instruction will be interpreted as + . +

+
+ a new or updated calendar to use for the trigger + +
+ + + Updates the 's state based on the + given new version of the associated . + + A new or updated calendar to use for the trigger + the amount of time that must + be between "now" and the time the next + firing of the trigger is supposed to occur. + + + + + Calculates the first time an with + intervalType = IntervalTypeWeekly will fire + after the specified date. See for more + information. + + The time after which to find the nearest fire time. + This argument is treated as exclusive 舒 that is, + if afterTime is a valid fire time for the trigger, it + will not be returned as the next fire time. + + the first time the trigger will fire following the specified + date + + + + + Calculates the first UTC time an with + intervalType = will fire + after the specified date. See for more + information. + + + The UTC time after which to find the nearest fire time. + This argument is treated as exclusive 舒 that is, + if afterTime is a valid fire time for the trigger, it + will not be returned as the next fire time. + + the first time the trigger will fire following the specified date + + + + Calculates the first time an with + intervalType = will fire + after the specified date. See for more + information. + + + The UTC time after which to find the nearest fire time. + This argument is treated as exclusive 舒 that is, + if afterTime is a valid fire time for the trigger, it + will not be returned as the next fire time. + + the first time the trigger will fire following the specified + date + + + + + Get a that is configured to produce a + schedule identical to this trigger's schedule. + + + + + + + Gets or sets the day of the interval on which the + should fire. If the Nth + day of the interval does not exist (i.e. the 32nd of a + month), the trigger simply will never fire. N may not be less than 1. + + + + + Returns the interval type for the . + + + Sets the interval type for the . If + , the trigger will fire on the + Nth included day of every month. If + , the trigger will fire on the + Nth included day of every year. If + , the trigger will fire on the + Nth included day of every week. + + + + + + + + Returns the fire time for the as a + string with the format "HH:MM[:SS]", with HH representing the + 24-hour clock hour of the fire time. Seconds are optional and their + inclusion depends on whether or not they were provided to + . + + + + + Returns the for the + . + + + + Because of the conceptual design of , + it is not always possible to decide with certainty that the trigger + will never fire again. Therefore, it will search for the next + fire time up to a given cutoff. These cutoffs can be changed by using the + property. The default cutoff is 12 + of the intervals specified by intervalType" />. + + + Because of the conceptual design of , + it is not always possible to decide with certainty that the trigger + will never fire again. Therefore, it will search for the next + fire time up to a given cutoff. These cutoffs can be changed by using the + method. The default cutoff is 12 + of the intervals specified by intervalType". + + + In most cases, the default value of this setting (12) is sufficient (it + is highly unlikely, for example, that you will need to look at more than + 12 months of dates to ensure that your trigger will never fire again). + However, this setting is included to allow for the rare exceptions where + this might not be true. + + + For example, if your trigger is associated with a calendar that excludes + a great many dates in the next 12 months, and hardly any following that, + it is possible (if is large enough) that you could run + into this situation. + + + + + + Returns the last UTC time the will fire. + If the trigger will not fire at any point between + and , will be returned. + + the last time the trigger will fire. + + + + Tells whether this Trigger instance can handle events + in millisecond precision. + + + + + + Sets or gets the time zone in which the will be resolved. + If no time zone is provided, then the default time zone will be used. + + + + + + + Gets or sets the trigger's calendar week rule. + + The trigger calendar week rule. + + + + Gets or sets the trigger's calendar first day of week rule. + + The trigger calendar first day of week. + + + + An exception that is thrown to indicate that an attempt to store a new + object (i.e. , + or ) in a + failed, because one with the same name and group already exists. + + James House + Marko Lahma (.NET) + + + + Create a with the given + message. + + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + Create a and auto-generate a + message using the name/group from the given . + + + + The message will read:
"Unable to store Job with name: '__' and + group: '__', because one already exists with this identification." +
+
+
+ + + Create a and auto-generate a + message using the name/group from the given . + + + + The message will read:
"Unable to store Trigger with name: '__' and + group: '__', because one already exists with this identification." +
+
+
+ + + An attribute that marks a class as one that makes updates to its + during execution, and wishes the scheduler to re-store the + when execution completes. + + + + Jobs that are marked with this annotation should also seriously consider + using the attribute, to avoid data + storage race conditions with concurrently executing job instances. + + + This can be used in lieu of implementing the StatefulJob marker interface that + was used prior to Quartz 2.0 + + + + James House + Marko Lahma (.NET) + + + + An exception that is thrown to indicate that there is a misconfiguration of + the - or one of the components it + configures. + + James House + Marko Lahma (.NET) + + + + Create a with the given message. + + + + + Create a with the given message + and cause. + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + Scheduler constants. + + Marko Lahma (.NET) + + + + A (possibly) useful constant that can be used for specifying the group + that and instances belong to. + + + + + A constant group name used internally by the + scheduler - clients should not use the value of this constant + ("RECOVERING_JOBS") for thename of a 's group. + + + + + A constant group name used internally by the + scheduler - clients should not use the value of this constant + ("FAILED_OVER_JOBS") for thename of a 's group. + + + + + A constant key that can be used to retrieve the + name of the original from a recovery trigger's + data map in the case of a job recovering after a failed scheduler + instance. + + + + + + A constant key that can be used to retrieve the + group of the original from a recovery trigger's + data map in the case of a job recovering after a failed scheduler + instance. + + + + + + A constant key that can be used to retrieve the + scheduled fire time of the original from a recovery + trigger's data map in the case of a job recovering after a failed scheduler + instance. + + + + + + Holds context/environment data that can be made available to Jobs as they + are executed. + + + Future versions of Quartz may make distinctions on how it propagates + data in between instances of proxies to a + single scheduler instance - i.e. if Quartz is being used via WCF of Remoting. + + + James House + Marko Lahma (.NET) + + + + Create an empty . + + + + + Create a with the given data. + + + + + Serialization constructor. + + + + + + + Instructs Scheduler what to do with a trigger and job. + + Marko Lahma (.NET) + + + + Instructs the that the + has no further instructions. + + + + + Instructs the that the + wants the to re-Execute + immediately. If not in a 'RECOVERING' or 'FAILED_OVER' situation, the + execution context will be re-used (giving the the + ability to 'see' anything placed in the context by its last execution). + + + + + Instructs the that the + should be put in the state. + + + + + Instructs the that the + wants itself deleted. + + + + + Instructs the that all + s referencing the same as + this one should be put in the state. + + + + + Instructs the that all + s referencing the same as + this one should be put in the state. + + + + + Instructs the that the + should be put in the state. + + + + + Describes the settings and capabilities of a given + instance. + + James House + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + Name of the scheduler. + The scheduler instance. + The scheduler type. + if set to true, scheduler is a remote scheduler. + if set to true, scheduler is started. + if set to true, scheduler is in standby mode. + if set to true, scheduler is shutdown. + The start time. + The number of jobs executed. + The job store type. + if set to true, job store is persistent. + if set to true, the job store is clustered + The thread pool type. + Size of the thread pool. + The version string. + + + + Returns a formatted (human readable) string describing all the 's + meta-data values. + + + + The format of the string looks something like this: +
+            Quartz Scheduler 'SchedulerName' with instanceId 'SchedulerInstanceId' Scheduler class: 'Quartz.Impl.StdScheduler' - running locally. Running since: '11:33am on Jul 19, 2002' Not currently paused. Number of Triggers fired: '123' Using thread pool 'Quartz.Simpl.SimpleThreadPool' - with '8' threads Using job-store 'Quartz.Impl.JobStore' - which supports persistence.
+            
+
+
+
+ + + Return a simple string representation of this object. + + + + + Returns the name of the . + + + + + Returns the instance Id of the . + + + + + Returns the class-name of the instance. + + + + + Returns whether the is being used remotely (via remoting). + + + + + Returns whether the scheduler has been started. + + + Note: may return even if + returns . + + + + + Reports whether the is in standby mode. + + + Note: may return even if + returns . + + + + + Reports whether the has been Shutdown. + + + + + Returns the class-name of the instance that is + being used by the . + + + + + Returns the type name of the instance that is + being used by the . + + + + + Returns the number of threads currently in the 's + + + + + Returns the version of Quartz that is running. + + + + + Returns the at which the Scheduler started running. + + null if the scheduler has not been started. + + + + + Returns the number of jobs executed since the + started.. + + + + + Returns whether or not the 's + instance supports persistence. + + + + + Returns whether or not the 's + is clustered. + + + + + SimpleScheduleBuilder is a + that defines strict/literal interval-based schedules for + s. + + + + Quartz provides a builder-style API for constructing scheduling-related + entities via a Domain-Specific Language (DSL). The DSL can best be + utilized through the usage of static imports of the methods on the classes + , , + , , + and the various implementations. + + Client code can then use the DSL to write code such as this: + + JobDetail job = JobBuilder.Create<MyJob>() + .WithIdentity("myJob") + .Build(); + Trigger trigger = TriggerBuilder.Create() + .WithIdentity(triggerKey("myTrigger", "myTriggerGroup")) + .WithSimpleSchedule(x => x + .WithIntervalInHours(1) + .RepeatForever()) + .StartAt(DateBuilder.FutureDate(10, IntervalUnit.Minute)) + .Build(); + scheduler.scheduleJob(job, trigger); + + + + + + + + + + + Create a SimpleScheduleBuilder. + + + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat forever with a 1 minute interval. + + + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat forever with an interval + of the given number of minutes. + + + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat forever with a 1 second interval. + + + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat forever with an interval + of the given number of seconds. + + + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat forever with a 1 hour interval. + + + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat forever with an interval + of the given number of hours. + + + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat the given number + of times - 1 with a 1 minute interval. + + + Note: Total count = 1 (at start time) + repeat count + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat the given number + of times - 1 with an interval of the given number of minutes. + + + Note: Total count = 1 (at start time) + repeat count + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat the given number + of times - 1 with a 1 second interval. + + + Note: Total count = 1 (at start time) + repeat count + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat the given number + of times - 1 with an interval of the given number of seconds. + + + Note: Total count = 1 (at start time) + repeat count + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat the given number + of times - 1 with a 1 hour interval. + + + Note: Total count = 1 (at start time) + repeat count + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat the given number + of times - 1 with an interval of the given number of hours. + + + Note: Total count = 1 (at start time) + repeat count + + the new SimpleScheduleBuilder + + + + Build the actual Trigger -- NOT intended to be invoked by end users, + but will rather be invoked by a TriggerBuilder which this + ScheduleBuilder is given to. + + + + + + + + Specify a repeat interval in milliseconds. + + + + the time span at which the trigger should repeat. + the updated SimpleScheduleBuilder + + + + + + Specify a repeat interval in seconds. + + + + the time span at which the trigger should repeat. + the updated SimpleScheduleBuilder + + + + + + Specify a the number of time the trigger will repeat - total number of + firings will be this number + 1. + + + + the number of seconds at which the trigger should repeat. + the updated SimpleScheduleBuilder + + + + + + Specify that the trigger will repeat indefinitely. + + + + the updated SimpleScheduleBuilder + + + + + + + If the Trigger misfires, use the + instruction. + + + + the updated CronScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + + + the updated SimpleScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + + + the updated SimpleScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + + + the updated SimpleScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + + + the updated SimpleScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + + + the updated SimpleScheduleBuilder + + + + + Extension methods that attach to . + + + + + A time source for Quartz.NET that returns the current time. + Original idea by Ayende Rahien: + http://ayende.com/Blog/archive/2008/07/07/Dealing-with-time-in-tests.aspx + + + + + Return current UTC time via . Allows easier unit testing. + + + + + Return current time in current time zone via . Allows easier unit testing. + + + + + Represents a time in hour, minute and second of any given day. + + + The hour is in 24-hour convention, meaning values are from 0 to 23. + + + + + James House + Zemian Deng saltnlight5@gmail.com + Nuno Maia (.NET) + + + + Create a TimeOfDay instance for the given hour, minute and second. + + The hour of day, between 0 and 23. + The minute of the hour, between 0 and 59. + The second of the minute, between 0 and 59. + + + + Create a TimeOfDay instance for the given hour, minute (at the zero second of the minute). + + The hour of day, between 0 and 23. + The minute of the hour, between 0 and 59. + + + + Create a TimeOfDay instance for the given hour, minute and second. + + The hour of day, between 0 and 23. + The minute of the hour, between 0 and 59. + The second of the minute, between 0 and 59. + + + + + Create a TimeOfDay instance for the given hour, minute (at the zero second of the minute).. + + The hour of day, between 0 and 23. + The minute of the hour, between 0 and 59. + The newly instantiated TimeOfDay + + + + Determine with this time of day is before the given time of day. + + + True this time of day is before the given time of day. + + + + Return a date with time of day reset to this object values. The millisecond value will be zero. + + + + + + The hour of the day (between 0 and 23). + + + + + The minute of the hour (between 0 and 59). + + + + + The second of the minute (between 0 and 59). + + + + + Attribute to use with public properties that + can be set with Quartz configuration. Attribute can be used to advice + parsing to use correct type of time span (milliseconds, seconds, minutes, hours) + as it may depend on property. + + Marko Lahma (.NET) + + + + + Initializes a new instance of the class. + + The rule. + + + + Gets the rule. + + The rule. + + + + Possible parse rules for s. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TriggerBuilder is used to instantiate s. + + + + The builder will always try to keep itself in a valid state, with + reasonable defaults set for calling build() at any point. For instance + if you do not invoke WithSchedule(..) method, a default schedule + of firing once immediately will be used. As another example, if you + do not invoked WithIdentity(..) a trigger name will be generated + for you. + + + Quartz provides a builder-style API for constructing scheduling-related + entities via a Domain-Specific Language (DSL). The DSL can best be + utilized through the usage of static imports of the methods on the classes + , , + , , + and the various implementations. + + + Client code can then use the DSL to write code such as this: + + + IJobDetail job = JobBuilder.Create<MyJob>() + .WithIdentity("myJob") + .Build(); + ITrigger trigger = TriggerBuilder.Create() + .WithIdentity("myTrigger", "myTriggerGroup") + .WithSimpleSchedule(x => x + .WithIntervalInHours(1) + .RepeatForever()) + .StartAt(DateBuilder.FutureDate(10, IntervalUnit.Minute)) + .Build(); + scheduler.scheduleJob(job, trigger); + + + + + + + + + + Create a new TriggerBuilder with which to define a + specification for a Trigger. + + + + the new TriggerBuilder + + + + Produce the . + + + + a Trigger that meets the specifications of the builder. + + + + Use a with the given name and default group to + identify the Trigger. + + + If none of the 'withIdentity' methods are set on the TriggerBuilder, + then a random, unique TriggerKey will be generated. + + the name element for the Trigger's TriggerKey + the updated TriggerBuilder + + + + + + Use a TriggerKey with the given name and group to + identify the Trigger. + + + If none of the 'withIdentity' methods are set on the TriggerBuilder, + then a random, unique TriggerKey will be generated. + + the name element for the Trigger's TriggerKey + the group element for the Trigger's TriggerKey + the updated TriggerBuilder + + + + + + Use the given TriggerKey to identify the Trigger. + + + If none of the 'withIdentity' methods are set on the TriggerBuilder, + then a random, unique TriggerKey will be generated. + + the TriggerKey for the Trigger to be built + the updated TriggerBuilder + + + + + + Set the given (human-meaningful) description of the Trigger. + + + + the description for the Trigger + the updated TriggerBuilder + + + + + Set the Trigger's priority. When more than one Trigger have the same + fire time, the scheduler will fire the one with the highest priority + first. + + + + the priority for the Trigger + the updated TriggerBuilder + + + + + + Set the name of the that should be applied to this + Trigger's schedule. + + + + the name of the Calendar to reference. + the updated TriggerBuilder + + + + + + Set the time the Trigger should start at - the trigger may or may + not fire at this time - depending upon the schedule configured for + the Trigger. However the Trigger will NOT fire before this time, + regardless of the Trigger's schedule. + + + + the start time for the Trigger. + the updated TriggerBuilder + + + + + + Set the time the Trigger should start at to the current moment - + the trigger may or may not fire at this time - depending upon the + schedule configured for the Trigger. + + + + the updated TriggerBuilder + + + + + Set the time at which the Trigger will no longer fire - even if it's + schedule has remaining repeats. + + + + the end time for the Trigger. If null, the end time is indefinite. + the updated TriggerBuilder + + + + + + Set the that will be used to define the + Trigger's schedule. + + + The particular used will dictate + the concrete type of Trigger that is produced by the TriggerBuilder. + + the SchedulerBuilder to use. + the updated TriggerBuilder + + + + + + + + Set the identity of the Job which should be fired by the produced + Trigger. + + + + the identity of the Job to fire. + the updated TriggerBuilder + + + + + Set the identity of the Job which should be fired by the produced + Trigger - a will be produced with the given + name and default group. + + + + the name of the job (in default group) to fire. + the updated TriggerBuilder + + + + + Set the identity of the Job which should be fired by the produced + Trigger - a will be produced with the given + name and group. + + + + the name of the job to fire. + the group of the job to fire. + the updated TriggerBuilder + + + + + Set the identity of the Job which should be fired by the produced + Trigger, by extracting the JobKey from the given job. + + + + the Job to fire. + the updated TriggerBuilder + + + + + Add the given key-value pair to the Trigger's . + + + + the updated TriggerBuilder + + + + + Add the given key-value pair to the Trigger's . + + + + the updated TriggerBuilder + + + + + Add the given key-value pair to the Trigger's . + + + + the updated TriggerBuilder + + + + + Add the given key-value pair to the Trigger's . + + + + the updated TriggerBuilder + + + + + Add the given key-value pair to the Trigger's . + + + + the updated TriggerBuilder + + + + + Add the given key-value pair to the Trigger's . + + + + the updated TriggerBuilder + + + + + Add the given key-value pair to the Trigger's . + + + + the updated TriggerBuilder + + + + + Add the given key-value pair to the Trigger's . + + + + the updated TriggerBuilder + + + + + Common constants for triggers. + + + + + The default value for priority. + + + + + Uniquely identifies a . + + + Keys are composed of both a name and group, and the name must be unique + within the group. If only a name is specified then the default group + name will be used. + + + Quartz provides a builder-style API for constructing scheduling-related + entities via a Domain-Specific Language (DSL). The DSL can best be + utilized through the usage of static imports of the methods on the classes + , , + , , + and the various implementations. + + + Client code can then use the DSL to write code such as this: + + + IJobDetail job = JobBuilder.Create<MyJob>() + .WithIdentity("myJob") + .Build(); + ITrigger trigger = TriggerBuilder.Create() + .WithIdentity("myTrigger", "myTriggerGroup") + .WithSimpleSchedule(x => x + .WithIntervalInHours(1) + .RepeatForever()) + .StartAt(DateBuilder.FutureDate(10, IntervalUnit.Minute)) + .Build(); + scheduler.scheduleJob(job, trigger); + + + + + + + + All trigger states known to Scheduler. + + Marko Lahma (.NET) + + + + Indicates that the is in the "normal" state. + + + + + Indicates that the is in the "paused" state. + + + + + Indicates that the is in the "complete" state. + + + "Complete" indicates that the trigger has not remaining fire-times in + its schedule. + + + + + Indicates that the is in the "error" state. + + + + A arrives at the error state when the scheduler + attempts to fire it, but cannot due to an error creating and executing + its related job. Often this is due to the 's + class not existing in the classpath. + + + + When the trigger is in the error state, the scheduler will make no + attempts to fire it. + + + + + + Indicates that the is in the "blocked" state. + + + A arrives at the blocked state when the job that + it is associated with has a and it is + currently executing. + + + + + + Indicates that the does not exist. + + + + + A Comparator that compares trigger's next fire times, or in other words, + sorts them according to earliest next fire time. If the fire times are + the same, then the triggers are sorted according to priority (highest + value first), if the priorities are the same, then they are sorted + by key. + + + + + Convenience and utility methods for simplifying the construction and + configuration of s and DateTimeOffsetOffsets. + + + + James House + Marko Lahma (.NET) + + + + Returns a list of Dates that are the next fire times of a + . + The input trigger will be cloned before any work is done, so you need + not worry about its state being altered by this method. + + The trigger upon which to do the work + The calendar to apply to the trigger's schedule + The number of next fire times to produce + List of java.util.Date objects + + + + Compute the that is 1 second after the Nth firing of + the given , taking the triger's associated + into consideration. + + + The input trigger will be cloned before any work is done, so you need + not worry about its state being altered by this method. + + The trigger upon which to do the work + The calendar to apply to the trigger's schedule + The number of next fire times to produce + the computed Date, or null if the trigger (as configured) will not fire that many times + + + + Returns a list of Dates that are the next fire times of a + that fall within the given date range. The input trigger will be cloned + before any work is done, so you need not worry about its state being + altered by this method. + + NOTE: if this is a trigger that has previously fired within the given + date range, then firings which have already occurred will not be listed + in the output List. + + + The trigger upon which to do the work + The calendar to apply to the trigger's schedule + The starting date at which to find fire times + The ending date at which to stop finding fire times + List of java.util.Date objects + + + + An exception that is thrown to indicate that a call to + failed without interrupting the Job. + + + James House + Marko Lahma (.NET) + + + + Create a with the given message. + + + + + Create a with the given cause. + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + diff --git a/lib/Quartz20/net/3.5/C5.dll b/lib/Quartz20/net/3.5/C5.dll new file mode 100644 index 0000000000000000000000000000000000000000..2130d1fa206f3d5b518d8863687feda53fa93395 GIT binary patch literal 272384 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 DUP$wm#uw^Tg;I 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%0D=-zY5VyXNn#{O{HB6F18* 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

!pr3 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

E5QTJmKj#*srU<-d7Ut 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⋙0kLt%{Ik5f9d3A$Z!pRsqWNHOUJLZ#c|xEEj}F05hYLZ0B=3ps$8nCFI^O6tlrbRBAAj{V9C0{` zDc6tp_TF+~&LJM`flv>QQK$#UD3;oiLT55DRG&zyPbAf60(sgscg~c|CRk@r8=N~M zTE$RrM?>0N@CWq#Ko9yrTgvSo96Ne@J3&2Bp6b@yn660P~|so%O#>AfLUkkT7+=+O42tNw{S-V&5^5}ZF|YS-M2P6P&BbH8$8QriKP z=P0GuiP>$3Qy6=oPB`{}yA0O(cw1Z#FSfbV`a49GJ{{Wa5aUmDZMRfO zI?=1$8U@$zH42VSO|jraZ*Q!4zejIx0_C|wj(UX{*B1C) zb~qdtPGW8~kE6U?q}%JbrVV;M)?NGL`>$i4jD3Bxg8Q&4ttJf%kLl6Wu4p>*2?qOI5kvAG#8ht|1Mg<+@y3YYKI?;G zVAOVkyj)~UP&VYSB`A_s_=}#BeZB~~4lx&kZpnB&^4{_M-ls*-eTaDwB6jGVyH1vQBS1L_ax)yqZ-G2`@+Xiuz5&XylQ%s9@D1?54gt!!lk;FT z{u*QvS`~}X%qrr=GpIl>t|Y-;TuDN_I2S^^I4|zOx4x^lzv()YwW65QWP6fbNcJWfPjWcP1d@|U&LX*xWD3c3BvVPIkxVB! z+>7gE7RXICvLPl{WP9=3^4V0AY%ltGHq|E^+BLk%MX-4wE_(6ID#_FQ{I6Y-+-=Xt zhkfW7bbe)c5{&-p7n0n=&ll>Nq+|}u)RuZO&KGmv6W7j%cfC$&Z&A6|z2BaH6=HCH z-JxDu>Z#JFc*Q$jTuX1kS;vM}_bDF7`kk)#DLx6#)!_@lo~JLQcirbHQ1nRG!=9s| z2IN2S;LWZzmDes5cAo@Kh*QqNEDH%sQobDWoqA8K-)D785!kDnq0fgzqzG)|W;hC8 zYIn`E-~!HB+bd*Uh71&uoVCt5Oig)x)FWnw$dHkDDOR zGg+m&ZH9HARJVQ5198eV4_+JoNPTkCb?ySxko@zWC-=hkZi-jG2*)6AQIcU7_dv`` z7uQ2fTatZ9jw87YZ0>m)lqw84q+dMPEx`N5#iQNsd2%3p&vW-;uDIv%TmsL8Uj3$9 z32)#f!+n_M;9;fqrDENKyxKH4V^Lm&aAmN;aH~tDyB}6MknDL0V+Mn)O4_R4j8V^Y z4}~+#3qhfDWt0!v?rs>WEV)z{;_0ZTqE{DDaiqFXOd!PsQcQbF+n&+}Q`+{Fwmn&f zkYxy2hElIaLVtqKt2jD`MareZ?!)2}koCPkTq@P033*F>Z-L7}J)+6}rt7K8FZGC_ zoLhq2RwJ55BwEGQHCn|Qwx?2BsyOf3Q(1Tx`biJ)rOS<8YpLQ)>_Rz2t8ZS;ft>MN zYZ#1RzMjLB9+%P@;FAJ*1eCi%&pZN0lMKh?97_wePT-FiTMD)hYO!8K}>g4ci( zAO_{{i4A%V@U+Wp2J&)|*LzOzwz$%%XOj2LE18}o?~p44dw%GhcI91&Swi7WSK#}^ za2F*Y?51n?m9;%$u4MH}cDtD|&NzZcjjgcb85n0*n;EyU zKPy>%J?G^0jm%@OmztXSj5p;c^MFoe|t~zTzO+<`oCYHn%yb7kv}< z2NZt5_S;E))*h%cn)Y!C?&I>^!~TrOpxMf1c6ESV9b#82*;S^KTy=L+xp#L`t;lpz z?QM6EtCftDllUDJC(U<`hy8)JkOs~ku7 zgAD1Uc2vrotqxju8o{G&9Pw=TRKw>to9DnE)Kd1x56*x>l2_4#*_ZA-zGXkxu7ki) zEeGvCUXed0Nr;v;9iYrlJ!4{C}}Zsvo#emXzS z>UNIFN)F{Jj(^aIIl+MQJYgoqFw{eJM=iIZlu@BqWw^z9AwsN@JoK$MtoRo*JaA|IJQop^H*Soek zsVuf4Mfbx`ipf?dt%F@9HeYi^bQ|a1Hsuf1sI9Ve;Aii%y0e|F@cH#KKX8(LTGiPQ z^`b=j4Bcew_Q@vraNL?>&!Tc!JK<)Qz57D898kEH*V*>7#I+SUeDKUYNX2jBDz>wd zTlzlcti)Q}>t`Nd^*+w|1C0APCb{+#Klw76>lpiqJHz9s{KV-PkG-fT?c;HW^GW+& zqp9V*u~SgDe~wOZ_&*V`8b@I5kNz4*)7o3ks&TZgU3b_LD+Z68ZH}2ic7q6ZXTZZ;B;;dC%17FN&+T9de z<+%9tqcXf17wx_zMl+h#F`Mn0-LH6P_VKgWgnX#71v4>^j_oyW-n~7x*0J*0XJa=5 z-;B}x`jXj)kkX&UA+9-xoHTB}3%)(R9(GQM9~6)5E{zY%cxLzd6K>A@X!q1O&CP4# z7>nVG@N5U6%eIl_%#C8MzsAbF4NB9z$K!rxmcx0=8MeHVfEh zDchtO!~>-y+kZQt8aCg@ocjLPR<&2VXntDlqM2YR`!mADvm`O&)AA*4qW05iOL}uT z_I6(RX(QB+d>RG5{ORH)!@$odJj40qb4$VL@!6G2&OuqPh5DG!ZdsD+%vrY{NUJxw zPFnr28Refny~Jibx%&AfnH-AEpw&Ohz2A@zgd=3m^Lp0^7xhjfT-4|IUDVrz*fh=< zV$%?tc4xV|^|b z%}37cZOdA4Fy}V*p~m^$X9Y{CewHuY=%Tq>i}UW#T_u}2CR;fs2Qgp6$j+hAiqjWM zw{iV>M%AAg&m7Zny^BXf*uVeG+g#3my=)uVhgV!QYTU-yTg~at{k-4#TRE%;@Jr2q z>NrOfeZC>Om1FxR$95AWs}W~yW6lR0)*cS)0o(M?_szv(2i75NHt*+I%X-@yKi``P zf3E4XY#+OQfakpHZEfJUp&UDwZDM~`LH*{~wa%A6w=GADyZVTX{hTgJ-4z9E9fUVC zzRR3v;Ocqj&2V+<@&|bSxXJ1KBEEc+^QbT0nLx8(%!pz7vv|yzwdEhnU*S*=a2$Fg zoWhS+(Y*B0L@65)!avpH8?NwmAZ4a=+_5*OGt*T(@z%!+f%?-Z2tnjZuoC6$V%mSWm1c2j>IB=4239!Jp2{_r<1S~Zk1y&k6 zfYrw9z?sI^z&XYtV68E{2lClC8`xmv0z*b6u-TXgTx|Rk*lrvEb{Ot#r(7Z2)d}{RjAr>(rCs zgKH!36_Wu4b;G3>i;5)86fgiZu1@3h9Jq4+A`G8-z9tG}m*@h!^t~}rYR~zsr z*Gs@duHhq4XWW&*Om__Ea<2n+cRvN}<^B(_uY2sNs59pNg(){mo+Z&}VU z$hWL);DD^7fPQ5a;gI!27$$fLpu&0DQE2 z-nsC(2Zf&5gF<)ppwPSbpwN5upwRpFpwN%*L7^Yt!#B<)2J~nE4rcYqtbUVyc!z!X zfPL7>KI~y1zF;5ru@B$&_>p|erVx*39FR@*d2lv`esVU2J|de!KRug5ACpa?pUtM@ z*>n=C3s^mw)upViWOX&GXR>+@t83vKT6#9+!%f-yC!nQg_c{+{ntcXvV|E;PPxfQy zxy1b(pRMfnQFgnHW3ruN@(jo1g>1@)vwKqf$M>W-PwGi=F6c>dp3KADJba70@?F5X#5bcfi*v`W0Wg7goG*I4fp$1%NEOdLY|mld5YzGZuj zqL9sFqLJxE;xA0E6z^R`_OBB^GTi{W0{ZVoZLZ%baIR(IkWDE1_hy9#>{T?=E%|%8 zNxHJTq$_#~amuubLx|ovbK;N7yZoBAk!6!jb-_4)l|e0_>;0HyGs23_HrIAoWi zHr&P|eFo?t$HXCnKq;MG#b2iA3dLWq^iM0g19W!IuvVf~Id8^^j>~zNX@1VcA*3(K zc`3eI@rhRDywysS%!!hD2JWkpd!po?D47!_^Fg4ooZA)>t;#7{L^Q$wfcdeUUd$)= zWKQn$K}k=vD#y`Al-v;|bDuINO8yene6qJfnG+>*qGV2#%r_`=qFPV(NKf{5D08C3 zC#v~mf4AZj)q09A>B(Nk(d6!n3yG3BQO+MwG9P52RXNock)G@k<#a23J}BicQOzg! zKBXs0?ucqW+doFuhaHM$94qztpes(iY}p3T>rPy=EdO|^A9R8=-;g8g)ec2>E1JTh-_{cc5VLsdK!9jNFaMROI+SJbPhPtj$Hu26Knq8k)_TG1Vf?p8G8B$cm<<}2z` zbcLc%qhsg(Q&HP#Qa@19Tt&T#E>m>9qE9QjOHteD%Dtkwih32@rKs%;WlzynW2m3c zSg`3#+22n(SDM!<+M(z=MYk)uQ_&a43*pPTrgbMMrDreeH@AujQtt-!4U7FwXj3!SFwKa!c9ysUl=@({JUb&DyBCr+5~!0&fSY%Wc^Ev z_A>o&k$WP-&-q5tIg1C79`PFn>dX0Qu?O@@#3RW1`E4&UZE4%f^oln3B(nEJ+c2gr zZ62m?w*{H*Yg?uGo0$I6_9D|O+V+C3$cbJk>Ai{$xGqW~zDc-AC?`U7I^xGAETG5?~?ow3bOLsO!2PisF(MgKt zDq5?kSJ4hdmnphV(e;XMSM+H`cPhF|QBk16S9E})*u>@ZOj0yg(ON~ligqZvPSNd( z?o@O@q4G!3T17h)U8m@FMRzJHiln;%icV6rR?!Yc*D1PP(VdElV&z`ZNs2Bjk^J>l zidIYdw4wuNDR<41PExd1(GEq|DY{+Jor>acFX!6;MJFj*tLU!9(%jZ2X~!j!u2Xco zqB|AEPs>aH6s=XXL(z4LZdY`tqBtxp-6=Xr(ON}26kVt2c13q8DlS*<6`iDLt)d-@ zu2XcoqB|88_|+F`4>+tWf#?ND@`qT3bSsi^ouxmR?OqP2>4D7sGbznAuf)5htp zbxYcz=sHEWD=LnX<^vSn-rvUZ_)bN|0I46K=p;pJ72P?|#`&}EWNEM9RGXmr#&%GW z>vt+DMk;?49Xw9j8(bi%C{pH%ZUkk2N|ir~uB(vx?TQWvO8q27J3y)2*C|T33ov5g zBl^CgA1L~vq8};xv7&p#CAojfeKogd-rT&FybJSg&Rd_iC(oWgF#o*#%KUJCTmHlO z&*gugZ!b8#V0=MIL3P0e1uF~I7Ti{FSHXP+dkgj#{8rGb@Z7=~g$oL=FMO^rqo}&5 zvFOI4TZ{f&^h}Yxcv$i1;`55jivz{Y#qGsc7vE95srX;T{U=YG9G!go{;Wv$Mb>b6VJar-+6xYl%9Y8`LCY;+4SwODpploS8;R2#)>~zJY4a3 z#YYu;D!#1vw&J&nBP)-uJh^gYWl?2m2d+Ou%*;5xxy<+N`sehZgeQM9DQ>x0U7FOL> zwY}=Ks-vny)fZQ1SwyK34WraeFH z=V?bwKW+NB=`*L#onAjZGQDm3Wz+vS{ZG@MpZ?kOFQ*@zZp=7x#^4#_XLx6f(Ki520 z^JdMinte6@srj|WIqTF}qi3Bzt7X>0S*vH=J?raPJ!j|49z1*4?6I>a%+8=Da!Q%Q?Tyan2nw zck|p&=N_DET;RGO`+`9icrR$U;13tvdBKYp+&u5)dCwgG+q}%$qiS<%XVl(O`)%#- zwGMAjugAO8dx`f-?}Oe)y)W0jQTI;Wk9EJ+W%%5_p1yv*<9q{s1-|ormA>h|Ileky zgD>oh`!4j|<$K-ti|<(f0RK>bq2KRc;BWS?@?Yb>*}uvEfd5(l%l;4jU-%FCj|yBE z_&s2+?^8ddzOMeF`n&2k*S}G}zuwj`xZ#Y3l7`t0k%pBGe`wg)@M6Qi8a`>**YI zLt3V_1Y6=Q_qM#!@^Q=FmhW1AYB@IAKRPZtDLOaW9Bq%@7kwi7Ui8~&k63Q3I93*$ z8;i%Tjr}q9SnSo<2eI9;Z(}{;ed9yoBjV%Z-gqRwB7S-N+W2kp_3?Y-_s55|SF~T< ze$JA~OT0_AEcs!{jEgV4_{)nAUi|yT{gw_}dco4Gmp;7o(9*1q0Uf7w6m{Iuac{@g zj>kG)=yacsGSU0kakt5h`%K*he)S5vUg8M+kHk%-(?mZp8n=~l#ZjUFcbg`Q z<8aUDc-%1>DCUYmq82xo>cmO78+0=61kv4}Q$$n@7Z-`s#Y)^{x}QU&JKb zWXi>QQl5Acz2|laAv@sPbGS?M67JNzjGIlb;?BY5s+q zPH*Fu)4RCk^gcrW0JoezM93ctulN$7e=mIEfbe5j35agC`J#`lUi8IHq~mNsaUyOV zjl@l(Gi+gT7H%1h#Vw>%b1l zO0mjzskqX18TLso7gyU>VW;E@vDS8#xX!j(+-$pA{LyxexWl$a+-w=IKp^F^fR6nM;R|; zpW_{oW9$?IjnBm?##iDTV;}Z1gvjYP6oX1B<10sYKy5#IFYu8Q#%2ofEaN$S#zFn= z3Aw<}8NXxx&nFau6Q(uS1supB{QSu&emIG4yJf?izX>@IOOu1I{>! zQZ4b(lPE?1$N2F{lrG743@1Ci8IK=6!GTl{&j+49+yl%XUJk4tPB9M;p9yux@C$&~ z45ygfF`WF|%%;yUNPX_$u==Y}6z)%qnb=?z;t0n6jHfbA z8vPyo35+J2ZOplBH2H8XtM45B6HNcc_%F8e`RL!kIl$^(W60*$W614qV~%wutH)0u z{$$3Q3AbVe^05hj2R<|51)wyQd}-&SV)9M$e=jDtM|(=JJ||N*h}F{0X&y2i%{YNk z+Lvy_MipEQDIwoRmr(tb{Bujll`M;q#$~WmTyhm~ddaoGdNzH#jO=_?wjG=UW#mIe z@8_VFwYt|4uRz_moa_uOC)1J*s){8>4uA&h^YPoccbXf1bHTV(FZIuoyd4X#$!zXiOp{ym^9 zuY>heQoq(y=$Q@Fx6ExI^}iTDX>j+)d?9!)(8}qvAZqeY>2(j(M};URb)nw|2+?Q3 z$blNa4y}gzAfvyDe2z6e2adn#-@txhGPT-~@sV+pA)Xl_S0j7RI#Gzc2*q%EZ_1e} zR$maIJe0MoF+y=Tybsc*bR~U|zRCJ5dyG{r6yi0EH!`kcwEDb>Ifsv-^wSzo8ABO| zhg&GN#nJ6Z*Q_X|D99+|CT&W$>2_p3NFOH0D7LbUq*|7UHI33#x{^MB5Tg*SK7SFr zdyo)6GG@lNKy8hWj7hpHX-E1jU0MB+F|>v_D@rwAx{|(GIo24uT4_yK_5&}pzBvS= zA#)DaQ$HhfzI-9|)v|6(Ur70R0pmrCH!)hvRF`AtK1loN{(QFRgrP!wyJ!&br$y8v zY>O$Z?u#i8k6uhQbJ*fxFde=4G~mR=JVrCtGRl@E>qC6;nXq%wV#jz6?>?mt|@#U&)ar_1iL%8Khcs zNPe)|k$fvhsu!%Fw$RSFnsGg&)&6xW$tyck8uA#JFv8L!OA#PxGPQNKo-@b<8wqeaosGn#2dd*y@53HFF zJbG;-@PxJG_GHE}YpJD7V6`kG*)vyOw{ENuFJ0gNY$0}DKNR@G^``=VyPnef^9?k{ zb^in5iGT2eKjIIKz^_^U^fr?ntNIX+bo*{3{sG39*v_x4?sn5PaGTSQV$$!X8=yYn zCW>L%P4`26FOQp7-b8L^+)TKDv5ir3{>|!NEu68pBy8sNdod+$GCmKooxj~eVf~#^ z#-!#};zSs&skmwJLHL80QO-fB-FhOh$88kKgLjbq7Z_!Uzk7#moDh5N$O2kNjiNu3 z%?lXgj5lnd^16|6;}-JmK2}?MY3ajrTRxp2#7A4c0$TfoVfR!2JobL_xtLM*4E4tm zr-DuAFiP1^&SK=8qVawTy@Ord#(2ki;@rfzmhr;}-=2sU88K_ddtf|+9*nnu@C$F4 zN#jLcy!e4vVDUnPAr@jzZHPspH*hiL)dpU)=m)$|90j}x?|>Mh9rJ2KTr5rit`z-& zmtcmCw@Wd{HpFFO2=D>Sv+F7RyIJm5JtFYsKO z4>%69bVE$S9Ni{zfd=N{L8$W?3o%zW@S*}?k*x{*Vj$il#M~V(w*d`tKIZQ>Q35nX z1?KREsKgB3CZ+)KS`TLOHc`bm4KsQ}R5MPuT?GCNpdn^rhHn!!Kts&3ErohE(7}>YEvF#VUgh=QTHgbGz*>sQ<{g4l54^)+PwoWA(u%?qu9xyBC~|SckBQyRZ^r zh(FmLfckF6zhGU$5ce_OZ+jU0ZCIf|{b76ps}!gMSfj9se=@#>bqdr3#(&wK0{?9w zUTC&G4fUtC9Z>IK{M_~|I9~wq>ut8@q5cwRh_7&S!iIC7FGBsh?PaKi@hZ?}yarB& z@dnhHK(saEpFoH47BI_r8`#}=7p6TJvyJz`>1BKf>}`AuejmoZ#x8JndMCeFD(H`pVZ(_Xiqcfbk8~0~rSy`@uPpaj@|{ z_(K>^GJXJmDC02WNAOPp8e+I{5b6;?L!4^-0`*9sAx<-Xh5B^HQO57!oWVHSz)57B zQYAdg$gmmWOvbT>9h|d)Xjz66>T`i8Wy1};)5rpDFnWOhy3rH(hJlwA#Qzybfd8h^ z59+so__ZbDDB#=1G2pzz_^xprIPV!Jfb%}kz!}s2P=CnykueaQkBvd#>}1?!3<2j8 z<0Rm2V;J~*7(X+HgYzll=fV88^-;{ zSn$6C8sdB79H*a9CRW z4n%*IQ4F;Wh<7gWUIJ=YMhVcFQ3iBnRKT=b#uTV=vkjP)Q3dRsF%5WU#th(wj2hs^ zjM>0PGUfvNX3hhS$n?VPsf?#(`oI|pw23n^15lsNI6AW)oH0O@X=V`Wvl!3LYy@X4 z<2jj4;GfGlJ~IOTIG|0Om)QdK1jdP(xLP76G3I5qf}hKnpScM90-zxZGuxmp0ve(? z^CGAx0}WA@fq7Tfx2I?lDAtIS;fz6rM0ppoBfZxivIP*qu7BOC!c{BKJK>Wf?=B-e#1Y*3) zydCPx7%$Jf1DsVro477>J=E7S-kG@poDD!j+>?11)SDQe%)A?%Cm3JK+ywOpnfJo< zL!f~(&|9GX8i@Lkc^~jMoa;v)Vt)wO!~QVvDElM8LH5Uh!|aa(Pq9A%9A|$DINts= z@I3nt;6(egz)AM!fw}e;p?LR;r1462? z{|H=UKM2lZAmkbQFHm0yggj&a73y}NA(q&G2VQKq88)#LXowDb2Gq-dkZ|mFs4oRV z!m&G{z8r`Wx4WUf#-0WB)r_~;dq91sy(jn^fM|F2-caAgc(?rsaQ+0eiTmySpuUgs z0sB!3xaE36R%u{Vzk2x^%%xnhYy@dKuC0s0MvPm1&(@f3W1R296_MR(FmOD zXad$cB0#UB1z6{Z0h=AIz!t|MVARnDj5#g>#vMz5t&XL@g^p#wMUEA~C5}tr|HX_Q zj?2JV%DBw23hL#KD`C0<2)`h^^PsT zJ014{H#i;uZge~Zyvy-0Li`iZ5O+Hs0p9C)47l0xIB<*O3E*EGPXX_9JPo|xu><&k z<5}Q?j^}|7IbH;Ab-WCG*zqdxua4J%k2v0d&yOz5@R4_!=mj-@v}zxgTnm z^LyY(=MO-S^GDz`=Rx3f=P$sS&R>Bw&fkHvoVE-@%ywn~=Q-^eHc{tvLVcCf4P5Qa z0$$_n0bK9w3B23c8~9h}5x~DW`vL#uJPP=s^BCYR=W)Q#ohJalaP|j&?HmZ)?;HgD z&N&4B|KdCe>Yo`8IfsGsD-daM4u|@8AkyMG6>1w0vVrR~s52Ptt~0>NWbEM@4SqHd zEzWf&)V&z{xW@{Oerx!0TN>;JvO!;AU47Ot%104_y(c?_+$x z)dJ4_j1RhE;6DUJ4Rp0ay_NAX*CKEpW&FFV4g4Lhi-6C#mVp1fYbn$(05QjOEra?c zpdns%t$_L!#(%gj0q0f5*Ibu@|GH}x@D10M;D6y-4czOx2AnTlYk^<6t^;Sk>jvO= zt{Z{hyKV*^aNP?0!F4$!T&SkX7@MXZvmptxc5VS9}u<0{XNtV zFh1n|0h|Yc_ zO+1SS&Cr`MKIgWB^E~5=ZYTIJFuv?|gZ~N;^~#+E^*?}yc+K4d>eqpo=em1B{ZGb! zxqE~27USFQBfx(LXoz>+{h)r2@dNi!;JnZHq5Bx{KVsbJJ`VhkfshK^CqTW6@l$ty za6V)F!aWfD&l&f+2Z8@35c4DV5UBS74e@XHNl<^oxZgbtoNpPwcMpg9fcsS7&+gM; z=NBOAv-=FFe+8m{bB_l8?miPJx{U>%-R&Hhjs-%R?KTehZnp{GyaPlkx=n=oJ;qPF z<$|+^@tbb>;C~B5`|4H*^>;wDuWrRqA7K1XHxD>JF#g!B1nQrvY0RslPQ7`tUn z0msdll~o0PcOd57S<`?gWX%BPWYqxsXUzr<$eIfrm^BZ0VwM*;D9Z;NoD~2L$*Knq z%?bif&T0e>%W49ik`)0C&uRfyWyOHiS*^fnS&M*kvf483;%KbkZ4s0DxPfE(IDw=3 z*ntIovVcW>=#AF}eR|?8-`=p>A8T!AVg0NSt6|f`T%3Dp!YbbqtkzvEZWZ@nMQ$6` z&i;Y(Dm%qq@txRz!iBlZbFa(YllyhYiFy zHMc5I)l~I<)$XdVst#0TS06oXz_gR6Jvy!b^pmGQHT|RMqh~bE98xo)W>QT_&5WA% znkQ@8XZ>;3e`ftQ%Q1WV>=$N#KKqzC1Lx$=DVb9>r)f^>oF#LvnRDZu{8(F1IdPcSqfhy3gvy_^$Fj;`_ws_K)#b`7ie0;os(e%by$Y1nL5f zfm!uq8>$-W8!l>C-SAMulMSZ_OM^ARg~4}%pDozG;Lw8ZjmI|*ZVWeG-Pk*HeCX`Z zme4z)U7@|9??Ty4txZdsE^WH8>6Gxe@J-=O;enAgk((mxBQG@XY~I&=Zp)IEOIxmP z`9sT&mh9+J(b3W3=#=QJ=(6aw(c7ZWMqi2kGx}xhi1uUK2ezNxKC!*H{et%S?UD9H z?H%oNm%O^G>{~MVV*AqUrROc3xpdjm%a?w$^oOOBI-cryuj7-B>Sezy-+3uy z+|0}ldQF`EUch>f5Km6R!Cu87E}a8y#GN&ITO3JQ@~^B|FEmKZAj#XRYoWQT2= zk0h0qXA`^A?AgS4?5?ERyZn!-ynp)#)6vu<|Nia2@S{|oO}L*S9{o`aH{!H!0~Dlw z4C?M!3Ga;)Wuve@JqF*I_|C#N7T+A4Bb$rw0(|rEEfXDLjkrc^6dSPW{47p;y@%6Y z@8Pu9d*UN}ALIK0?*4=CM|?lwJBaURe81p3gzr~;zv25GpTJcS8$JVH2EI&uc6<(e zPJAwWZhYPFW#Q|NuLr(td_D2?!q*#LAACpP>x-`+z9aD+h1KSx@g0NjSbWFfJ09N& z_;T>|$2S1qKzt|S8-#B#z9IOA;yVf7$@qrhI|bixd?WCkif<&o)9{^+?+kpS@Qubd z2H%i_FP&g4EM3{BrEF!N{#9qW zmQO#|b<^|*osZ$`HRCMT3VfqyUfgSGNk^}xHD|e&*5qYn)#hdOuJvdC#p};rSnALI z60~QXKf4m&Qhb~7?Z?-@%Ab9!&!7DqzWw<6`u*7x@m+v#^vpGV)(6(~xf|aWd=KG! z4Bu1u-oW=Zz7O&3##fiWrVqvcd#Dcv#u?SYHGM8y(CF9{Il6D&61&I|4t!30E_`l$ z-SB1M>yEDnzTS8tq7Tk*_QQ81zN7FRjqe!n2jk@B5UkUq$j6sO{H>wDd16YdHyXci zq(2lAo~l5+_6*I*kAy-2UpyEIi^<+tgEaG0MWXS5UuvqOfk2WGTVH3UMT zBCjtViMA!Yiv|#auOUF;MoWXScpw~zDr1pmP}SPpjIgwG)4r#=AsX=d5lYxw7YYbV zh+=vm9trph7yAOu9B+?yRpt$Q>k(Lr-qX~KR8I{wMdIX_%nCCmI_Rn(SxYr62!y)#k!We8o`R$7&_RmA#Q|SyJQ%JAGo~Yy;_K8vEYceF1!5{Vnby>> z6*rNYRl)kO7ny3txH*`}P;JPGEvPFC#JzrR+^g*pdt|OZf>>3dyaFThBTY>xb5B8C zWi+xd=!dr!C2ZzL!m+qF9M_Q?nd*hGcsDH`43VCxr#c#>jHwJnV_g2e0J1Sq?~Mlp z=W+l+HV2~dU?A4DRb4akk>s%78})>d?+d-5u3ZR3IV|gPZrEQP^@d}poT%B8BOyv( zel!w3jOzk#Fw|BZYzq7jAyviwNm+z8)#Pn%K*kDBHC3|8XkdPDaqc27I0bnLQ=Ji> za4;V9hJqJ*DT2At`j{vRMgxd7XWi6*FB0`r>E!xQPht_&vVv%EVIZnKNR+&#A%u}X zK|iu#ez3kZ%3fPcb=gy6;!0r2;!vH}*QoWL>bB-UX~gTF90;MDM0up58E!O}vNF_) zh8@-QyDS)+kJwN4hW%7ODfWn};`-qY1dpRF*`POC!FORZ~h$U3sLc)z_f42}c!CuP9B%c7Of5AFQ^SqG)S=-7{oXcHUls|+8$t>Fj6k5#qV<${vF76jesT!&cD#H6yn! z7Do+?YrQoq6fY*s!b|CSgwFUBKKJn+OLu1N+N5Duotfy$KsrmR*Q(a5Xi5umP?Ccj zva=vC--~vg!nGvQA`56qp#VLFFK&*gnoXl<0Y)thB&JG+39TAcQBhG8fyLaBr1De> zbOT2(gaJQbhLh+pWhgPoG&GW%7N!Q8Be5V0Gw5j$XsU<REGt#nfUpZ7B0(6D zLu{umXEt$tq*6iau3JD=HxT8a8%3b%e;VK8Vd2Ra@c4^K{^h=BawHZHqu1)pjB3BG zMzRrF7)o4fqZ%tSOk16rTLybPnCo$3M%3Gk-VX9zvsZ=-8;U8oBY_a9a*@UqbAU1J zn6;#EG0EmUpra`vaDeW{rWS3GIiG*}F#1jH$%!ouA z15qU(t1c^9VyS9_c+#Zvt+N1T1)`Cv;DrH8I4V7IzmYZj-yW3Jr_(yQZ17` zD}1CB!nipaXqIgUJRjy05dUH%BzA2=@>x8v03DS#d0=E`;6u3aLXu`JT5Gh8Rmg|V z<^a+xA=R@!7Q|FXkH5@8F3@y@)f5B|GOSBP-_L^*`q}>}0m?@K-(qI2P}FrJ5YtHz zPZ7XXzeYVu*PReeV${6L>@f3MgFJ!JzAHT{NveR5Vk6C5RdMBkrDl*Yf#x2?T!WSZ z5dBt~^s``*<|*uIUY8!G$r;*(PE4AG!*~@Bn682`ZzvR5gk18qMx&@ArWlYLN3qnk zqC-RPi(V_*+RU=q`KWDLfSQJB7eo^3_U5}0vQE#F6klho%pL7Tm*p%w zZJL1#f{OXbFjiGHd&AtNO~sm0B0*#+$w&`@I$RY}qD3hN6{1omjez8#W!zL&Wam1K z*P*H-X4T>S4)AiC3Jnr&9BCe@ zB^vIqXn{})IBd0=a?3;WCT>j>ag|3h;!4M}K1z|O=FS7_73M&R!3~};yV4tsLTfR! z<_h=$3|xtY5%h1oG9ePB&fakEJ(5-)A^lqHd&2W0N=(L>go5YFTMgluIsYBeE^##WZ%qX9h4H9YMjJ&J&oW657jdKq?s0unOarX zih>Z%AeH!a{jBu1#u7RV>{cyFBuy4mt%u*aesnl;B1I!EE0trIYJVtp$`9gdwQi|V zUgb>8kUU{Dm$1LC4Xesn%G0eMOj<3rFqAl+%poz5gmleSf<%5OfJHJt#ywh)9H}M+ z!UKf};iCc|HGRlR0SR2R#DvbesGyZ6y>6z&wv_5k^%e4a6jfzmkd|FNvFVWzDm!HQ zn2PJvKuc=?LZct^Mpo%Lg~$ugWQF{ooD`K_43P^-ZZ3ypJD*!2iTE+LM{^-%fE?9R zqL}Ggx>2Q_ZmjJo3sVD-fJ!5gX0_(c<)v8x3@ezhhU>L>%UM;J#!cs-a#$jVtVTzI zcAd;tODH^z=IN)7tu{c5viPF7F;Uz(n`Yxl-lSMebx5&E$)-+NIxf=p6#Lo`5$)WB z!|ckaQ!gpfDGoaGgkowo51nr+C)4@xGmRNb^!SN!q^ddKlQU1hsEA^M0hz+=WJP@_ zQs*U^Mh6&Eth5Lx9HA>#g`e))EKzBc>WgV?wnR&~XtQRLXrYd)rpeJ2*5gm+>;9UW zd~#pIoS4}pNjsf(7a*$gP(Tc%oF~HhA+%8TI5D^Dj7PISEM%kiVaxeaoD4y_vh3hs zFhS>LN+D8=g{t~pI8{v+{TVd8SgQJXkKS0ZGUeopoFzsc(xKb8c&W;n z4A?WJPtstnNdu8-2Z|VZgV9J^PttK4kx^6T953xgMFOtbBes}}ol5BksfxK%VMkP* zbY}sn!rJ^|74yj}Shj{@I#5jQ2v*g4W5R*OEeaQXJQ}i|V_~s}1^`nFSDmS4aHg0j z@*4uQi9r&(@_`d+DaBZFd7$a*k(HZ{sk1bj((Dd$64IFHax_yFa=L+;jR~U#i8VJU%j%;7vqs1nw5c1@o2^sP#v@GvyNN^^ zu$5RH!S3EdOg)S9m9+{zA4c=WifFh#AZTnxMv!YnK3FNGO+VSC)J3qpBiE=y zZNd*h3Mbx4t#|0^wmlq8C z(WaOnX62FMd^H7biS5Rm5Etm zs@3x3JH>O#AHfEeBqo@q7dju=hy@IbeZh3@&e{) zEJbxo1Y$G1vD8d4ox&`|Wm>9YayljbO*hpX)I6S8XuWxeCYBhsyS9^~&2#(xd#aK5PMz)IKNB#*IOGa? zkJ{$&V%AJ^Xz6m~NEtPtRU?M(+)TgBmPD%-y0cI1*|jCz4QpTEL>pmt-+9j%6MmB0 zX;Fa&c6db+nCru zm;HNz7Zdp~BCoavrPneh5J&3h;04WlW?&4CED}xL#d*YHIg^JhT9&7jLd?)jqYFMA z%9!EBf;|oSoDMm*#W3xnomJ*rgkmz4kz~u{%A!q}ay}$XSxcsfmE1{HB8Jo`leD~& z4pQ00fjIUUuz=+8LqH7952B`_<(joz?J<+5DLg6Yly#Zo6sfLFlRPx{ZOM%pjL9Xt zGGokQOXP;hB3oQ^meM3^sXVe*W-VnIQA@Ft4Q`X26g^q)%Iq-ilBz}*?oB(EDq^V* zQptsH7CaQG1!`uWZWCRXfoavu>6Bbf&AOy)>mn7hH%resGj(dJC4<6DLr9fs{z_LF z4Mw6k_Qd^?siDkI(s*KdI0jgcQ&$k6&yQf)vpOR8jIp__d`Pm>5}O)}VsaM?*3*$R zJ!?YKl+!0a3DMM9Q6-ud_lah?fQ_9ATJTWECp0T`I*M-8^p2SqC z2*+~BP{opx2IogX*B*9ZRE;47XFMq_I5mxPjdJ`` z6(BJQu8b2xPRJL`IFEL6FcK>nc+!yCg z7)x=1rn*oYYcQc#M<967&L@uy$enncRcXTNirl4d*17^dbgGvVu$86Hs;jdOm@s3* zC&jup>x$2DG2M7#detu79odv8c`@Lroi&bb9Y(i2nJCnON*&#VeGhF|$`mEGmawA1 zha}YgB>RM|(}oD9dPqjHX#w`N7ACxoNsFlcnAYO(2|4D3SQ+RnFkDjg&b8({HH{<& zHvmg1$&MgVYGjVZSZiUCl@yk=#VO*XNGl0FhoW=Av|;88b1Z&XbH(D7m7Q+8i(E=~ z--X4bI3|jZMGG^g7CzZGH(AXzC3DCQtv#p;LUFNZlR{MWo2;0jDPAY`%nI6xebX$- zT_=@0$!!II!s;-WKsV4X6t*0*F<7gfmg#Zpa@D}<%=P0Om3Q}j9yvA(W)k4{R+S`eIeDOOUF8J4?$&x+Scw=r*cl()}4pxz+}KPY>s%%6e=4DJ=KLosVVt`DpaRT zI(vc@Jg?>UhjLFezCvMUtl-QANY;6|dNIWr}_M4$i z#eOkej<8(9L2XUa@rlp?uRS7eeEWuikMS_T_eUU!s$}{5M{WU1El!#E zqCt6kOmb9;Epb*HYrL&8nev!+0)mlNp0~63n&h1|mz001tKod3r4WlF+&i%7${^K6 z`K+)$WG1~f1@YWa(2Iiw00$Q?Cz` zUj;#Gdrc5x>GT$A4lV-nK~yYnD#xn7#zAIv-KlGHnX_G+(=E2HO*uDY&L_fDk%*~! zhk=01aMo6Kc2YYkSvy*3QSq#nl~!A(-6X5A)@$>EfX`~IwAwTeXW^~JT0aU$;AmQu zNQZ9FYQMP?1DWle7|0&B69bfGdg-Jw^_{hPjMmnwMnk$)Pv$(4r4~&$<)Y}3$Wj`U zY+7zXk{ye7yv5V=8s}kgiaLb)qF^B87vobsOSh5mD$UH|v)qukMm6D%cB$1oi3A_Z zty6)EU-||r&&d+v3u~=bIe#qHEmp18EODx8#R2-{lLCs>5|WLAn!PGAQKgw?r<&lP zn@O`~6%-PVtz7IYXg_uDFBh-P=3|}l`ySm_#xhYxE%%-w& zTSBE=kWB51g_B(T(wenU5?0NaC0Hrp{*`K8(Kr*cfNapYn z8=Q&6!Bo0zOFg2t%(W6fW1iz3mqf&*JhIZ5u5 zC3>sRnD(TkQ*Y5*8;Fc!s)=&Sd$pL5nBJz_Gy4NhS{LS)g2HPUU06zlLUOl?V|7G{ zkrva|rcP?0+QCb*mYz=7(oAGAamR50`6s;$5+|A6(^oA@w zOy*lWOKaiMzDiIcC5plGIWsiH?4&s>6XXZgX_op^U8UALL42 zQt&AucWuX#44sC?U~_V2Xaio}F!RI8?K;Th7U`@ZVb=MN2Qv;ZVA-N)MnJLF; zv4^MJ*zLz84_jDMN@?ex)u?Oa1{|+?_k~1ttH;S&o)Ykp1hRwoALOZL@_=Uppd5Qe z6W&(^Fh5k`BZg+I^t6Fp>vbuskZu}q8c3&KsIkOS?v~0ZQCuwHcI79nqRJ;aXogCW zPUcWZ`V?tGNnCht$^`5%i9t3J>ym74(UK|6pDpjQP|ztXvL(+t;#`lurB3$Jm@+=W zxLW8WJG7dqwBwVKlr}jUFVmOKwa;Pb! zv8(@PNBM(BudQpP*+*L$AEI^NoW?0Tu{SQ99@D%`XcTC$Ber}4*Iz38lh zBxO%pDUSay`Ov8YBr%=eNw%b0N@Pm9nKdDt7wJ|y$$)fAdZjnb#2Nr9SW?FDoxj7? z8LMMiQk_JGmhP~tgcYZNH;jFX)&Oyoo<^{OI+M%WIb3lQEDUs1lhbSxldkNVHZ{X) zGf5=iD5edXQcz2k&*=rbRGv9A;2B}MDa#VcmQ>l2pr__hSW-eJ>H8a$gLP#Ikn9Tj=2$eEP+YWdY_u3RR?P4Q%HO7ehN$r6w9)9NPKLM+)vvapwsHUCFz z$)2g&Bxh9VF{L6$<|W5Rt)f~pK^C3PM6(DKL-~>@D)^dgw^NH2WVJL1mJm$jX#Hu~b>sr2!Vj(#>=PJ2Ua% za6OhE&<<6^II^nxnz&$DQ9Y0DwowHu>!7+^z&q* z5LKlKV-WABR%5N1&(7tB{c4Ryl^*u)@M0tK3nr;7(=3)SjH#@Tnc$d@l-F_>=^baUrivE@YzdN@rTD^}6c{>4*fq*Png5!NUj{-?&rM>BHcxg_h+9He@& zC&te&M8c(LHdw63d3hX`#}=ShRwZ47%xd!;gGkA8LpSf$XW8@ zzZs`qfFU0-Vb$eKVOz9hN?BnRJ((vlI7X>8i)^VlCaN3REa<$-k^L@=$W?mzsux=5 z#1FYWtOfERxtr$4IMosvIq%w(_$xf3=Ad)Ru-i8-td_9Jm_tr&wqBrF@Uzj~%+0TCt^9XZprfLba{tz)np@iE;b zdn7#Yd(Nbx3Z`2f#m=fHbDRx99knc(sV+eco@s9dE0JBr#T=OnB2qA@n4e~X*zi+3 z7^?Fd@KzdjGL#6aM+%Dp(uI(v90Iknq2vu$ZCjNTG9nJenWJtsdD` zSq4Ns)X8zLK=*tqwvhSwPDElrmt##uIBBSn<9-;=Myjg-|HXdio_d<_E>I9-5$*)c z58|;S?zB8%fwwXAu_;jyQC%5U5W;@CRDpXEYCxm=`eA=Xw7J0>4y2i3eDx{&^ZB_k z{UEdsM)ilPplMNUhBq4a%tu9}hZk9%3%52~Y9HRF!n?(m#ce#5Rfp3Y78ac~3R-Jy zQES+T7fjSjGBw3WE3Rx~w8-UW+3==~GV{mj@y^BB29HcjHQ-=po_l! zF#WovM<&nB-dMLTb4c%^6FqGI*mduh{6IMOe90_J50>6fb<=it zx-Up;_X}dE30`^jdRjC{J&ZnmtFL%?Dj-7R<*X*FVJ>csGH-#pp{JjerPmesNvUva z6V=BU?ugS*0N^%mMYCwYY7nI5l-?pn_fzP>*ML98L{66Q9tNv6jx)oO{wPmbv#Km+BLG#FJu2@q)--LH&`oOUaPSlA2>3 zvM6P2ic^644idU1JYo{Jq>j!XGmoAKi8RBoje?S~AbYfkglUr(cSF=xAah_x#mux+ zPXlL)OiqJqD$in%w{7GBTp2LMM(!Y;!IGX< zC-|c*{84h}57jtaKia|{&3sHnq$jK(AE1!VSwS2+K`AXsmF7un#2ba`<-=k?NXad% zmQIwx8CDbNP?^a1sa0?3#?(+qN+aEvn(->pX}PBiMs;N{I^BSh-YK^ePdEqCEpsNM zvvuOTH0dM+o%nP&I`L^Hx&lawqpGT~xlFkjWx*vC)fu|XMhP9HR`5%bQk3SQmG;MD zJi|5D)aZ9vAOgtAFDqkp0@X9F+cV$W!^W+Z#cf+&!Bzs7`Q$8>bd}Yv6cy9h%8OLz zoj6TmDQAt?pTqEmUWp@y<=QZ|>PeK;)8=_(Mxkm--oPHQs3X*NX~ZHc$~e^s{i9l7 zQyB$@C9lXgX--*3zcHaUKg^6@~(|A`+_zv$m2B*7KSfCBlpVB-*fi$(Dk~V7fTquYq(yS4rtTV7zXNH4I*V z;O8?r`@qB9F@7$XBSDr-2JX#x@jRU}CY{`7Gg%litu~N<5L+7Z>9tOdDR!`|{`qi* z2uCZhz{CSCMIhzs2NzkgErgM5Nj7P;w}teU(qt@?$(MT-qbwNaH<_hz6;^|AUBEO8 zg@Uw&#!e~sabp|eTNT|c;QIj;VaRW62?H-y;&4W~o*rw$j|YY86JaH>RftJE6>btw zdCWZAy-D{_GOgZ8j@2`5hvOKOgTI*$T|iXT%+%@F6N9R=)lB-PO{hSSHxMIC$6P5= zc_@;E1$f6H$U=Y)eo8fZ8on7$`JLn^g`?{bMVYH55Hh5dt(KdUSXK>5-;1e&dBXfd zF}k8-6&tN50FqSupsAQozaWEK>-@Bn2nFWH`3F=`Lm&+{m>SIMxw9y>SfEHxwOXais535R?+N{ih{di*)wS?X)Lm9{uT@^6SGg!n$jj&;dKMm z09nli#LHSjnyFu$kvhnb{BtwZiz`<&t3m{T1o#`_hm&58BPT)gC@ z%T%a>PLgtEL8mw0DBoqpY=M6OP$X+PI`QN*_;i)0#B?gHQ1*0cP|T-Il}J?8irbC& zam!9^`dBU!Ga#N&=TgBP66KuiV&D;J@&fa*(8C!m^GvQXQTS%Fm%}r$RKrg&Xv9>b zB&EfowfdIgQ<5)fPCPitJ3ojci?lfGxA?EiMux5mNNQx3%cv(RoYd!IX)f_BE~OcQ z!$NwZt2#pcGa_I~K}uA~v!v)E+jLj0vQBky*tjOYZ$kxLZ(6ezXaK4R2Cgc@!J<${FRRewaI`R?s<4It=y3 zfxhN$2Bi4%8Q4^ALT`FQbp*W!ukDgr-=inBTET-c^}SpP%`t!@g8|)gf|U9%eYh0O zo_t6}IlX z%E?SpT5=LefyzvVHKv_Lzq6=gMPL2Wr;aCrbCSoWjCNF@AWNANERZ%{z}6yj$Fso(IhC+(q&;YHD}D%#ki0R7;CB?b4Z! zWbUXJIn%6CG!nNKI*$}8vwCXvznOQHO)QnAKTnvRHC>7X{J+S zT^b}M1u5h+c`3Fvn-)3Me&v6+k>s)EE`EAqlWMFEE6F)^F!JD0O1O!8FkRYLzt^pE zEa4ThOua>*7UllCm86);H!f2mB$-K(L5lQqyD65{0NaJBW+!>Zn@UN&m7p_jsuQu! z7jT@w4ev zf8iPV6w|-@M{6*Nz8A}FL{Zyt0Y{Pm!mvU|zKcUQjpA??xe(a!DS?HZYqf zzWmh%E@INsPtWQiU?!F}gH5eX(pfGRUg=dG{J0anTPxopf~QsK(r@_^vZZ^P(ZuGDXunLkz8MlBzQEn$N;&@C?cCvH)RaS|ZGrr-U9gl7J5E|#sx z0+lqT74#$V{)*N(RzoZX^38P&|MF*ab)14>Sd-309PZ7atD54?^h2#C10qzgIf&(c zlaudD=h1KQV!vA_6_YdkmVCt2<7p21mpYp{@YA|HA zBtm@qo;JIX;kppj;BRW{A;@SA&RUpGs1!{Ny=jdGoR}M^HmjC9%%2{kc^9u6`RF%( zOM_ut+CTCt?K#OT?Z#9!M6E zMV|S(8#jxV^0F&4ikLjz*r~HFj8N=SC{d2+Dmlak+L+^wB%GBDP%+T*qZCl(NH)HU zXr!II7~groY4*DCPjv2_s&*`|jm{UuWeZX|$(QTg2@|EqJYLl>?7XRE7r3LEWqQMh zIMjKqW_~4HIblC=YL9s+D5b9pL3HOe8S8Zw^&{r`3SO~!hRkAM?sMceW0Y3i3r(^y zZPwA`3p4ciISD+K*re13B8~+K>Q%AlCun0VFmE36NIIt)!A7Nll3r#4(dZTvJ0P$~`B646S;LIVa0vZt7E$KyFfb91Sy6 zYY0lsz7^Bf7tQv`3kX28H^8aT>hVgE*0i(*#qvA?oC43>zb-<=Q z3zHT=%)C>}=Q4fLOZ1|U2BLh9GLdwWe$7Wv=w&Nu+2U^$KP`)ovs9qXL0!R*iSaMl z>7Jc>um6v|w~f*BO7Hv5Bkt;Tmt0bowX!5@xblWlBvK+NN~_gsrO|Lijl?%`hLYE7 zl^$}2FA_PVW`?3>WyM3PhS!bVG;o8&2#k0U1c_k;wb2@_krq(UB27^TNYGFHP@rwl z5BZh?E&8QE`~O|neLd%#`@Wxf;mg`iyIRikJm)?y*SXI1ey($FMBr2ep1~l%3*;&q z+5Wxk!qV)U<|VcB!%&~izFUFf?1;`Rt{jqxT2M%Q`Rbx=HZ@MZie((^--n;7FE75p zm$=k^SP*HDF%{wr77@JC+(2yBeU2cgo?T2#XE`R3<}Q%bda2pkmn+u1RKn%!TRFsF`2Amyamr9H)~q4%5<2Bd17Iqb^@8rWdor1>g7)ZL83 zH>Ec3-RAnyb-L5ki^}z{b(#XYO?I7nFoV^bxO@eVQ43(nA86QkL%1LnTU(E!yV<#8 z3);E!pO#f-0Zx8TM^M-w@>2%Qg1u1M*uvK9&5N_=hU56s6tkSJ=3^av8?LQac(}pkl&oE4=NTS{IMnMo zO8jYGW=&+YX{zH=4Zd7HH1)`R3xhxdC$)m%FGC{lWS9E1nHFwWNFMIR+%G zA)?CIkSQB=5)A4qqu$vD8D5&<(GpKBS8vM_ET@(JAzqe&z03}T;!rIANdgiVS0tdC z4zV!Rn+uH?B$rs0V_Dp!-d07*S}%V~P1@zSGFmOs-4BeEHQu~29rE0pX+C5 zU~+-WIx+vUZ2G)xiLxNRH`bv>s!C*^%+7)FNganKVioTTU|Fv&>Q=+3zyfy)n@CYF zPLZ_JvuCkzFR=rsAtd><_pNfJw()Un@%{4`^peRdN)%0QXR-aGW06`ifok;V$l)gl z;M0)D7so5#nnmF&$k%$$UvYm;3w_1|ZX#x`zs=>6*$O@>8>4v=8r|#3L7nVNXRp!BjkJS{2WuWY{()#>?-N1lAsB zSg(Gb7G#DsGtC%dB0RA1>4bJ{48x#2a$ zM3?-VtXF)P?hkuO`dQBKIo@*?_>!$d{>}3SHUmGtH|2R=0kicOAX}5+589OA+taF` z>9v_o3>ZIo+DyqF#rL8-PmGB)6>?!fKLoZKU8ONpblvGe`eRY)mBWbOxELu0NtY$eujvhT^YhI;Kv1&}Eptj4c5_#+T-008I8`^K;NC_CM*kClYWHT< zJB9u2JJmEBho%v`88kf!JQ=%$+=jK|yI6)iRO#lS7dUil`X9swzL4jQz61w{#8859RF{n` z_QO&>f(nkQX18+|r~e6Uri>1Yp{d>}q$XJz&7|_r;l#8)1b!Qn^SBt*ZGH-6z(jmr zmh=3gGLV}+ImId))Kk!ORupRUb!oo3efLE1h8T?BBb{t)>}7Wsc&n6d9T9uku%gUn zg!p+9aXGWNV)gJ0hkM~7r*I$ZuX`G@Dv0$H>6r1wb4y7zbMb@{sd%wN%pB@e93l#l*iT*^Dk><*zsA%pRI5mi+z#%2@|UhFrJ>n^iZ8ZYo^hrG=H>IT zjMWd_@@7XPmRhBLAgW!;VXSr;xyP->9QbLM*=eD6Avxq;))3}fTC$5`0MaQM7@Xh@ode|gvtN;9C_{f_rsJ@Pyv!1GB7mHZkvl4s5 zO`hC3tWhiR9SE?I8p7{XHB>ars#*sF_qm9xWTndk59{G9ZY38WL~) zKDNN2kOd7Nry8K2iz@0x85|N2(8hiu0W2c>7ZQj#zQYv8O zAl;G&AUV_^EKS-*Oy94w65AdoWs0T3=6C0%U&D2}Wa0#X;cDagMgYj@Gzql)qoi$b z=qWx6eEOpK$&YbSnH}IA7X@2Wf9j=R#!C$|3TN7y#b*>6>AiVX*fbkLZP3we538$sW97=<=R7OWSnZEN^|oz!)IQ7_)|0!vU=FS7C3$xdR-X! zVnAg^)sTt5iCzI(qnYAVyvP_=t2vCJoHo1~$W!jrK|4yZl1^fB%9av7W-X$RU5XBs zAdzw^EJQCD$~9D<_KWKZP4v<#jebJkP0hLz5zo5B1EW3t6%Xjnf7Wd+y4uq;m($XI z)eQ;H_Ou%o+kjeC6Wr{vDO2F;!ct?No26F#mL#&G=1l^_dNMOsk-Ikm*uc)lgr$u#vE(P zFu`DTIhqaD^b7J0U#}E}ok~hUP=2D2H=-6g+Qey7%_VHnO;aHT^XI_Cjxca#Q!*?( zILSmGFJW)2ZOUNHR*`GGv@o>FjSJ7JdzY+Ak>YD36BYyvLr*9r`s~^0x~bC$3UMR{ zY{Cdo^+v;+3}`mQ4(aM4g#~`(IzH-BsF1U6@e(lZiucC2p9!StGqQ#vqu?X-F(g1xU~E|341T(mxUvaiH`JM z&hYImyffA{G;DP%NzLEFBUF3aw@prn79VheMpSCsNTpB9Rnl7TCIxMU4J zTxt$FvcLM_Qga=kJj3NH_I&wD-hXeT)uKIsSi&UJn*?l7D{JyV?R(r{#}Ccal<%;$ z$JR*uv7$rS_n^AF2!6G5gGi6uM?cLqc^Q7~K9=L;sSLriafZJdpv_>_gri@p)Pk)S zm}t-kNIc6xxVUz?CvKM&A`%sm@FHWEbnQ}%sCHS=e&+J>?8T7otzJ6MhJAIO1SBYp zwZjJJhP7+K;-wsSZKzSLFgMYpXBdwg23aJ#cXMx&U&Vy^2l5>8Lyy4S z2Og-%pLr1!NU@QkKd`TjGHdK<(K<5SnrH!Jf6gl>ONxr-rm^hLP`n^ryaxs5npg*; z_?1V)P2o7p%o-ezgtR#E^2SOi1NYJ7mKfsNwbUwe~m;VXotNWC6Dr=(4tG9 z5LkXWhiNFe(_Wz7n4K;yym;~QH96AD7tUP0IJ+2JB>5@(Wmp|?O8uoc_kJedLU@5Y ztt=~D2F2X`r*WapVq&vY34n^44b{6M^r7ipfL~fVr(n%hUB z`BMVulb=q0s?L{m_p0RN()oEMHmEp`lqef)S%Ocf)v3WJTB9ATQzB1Re)Y;6CV1=?2wcs5DF$8= zP11Gzwr7`5f9M_CZA211bAGy8$@g>Yx6I394i(L65LdX^9IHtmvMcV$iW9sxDYTCc zmB}n<&S@@NvLw{vDa`=_Jtp1r9zCBSjnQxS)uj3%P!B@5w)Gcn&U3>TdONZOzQCR( z6U0*atW@Xb<>Z~Yqy!NfTbX?`m&OiFn|!x2QNVc!ig5XiMAwjyVnDw?Uzv0Y4J=sp zk#d2^G$K3Of%04_u92G?Uc8`66r7f38@^yjG_66ZH`YiP5a(v78h&{#odFDr4$%5`x*`8~e5MKV%qZhG*iL-w+t zn1sB8M0>7wjHSHw`4dU5Yr3i#7he}hEr{gH7f>&MDhX-#GLtW&WYF?m?h*hO=8!)Z zr%Vvdk)G5fk+OvF%k1Lf?21y9`S67jNSCfyh|Vvzg95GU{4kVV-}+{ZQe4`Wf2%7C ztc4V(*P>#lIO@|wSgK`%Zh6_F34{~_P`@c%)>n(Wxz4-fci7E0clRA^rpQ!zL&7CR zUI6wQAv~S_KBv+&ZMfkb*K=D+&+eQ3gL(q*8ixiGu&4L^w zN;JPPM?2B1+jDk1@~10`!HH}Yk_fpBL2@ksqAbe%d=xtm7nVF;Bo#g1x|c&jRk>%* z$1vAill=_AO2eGh72bO3q;A(JWQzt7;aHBNi>Ky?_p-ROct(O-&b7;z3oeV;o&c}R zW&E7S8C?nJ+6a!qHexKx%%wyUyC_|I--7Y7#3EV;QMRNgy;jmrpDx9T&}Cf~CypU) z6AmU@cd0qoDb;M}IWGy*vCm$xaGFw7Oh&TuYnyp>_YcWFH)u*6lYFvsY%%&~+1VP?vDQ9t#j$zM>;opIp!$cG3~u zY#m^uxHRy;E;*Kylw&~wMwLbnHg)~HU<5F8dGgcQOBZBl>EMbd!WxbmMdNtV4|s^n zFP2p4iuQr|9=zy31(yh3_F{AMg=%sM`Mjdk5^GC#2tZ`{sW!9qNNY!SZ8rx&Yhb7U z%(yb-G*plaG&&bZ`)YE}3Ar?uA#|aM8|8i1ToNX2E^*^F{}wlMHHf6fC$kd31Ut&# z7Aq+Wh=VZcbvFJR_``0#fW*)+XBN{Zk_73}LOL%)X?ErES$&0=^iQ|RDFHw@hmCww zo$Z;tiDn|o?|wvBH5-wa%Y7k8$7CnsY4#Ed72(CDacoC$%CF%d`|6ri{6C94Vuf|n zT=5bFanyv2S(BP6DPwfl7nkCO3*rRGW!WH2z`%b+Lh(d- z_CFJPJU+g7dG6|&f&=0~ajR{&6)JyrLHi^Efpl+e@Gs3@I(>14Qv(9{d{2kc+jEM9 zE`HS0N(PDcV)BED!_#I}kdR!IUcU66?nG3sdM=BB-}9{D?gQB%v-UEj{HPHKa?h@s z?8#1#jER+*#jARO5$_$>yLoa(yJA(Rubw+crhM+n%d})fY}`H4DJnFH-bFS0seLQD zXhe`ER{Q({B(JKfvxgf6z4?SqguNE5n+6OF;^BfY9?~&;zoFrH;`j$A6mBta}ArAgb-g9l~IF(hekWm*j#{=p6HkQp&NseC3qxE?8b{ z)b;d59c5@zzNU~h-25`nEwRn5MUn6Br+<{oBMGojT&E#1bb*66lQbqr#^$dS9qHYM zOfrs^_V{^F7W<+CL4H~zKNtGO^C6C=xsJkptnM|gy_rCFVaX(F2m$D30ILpSThh)wB&@?XeAR`@roi@u zO2*=32U%`V{V^QS119Un?(zVS`?sDf(oNrz%@WIMll=(&rgW)m7aMq zbB_&@*V2RHc#R4)4sYqQ^AtAY=8!(%S%9tz{IH5u0o91wSoI6MZk#F+A3AJY{-0OezeXy>`^x5NkIsj>U_1Q1RQf0<=*@C`d*;)})OhP$hF zMTfvS>_L}qn@36^a|-`n(NM` z?va1uhs8K^uLxS`uO?otAlbVXj}WKm++tG-r%O8UA!-&H++!74d_rQYU0}>|WrWAE z7+VW&qfuUhkvzJY9FaFxWW9Y)t1#p0T>=t&Qjv=9pFVZ!`SfX;nEr+DegEZCy3H8> zW_;oD!iua8-C@EcajbdY)n3IIvEG!nU|}wfYU>oCQjd+GtLO515EyT+7lT;?x0Lj13WeL%YFu$1#}Li;DvG&0MYI88E#-Wtw*$Ek zTE38`j^*X))c#IWyBO;wfzyKUH1om55nyyW+pRKRRIwRrmD}Cy-5Zsf;jH4`=X+|t zkY}-!QQ`IX_tY2A@#4+~#=S50R1@Gnkz&4kU+$?W=o=0!Yo6)W+$ZQ`q2yw&i9KD+VJhy>?VloSv1b8i3&Q^G_`g$ExsiO zOOs4{OoUj1#FdTJL#+FS3qjOOY6z8MLU0b9Lu*5#HE zW?zmeb>GZz6t>-kk0$CY)B$65`fDIN(1Vf#n$ZdKPF2Z3JJ7@32Q;S=7hX{;B9N>+ zM5V2bKkZ@a1183b8G23O!a5Q4Fy#Zr`qYX7A*M}*FAB=;dk4KgQN)NxFZN*IMNOms z^}PV|Vh_u|sHqKUh-j2m?BVzqMdeLJ%PPPM;OL>%*W0h;0`X!$QEgG?f2~E8{ zdS%XpUJ@t!P2X}W-a7b+y|%mz6?Yax3AiagAiMS2d?>*}K3RjFHM%^&xAvV(XO zE{G20T(tZ6%;>ZDm@*^fl*t&tgm0#+`z=biNV1p5{K8#tXsFvj>*nQxszO6YUWU z79uMi&0MxHP~~;Sa=VYycmOtZB(li!aR7t@!Y=_%lQS=>3q;F|92&eDKHLvln-3EO zX6X^tvMV?|utyn_wIYwz(eBt;%delgY*@5OYZeRI`&nF4;tojYaE~P7)RF|9i76Lc zutJYikXY0!nB4wr)t2O8{6^9FhNE%e#tdhP(yDo|#*~SX?`*6SNuWdddS*tK5T#qK zDVH}>a(ZK3Nk-AI$^fFdyxNWU0m8C1AKslq+p`;Mi{YthG^~G7FLY8|3~xMik?hqC z0kL;z;MB&!-u)YFujLjX<$4bdiM_uwCf*YVwhVjOx-(yYe)w)_o z7KL;jwO9JLSu9VyvO&bV8(HYR(md*rBr%%F?A}nbed4*eqR`rDse*MHyJVkqY`aKk z5Z^}y!QD0huz~SK?QO@V_xFhui*Bq8J2xli23hUbau3@A)cziuZNCPsnp(vkOz+pY zGNIh=4O?q}kN1U@*^pQ>v0fupz?HTZ!@kgClfBSqlf57!Y-8$$u&-j!9?R?nfop>X zie3=;v^&CnbX&2Rg@LAZ=u{NARYkYUwDO&rW_*=4YLC5jKmfOF)Udh3LfoLNJD^#4 zPtkCLQtm*HGQpUX&=AJLe>osrWHF+{F%8CFbn(<+Eox(0dV9a!9&Em-iM5=o7e$Bd zB0*#R7ENTwZHN&u2;1m?sgirvTMwnZBudNEk_>PQ_N5+Ldr7n=z7228dh8*$mqc#P zfK|;Nn)^_5N~>^EX>5*2=a= zxUWyjl1r>?5PRaUD;Ie;`ylun0%}R2T6JFCiLSsU%2v6=v29}pT)P^ZOZ^SK`s{*R zydGxE=wxAh*CG#Ku~Bg2m2L9pWPNZF&w4StZJ32He4a5$V`VbhE)sbP*nig)B2^fZ zW8v{>s&Cjl{~|g}7v@6nBYdD?OHV(VUS81xQlb6Z9h#$;n=~b=oYZ-8QUMzW#G0MZ zs2AA9Jmrfe zU$B``M3*h>enjc-;@(B!F)x`dvJyOKJu#tufngn+Cr(8(;U*CTD4S#u=JdwpIr%5b z9BKSS319-5k>2P;PMF$8m{KbG*~_sD$Cy(~+`k$n9BK1|@!uO>QEdM7^J#uI$yGUc z`O>U*Eeu+BDVq{&=^I?iDVm#$ca?@W2>xp-0c5RygOR5+@5-GiYpsg`Z}-d&T{ydn98>fbkFa0okt1 z2W7RhwqVkStKyBTrjGM*fhERrqXDd`^FOLRmLQwDomfzP_}EZT#mEv=@DT*;GbrNusMg+E|hJ)j4cm z1iIE~!nmS#TKAm_C%(tMUKe}p5?%f@ou(=0%I0U)*_4me_h{X5xVu;X@+dxsxX*Wp zp13PFDr#5ej4K;R$F)b2Y-+A_Jt}@-t9xz^Hnrt`lO(ccA6^{HB`C2S>C4nq(A6vc z^7H9I77(FKPG1N zrb~Nb!g;E08Kag}atptAlU^H-;qE5<9e|ju`Hyn#vV4!vd2H6UuA3 zd}$a0@;zve?to#fz7nvStNlcS=cIZSCe#L!;lD}nVUjYyE}T_nr^KOUs5K&xy+q$5 z^?gw?9Wov0;sNhd_wQW3igl*94|u+{zA<=4xn4$n`4W5Ewq2_swVN%XQo73A{1ATM z6W2Mz>E-z=+S=rxeEE=jEjfg!bH6fC@{@)vbfwE4ae%!h&&fG3MPH; zu__z>7=GcxnC3O%b(tM5%|*=?f(0XUsmJ=v7yzHjDwJMUj{&YoO(+*O8`D8cV)i#{ zV_n%zGX7A^Waed@-WLBD6)kDS8+$j37(xE?rP*BWRxRt_F00#nydfYdZ7QJw18`lt4u^tjAGs%&0SdL`_W|InPO_OnljnjFo?jQ31IP=(l3e7T9(4yo-V ziNeEQY52|6vC?BPqZHs7K1heIUeH^d=danPCZrUA!%Da;(`fzoJJ^#4g?IpQT{(0H znsDRrwQq&;bHtsF@TOYYQM1&&szIgL2)7d$YxbT z-;Dd*gs^?lYB|0qE8MbHz#OZPj>YJXW7g%oV4Y9bRBLt!UD=DzkrLhcA`G*(^a`fZ zk+u6{?5nDK-e_Y^a5}||=xri;tDzdz%X|l>Jt@5$eZ-2k=NM~P&qgix&)BNz_IW`G zod>loY7RP5(ad|yX72b)@3h<80_5|@4L^Fprp6z$RknmD2FI=W$Ppj0T#X=hn=E@<{KfA1aY0MnUc)1{Ky z%V*J3dky-zYJ)VsdVPHnbWPK_VCWl@pa2OU4X0HC=;ZgIP=Zi`(Unzi?GQzKROZiG zf@t;MoD_~`)d&g>X||x|P{mnEp0QL@!eNyo6Lkn){}$6z`t`JGm4Gt;EGOF7f2!3Z z{JCKAHn4k5?cx2gbTl1P?U1kDFH_yAF_~1|Ho zvF8{s*TBWcUjkID{tveY6|r7x=|DK-siAHdwX!7|Z*qNC|JCiD6v7=5bxofxph{se zXX5fHV}ek`d3tUTAar0RHz+nuvaA2&`cv8%ch(vjx%%flwLko6$v((0uM3jVjkyJ> z2t*!;K%5~jb+E7zELnWWT-&05pWi8XOL;Oy zE!K#@i*VCgywk_nr=|8>5!Pmm_m_>9OPX6aBI@gzzR{rx9GBf1k8x*BS`AizW5y6R zmiij?p$fp=2f|)+r8lcZ;5)YDwEDx}nG;ag1pZTI4Ip0-nTSCw1z!e;u0g==zVQQH z^?0ME7`3lxtg9NW>G|cgdv<68eOQwYw?SCBX&!pS;4^!Ixfx(cS8sI`IWR7&Ck0sUK@fVAi5jlX^OG}L+w8x#pOc16986Ty`--;mO@(n8+QhnKK|SgK-d`25Zw zqo#_?({GD9PNyL+SE2JVJeCF1iqSmV2^$xQZEX1X1w}61nOVb~)8a@E*1aLsc|`L? zeaqOWwj*xeT(ctp*J+#!cV=!qR`4Afscrk;xj8vCj%$V7^wUTm-x=&V1$tmUOgR*- zMqK^E!KiH%x1O>I9l^4;JB6&l9@bqn>dwt`tk*tM{(=Q?7#wN8vKu z`LWZfK07%RG_zvop|t(6;7i{+*M|H9!LwpLq4u?|$Y53*4hQXb=k!#yyVC6wcM_3< z50T#KKF_;J2nN<@N;Lz|;UxJASK+85eSP7X#AutE&4Cim;}T4|=yC)U;UEf!jVp>+ z^B`?M+(nB?r==6pg@{8|kEljFV6>Khpm84z-2a07gvRyXSo!NXpEPfpqMXdDo?pRMpHb2H1z5Q_Wy?JO3K~|0HBKWefPsCO67kt0DtAWqNDz1)!XAYV2(`QV%nEl; z0>VrB&n-qq*QI>=^@-+!E?1B+U<<<%b1_nE;62Uo5R~itec+XV&KpJn?S8|A%pRp1D4(T$M7Cdk zPxyc$b05b$utgspd+p5;mMblTdUDi&w2IcVMTeIv^ETe;7s+fTRL`#G$c9~A*~Tl78g zHW1lFPm6B3*MCD}91~e~$LM>q&%(%K={=FxVFmang&Pv{AUQDACWauVzGr#a{VB2@ zQiP)&zpsm@bD6_impNWvw^qx;R`jtfzV&{wKFU7hcRWYhVjd#LE)M&sOQWuCLDhe5 zUn~sk)}`PmZ7U()+xoq)^?QFx_c_d}*?d!-2Le)+4!^5>dkveOwo0f|!$h6BM0HmG zPZ$k}G$8^XOMg}W{y!j<9_q5K(9=^Y6!ny9u^#F&EIo8f)x*Pmtg70*<&4;6RQm3g z(sv(=(sy6E>R&i2;`QxcOh4U9tY3Y*h!{E$d1)59=`~Yni*jGpx3p28awnc-pK?}g z#|W^3CxJwaidusk{~9IY8!V`_jjBP27IN)d#!yK$_aO(mwfCvi6MGs?Gn-6;jG#+g}%G>bI)~s@4t`i@(8v3 zaS7koB9BqGp!_eL3AAm(H07yg?bG8C&RG%-mxdSiYPxU2jH{!{ZgRaB$=egEix$KG z!zRWLAW%YCdn0|ublH6RC3`xr=h5pawf{x4V$j-pjI1FM&|Je$%z&q~|sbM@~-G^4FtHx=rIbQ9aj`?IvavR*$+FWB!s zOEZj%Y^#2j4vegw&5d+VCtvs_6vB1XL7U;D=T+$1~th~Y9^HEZIKY&<8SKo zglG$or^d17vz^&d>Le-BoxB~8-q{sHHMnl{9faYEJ&K}01>wU@7(0fKr#yt)F|m?m zN(S@bXaG{yDjCab6%6(8+aeg)2-pA{>A@QOO{^&V0u{d7I6pI*<|(7g38COUJ%I+(XLn{shlSX8G)C9aDi&kcaV@|} z!PUnrr{qqakP6V^Jdq_FnOZ=8O64pc5elArM1p61JlEmEkJg^`+Wpl!A;Xp>Q)md2 zz?U{Q7Lx4Nqbcd!+M|t@n46r{I^&GiSDPH?gSF?=UfE6derE07Lj+JO3yV#Tacb=` z+WKv?@w2qFcK;jWu}#it^^aZf!-{>;uP~m7xDb`ZMt6hBzah!}8`7GDziy=F#iq`! zL~1xTN6wGp91muaEK=oeeH#71Gc6|gx+HSHwbTDpfNpP7L|XlSZXL{wZT|*#0lgg` zdua%GZRCWeb+GGaS)}(pUCSfrtKaqtgpwOSxHAZFRK%1&OW$cG|5Iti5G%p{ z{5=!)Uh@U|(7D&Vg1%|iR%2g{n@9Q72z#w>lsDysVMzqq`|3;&<05@eeamPqXuZbT zWa4%5NM~(ZZ1i|oJ8M}#eJ$At!4>5%n`0uahiYrx-OKbqVO{K;GRujRuGqN#_oM_L z))lsV+Rk1GE-HU#u&S>A{l7>A+b^Q_4kh#JP2O|8gl*f|5$dG}&FJLR)CGC@_}=*U zWsMo3m)*d!?4XuZHa?1by5~%Qzu*nw0FJcQGtkx>@>Y z3mHyNdg#INIZ85XzN`P@W(TF~Jc!3G+JFE?R@tL`83)o22dzeeHZr{O>^%0kaB}qv-l-_t-&? z6HNa_W8koe3OV{X7S5z(<|*OaqnpLkP9(Xoo;vYo>?4GQ?^qJ$MQDT|@c5`lP8%8i z=n;)LU5x880dbL5|FGT|b`{j!91ef9+?DyM2lGE~!|IXB_D1%t!8*#_Or6njYidm4 z+yqu?O!-y^TN|;>5lK7sM#jj|l}ui4;QO}5&5oW{|6$!-Up~OCp|O?(Aq_`GV(Z#j zGNzTEE}X^4Q@3m6bgJ&@pm8JoiZ?{?=T;ZA*TQfZ?W(Q6eb{P?E>S25xp zCznxXd0PGBJ3ZM^LyuYxH2qrseOmojHOS$9xYf(<1_O;X(IAJkLIrZnCaVBt)Z3ggyA_GnPCTO*aD!yK!Bw+8jrguo~wxJlry|9TDF z+e)x?0I`PrS48ssSH$xC7wRt8^liry>nQFpHD;`)6P=SBBh>Nq85^INV%`~Y^&4u` zYdBfvI!>DHI$0TyvidVRqu+Atbd zX|=V`d69#E%Vh(dk+xCWHyJ%)&%_jCnad5$E;Ia#dZxEig?%r5U$`9w*7x-6b$KBD zJ`{H`oUpC#6RP)yEN^=9)grJp(aD+GKjw#i|6o9QarMxl@Hssl6 zgsf9DQM(=pfwm;K&QtyRk>t99))`H~o)I@p*9U!wLUP=0@(Yy3+Ihx&$eWF$EXyEI zPrhXothPx1&Z?|H!|kM;ObJRzy}sq&jTI%Cv5)sRM%KI6MuHP~sLYV4rKClkhRCWV zZ8j=`-~0JFuS%DLzt?2Lau(}w!^L`^fP%>+@|N{uy5BEaOsdwR0y3OYDqHoV3p1fD z1zar;rN9R@w)#2XX3e&=`rCK1`x04M+m9BfKbDid&e?Wu zLG(+UY}$@Cv(joSgmL>V-I7mz%}Rr`#&|Y<(&~TL<^mdL1Ldb7$!p;HXty*<>e}U0 zeq-&a)B^TaOnoPZk)h1hfAG@aT0Jug-63qbXZ>5!T2fmJ=Tpt4*taviXU-WU4nM+koZiuFY4YWnsxr9a(t& zCPYAhO?G`>qEk(zUb{?siitSkMQ`l{sBn_XT7Ah-v0i1pOgTAME}W{e9_b!yMbg~} zD1#{hZJ97drb6w?Wwnhkb*m)PQv^#&NctEq0`O(MlGXlj^AuNFay7_zn9g`_L-(NQ z+N$Qy3)oVIl)O(O-kgG75gtpcKiT}G)=uzh6VgUkWu#cTeq{3?*229^iK>&QYCa#` zYO0l?=3G@u=elj=l=LN4wGp&Yxm}OY$89B-*R>0t`{E|VW!>4^)sCy9BCm4W>GRqd zfb~!}I=QG8r!`D#B^uS@wQje5($USNa@B&m9x*dtS2Wi(YlV{qavQ_mV>^{8i)|Oa zb>H2@ChB`Utgrrr;%cMPoM>6v*Y!vnO?sl2(Nxq zC7jnR_@N1qJTV`qL>YN<+!C>%9V`C&djZKBh_u((9dTk^JD;E}aWgArCMg%MWP?0o zJO8`-PdC2=Y~Woh5Y`4KQ+=3~85l?FMx5|c<(KwyN9AAN{^vb~bMj>TD(@~cM5cK# zLmT|q`^bBpP66$DT+=|%pL(TUY}eb*VSz8MZ5|~xSG$~v>2#T^uXdXOMw=6V(RAWi zx)~Yz|7*p32jrd6ikn%Lwnod;hfs96ljV>nx(8F%)Erb_N+3^$@2{WfKCS+f%`@K8 z(0kduAnh}4`oJ#*Xg%2yc)h-Hvku{{>w?=kg>uD8_1hMb>H2H`?o1U8v({uw4YQW! zC^byBC|;Llt9@+KFgFvYzIj?|+|THF+bp~hugr)5I=9hVqegT4K2>sK&cE?XSx zZ!x7&xbo|wjl|udykscg>>2r`{(gWnE=%r(_)>p6f@&OP^Y3dvt7QMCSKBgN; zcN<1{ksB9!``fVs=0#o5JQ#PO2X=R>7UwMeLVmvv?V3t3lh5fIHSU}B%hh5;)@Sfq zH6~r-nGLVzob=9gY-bYJ~|z#by-|I&AS$yp1QBK zB7(FyyfJlonA`DuN>{ne-Oq`#T8=+X`4h6jnTfkoxeSFjF4ot>oi$AGQtvs{rwtds zVQelo7|XZi7WDUlhlOC=yaL?l%8INvQh1lsBgPrL8gl{)Fwezy&-IK;JmJ zJ9hPV0dB!A7B1gi220_RpR|99DW{JuKYjuX2Eb;g!4!T*jU+9DHBEgO1>H z?~e-wohEl_g!0r&U%Cpn;&E`*ul?Zo_*-iKlul4$H^kFt#aYJ`evjXzftS`9If@&* zWH)-qCz`_oyC~8?dW5mFOG(Rv)&J@*^AwVtwtP!}T$~*T(07a4{i-_3w&=QQu`?OcYYn)GZk;*0G(6AqZ=Ow~})i26{p%J(mU4x{9RiPXh>J9=i)s`vw zc6{fG`mL89a>PY-g7tHU_H7$|l9qh5DUYW|=Qu~KT& zKy^?gf*?I!pASBz%-jk6=l27qZSU(h+{3Y?L%NcIr(As%SFxpSe*X)+W@n4PUS5oo zbilE^imF}rO@q&|mVN+#v(XxN9zrHrtL)M`$E!b>)ts&w9ZS#Y-!2oc&Sg=aT@{hd z!zWZ98Sl6cJfzR#&2)^E1@JZ1W&|v#1yK^)zn29SWlp>ysQpDCkf;mIxSih1W48va z<8MCYt+esl)xo!GsQi_To%fpR+8QniKQ0+XMuiS|j?)fmXEsoN*cZEOj(+dFOKO*y zHBN<(?d=}YeqcoLpw{B;4c>duZ-nFg4tmj<-VNHmV;>A-|iQQhr+p?GaFof(-y_=-F?1yF1K~O_q#-Z zN##<1BiJonmclH2y4x@05o_i|X=F9ot%-exiLz*Gi!cpRtSS^!zhW24!uj$Q2d0|N z`mD$dtr+f9ccvvy+P!6S+wXXWLny=TLoj3<`r+ikk#7Hem~4-eVXQFvOt&}ZA{Sic z_|ohBm3=6G&2Kbt#v_di>(kNbQY3C7b1hoG{UcuLiv))-FprT#Khm!`Tl&EWdDaJm z5#IiOm_stRm)F{SepKV}irO|35oy_Z08waDty0s3=z;v z{SenPtXmn>_Cnv#Ke|8U0WNyMa@JJ=?{xd@BO2E(%qKjBdK_ayF@3$)Sza%mU6Xvh zcpYoVgt&wdezyx*$u8|gJXZ@RE8&Hw5+3o*_BbUm<1~kMYxUSi_-g@qE5tvN@Oub( zEf|a>j&+gSx9n{skCeYl<7ibRrl%e$vOX+r95;RSNV&SNkeVS;M#GRV%gQP=OPQ?hO58YZCq<6ogPk#}njlWt zy|tklrQs^mLtlWWo<)sEbcbt&W;Q)^QMV5);Me$;aMN;Kx@eEw>7mCYtH-W;a6ixe zRfo!OxVKAP`3=NvcE+?B+_TFy`AWBCpKx;FQN!ZCTKF|#-6>xKpnb$iV{c$A-5cN=#Zwx*vR z2~pz%eZQfedIFwxJOB=WH$8+}`n*O>Ju?Cl#CyEgt?sXjC+nvN4iqc>5Et#@BvXjB z|EQD$lu1b{-&;fu74~bsOKgZ^p$b&6b($y?6Rw#Y>-S!P(o_gIr_9i-Jz( zXiyI>;FQwZ$@@+ zKV#B3B2ALFPY1TUv*!u15v*5X_380mn#~ZtEl5ub-tKr50-P(%frP{~I-{kZJzZ`FF(%}%Fa);os> z((3<&PalnlB)Ql^Wblirpd5T7@tRG$9rAUB;Sm5jXR{H<72~QqsH>cC`7j|c96|r0 z5JChiPlL#mhYz!PNqdkCI|4T?**kKT1{(doKYB}w8o8qr+hn}v(CeclR}8*$YFoN5 zU8rFJULr|LtY^OE82@hT#TmbhQn8FzR2Q5$jz*JLX)3gFM$hS7dnTFusm~nx7Ckfg z24^5eU#L2nm0=2~yBSy*wfE&4Z+H>%%Mq>NX9_!}tV;$H#= zywS3KDQVs`OOrR>NAW_DU%UBU;vUAhIniI-bV~7J=0iFtJ9nrS?g}9)$W{$_)57vchk7~t#)z-{2 zn0)o-OWS~O^&wdzb9U{y#|V5L6upO9!Qe`}J$RSJc{fhFqvjv4E1LH}7%ufeAAJmGy}vEvYM6re zgI`T9t}0{B?PKmT&O!;Ys&h|R0CouT1~2-xo$t|BL9QCH&|J|V0C|N@SX1~;ef_vP z3Xqvd&YfX_W}6;80>R&UcQtm_^1fQ?31ee zW{!iN$OLtHbF+t?+C5=mvAjfSTYbISzXty5_}HHE5Lvw@wuJZ4+j(s-1RiT>BRi=* zvcK)xH^^$C;UP7mJm6;V0XA_L@*I_}aRdY5qqu?zlZQ7(BaBLlp=LVruEuc{_ah0+ zniUr%Kz$c;ce6pkeb=MK$Ut`P=%-){OVN!FH#@pw#pAha_cAGrgw=|XLXL-c%6$Ve&iH285!!}_?y7xQ&P5<}Y)u!2_Lt(@7gv9ZGA<&_#pZNv7rks%-HpXU)k z17(bWIx-{P=dJVk?d`X1^zF!;@SNBDERb1HoMa!uARCU zmZz`hTI&1IQO$h)O?&6}tHKj5Pg}2u1|KO`i~tL;6WE89%S=`L|)}uGWFZ)<@6A`_Dfm)X+a|2u3L{Fm0fkMqryPnt^Vn` zy54$+Yttij{Y*^h;rhvtNbig7^|Z6D;cd%9ux-pt3g`KjjntYGbc9Vz9Snq6-?YCT zr&e84s*hlZEZQdQ^K{+DvF?8(D21;s;qydYvwh4p-4~bDbj8_ziL)H)9>Tl5Eeg}q zF04K@%E((t^~ff$ziMfrkD$(baiPQk#NJFraT`@5;k&fQ4Py-|MzzD8uEgPmLg{R8 z!#)dW%qcqK@lW38a6SDJV7t?B@ZBJE z2b~F%g$7^xSYt}m1wx<1f8RfezX+f^m|+9=O(a8Uli42l6?*v_)rNw#dSKDWAFuQv`*9kpOdX2Fr7eTc@zTez++&dU`U`6Q&V< z1+9r`#0jjyGr11b8w&)3LfibNh0V_BGrVksA$D!MX3_V2361;Kj0Q;p$NJ~9Hgr1b zK>sL=Kpe;6&ro^t;ozhGR&X?;1mA$!xv`b|YWK4t2)|ywbU3wy_z8^$V=*#O755j? zGqn&eYfWiRmAGrw4Rz6X{Y-keKJ+o82-I=SGi}ko?H3#B8JZIl{aA7)UyoiIOt1bX z0B14kRx!(hy&FRYb7bKgPawTAk94hJeR){6d@O_Z0m|P)ZRMfb0c{jA+<~M=ZxBQB z9L^kpVtCgAF(v0HIE8^jLPt(~oXVNj(=dW!YS|fa4ogS+@x5`L^NBXewBLq0-SEj7 z4(J*-iJZ6PMZMMz<(3@Htj?*0AFy%xl@|@vrq$N%oqb249IX0aQ@oCdBh7IWQ$BK@ z52U|7q>&&??gRDP9m;db>4A*u^k951_H{P&#yJkpa-9ufMTd%A*YfRb?bkBKVg_`& zQDQq@0SrxO&XDvt{XtZo91@nDAJ9s_R?Z^`CvXPCqD=bmmDLN+GtS}waK>kO(6-F2YNtbQsV`hbfU4kFCpj8d)C~fmZ08}K*pC0y232Y~DLvL7A>6O0F zS8bpHt(%IiJ|73aJed>~U^$_Zha>I`d?I#g4-5+WVM_N!lp($Pfzf9TBZ4bN@Bn^$ z4EiBKjCSp3K5CAoxR@J`xZC3q>@E8mVz#<)c*}(3qB!zwgQv7>bZy5xISTT$)~GkF z=N`gW;C_vI^oMXmC8ekHxRb(j*qc2NKG|Qhf^I~e3bGM(DyZZyEi{QH`F(>Yw8n^5 zf_=W4LFK5Yc-E}gSD%LuwtP3Gd-$gB_qb>u$izdklp}<><_6aXTJI?vADSYk0wooP z#gJ3s0hC&HFy*aX27R}YJ$!Oq5ueB!mok346J^}1z$f=6@X5Uh>FLp<*Yixzv}B=N-rv|(q6xCmYK7y94#slu+S(shEFx!+N5yq`%nkPDd zLEy0YMi=u!{<)FXl~otC9&V%1GGig;$psB=c={@&*JflZVYpy)mqAckxL4+;3tk*@ zh0t*r`?^5jLFSFrCANi3yxb)B)@5UbzqqzM*qPF{dgOG#BLX=<+lH+dvUg?#QQnlu z2GQE%(>HVxhPv&6zmp>h>-7V+%GREQ7M!5a{DeED>-7`zu@|008;57jezpjn)h~k3 zAkw_67M3V%T)s#Y^j$X96%hr9&b?I^0%40{D!V-&;Wj42k%rm>5fD=@R7(MZs%k3@ zREPHtdAliuy2$O)EA_H_*qw-tpJDCmHBdBowXZE^gYSE+O*n)1`&z>k5okw1`r>a2 zsvm5&-wi{&`lof*rJP1ewHGRH5Arll+c{dwxNbbf+Qlue2@Cn^+My&X+Jvnh)@<0a zGa@6F&+DKc272?X2MK@)$%SR-K{=7r53(hZNuz)Hu)mO|F~&O9+{-6aH=Jr`krd3R7`t*hgrgRCb(jy z913QP^Y-g~)t$F&5f^wr&@Y6zr5?RjPqPhMKPowG2(KViez)!bk>TNoQ5bsOfMS|V z5Fq(ga>c8yl0xVkgT5OO<~B7OGfGp;S? zyX72#qa?IgOt%5RvD+h%2O?{qEHd9k#A3n@&?(?2eQVy=XHKPzGp5M9XA7ePsRQQ+ zVfNPf;C4dRfnZw+x7PlNEEh_CcNP)EQ_RY3!}`h|=IIKgOxg0tb8k;8-sh6}E}7M! zZZOvlpuU+)Mp}xm6{z|#(N_|c+ zMV@wBafgac^Ib*1e(Uwsei#-GLwfaQMj66*lQLeu(=*eecPw94Xzi3R-b%&0%KhpK zVoBuOk{EVa5e(A%IqYJWjyzNL1ckQK%d*}cyt01XI(FbXm3#R0&XW}r(fB9JJ9bvc5jlX6q3tKB2#%&Ko~juuh>pp8IG0?Ux=Zaf4Y)+OT~RR4I#ZZT%NGJBGE z=G;XFsWWPDjo0N8#KHBCeG&mc26;jae6&M!kog`Yqi~9wDoYEAD6-WTD#>7MaxlUdJX4+q6M?b$aKzj zgnAH}=P_$==q97rAOtk{;Fwv=EL|*jHd{D{dPV=2RurY(dbb-?5yLe=`m(_2)*z5K^|K_ zEd((R`5l4ED=KqW*!fzhneI~y8M)bQFPR0-21T*Si?!-9#ZK?MLWGKuxmt9OU~Fs4 zJqBAZ(w-=_XBW2g^|J5uX!&c85lq~sn4b7+%8^*(`PFiyoTy)~fM-MarWmsgl4h0I z=7&UMM3-loDPSWfs*JnAv?24j8>!xv%VRHzA=h4Mv3p?^4oci9*0AKG+T^l=eQ3BWx%6ix;r-jWONf^#W z1#4gb`+eX5t?wj%uR`H*W z$(m_f-6oAAk|SNWjqf&F*F=YK)wY{*de#$pXsZyKM}=AJOmczNYX=reQE6J_(KVcv z`?y4m+>bPUbG;uDWLOri<5`zIk_VoynYK^sb@YB&88xTra#W9yGkrUr9Iu|SveW*lSLl8oy1?qU;KORIn5_I9|| zB)JK2-3gvtA07@tk>S|Y{4)jn;Ip_fxu9s``n|IIj^Tb@Y*9J^<0_*yi{gR?ar>se zgW7S`cN-_ne=ZJ2^yAZ{+1ouXdEk(--!pO8(L`}z%;5CXWKYp6;D;^=uhjbISuJJ6N7_CepOkD7B?juVEG?5eQ> z3mZ^cC54UdGp%0V*x+{%RV{WZEe)JR+`@u8U&(T=HIN4oUYuQTlw8-_zn!Wqr zNf$N)#Vrw13mO8{Fj;x0f7<4b(;jVrn%nf86D3wqw%LzMEf9vn3TRm_*CzCYko#Ko z*QS8c46+8M?IyDI$L(L+Tf*vgZ=JD`cJ|?HTDXqXi}dt*HHLQawfL63j~cgxOmfe) z*a_Oc-FmgG8@x=U_oldSzMNCr3%^~nN>A6))Ri-Q1?{m1 z5!{{5xQfot?tsL3Vr^*J9&Hy|;uhSI@s_9w-oyu5OliIgd(5lm?pu;tEe~^}&=ok= z@zpT;kQE*+|5OJyvk@DzD}COb6CQAP_BBPiE`lm=X|5Ma>Z~~~bRZF){Dy~|`;W$9 z$B!#v)_!S*@!Zv0o##z)Un}@a-0Z5L2KIDc&`vtnbtQ>$Ma>fP8=1 zd_6mA%-e?Fmi~21CvKB$&ozBihc(*IZ!5k(UT>`1j(2$qWzeQOyW58KS8LstB{~kf zTl@qv^8RLJ1zqcMpC@va_3wa2ZbiU10(Dy17_1>hOOCrmt#qKqap@bDyZEiB^D`T7 zm1ally^YyqrDxiP$@JaswQ68X=ByO$4V)_Bxj8Fwt?{@JFG5Oj^$2_0If74Etn?uX zW{g>gM8^ko(L$N!?RSOc3l->@y+G>p^@1;~*!8wkil?(?1aD={>6*p7uYtAR-U6;E z3h3HC%A8=ERA2bqeoQ2vS`Pc9uU~A51=B(va!k6m#os11VY?zHw0}_?9MqL9-KV^l zjpKEvnhP081!Mp7MA>rn*NFo{m~k4T|Afdc<+^l-II01Ts7uVeFg!|!l_?Ta2c0Y@ zPOPh)aNYc#k-_RuZUu~u%=DH)e1(J{Y~{RXgZzP}y3%|>jeWQg8*QUmO~jaHel_s{g3|9ns#|5!EdZZE^+YA+<;kcjsX+>Yx_s zpY2yPqAT2TQ8@D$buw)NAz{&ceJnF3Til7Ez83dl(@$`<`m?kBef^Pz;(Jd{Hmds| zGv>0?g6^NoWgDS^G`mqM%ihaqvhF2hy&u#QCN@eN8yRU``Zy4y))HyG)$DI|^Q$?k zzn<0H#;TJS<^FSe$d7)N$I^6M@^Q|UBU9g0?M3a=B1e(@>`x{gSA|RBy#YiF;7|I{ z)14ehLzcUo?NWXE>M`+DD&7qcbnE$8p3DNZ5+7vb1>R<+U(X48-C+6E-J0p(xp9?-{_-q^ z&~8pS9Csn=*W6ub_rS64Xgt3a&f~n&XXB+NLc0@JgwGs9%-&;GBq=(d=M^%Wp@}em zKO)Q@ls%TK5j_Tscs{WnV z;+L#N(uGiGRHx^Out6QiK(Y&&@qJfR8(gMs&`yrXrESP;Xv;6DPOmw|`5r%ZQ%pDFsTqv7+n-SXL`5_7>-6wSyNBswM(ebFwcECw?Pgmasc^GS>qkp}23$iw zPN{=kF^8a%8tc@vi1XgQ&9hih%nHvT@Sd%O4xl$VDSF#?+ux37P+m&Q`!}` z>a0`m<^Fo;E$1MPW5jU)zBz0f;T_iiDLXc# zIF-#k6$lt#FcOd7(tqF8LSE8ePdPav!{s^kIj6rX&3~LJ_*cOKi)QdRQmm(ti5=n9@qN$#rRmUCsKNdyQ#;lHt(%& zE|q_r!!En^FTaOnQnmbY{lR2hRpPI%98(W(4xjSI?Di;>wBIc|*dM+4xZPIWHtF*^ z{=>q%*6w4c54Ad{HL_n^0Q+!IpkyBM=Qqkc+<^11*Bib*TMK=T0^(-Da8e_i2l3=- z>{(QngqCFl2Mjhk&9wS&)|;f;oLMd~O&>Vq;HXIlvu+OWNOWRDEwM<6_gUtavVxqL6vM%Ms~O?c7qk(fZ}mPQ$uHTCUfY@zN127WN~6Y~IAX zk5|V=0-g*7%Y0eZch+(8;i`SNQw@ocZvUxNz{Qk4*w|d9Ls*N*y|uC(xrL@*}uyd+;CEiJ+O~7Tl^Hy7vQdYa-dm*fCCxtNrXW+ z4k=!IKqgE*SC7`kSBQt^@~B7NY-W|M955sMVSLmRmwOwCIqWTAAu5UGJsNt^Y|lGt zi6Wrm!jH&sDtg%DOF$3U=1$*yLi4Pr#~OW4AZRb!x2#`|mcH6Z_Q8bHl6!|7vnYFn zN}X1HwA?=Pi?DaP30J#B6K=san_It#uovXo$^X2WreC(-sG!gE@ zSBMML+ONn${$jPU=59(WVEPvmJf8;E{$Ta5-&qjd&#BMDxz$?c1GtqtSp9o<7MNub z3vL2#8!ibVBVT5ZaSbuCfKIWYVw|oea*uKOM!q&D`a^&tw0xTRsIO0yAdW}Y;RV{b z`q3Hky(cU-?;>Ja&kzTYGb7eY(@~W4Dri!pJYYh^Vj%Thc+v}>NB`zgGyxHkEA zD(rVqGjPW*%Z$=1P1D^P?&z~7h&}M(x0kg|G-OdY>7E_!j5*N#SLGP6DGs!!cp*|< zZsEB2E5Ti^p#tmxwq8XM0=Mi3!BDH6P4>IxIlGDNSJe*z#qX!VedjeMLA7)bhJZec zq#wjSMjqxyxkU^6=3n6oK~21n{(^X$s5K$y7BK7 zf>?wdST8iyCfYu;iMsbi;32L4=0wBbL`>1n*#_ydB1kIjc1K;UB#Z=M3q+7+}5xFPg32QJcm}B!szwtb^;gE0yUH zdCJaMriHjm^=Z9E2#88ri11sU0*T#ik&N&dc#bsHao*@|D-VpD+wt3#E+RHsz zk5B9RyXExdvkwcPk0>@91!1Af)!*_C)4n3cADDIDNFr#kEMIa^yl z%3zN9q4x!aYh!l=f8eB#vO%u;l-s=h9f(8%-MtHSOAO%+q-0T z>mjg$-a*%KiXYd((j&%WjxlQJrV>_Ym-#u?;trce%ROCUxy12qx#d_oaq?@>Y&6A- z&IT``9|JnP0^bCSdARv}LRf*KBeiv>j&+vKBQ}^j-)^I|F~vNvklOuNAY}h2*s-V_ zU!7H1{a<`p+?)5eE5rits?J^SQ5S9Xy2lm?q=XO3fgn6)@>wZoIm4hVJv_z$6}}hm z@vb-x?QD;)9|x7j)Eo6t=&*C&Zl_z+h$Dmtq=R~v@BCyCVK*L>Eur5bO%wjYwcD&|EM0OiD1k?_sO!WgFTZT^(}M0zp3R${bSEvNxED69^{B@$1Q(N z|9)9FGz1**J>=Ry3vG#h5d7lM;V+^=+ZV3%u?%&61tXl(wgm|Nl%unj!9Wpm0Y8D& zbZKMt!2t~BejFDY5Y)x0&3Mi$Vz>`?Xr5}12o>p$|b!q8`l7^SiWe$ zZ*2oJ;Kw1&p~JzGM~x1;k&@i^;N|1$ufDS-KW)zxSR)`ZxQ}g_ld=HPBN?x*J+O=s z73u4xsXEy5q*B{=ss--`PE!aqw<5|zNo;`RgEB5Vf~MTZoic2|yHGuw?KjgCuR}qu zoTG<{o9hAY;O-O72B*oJ>*Jt$U~?Y-OT8SrxnAB-FKAzEn+5uL=jQsEFxuwo1h)+h zzc)FvY2hU(K@h!rT)p}$B*FTaHtGn<=kT*ru6xf}!j>wJIc54z3g3?E5t>FtA_Lrd z;MaP+S}MV{2(Ch%sLP0&xE2cS0NgQ3%p^8aL&~6m;$AX%l@t?bHXlXvP%u5Gl}Y`D zzun?=iH?+pyLVY@))(c!yV*dAq`aK0ljlf3t^-R=)Abh=fm*%3nW5{@$ZZ1Q>u)v_ zXTs?vM^;QX_8hpw&v!X^DYRP~s3YthyMIfskO#@RT@CBH?e&`Jy1kpwy<_cf*KLp0 z1K+$WR(HHSfW*?q<#5-GG<<U~&!BE?bxnw(o5Xt>{GSq8lr9rv zpHpIAFvuw-`<#+*&gSxxO4Ah3hHnVQA=i9^vy*?uSE(g@9E6O)wX;0P(T0QBr)}dJ zan7^`IxcMss#!9hJ3Z81aig18j|wKFb(^AnZtk^~;vjl8sGh)+ftk_T(ZXrZoku&n-u8{WHYx}X>NjVaeR$-09K zVjHBIa52q&kzsdUN>TR%AcJp%v_3+LQ4HMYvO;ZVySEWw^(QyKkTvYq%L)!MX>k|K zFa+6MdF^3x2pcyLy-83L6NaE?-76S@Fk)`}_RNcHe(h9Q+F3i;a#{rm9lL5fH8EJ#T9__ozPKl;8Y@K9A`434M+$g3Twtf1uB|<%?5~&%^fo zq>lZhdq`P4uFqpiXPnU|NtW;FlN3uGM9_0@$MGWC&$v&2&-;2VFI~UiQVHXegh~Bz z`gtYZ=S4)G2m=(#Je)(|+flKgwE7R(qR4@tEDuU6aK#85CAv!!!q0F^-+#YvC7}mU zoX%LpGBE^*la^s>7=}$AmV^*a9azX)1hKJ!=oqa2&dmY3Ij~%gkgT;Kpg!9iOkLUZ ztp*9-(uf&V-La7(B|1cn_KrE^tGge_9;hBE$frl;{CQ0gYPY(vJ;48mCVq_0j$JHZ&3vfh;;*5Uh+P=|WDm`8W794p%-*ZX;+8vzvS%y$}yV8@! zvjiJMl@8wTVi$|B3_!uhVK2~^6KW|o!A}bxudLrM(C6UHF5%uUp&wlJ@2oWQgRB=c z8`QCHOq5cp?=GbkttzaryIMOB4K@l4H&@LUhK)&V` z^m&%+=#1`%Jsc~T7w}SqVF&wBjOz&p56IEh0~XJL&8o-AV_NsK(mlu-=r%%xIA_c~Bv}{R z{?6_Fns*w3N%xjY-Y8~$vY)a_9)^?JYuq+vORjz?aqic3Z^^Z7*;z`f*owlSeM+2; zaYJUT%Ru^b&3&8tTm2_9jaSg$F`JWECWtoouo28y{=|mSTl_6unk@2Y#j^F~**Pik zVl8ex4Z#UAF+f}oy2_##$Q^M5`a_s2^F+w#io{z(?nFn#-a>yCH|a8Tmkdi))E29V zmVq+O@a330p<2i`ZMk0=X!ZM@tbCjA2(wdQzaI@e!dgd$__Jr*Gd`QzkCe4T$XVSd zf(5+>y;aY5BD`2_=w*5M%xhZ@dS@I8=%8w?NUXNocl&Qay9CZQ#SU2d0N z>Q|IGehY=LR#)}u<|^tp?VJz<@X%zh&&8q5e~2D;3kf2~l9}ker@_F!2*1&Z7cR9U z`s8l}taC|V5^6a@$Xdrw^YBT1K4?xgaci*#JyV4s!{7-B!L>qUB96%d8zjX2k zHvJOCrPYNk=Jqux56uc{AbDr25X0A0#(N6of;_p_sGfu0UnlbOfle%T#EBNs?qnNd zl<>L@t1O6WrYa>bj(i z!(1LCbn-7JRQ3~-nJ@x_zvx$>eLE}(mczNu7X@x5`e(>~rJud>LNN=6ppGEn0srk7 z0-@mIWJZ-)FVqQOg7Ik1mcE-HF3NLQfwZMK7t#hdi|Y21m`F)s7V_H}aFzX*Yn_ht zLFI#xWo=vGx z-s%?@F!-~y`a3RsN2kMOE!H1n%aO0|4v~(E$YyDKvTZ-Nq!)N|u==;}6i~H2z8Sz^ z@xjEc!DU)&^(RQ&*oX~F%}rA$*tf;o`3-_B;V#>-25%_Y*n|rk3kSu?XU-%8>xAC& zd%?1%%Ifff2ek$iZZ0sA;|GJ{^YLMo*sFWt8+#?hk9!UB1CHOM)f1lb{ICUzn#9pPFq&PI~e3`mlG5CknkKPdG6UbWB+Kilmo;l zBzK@KF7ndaTBEO>nY%iVl+E4l3`VwlXh!hYj>r#_zvcvcrgRLP=IY$=h>P$ES0T}m zLXn=rFW(;~3DGwbe71O2S{eQC!q5NdFTMAF|Fffi^1mJbH;;YwKUhxp{^vjX<@X+W z;eYFANTpkcK^6nANStDi zfUfdzH~zD`wmzn2UyP~W|0urvo%r(m`Xb17d@&a#|0qhnbRe#;Zc%>HePaW4%6#t` zyKAuHgYC2TkEwvUJ(#{arjL8SGRD`Z`0BM^*4Mk$ZpZb1d5=bacE^q1_n)iw@x_;4 z(Zj7?^raWg(figNtN+El|H-{K{_em3Z}VY7~{(w{<~=RWjV-~?Loe*2l;aAeNF#2zNwk3=dCuMG5x)3 z$5;$LrrCbHL)3W{@K=WO=@xx?k7}(9c8nP=ZhW(u?3W@3^_+Hm@gM8kT_EmrebJix z?5_WFmU8>*_4`$@ef8J%^*0|FyGwtCZISrBW0XMa%=h}2zD!@t*=l{kETh$qFQ{)z z`^DUjFMgSRwP+9ML$Lg!*5%9MyGTa>+&kE6pO*$(x3dQKvU*MJxv%-Es8d_g=JA)& znIHp1u>xOI=SyJy;=j?C`^LT^vb_G(T|lePt)l+BY%v9y<^fx(t(9C~y(>Tca?4Y~ zmMBWtdP>;Rx6k$E-us>kY~8PK4VpyHtG})FnbE&r)(^G0d&dj+Y8l4w+PdTLea)8} z-(+P(NMkSnm5=M+Tl)7a^zb+Dwsm{#uDkD2i(%JVku50=^iR~7cKixUcw@$JdSm8+ zu`PogGpeHh>w*5lL61SUkKLUH_p4VLyE*Z&CU{+3#AU;SNL>qF)Gd)M8M8MnN?V+Kmxq0hVS{kl-<1ovYxl%B(5 z(5Ghg`%U#<)>J>I*WcsMPxR|mo5trhy`Na+)t}gp-}4{8$6Q|(&|8gc^$?(c51`dl zU;lyq{R8{^kEwi~XXn3F<|6Nr#yu@-j{Sjr4)Md%QQ4#PEkBmKN2WREo%?*#W_Dm^ z?va7+ck{YW*4HIwXnmlJ42Y$qiJoVLS^x8QCv?hrO?=0BNiO}^`m=r!-ziyZlja+6 zrSo+9Mt!&6bo%*efq6t3YkuK#`|;0B$f+Pv?UXtxZv~uAKlg^(98-v|`{*%li{^g7 zgFO#-a9KK|aVia;Wjg(pKZZ&`iP@BFTHcY<(% zeuhh`{c*m;`Wu0gxJ-RV6fnRs0dPG1%#=C@X(v@QuF28&&wAl|s>Ai*Tmw$=m>2uI zb-BCns0O7SGe4?ok9mdqa&YF1ul6l!y{r0@8ga%(rG$Ro(WJJ(YgR>Tu`!l)C!4m>lVL69OSG+t0*`IB$7-!xj+nvI07|KjU32T=QG* z>l^JyJA%Va_0#-RhVG5b%C~zU=2~r63WZmQtl|w6(nQR1uR?=@$eYh&rs#%nJVQ>ari| zeXW$5_r|(!b#$@<5RQgms)w6Jxi{AT?zBY;cB>@#MN?H5??t7r{)4TL-H+hKGSG_4~NV+Apo`dZ%bkylMMZLea1Kb88paRBX`Cc zhCHTko&&M|8b8&$vV^^B!JpT$?^#|Wp1QWG3AMj`pX~*7>+iSnE`RMEQSSZpvmPV& zJ@Gbu3`mP^x!3P!Lt6Ab*=MN*V~t*Q8z`=jqRl97=zEsw+@BKahm#1JJ6>M5aBY-1 zymgu5^>u5tJZwcD%i1UPehJc-ea7#2P8gKqfb7X%9QIL{MqP64^YsA%WnBu6Zv3yM z@wjp7h4P{ME(Ng@%%){Me}|x3n{3-|ZJ$NA_Ws`5qiHt!c07-!;kurW-bcB4Zm~Ar zXJ6esv#9I+cIi9!TCb(|-L0Q{uIqdMecX^os42il=xdS3s9R9}mrXlaEb1#VW9-Xg zJFb7lJa3OKtXjn2kIY54uYZ7>|Hl?cS^Wcjv$}ump8X$NwLh@Ge|)z~dVQdV?;{*~ z9y7`fEBlmX^;=v2%Eyux%jrilAn?DJ^m$Qy{ExEZ7$jz{*1pj4yvBw9@NtZjlP((zh8dkZWXA_7jyjiQnjg|Hmbm1!q1Q0rMT5& z5hT<1`1)8;em$38f6Sr#N171^rDmisu0>%KtX%yqjqr`JE&2CW6>J~-N>M<`Fb?@+ zHBpE3B*a^XVX0nMc(>?SK*y6NhK2<@w{>ibtXnnLcVWn4@(O*b;Ad!U(NFz|0BCe^ z{m1&o`U(q*m@%-vZGE7zne}z+*T?RTV%F4uMWj?ETfgCzbJ4J)x!lp5DrOJ`=%2-` z6gM=e|KIk`2gdH|%J0AT=FfZcn0cQ0*#-k|yl+^WPN+TD#$1&?YDtdzL2aODc8zIbP#$Z$Fgy;!)BY@9#sZiTkgQqCd4y0Y7M&4sus^7&iw8w)UeMzyJ$|6a4@FWE zMuX=I_I%0>&{Ix2eJn5N$H_SoK~mcN+{&lBA&P`CCh0ue0+M9$ETwyk86PfRKCL*H zX^i~fp757RZ5vgF_!L2ewj<2z3wE0lh6@%a!aF=veeG|rB6XD*|uP||2O{X8;!6Y8WMWtPGP^9)|;w_DrCoihY z1$McFbjf#=oLmKYToii`3KYEt?t0poyzGGgvQ)Z9rHqf0@444YQu8P0G%9IO^q5!k zCvM9z(e6{6B=pHLCE6m($48l1@y+NdkiL<0!g4#{W9(cghO zo+so9Um@P9?M?EZW})C|+ckx*O{w%+8vII@(n*U$TLC%1*q3}?9pI%k>ihJI=f~?S zt+u9RE~BgMWZfxkxYk|wwe#kcSDQUrYPCV7wU_Q!3vHeKC{X&*n1FEALVv!W-3yjH zdJy$%4aTn}u)u1HpNAg=zky@mEe|SBc@R%pkhF2dp`2w+5_=@CTjJz(Ln4vP*9}o# z2W*V)8~kkCUT;4GTcF`MBK+_>C%B-$FbM|~C_=_7ts3L(J8jz zd`;C2)&P5vYpZo^!woy(O)hUG>#Rnd4XF$wimgc-O<*sZpwXiBvI$gzEFxuZq6CAj zRfy;~{e{lYNp5mq;^=gCH`$b#AVg8Rvn_oaQ_A(2wJ4j)`oDaUeYNsn@Cy8W$yt7G zTW-*KH0^RZUjU9s02ZjDb}Pw&`W73GUKOAbS|x{|>Rv!~*v7&VwEqTe1G&;dqcr%R zl9SnHGu)5eHsO@H`;zl+SkLj%|@>m$rH9PIx~VRZueY5wvGgxx|1W17K?+Z)$;%)o0J#=70@>fWAu zJfmwA{~I;y1r4}1Kba1DGj7JK^lV%fePf&+>)e#0mQ&Q#SKVbpSlwk6pQ09mAUM@s zLWjKGwykZhm15q(i_j*;t}1pyQ(6MA1O>(ZwFGM=@Wdm$)9wE^8%3R}D-V5g!T~6( zLiuC*u4ECEv!Sf~Wy)952C$IYdUVpzAq$e8ccWuY1LjG?5A(PG9e+YL=L2#l^J)uk ze(L55Yf;^QwOZBCqn0nF%faR&|20$)DR+3nh zs&5?;CAwrp6nGhkDVPz-hN{C`vo+phaDy!=pAj6(XJ{19yur+Z2ZI7os$i+`q?^`G z&MhMcSm%?14hRjBh|ROd#QO`yGWX*r8ukdcRM0#{;sVV6(j-JdaYk<(BtlN z1LE9fl3+vPW1TTXWdmL0SFj;bzVh>AZH_G3pu9_@VAPRSD-4_VI3D|G#_%;h>ZIBD zs9Ah4v*0yIo7i*7o)<;%3StThwweM?t&E91m+W~FhPa^qCVCiEx+vR??dbvwu86u! zmf|u+F>9YfiXJ9m|Gm=d6$C^3B`x*ED-&Avk4b(EFp?nxp0}F?782KIov0hlQzssCUH>6 z&r%2fhWF3x%s(DsygtBK)f3n2_&^9h1~*qidFXD*53s-Y{hKGP*QL_)2*$vlbdp_bL* zwC(*{=WKD+-TKGr>jiv(@wr?9yWYQE%>V~TogL7HF3y-}j+JW)Sh*YV-5iZRQjGpL;@O?IF8T1dDt=_CFWfSl2lip?cDXaEJqPV^|1e!Vc-W{kH*#bF9 za;l{9V)-Elb1e_TM0c!5^*7q1)l2MkbfIplR=iw(0W)lq4ZdH3(5se}R;-earwhTd zVcxaiiv#iqX|!1v7P(81p>aRFHSsm?&a<_UaJNKDqkjj$2~2<}m7wYXmz9CXZsyVr z%|q0Pkaseu;n0bQ|JDzlv_1|kBP%&uz0{831bYzj^*(^Xh%-BJCK<3g$tiJ7uNl81 zZdOVdBwe2T;4#H!?T)tK_g-IetPK6p4QiaZXvTsu#P2pj|OxW^+rb)DKMSZC`v|1UNRj| z1?|~Oc__sJa?Ai(>B3Y>taVPC$@S0IuhFNE9-^?;2x`&{(q<#bqj*ihBcv72m{(`& zH~i<-FKOTOk%>~2^YST;6Gt8=KhArb_>r7+3uYcaB7FwN*+5wbB;uk|ge3^=xWGNR z9J4PMid3fr!#W!2UWLdEStk2w1(|f9-5lHIky?YF*JPY&=jz00+eiI;Y$Ryf%XfmECncRD&~YV5kh|Ge{%-9q33+D(UYqmGwoFWjO1BScHNC zfvON6EvQF_*vT1-E91ev#L<>s3#a?rePmOBQaDwVcW@BFg>(xh)IqK#>5**^Dl-Hk zEqRYqxm0FsC^)@QF}0}1BTFg#9JJXORFrgW?P)zQj*r^qZ-hR@fny$=j>mnVFMDbXtNNWuG8LK-ZQZSN2-!k(Ve`r>BT2is9yMUvi9PlFYKfp5XnmUiyGRuS5>7d1!*f7^IC&1N=uM~B0`To2<1 zypr#ZTvg^lDU7OH!K<3r2eHXRf^+40bzFAalcML9=bcT5Z(&gzF%f#!$uR9LLYC0xRYhBrN!<4NlflO)A&YPL4{ETfn@>PBN%5 z?Sp6&f-h>1q*Rg-#a%2UGUeV4QA)WJS{$xI6SW&PYwqEemfd~57Z&Z+Hzl`YFvqJOHAtw)< zZF08d+i>>C*^}?V*)3;xz8hy&&aB%&v7Mm)Y`$N6A~{9m^4ifvCj%1e@JXivJM*13 z?x#h6X|HzK+U(t*XKRQxUp5B3SSW;=$!VaFCWQ--S+IU zCpv6G+B!P>|DTD&#H8|CY=DmgRiQ8Wma2cU&u&Dq<9>sBG27cYHzbxYk6jymv&)ATaDj8}`Qo zwS{lMqisCU!pS#&GesJpF=o0h_nD2FWR^?6!=5C8%HGDEkT;rIB#>IM_7bKVKa1rq z;?c@I#FDT08{tZIS^te6^0NMsM(X}iZ~iYflDx}Z*RQ=i_TNPSA@J3);8^l&LAmBg zGz_Ex`V0dOnK*k_!d!tsy`)8uhy`A#x%1ggDJE?%gqmpVh*FlUd?xKQ&hW@rY5la- z*p|`qf_o*doDS0uyQ=(&EU7j7WF_n2{sh3E(6j@y-8kNQtXL^-_swZ&j=92De()ehpr zKIB&G>eeikxNhb9lu#X{wbsL}2AyGp&TtJn!&%svxH|0jD40-qRHp$AEwB7>^<*o& zhOM+62G1R|!s_4Qdd~}R(GWRQfD*Xwt6sXGy@qVI+Z?zRn2S1GsJaf_Q3C#`26vBb z9R_gbwUF0#i&H5plLi|Y zcOpk+wwlZY*>cB+FQRT+{W~ANkZ_o$eh^1ccnD!s9d|OZJCr3Oeo5uq?dgnP9mD{9 z^&5ra3T^MOo5GnzzfYKz7p4UM1#CHPgLXV?gLWLO(=Z>07ceY3?g+^7)+umYJYczp zp~C{OO;cZsIWNt;lf11s9FzhwoK$08u(7Vnj0ca#nx~p@%Bni$5cZTuSf=li3wKRA zrKzB{ovQW2d>B($lSyyqhne@~CBxZM9;Z)voIaIzIDIPLV}#%o9MAWCN{8K)u~#j9 znRxB(^6QPv@{GzI`<{iiga-JK)sfj5){@}hXPqtIlN{#+Pt=}7(G!r@PDwlX?|)$X zW|+(<#lKJO`t!4uKZv&e(YJp8&mYZCqDqQ>WYi zvh&D;|MGYLXv@?8d;eAc?$xWlcJi73^51{w;M-R|`6q9`IJ30re;mH`hJXFqD>wbw zEf@an+rM|}`k(ys7ys+Afdh}PIKBP%9$fsxncqLX|Mfrp#jXG0$qiqa`oqq@{N1Df z>3_X7yz}ettok>*|D-DwweOrS9f+bFLM4>E3*NRpCl;O|F7bx7ZqM*G*269r(BiN% zf`KQ+1g@3QiVUU$3iKhusuF7x<6A!1#nGa;d<53;$_#M5$Oxf3iU)Y~7xb^TVG4)s zuu8{$3kA`aLOgJVh#tF+g6ln*YYpy899LFR$tloWPm5Kciggd(`d#R+S(>`)>d%## zthVypFYOzXfz>^Qr#I8?9AUue6c}HId#7!MOr{Ol>OwlJ^cP6qt#z9Y*v$o6auvdD z5k5qHGkb|Xld~EV_X>LTyz#*mx#n8}`Z9)wp{R6x(AbXhF(6)0Ts^bcl8`PwXc_B~ zWbDW=`wzw1@;WJTqjd@bLB(O~&WrnJzwEdyg@%(yEMX!!!=YA8@%S|yo! z1X$@^S<|74B>6d%#u7o>(V81-Z25W6i1$E1IVPTL$e0GwRFU#&C4;GWl9FYJ^r|5O zVlwm7#ASjsZ77fu9gq4dVetU7K;krR;du;l%eZbZ)P&U<;PGpOFFXlFiWiN`&xy6= zRVZdU9hw-8B*d4TH0OsRyNK%8l^JX^xe+4Rs#r^45{&V!UEtuW6=qpWmpTx{`wO4Q zTmi{&eSs)9w%Wp7+R%pjY!9WlV!2krw`R$;W~rq$OTU?szR3uG4J@@Z0WuJ#oWp`# zo|%tPt`cdaSF#ryd)5T<1Czyx~pFbSn573tDO_NJD7_ zEj1SelDOcef^?$}@T7@WJPu7ZABN9XixAacxK>h-rN1=J#f(s(fInh4f{+xDHWV__ zUvTL({gtk`(vM#;E;6@W*y;>8A{x;U*3bC|REp38%~uUpJ$-+}bcQA}rOOvxQJT@$ zc*#`3ig5t2$?kiv@@~S+}XNwm>t73hkh8L1f%d zxdO~Ux`1dT(Z_yeLd0bHIRUeoE>NPc?^zdK(Od0!*6Jf?`E#&)bj~Ic1;xpQc)%5C zft6>08j+P}1rWV35*lEt;pG}7;}dF4hzFpewIS9fqmuIeV|+f8aaCo8s)rNR+AHLxm3Yi&l#RPXYOyK z-71@QtbASrYa@iRQke8@R-b~}ujMLnxlV|eNKRzCL@;5hPMBDcywXc=bd3BJg_g;b zC0+Rme3_^X1!_Lc#*fq(Ql9F+6#%<;La2mfosTmaR{~NFDgl)N=Y_69l=nr{p0rDRpM)znmemZo`i0dwWK*o+w|z8gH2 zEK3{Ps2|;kP>-;iGX*pym|9kM)in(^eB=d%-P852tv{db=h0tyG;_N{g8v`SOb+m1 z+73492?x*JIIH76pqgoO4Kmf05S4LNNFW%4h5;{&L54$?T$cQCUnSMel(1uQASq{R zH0OI5X*ctr9=TpDrI~gerp-cCURVKQOvcH#2oqg>88(Pb5TVya>T)L*05Nm5D&o#8 zuP$Ae=?Zh(R!55j!nJ7#i)A#d%A%2VNvlgV0>)%XIhuJBm;`YH#G~0@&W30a&vK1D zpf|eIpvzDRM?sCO{=l9;1YQu@o_GLJfkI&96nPFCaDj(4s2x^(z@|<0&8z%!KwJ0? zc>2weFckvlWQztz=v2g8E^x^QE?MA(72rH-#2TlxMwE!2B`%r5jblhG`9(cB+@bRR zy2m9|TghT!f72zF4b`UueD!De@zUV5#lMr&WL{K;MFlKGxlB9D7UHw(=t4Vdk|U^M zsum3rz6py41MP1BO;_MT)=KHNrVLtQ;B4_((>CbhF>y+ExX#k{8n17D*T{uc7QUvI zUdW+%>(YWPD$Y-Op-&!3z}{$d)e>`C8AU7GRtjJCI!4i!U{op3t|ig<`_`Ue?!&mwz3G&P{B ze}kwY$fw@w+hN#4bL{=D?XVVG*Ke`sFf*jQTd=#vF&+@SN&4@5Mz4(?8_+1+@@%_K zNue4Z>W0Y%QwOH%l1bGTVnwNxs{~Ge?x^O77j{sR7!L8bZtvO6^Rb<;Lga^iuV79=XLQy|^`FZ@t$p{e0gwR_EpIvoew9(v zbf5_&zXM9-VXU_Vj)*ZgbdJ`0Sd`gCHr$Pf)!++%SR-Ak-*lK^AwsZnr2iq--moL> zP*3}b1FB6cN~2bdtR^Y7CntUFHVyhLLRuiWVad3C6&y_r=^1?sZ-!b%yD}{y!hKhCN=(U*@#w)P( zixQUw*Ru$E0W^_}!~-u0z)K{eanvqJTwjv}rql6Ae)U5P6-25MgPS6JaCb-#JFCrR zxH8yn8wV9Fel5#t)s!_9=|*b3AF1^~XA#i$uZ*^2j3L#uvJ!IWc?AYW$p#8{fE8n6 z8O3gNz!jgM`kbnVdr#$n8aR{-iNoYCyDJxS!Y?6zOFC_BXWO*<)FxFm3?foS7V_V& zBZ4Q8C9G?Ov^Y#_p!9k!PWrK(4XojT%RyOu`NIlrzSJ@2H`O~=k4Cp7! zIL!zm9!lMWR)&2J>X8GwkhEb6P;gp8=fT7X z%$Y2(^xrC`J2@4Ck%pno2uNjB4wM-DRSEDPtG zvXqQ#8nvVN%&g=H6YtDLjS94YZ)w=qvy2*8p&DhV`f_tp3#8=~@q+c)q zZmJOpeaMQSL4BAsIJz-nWD@fyiWPJhly7dcG_|c`%IdN56%?eRv%pRA<1yY{dOPZl zL!3V^8%f@_0BsU2gG^Y2#~zE=YEP5Fs~c<~))MS~p(jDb_7Z_DZzGZsB9GdpkRAPL3goP++osZ)RntUTNQX8Zk2=4Zx;Q@Pz!KMWS79<+qaX94)Tz~% za%%M4m| zNIxcoJI)M5JS|Q zE#z^bJVU?-eK%xzS0}9x#WkdPkD!JqGHgZ`*TvCQs=AEiiWpG4^0!pNfZJPb?=M<7}VGpxCWG5f95| z-N!spPxOQ(dV*pptyXOMiU@`R-mCm-JS;VsW%MC1B8}cIsW&ZYm&-)^WR_n`lLwe} zk7+}tC{kj{xQ&VN*At7|QQ5p{9!G~w2aOat%xWTOa@asJ#)z_%o-ofiU|^8zV8BBU z^%VFf?Kxx5d3!!$&qwWPdc1`Nb1%vw-;*yu5PHzS3@kWV_Hj%8ggw7u&!_Bp+@8{5>Cgm&by9=6YxJpFsY{JXjf=09x@4t( zSD1prrH(01_Ht^<1((QBbKzA>O64_t;Z(R}0axj30yg*f)S~eS*gOU7Gxq#}J%4B= z4c3#IDw0I!j3Yh4UXY=A`GnW}ax~nQ_!DcT21R2>in?B$qSJxBJ;TKFisGX_k0sN@6$^@5~#|&f76jothAp`!pje zpGK!}AJ&W*6W`ZY`7GFnbXU2Lspq2X{;4ByEEeE&Du|1f`&a~V1#hBqXm0#thPw2CIt8lT8EmkCsX1HhFR7ENqv#JjT$I}D>3?K6xkxsHa9 zl8gn%QUi~ChAlzuiD@k;pCgmoR}_o1G1G@IExO6Q1X7v(j6l|nvpRsr%RRjxqdW}F zlOH+6NPZ;!Q00(93{#RH;gT==v8Gbv@;kmzl>;93v*+p^T8)z*rLSO*th!f6%5>ZS zLwQ*drur&hHP10Ulb6D5gTi#I;1=n@3UTFW$*YxT91KpVa|;)O6`EV~ zxA|>QJ4eFSq!ywVk?h#-M1A9z`E4e*W2^$mxAjXGk5azJx)xHv>IElh*hoPCjo$8M zI@6RctUwx`biS>P9WF-MnKo5dp(2G@2nE5VFhIfQPuF~!!RiA}m2KI0;bMs7S|)cf zlMtRO$N0(ky7Fxth6jJFbBj=p@AOr^XFI|#(HY_K_Y8{!FAz`4j{XiQTPwH5l~?*Z z;9byS06(-TFV(_ziig6#&&IFLW4sRSX8Ia6y0}uCz)MCMum&h!)R5S8ya#1^DhPe(v2)~+E9U~)idOC%_G1y zu)cfgo9O$$TK&enh9^H)y`mahYJSa+#sttFS}Sg45u1&UmPk`Y(dF`zbImB3CTe8{ zexYy`)*9tO4|PgXv{v{)A7&`g2cw~~1#`xx`5@V3;F2Y&+g{U_ri_io3DCGy#(SAY zKW`j%`=XOOLbt-^L>pbG=!*nLlhUPLsw0&&8(NG#8p`Q^2+i z!U6n~)y53)*k*+^RH&qeBcVb!6-l-}19yoyQEw@|hp^NdW>Z#N8^#&8skT~Tj$gFa zs6aq>CZgHk`8nt%*?MUKQ{BLD@gET zAI@~E{FPu?)H=hCpr((S5)$|x0c`2|SQ$6_tvVZ9bWEmf4Et)~HwN0{3AC)D&fgRBne zEyAD=8X94E+yuGm)vVhqBV&pl4>4w#Y%wI}O)hp&Yi?%p<4{basgKJ|r3#Z0Uujok zns58*imd&}?hZb423ngADaH)Mb1S7aZ=18wh z#TWvyP*;A=mI@5Jwp8G{YDp=8lg*-EIzueDvXhzZqCR)t7zpd|u-PYy(=ovMrCDt0KUUmvX$dsqD!Op7i$O`{^LZq_(g zUV(qnU5Odkl3y(^cNuF_x3iT6zG>uf6gD-8zQ+=KWy#N5=<<$*sHrf6(IMxBp zJJJcu%6?TlN0haJ+!MlJ>+yC6Z?~+-+OT{p7*Wrz%5?b>bxhgqcq>CLWXOr-YSVFL zE2uMsbMLAx4D3LO`_t|W-IHXdy$kcJ)7bHgy?aq&u3D@SBauW7c~?roter7KW9MYO zE@;2FkfZOD%w3&+rIBBzQ zdaM*hyHim*+MVv%J~cgcw ze`TsPKQuReXm(%e3)8dvOGEf?{O#$7AJ{iu8ap&OF|~ik==^9Y6|MZ@^urtHYM~p) z2&STsR_^X}Zs**+hbAXSAD%2lg;aFa%xr1n%{b~UMEQFK!(8hXF{v(r;ed2UWco8BkS+{A&I$x>6U zJ0wDVL`Z4~g_&r-8dEX1aSC5`chH1 z3K61iJTS_jOak_~d60hN{KSFM-Up7%aW-v;QcJt>Zzvv^+c!NsIq~p@;)9IW#Prnd zTbN_~+fcmY(B%A~+0yM(r9<xqbT|Jsi;t|ZR1>N-!zCU9Qnc_mG#ej{SSa3Q~Q6dwQD%u3tECUm}6jw zqK8^0Om8F9ehsrEmx?+{Q}eS&qG%0tHH;z@YFs^2Y z#hatSk`<4cvJt-TYd$)H$&-{`)y}^d-FJL|IZSdnE8ZucJeS!KSIcqbhg>=$jbvPT zQ=%4Jl|NEgg=vcv1NVAV;zi}6WKAoSauwrD-@LSNmJ`fzy;OCLOzO4Au?q%}C%jKT%5t%e$s2qU znF9~-gqRn?3!xWASzG-YTvA`vRI9wOR*9?ML_Zc+^@ZHH`m{{-38}h^k*ZHxif4dj zTs^iD#ED)kZIZewOsBQ`ze?tFu|Sb)8(W%=rldNu)}{9Kx9 zy6k){z~vZChr+TBnsDkMj9oM$I~$jw4FS^TeRWfVRZRnMD3C0BGF)7ZaaKKh7V(lG z_WaKqsLZ8u?N7(c_;WFh&oH~f8}U-9AP!^^ZFz%pNXP(efJpAz8b)rbS&W?ba)^fZ zSvn)zE=(qbIXKLM3quO$Lk}+9iM8*%t|if#C!`*om0{xr7dEvGO)D#o{}yyMv@g5` zXmVMjY`b3QG|V}Jh7yED*s<}X>mj2f3NJy4+eMM1nN;+}PtTQ#J0|8vCnu*5-!VP4 z@6hZl%)_0Jl=dAGtFV0@QvL9u`BD+F;Ku3M;x4gjbMwDF{jk`>?O%X-xNPF7>3JB& z>8ZJ*7?0BE*bu8g2S!2F)23yA83zKtpIm}yWwVpo83uLFHTLzsOc(g8vp?Xl>Du4J zx+ioryy-qw#??1IhP@zILa`z0-QG%RP^;PZyjw~xBqZfoE<0gBZ7|MCYf^qLWU#Q~ zdX~)|Uc+>}X8aXWQJLyf&IMp%nZ|BndU*9!c-KZT1hl@_JL6vpLm&69sc(?FyB__n z=_qEM)6Kd9TWbscYg5sc$gmr48oGJt@Wj+jTmDh;enhmU?RQMi9D&D%9Nv}yCkEt@uPD()`L&W`Szo~Ic*r}hmA ztBW&;C=*P8BgK10XTLOE92p%y08dj)Mb~aefFCavM<(`_rsfb?yr81K7)PT^K+KUf z$6Aw|(pP?Fc68?6>8U#(*;ks;B-lMZJAHW0*r5OT_Al>MTIKvK|3^NbiAHv1xJP8i z1Ah@+D17|F;z;=y|03Sg`^&#jhOyiBeg**S^>QMB-0Qjw(Dy!kXkv0~FF@Qo>tODa zh14@+@LN%IhC0IE+j19!ulfCELpm4p&>hpWJ0>UZ8J(DlOk69KhQ=l*E%NWyN5yT; z1uXlPA+QXAWe6-oU>O3-5Lkx5G6a?(und7^2rNTj83KRrA&`oC>EjxU<_xRTi-YH7eCE)rZn!ZuA(>_`=Z7J4SE`3i;-!PgZzWxy#SH$z} z-{m6@DcV&3md~XneZ$ghqTlY{R=!RE47jy?J$dz^9DPSc-xZmsmMChxCA>)4jbDLq z-$NBAYAx-9q@5*oJ zVP7I&k=Bd?bA5L$ias9|n%d_uP2ZMLymAN|B5pxescsBZ!US$%i@rs(fijz+sP+qn zQMAqA_D_9(g*j?dz)$&vKh5~o2*1hbdfMl{+A|g%qSpBasMqs-h58)Eg}RGixGu~W zjJEK<6*G&`P2{M8^e}wJFpNm4p6Uy`3K2Mwab6Y z5Lkx5G6a?(und7^2rNTj83M}?ScbrdfdKpE-O49se)(@10?QCshQKlemLaeVfn^9R YLtq&K%Me(Gz%m4uA+QXAzn2jBe;<~zBme*a literal 0 HcmV?d00001 diff --git a/lib/Quartz20/net/3.5/Quartz.xml b/lib/Quartz20/net/3.5/Quartz.xml new file mode 100644 index 00000000..c983e3df --- /dev/null +++ b/lib/Quartz20/net/3.5/Quartz.xml @@ -0,0 +1,19889 @@ + + + + Quartz + + + +

+ A wrapper for generic HashSet that brings a common interface. + + + + + + Represents a collection ob objects that contains no duplicate elements. + + Marko Lahma (.NET) + + + + A sorted set. + + Marko Lahma (.NET) + + + + Returns a portion of the list whose elements are greater than the limit object parameter. + + The start element of the portion to extract. + The portion of the collection whose elements are greater than the limit object parameter. + + + + Returns the first item in the set. + + First object. + + + + Returns the object in the specified index. + + + + + + + Simple C5 wrapper for common interface. + + + + + + Default constructor. + + + + + Constructor that accepts comparer. + + Comparer to use. + + + + Constructor that prepolutates. + + + + + + Returns the first element. + + + + + + Return items from given range. + + + + + + + Indexer. + + + + + + + Only for backwards compatibility with serialization! + + + + + Responsible for creating the instances of + to be used within the instance. + + James House + Marko Lahma (.NET) + + + + Initialize the factory, providing a handle to the + that should be made available within the and + the s within it. + + + + + Called by the + to obtain instances of . + + + + + JobRunShell instances are responsible for providing the 'safe' environment + for s to run in, and for performing all of the work of + executing the , catching ANY thrown exceptions, updating + the with the 's completion code, + etc. + + A instance is created by a + on behalf of the which then runs the + shell in a thread from the configured when the + scheduler determines that a has been triggered. + + + + + + + James House + Marko Lahma (.NET) + + + + A helpful abstract base class for implementors of + . + + + The methods in this class are empty so you only need to override the + subset for the events you care about. + + Marko Lahma (.NET) + + + + + The interface to be implemented by classes that want to be informed of major + events. + + + + + James House + Marko Lahma (.NET) + + + + Called by the when a + is scheduled. + + + + + Called by the when a + is unscheduled. + + + + + + Called by the when a + has reached the condition in which it will never fire again. + + + + + Called by the a s has been paused. + + + + + Called by the a group of + s has been paused. + + + If a all groups were paused, then the parameter + will be null. + + The trigger group. + + + + Called by the when a + has been un-paused. + + + + + Called by the when a + group of s has been un-paused. + + + If all groups were resumed, then the parameter + will be null. + + The trigger group. + + + + Called by the when a + has been added. + + + + + + Called by the when a + has been deleted. + + + + + Called by the when a + has been paused. + + + + + Called by the when a + group of s has been paused. + + If all groups were paused, then the parameter will be + null. If all jobs were paused, then both parameters will be null. + + + The job group. + + + + Called by the when a + has been un-paused. + + + + + Called by the when a + has been un-paused. + + The job group. + + + + Called by the when a serious error has + occurred within the scheduler - such as repeated failures in the , + or the inability to instantiate a instance when its + has fired. + + + + + Called by the to inform the listener + that it has move to standby mode. + + + + + Called by the to inform the listener + that it has started. + + + + + Called by the to inform the listener + that it has Shutdown. + + + + + Called by the to inform the listener + that it has begun the shutdown sequence. + + + + + Called by the to inform the listener + that all jobs, triggers and calendars were deleted. + + + + + Get the for this + type's category. This should be used by subclasses for logging. + + + + + This interface should be implemented by any class whose instances are intended + to be executed by a thread. + + Marko Lahma (.NET) + + + + This method has to be implemented in order that starting of the thread causes the object's + run method to be called in that separately executing thread. + + + + + Create a JobRunShell instance with the given settings. + + The instance that should be made + available within the . + + + + + Initializes the job execution context with given scheduler and bundle. + + The scheduler. + + + + Requests the Shutdown. + + + + + This method has to be implemented in order that starting of the thread causes the object's + run method to be called in that separately executing thread. + + + + + Runs begin procedures on this instance. + + + + + Completes the execution. + + if set to true [successful execution]. + + + + Passivates this instance. + + + + + Completes the trigger retry loop. + + The trigger. + The job detail. + The inst code. + + + + + Vetoeds the job retry loop. + + The trigger. + The job detail. + The inst code. + + + + + Default concrete implementation of . + + + + + Client programs may be interested in the 'listener' interfaces that are + available from Quartz. The interface + provides notifications of Job executions. The + interface provides notifications of + firings. The + interface provides notifications of scheduler events and + errors. Listeners can be associated with local schedulers through the + interface. + + + + jhouse + 2.0 - previously listeners were managed directly on the Scheduler interface. + + + + Add the given to the, + and register it to receive events for Jobs that are matched by ANY of the + given Matchers. + + + If no matchers are provided, the will be used. + + + + + + + Add the given to the, + and register it to receive events for Jobs that are matched by ANY of the + given Matchers. + + + If no matchers are provided, the will be used. + + + + + + + Add the given Matcher to the set of matchers for which the listener + will receive events if ANY of the matchers match. + + + + the name of the listener to add the matcher to + the additional matcher to apply for selecting events + true if the identified listener was found and updated + + + + Remove the given Matcher to the set of matchers for which the listener + will receive events if ANY of the matchers match. + + + + the name of the listener to add the matcher to + the additional matcher to apply for selecting events + true if the given matcher was found and removed from the listener's list of matchers + + + + Set the set of Matchers for which the listener + will receive events if ANY of the matchers match. + + + Removes any existing matchers for the identified listener! + + the name of the listener to add the matcher to + the matchers to apply for selecting events + true if the given matcher was found and removed from the listener's list of matchers + + + + Get the set of Matchers for which the listener + will receive events if ANY of the matchers match. + + + + the name of the listener to add the matcher to + the matchers registered for selecting events for the identified listener + + + + Remove the identified from the. + + + + true if the identified listener was found in the list, and removed. + + + + Get a List containing all of the s in + the. + + + + + Get the that has the given name. + + + + + Add the given to the, + and register it to receive events for Triggers that are matched by ANY of the + given Matchers. + + + If no matcher is provided, the will be used. + + + + + + + Add the given to the, + and register it to receive events for Triggers that are matched by ANY of the + given Matchers. + + + If no matcher is provided, the will be used. + + + + + + + Add the given Matcher to the set of matchers for which the listener + will receive events if ANY of the matchers match. + + + + the name of the listener to add the matcher to + the additional matcher to apply for selecting events + true if the identified listener was found and updated + + + + Remove the given Matcher to the set of matchers for which the listener + will receive events if ANY of the matchers match. + + + + the name of the listener to add the matcher to + the additional matcher to apply for selecting events + true if the given matcher was found and removed from the listener's list of matchers + + + + Set the set of Matchers for which the listener + will receive events if ANY of the matchers match. + + + Removes any existing matchers for the identified listener! + + the name of the listener to add the matcher to + the matchers to apply for selecting events + true if the given matcher was found and removed from the listener's list of matchers + + + + Get the set of Matchers for which the listener + will receive events if ANY of the matchers match. + + + + the name of the listener to add the matcher to + the matchers registered for selecting events for the identified listener + + + + Remove the identified from the. + + + + true if the identified listener was found in the list, and + removed. + + + + Get a List containing all of the s + in the. + + + + + Get the that has the given name. + + + + + Register the given with the + . + + + + + Remove the given from the + . + + + + true if the identified listener was found in the list, and removed. + + + + Get a List containing all of the s + registered with the. + + + + + This is the heart of Quartz, an indirect implementation of the + interface, containing methods to schedule s, + register instances, etc. + + + + + + James House + Marko Lahma (.NET) + + + + Remote scheduler service interface. + + Marko Lahma (.NET) + + + + Starts this instance. + + + + + Standbies this instance. + + + + + Shutdowns this instance. + + + + + returns true if the given JobGroup + is paused + + + + + + + returns true if the given TriggerGroup + is paused + + + + + + + Initializes the class. + + + + + Register the given with the + 's list of internal listeners. + + + + + + Remove the given from the + 's list of internal listeners. + + + true if the identified listener was found in the list, andremoved. + + + + Create a with the given configuration + properties. + + + + + + Bind the scheduler to remoting infrastructure. + + + + + Un-bind the scheduler from remoting infrastructure. + + + + + Adds an object that should be kept as reference to prevent + it from being garbage collected. + + The obj. + + + + Removes the object from garbae collection protected list. + + The obj. + + + + + Starts the 's threads that fire s. + + All s that have misfired will + be passed to the appropriate TriggerListener(s). + + + + + + Temporarily halts the 's firing of s. + + The scheduler is not destroyed, and can be re-started at any time. + + + + + + Halts the 's firing of s, + and cleans up all resources associated with the QuartzScheduler. + Equivalent to . + + The scheduler cannot be re-started. + + + + + + Halts the 's firing of s, + and cleans up all resources associated with the QuartzScheduler. + + The scheduler cannot be re-started. + + + + if the scheduler will not allow this method + to return until all currently executing jobs have completed. + + + + + Validates the state. + + + + + Add the identified by the given + to the Scheduler, and + associate the given with it. + + If the given Trigger does not reference any , then it + will be set to reference the Job passed with it into this method. + + + + + + Schedule the given with the + identified by the 's settings. + + + + + Add the given to the Scheduler - with no associated + . The will be 'dormant' until + it is scheduled with a , or + is called for it. + + The must by definition be 'durable', if it is not, + SchedulerException will be thrown. + + + + + + Delete the identified from the Scheduler - and any + associated s. + + true if the Job was found and deleted. + + + + Remove the indicated from the + scheduler. + + + + + Remove (delete) the with the + given name, and store the new given one - which must be associated + with the same job. + + the key of the trigger + The new to be stored. + + if a with the given + name and group was not found and removed from the store, otherwise + the first fire time of the newly scheduled trigger. + + + + + Creates a new positive random number + + The last random obtained + Returns a new positive random number + + + + Trigger the identified (Execute it now) - with a non-volatile trigger. + + + + + Store and schedule the identified + + + + + + Pause the with the given name. + + + + + Pause all of the s in the given group. + + + + + Pause the with the given + name - by pausing all of its current s. + + + + + Pause all of the s in the + given group - by pausing all of their s. + + + + + Resume (un-pause) the with the given + name. + + If the missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Resume (un-pause) all of the s in the + matching groups. + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Gets the paused trigger groups. + + + + + + Resume (un-pause) the with + the given name. + + If any of the 's s missed one + or more fire-times, then the 's misfire + instruction will be applied. + + + + + + Resume (un-pause) all of the s + in the matching groups. + + If any of the s had s that + missed one or more fire-times, then the 's + misfire instruction will be applied. + + + + + + Pause all triggers - equivalent of calling + with a matcher matching all known groups. + + When is called (to un-pause), trigger misfire + instructions WILL be applied. + + + + + + + + Resume (un-pause) all triggers - equivalent of calling + on every group. + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + + Get the names of all known groups. + + + + + Get the names of all the s in the + given group. + + + + + Get all s that are associated with the + identified . + + + + + Get the names of all known + groups. + + + + + Get the names of all the s in + the matching groups. + + + + + Get the for the + instance with the given name and group. + + + + + Get the instance with the given name and + group. + + + + + Determine whether a with the given identifier already + exists within the scheduler. + + + + the identifier to check for + true if a Job exists with the given identifier + + + + Determine whether a with the given identifier already + exists within the scheduler. + + + + the identifier to check for + true if a Trigger exists with the given identifier + + + + Clears (deletes!) all scheduling data - all s, s + s. + + + + + Get the current state of the identified . + + + + + + Add (register) the given to the Scheduler. + + + + + Delete the identified from the Scheduler. + + true if the Calendar was found and deleted. + + + + Get the instance with the given name. + + + + + Get the names of all registered s. + + + + + Add the given to the + 's internal list. + + + + + + Remove the identified from the 's + list of internal listeners. + + + true if the identified listener was found in the list, and removed. + + + + Get the internal + that has the given name. + + + + + + + Add the given to the + 's internal list. + + + + + + Remove the identified from the 's + list of internal listeners. + + + true if the identified listener was found in the list, and removed. + + + + Get the internal that + has the given name. + + + + + + + Notifies the job store job complete. + + The trigger. + The detail. + The instruction code. + + + + Notifies the scheduler thread. + + + + + Notifies the trigger listeners about fired trigger. + + The job execution context. + + + + + Notifies the trigger listeners about misfired trigger. + + The trigger. + + + + Notifies the trigger listeners of completion. + + The job executution context. + The instruction code to report to triggers. + + + + Notifies the job listeners about job to be executed. + + The jec. + + + + Notifies the job listeners that job exucution was vetoed. + + The job execution context. + + + + Notifies the job listeners that job was executed. + + The jec. + The je. + + + + Notifies the scheduler listeners about scheduler error. + + The MSG. + The se. + + + + Notifies the scheduler listeners about job that was scheduled. + + The trigger. + + + + Notifies the scheduler listeners about job that was unscheduled. + + + + + Notifies the scheduler listeners about finalized trigger. + + The trigger. + + + + Notifies the scheduler listeners about paused trigger. + + The group. + + + + Notifies the scheduler listeners about paused trigger. + + + + + Notifies the scheduler listeners resumed trigger. + + The group. + + + + Notifies the scheduler listeners resumed trigger. + + + + + Notifies the scheduler listeners about paused job. + + + + + Notifies the scheduler listeners about paused job. + + The group. + + + + Notifies the scheduler listeners about resumed job. + + + + + Notifies the scheduler listeners about resumed job. + + The group. + + + + Notifies the scheduler listeners about scheduler shutdown. + + + + + Interrupt all instances of the identified InterruptableJob. + + + + + Interrupt all instances of the identified InterruptableJob executing in this Scheduler instance. + + + This method is not cluster aware. That is, it will only interrupt + instances of the identified InterruptableJob currently executing in this + Scheduler instance, not across the entire cluster. + + + + + + + + Obtains a lifetime service object to control the lifetime policy for this instance. + + + + + Gets the version of the Quartz Scheduler. + + The version. + + + + Gets the version major. + + The version major. + + + + Gets the version minor. + + The version minor. + + + + Gets the version iteration. + + The version iteration. + + + + Gets the scheduler signaler. + + The scheduler signaler. + + + + Returns the name of the . + + + + + Returns the instance Id of the . + + + + + Returns the of the . + + + + + Gets or sets a value indicating whether to signal on scheduling change. + + + true if schduler should signal on scheduling change; otherwise, false. + + + + + Reports whether the is paused. + + + + + Gets the job store class. + + The job store class. + + + + Gets the thread pool class. + + The thread pool class. + + + + Gets the size of the thread pool. + + The size of the thread pool. + + + + Reports whether the has been Shutdown. + + + + + Return a list of objects that + represent all currently executing Jobs in this Scheduler instance. + + This method is not cluster aware. That is, it will only return Jobs + currently executing in this Scheduler instance, not across the entire + cluster. + + + Note that the list returned is an 'instantaneous' snap-shot, and that as + soon as it's returned, the true list of executing jobs may be different. + + + + + + Get a List containing all of the internal s + registered with the . + + + + + Gets or sets the job factory. + + The job factory. + + + + Gets the running since. + + The running since. + + + + Gets the number of jobs executed. + + The number of jobs executed. + + + + Gets a value indicating whether this scheduler supports persistence. + + true if supports persistence; otherwise, false. + + + + Get a List containing all of the s + in the 's internal list. + + + + + + Get a list containing all of the s + in the 's internal list. + + + + + Helper class to start scheduler in a delayed fashion. + + + + + ErrorLogger - Scheduler Listener Class + + + + + The interface to be implemented by classes that want to be informed when a + executes. In general, applications that use a + will not have use for this mechanism. + + + + + + + + James House + Marko Lahma (.NET) + + + + Called by the when a + is about to be executed (an associated + has occurred). + + This method will not be invoked if the execution of the Job was vetoed + by a . + + + + + + + Called by the when a + was about to be executed (an associated + has occurred), but a vetoed it's + execution. + + + + + + Called by the after a + has been executed, and be for the associated 's + method has been called. + + + + + Get the name of the . + + + + + Contains all of the resources (,, + etc.) necessary to create a instance. + + + James House + Marko Lahma (.NET) + + + + Gets the unique identifier. + + Name of the scheduler. + The scheduler instance id. + + + + + Gets the unique identifier. + + + + + + Add the given for the + to use. This method expects the plugin's + "initialize" method to be invoked externally (either before or after + this method is called). + + + + + + Get or set the name for the . + + + if name is null or empty. + + + + + Get or set the instance Id for the . + + + if name is null or empty. + + + + + Get or set the name for the . + + + if name is null or empty. + + + + + Get or set the for the + to use. + + + if threadPool is null. + + + + + Get or set the for the + to use. + + + if jobStore is null. + + + + + Get or set the for the + to use. + + + if jobRunShellFactory is null. + + + + + Get the of all s for the + to use. + + + + + + Gets or sets a value indicating whether to make scheduler thread daemon. + + + true if scheduler should be thread daemon; otherwise, false. + + + + + Gets or sets the scheduler exporter. + + The scheduler exporter. + + + + The ThreadExecutor which runs the QuartzSchedulerThread. + + + + + Gets or sets the batch time window. + + + + + The thread responsible for performing the work of firing + s that are registered with the . + + + + + James House + Marko Lahma (.NET) + + + + Support class used to handle threads + + Marko Lahma (.NET) + + + + The instance of System.Threading.Thread + + + + + Initializes a new instance of the QuartzThread class + + + + + Initializes a new instance of the Thread class. + + The name of the thread + + + + This method has no functionality unless the method is overridden + + + + + Causes the operating system to change the state of the current thread instance to ThreadState.Running + + + + + Interrupts a thread that is in the WaitSleepJoin thread state + + + + + Blocks the calling thread until a thread terminates + + + + + Obtain a string that represents the current object + + A string that represents the current object + + + + Gets or sets the name of the thread + + + + + Gets or sets a value indicating the scheduling priority of a thread + + + + + Gets or sets a value indicating whether or not a thread is a background thread. + + + + + Gets the randomized idle wait time. + + The randomized idle wait time. + + + + Construct a new for the given + as a non-daemon + with normal priority. + + + + + Construct a new for the given + as a with the given + attributes. + + + + + Signals the main processing loop to pause at the next possible point. + + + + + Signals the main processing loop to pause at the next possible point. + + + + + Signals the main processing loop that a change in scheduling has been + made - in order to interrupt any sleeping that may be occuring while + waiting for the fire time to arrive. + + + the time when the newly scheduled trigger + will fire. If this method is being called do to some other even (rather + than scheduling a trigger), the caller should pass null. + + + + + The main processing loop of the . + + + + + Trigger retry loop that is executed on error condition. + + The bndle. + + + + Releases the trigger retry loop. + + The trigger. + + + + Gets the log. + + The log. + + + + Sets the idle wait time. + + The idle wait time. + + + + Gets a value indicating whether this is paused. + + true if paused; otherwise, false. + + + + Gets or sets the db failure retry interval. + + The db failure retry interval. + + + + An interface to be used by instances in order to + communicate signals back to the . + + James House + Marko Lahma (.NET) + + + + An interface to be used by instances in order to + communicate signals back to the . + + James House + Marko Lahma (.NET) + + + + Notifies the scheduler about misfired trigger. + + The trigger that misfired. + + + + Notifies the scheduler about finalized trigger. + + The trigger that has finalized. + + + + Signals the scheduling change. + + + + + Notifies the scheduler about misfired trigger. + + The trigger that misfired. + + + + Notifies the scheduler about finalized trigger. + + The trigger that has finalized. + + + + Signals the scheduling change. + + + + + Metadata information about specific ADO.NET driver library. Metadata is used to + create correct types of object instances to interact with the underlying + database. + + Marko Lahma + + + + Initializes this instance. Parses information and initializes startup + values. + + + + + Gets the name of the parameter which includes the parameter prefix for this + database. + + Name of the parameter. + + + Gets or sets the name of the assembly that holds the connection library. + The name of the assembly. + + + + Gets or sets the name of the product. + + The name of the product. + + + + Gets or sets the type of the connection. + + The type of the connection. + + + + Gets or sets the type of the command. + + The type of the command. + + + + Gets or sets the type of the parameter. + + The type of the parameter. + + + + Gets the type of the command builder. + + The type of the command builder. + + + Gets the command builder's derive parameters method. + The command builder derive parameters method. + + + + Gets or sets the parameter name prefix. + + The parameter name prefix. + + + + Gets or sets the type of the exception that is thrown when using driver + library. + + The type of the exception. + + + + Gets or sets a value indicating whether parameters are bind by name when using + ADO.NET parameters. + + true if parameters are bind by name; otherwise, false. + + + Gets or sets the type of the database parameters. + The type of the parameter db. + + + + Gets the parameter db type property. + + The parameter db type property. + + + + Gets the parameter is nullable property. + + The parameter is nullable property. + + + + Gets or sets the type of the db binary column. This is a string representation of + Enum element because this information is database driver specific. + + The type of the db binary. + + + Gets the type of the db binary. + The type of the db binary. + + + + Sets the name of the parameter db type property. + + The name of the parameter db type property. + + + + Gets or sets a value indicating whether [use parameter name prefix in parameter collection]. + + + true if [use parameter name prefix in parameter collection]; otherwise, false. + + + + + Concrete implementation of . + + Marko Lahma + + + + Data access provider interface. + + Marko Lahma + + + + Returns a new command object for executing SQL statments/Stored Procedures + against the database. + + An new + + + + Returns a new instance of the providers CommandBuilder class. + + In .NET 1.1 there was no common base class or interface + for command builders, hence the return signature is object to + be portable (but more loosely typed) across .NET 1.1/2.0 + A new Command Builder + + + + Returns a new connection object to communicate with the database. + + A new + + + + Returns a new parameter object for binding values to parameter + placeholders in SQL statements or Stored Procedure variables. + + A new + + + + Shutdowns this instance. + + + + + Connection string used to create connections. + + + + + Registers DB metadata information for given provider name. + + + + + + + Initializes a new instance of the class. + + Name of the db provider. + The connection string. + + + + Returns a new command object for executing SQL statments/Stored Procedures + against the database. + + An new + + + + Returns a new instance of the providers CommandBuilder class. + + A new Command Builder + In .NET 1.1 there was no common base class or interface + for command builders, hence the return signature is object to + be portable (but more loosely typed) across .NET 1.1/2.0 + + + + Returns a new connection object to communicate with the database. + + A new + + + + Returns a new parameter object for binding values to parameter + placeholders in SQL statements or Stored Procedure variables. + + A new + + + + Shutdowns this instance. + + + + + Connection string used to create connections. + + + + + + Gets the metadata. + + The metadata. + + + + This interface can be implemented by any + class that needs to use the constants contained herein. + + Jeffrey Wescott + James House + Marko Lahma(.NET) + + + + Simple Trigger type. + + + + + Cron Trigger type. + + + + + Calendar Interval Trigger type. + + + + + Daily Time Interval Trigger type. + + + + + A general blob Trigger type. + + + + + This class contains utility functions for use in all delegate classes. + + Jeffrey Wescott + Marko Lahma (.NET) + + + + Replace the table prefix in a query by replacing any occurrences of + "{0}" with the table prefix. + + The unsubstitued query + The table prefix + the scheduler name + The query, with proper table prefix substituted + + + + Common helper methods for working with ADO.NET. + + Marko Lahma + + + + Persist a CalendarIntervalTriggerImpl by converting internal fields to and from + SimplePropertiesTriggerProperties. + + + + + + + A base implementation of that persists + trigger fields in the "QRTZ_SIMPROP_TRIGGERS" table. This allows extending + concrete classes to simply implement a couple methods that do the work of + getting/setting the trigger's fields, and creating the + for the particular type of trigger. + + + jhouse + Marko Lahma (.NET) + + + + An interface which provides an implementation for storing a particular + type of 's extended properties. + + jhouse + + + + Initializes the persistence delegate. + + + + + Returns whether the trigger type can be handled by delegate. + + + + + Returns database discriminator value for trigger type. + + + + + Inserts trigger's special properties. + + + + + Updates trigger's special properties. + + + + + Deletes trigger's special properties. + + + + + Loads trigger's special properties. + + + + + Returns whether the trigger type can be handled by delegate. + + + + + Returns database discriminator value for trigger type. + + + + + Utility class to keep track of both active transaction + and connection. + + Marko Lahma + + + + Initializes a new instance of the class. + + The connection. + The transaction. + + + + Gets or sets the connection. + + The connection. + + + + Gets or sets the transaction. + + The transaction. + + + + Persist a CronTriggerImpl. + + + + + + + Persist a DailyTimeIntervalTrigger by converting internal fields to and from + SimplePropertiesTriggerProperties. + + + + Zemian Deng saltnlight5@gmail.com + Nuno Maia (.NET) + + + + + + + + + + Base class for database based lock handlers for providing thread/resource locking + in order to protect resources from being altered by multiple threads at the + same time. + + Marko Lahma (.NET) + + + + This class extends + to include the query string constants in use by the + class. + + Jeffrey Wescott + Marko Lahma (.NET) + + + + An interface for providing thread/resource locking in order to protect + resources from being altered by multiple threads at the same time. + + James House + Marko Lahma (.NET) + + + + Grants a lock on the identified resource to the calling thread (blocking + until it is available). + + true if the lock was obtained. + + + + Release the lock on the identified resource if it is held by the calling + thread. + + + + + Determine whether the calling thread owns a lock on the identified + resource. + + + + + Whether this Semaphore implementation requires a database connection for + its lock management operations. + + + + + + + + Interface for Quartz objects that need to know what the table prefix of + the tables used by a ADO.NET JobStore is. + + Marko Lahma (.NET) + + + + Table prefix to use. + + + + + Initializes a new instance of the class. + + The table prefix. + the scheduler name + The SQL. + The default SQL. + The db provider. + + + + Execute the SQL that will lock the proper database row. + + + + + + + + + Grants a lock on the identified resource to the calling thread (blocking + until it is available). + + + + + true if the lock was obtained. + + + + Release the lock on the identified resource if it is held by the calling + thread. + + + + + + + Determine whether the calling thread owns a lock on the identified + resource. + + + + + + + + Gets or sets the lock owners. + + The lock owners. + + + + Gets the log. + + The log. + + + + This Semaphore implementation does use the database. + + + + + Gets or sets the table prefix. + + The table prefix. + + + + Initialization argumens holder for implementations. + + + + + Whether simple should be used (for serialization safety). + + + + + The logger to use during execution. + + + + + The prefix of all table names. + + + + + The instance's name. + + + + + The instance id. + + + + + The db provider. + + + + + The type loading strategy. + + + + + Object serializer and deserializer strategy to use. + + + + + Custom driver delegate initialization. + + + initStrings are of the format: + settingName=settingValue|otherSettingName=otherSettingValue|... + + + + + Conveys the state of a fired-trigger record. + + James House + Marko Lahma (.NET) + + + + Gets or sets the fire instance id. + + The fire instance id. + + + + Gets or sets the fire timestamp. + + The fire timestamp. + + + + Gets or sets a value indicating whether job disallows concurrent execution. + + + + + Gets or sets the job key. + + The job key. + + + + Gets or sets the scheduler instance id. + + The scheduler instance id. + + + + Gets or sets the trigger key. + + The trigger key. + + + + Gets or sets the state of the fire instance. + + The state of the fire instance. + + + + Gets or sets a value indicating whether [job requests recovery]. + + true if [job requests recovery]; otherwise, false. + + + + Gets or sets the priority. + + The priority. + + + + Service interface or modifying parameters + and resultset values. + + + + + Prepares a to be used to access database. + + Connection and tranasction pair + SQL to run + + + + + Adds a parameter to . + + Command to add parameter to + Parameter's name + Parameter's value + + + + Adds a parameter to . + + Command to add parameter to + Parameter's name + Parameter's value + Parameter's data type + + + + Gets the db presentation for boolean value. Subclasses can overwrite this behaviour. + + Value to map to database. + + + + + Gets the boolean value from db presentation. Subclasses can overwrite this behaviour. + + Value to map from database. + + + + + Gets the db presentation for date/time value. Subclasses can overwrite this behaviour. + + Value to map to database. + + + + + Gets the date/time value from db presentation. Subclasses can overwrite this behaviour. + + Value to map from database. + + + + + Gets the db presentation for time span value. Subclasses can overwrite this behaviour. + + Value to map to database. + + + + + Gets the time span value from db presentation. Subclasses can overwrite this behaviour. + + Value to map from database. + + + + + This is the base interface for all driver delegate classes. + + + + This interface is very similar to the + interface except each method has an additional + parameter. + + + Unless a database driver has some extremely-DB-specific + requirements, any IDriverDelegate implementation classes should extend the + class. + + + Jeffrey Wescott + James House + Marko Lahma (.NET) + + + + Initializes the driver delegate with configuration data. + + + + + + Update all triggers having one of the two given states, to the given new + state. + + The DB Connection + The new state for the triggers + The first old state to update + The second old state to update + Number of rows updated + + + + Get the names of all of the triggers that have misfired - according to + the given timestamp. + + The DB Connection + The timestamp. + An array of objects + + + + Get the names of all of the triggers in the given state that have + misfired - according to the given timestamp. + + The DB Connection + The state. + The time stamp. + An array of objects + + + + Get the names of all of the triggers in the given group and state that + have misfired - according to the given timestamp. + + The DB Connection + Name of the group. + The state. + The timestamp. + An array of objects + + + + Select all of the triggers for jobs that are requesting recovery. The + returned trigger objects will have unique "recoverXXX" trigger names and + will be in the trigger group. + + + In order to preserve the ordering of the triggers, the fire time will be + set from the ColumnFiredTime column in the TableFiredTriggers + table. The caller is responsible for calling + on each returned trigger. It is also up to the caller to insert the + returned triggers to ensure that they are fired. + + The DB Connection + An array of objects + + + + Delete all fired triggers. + + The DB Connection + The number of rows deleted + + + + Delete all fired triggers of the given instance. + + The DB Connection + The instance id. + The number of rows deleted + + + + Insert the job detail record. + + The DB Connection + The job to insert. + Number of rows inserted. + + + + Update the job detail record. + + The DB Connection. + The job to update. + Number of rows updated. + + + + Get the names of all of the triggers associated with the given job. + + + + The DB Connection + The key identifying the job. + + + + Delete the job detail record for the given job. + + The DB Connection + The key identifying the job. + the number of rows deleted + + + + Check whether or not the given job is stateful. + + The DB Connection + The key identifying the job. + true if the job exists and is stateful, false otherwise + + + + Check whether or not the given job exists. + + The DB Connection + The key identifying the job. + true if the job exists, false otherwise + + + + Update the job data map for the given job. + + The DB Connection + The job. + the number of rows updated + + + + Select the JobDetail object for a given job name / group name. + + The DB Connection + The key identifying the job. + The class load helper. + The populated JobDetail object + + + + Select the total number of jobs stored. + + The DB Connection + the total number of jobs stored + + + + Select all of the job group names that are stored. + + The DB Connection. + an array of group names + + + + Select all of the jobs contained in a given group. + + The DB Connection + + an array of job names + + + + Insert the base trigger data. + + The DB Connection + The trigger to insert. + The state that the trigger should be stored in. + The job detail. + The number of rows inserted + + + + Insert the blob trigger data. + + The DB Connection + The trigger to insert + The number of rows inserted + + + + Update the base trigger data. + + the DB Connection + The trigger. + The state. + The job detail. + the number of rows updated + + + + Update the blob trigger data. + + the DB Connection + The trigger. + the number of rows updated + + + + Check whether or not a trigger exists. + + the DB Connection + The key identifying the trigger. + the number of rows updated + + + + Update the state for a given trigger. + + The DB Connection + The key identifying the trigger. + The new state for the trigger. + the number of rows updated + + + + Update the given trigger to the given new state, if it is in the given + old state. + + The DB connection + The key identifying the trigger. + The new state for the trigger + The old state the trigger must be in + int the number of rows updated + + + + Update the given trigger to the given new state, if it is one of the + given old states. + + The DB connection + The key identifying the trigger. + The new state for the trigger + One of the old state the trigger must be in + One of the old state the trigger must be in + One of the old state the trigger must be in + + int the number of rows updated + + SQLException + + + + Update all triggers in the given group to the given new state, if they + are in one of the given old states. + + The DB connection + + The new state for the trigger + One of the old state the trigger must be in + One of the old state the trigger must be in + One of the old state the trigger must be in + The number of rows updated + + + + Update all of the triggers of the given group to the given new state, if + they are in the given old state. + + The DB connection + + The new state for the trigger group + The old state the triggers must be in. + int the number of rows updated + + + + Update the states of all triggers associated with the given job. + + The DB Connection + The key identifying the job. + The new state for the triggers. + The number of rows updated + + + + Update the states of any triggers associated with the given job, that + are the given current state. + + The DB Connection + The key identifying the job. + The new state for the triggers + The old state of the triggers + the number of rows updated + + + + Delete the BLOB trigger data for a trigger. + + The DB Connection + The key identifying the trigger. + The number of rows deleted + + + + Delete the base trigger data for a trigger. + + The DB Connection + The key identifying the trigger. + the number of rows deleted + + + + Select the number of triggers associated with a given job. + + The DB Connection + The key identifying the job. + the number of triggers for the given job + + + + Select the job to which the trigger is associated. + + The DB Connection + The key identifying the trigger. + The load helper. + + The object associated with the given trigger + + + + + Select the triggers for a job> + + The DB Connection + The key identifying the job. + an array of objects associated with a given job. + + + + Select the triggers for a calendar + + The DB Connection. + Name of the calendar. + + An array of objects associated with a given job. + + + + + Select a trigger. + + The DB Connection. + The key identifying the trigger. + The object. + + + + + Select a trigger's JobDataMap. + + The DB Connection. + The key identifying the trigger. + The of the Trigger, never null, but possibly empty. + + + + Select a trigger's state value. + + The DB Connection. + The key identifying the trigger. + The object. + + + + Select a triggers status (state and next fire time). + + The DB Connection. + The key identifying the trigger. + A object, or null + + + + Select the total number of triggers stored. + + The DB Connection. + The total number of triggers stored. + + + + Select all of the trigger group names that are stored. + + The DB Connection. + An array of group names. + + + + Select all of the triggers contained in a given group. + + The DB Connection. + + An array of trigger names. + + + + Select all of the triggers in a given state. + + The DB Connection. + The state the triggers must be in. + An array of trigger s. + + + + Inserts the paused trigger group. + + The conn. + Name of the group. + + + + + Deletes the paused trigger group. + + The conn. + Name of the group. + + + + + Deletes all paused trigger groups. + + The conn. + + + + + Determines whether the specified trigger group is paused. + + The conn. + Name of the group. + + true if trigger group is paused; otherwise, false. + + + + + Selects the paused trigger groups. + + The DB Connection. + + + + + Determines whether given trigger group already exists. + + The conn. + Name of the group. + + true if trigger group exists; otherwise, false. + + + + + Insert a new calendar. + + The DB Connection. + The name for the new calendar. + The calendar. + The number of rows inserted. + + + + Update a calendar. + + The DB Connection. + The name for the new calendar. + The calendar. + The number of rows updated. + + + + Check whether or not a calendar exists. + + The DB Connection. + The name of the calendar. + true if the trigger exists, false otherwise. + + + + Select a calendar. + + The DB Connection. + The name of the calendar. + The Calendar. + + + + Check whether or not a calendar is referenced by any triggers. + + The DB Connection. + The name of the calendar. + true if any triggers reference the calendar, false otherwise + + + + Delete a calendar. + + The DB Connection + The name of the trigger. + The number of rows deleted. + + + + Select the total number of calendars stored. + + The DB Connection + The total number of calendars stored. + + + + Select all of the stored calendars. + + The DB Connection + An array of calendar names. + + + + Select the trigger that will be fired at the given fire time. + + The DB Connection + The time that the trigger will be fired. + + A representing the + trigger that will be fired at the given fire time, or null if no + trigger will be fired at that time + + + + + Insert a fired trigger. + + The DB Connection + The trigger. + The state that the trigger should be stored in. + The job detail. + The number of rows inserted. + + + + Select the states of all fired-trigger records for a given trigger, or + trigger group if trigger name is . + + The DB Connection + Name of the trigger. + Name of the group. + A list of FiredTriggerRecord objects. + + + + Select the states of all fired-trigger records for a given job, or job + group if job name is . + + The DB Connection + Name of the job. + Name of the group. + A List of FiredTriggerRecord objects. + + + + Select the states of all fired-trigger records for a given scheduler + instance. + + The DB Connection + Name of the instance. + A list of FiredTriggerRecord objects. + + + + Delete a fired trigger. + + The DB Connection + The fired trigger entry to delete. + The number of rows deleted. + + + + Get the number instances of the identified job currently executing. + + The DB Connection + The key identifying the job. + + The number instances of the identified job currently executing. + + + + + Insert a scheduler-instance state record. + + The DB Connection + The instance id. + The check in time. + The interval. + The number of inserted rows. + + + + Delete a scheduler-instance state record. + + The DB Connection + The instance id. + The number of deleted rows. + + + + Update a scheduler-instance state record. + + The DB Connection + The instance id. + The check in time. + The number of updated rows. + + + + A List of all current s. + + If instanceId is not null, then only the record for the identified + instance will be returned. + + + The DB Connection + The instance id. + + + + + Select the next trigger which will fire to fire between the two given timestamps + in ascending order of fire time, and then descending by priority. + + The conn. + highest value of of the triggers (exclusive) + highest value of of the triggers (inclusive) + maximum number of trigger keys allow to acquired in the returning list. + A (never null, possibly empty) list of the identifiers (Key objects) of the next triggers to be fired. + + + + Select the distinct instance names of all fired-trigger records. + + + This is useful when trying to identify orphaned fired triggers (a + fired trigger without a scheduler state record.) + + The conn. + + + + + Counts the misfired triggers in states. + + The conn. + The state1. + The ts. + + + + + Selects the misfired triggers in states. + + The conn. + The state1. + The ts. + The count. + The result list. + + + + + Clear (delete!) all scheduling data - all s, s + s. + + + + + + Exception class for when a driver delegate cannot be found for a given + configuration, or lack thereof. + + Jeffrey Wescott + Marko Lahma (.NET) + + + + Base class for exceptions thrown by the Quartz . + + + SchedulerExceptions may contain a reference to another + , which was the underlying cause of the SchedulerException. + + James House + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The MSG. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + Initializes a new instance of the class. + + The cause. + + + + Initializes a new instance of the class. + + The MSG. + The cause. + + + + Creates and returns a string representation of the current exception. + + + A string representation of the current exception. + + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + is meant to be used in an application-server + or other software framework environment that provides + container-managed-transactions. No commit / rollback will be handled by this class. + + + If you need commit / rollback, use + instead. + + Jeffrey Wescott + James House + Srinivas Venkatarangaiah + Marko Lahma (.NET) + + + + Contains base functionality for ADO.NET-based JobStore implementations. + + Jeffrey Wescott + James House + Marko Lahma (.NET) + + + + The interface to be implemented by classes that want to provide a + and storage mechanism for the + 's use. + + + Storage of s and s should be keyed + on the combination of their name and group for uniqueness. + + + + + + + + James House + Marko Lahma (.NET) + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + Called by the QuartzScheduler to inform the that + the scheduler has started. + + + + + Called by the QuartzScheduler to inform the JobStore that + the scheduler has been paused. + + + + + Called by the QuartzScheduler to inform the JobStore that + the scheduler has resumed after being paused. + + + + + Called by the QuartzScheduler to inform the that + it should free up all of it's resources because the scheduler is + shutting down. + + + + + Store the given and . + + The to be stored. + The to be stored. + ObjectAlreadyExistsException + + + + returns true if the given JobGroup is paused + + + + + + + returns true if the given TriggerGroup + is paused + + + + + + + Store the given . + + The to be stored. + + If , any existing in the + with the same name and group should be + over-written. + + + + + Remove (delete) the with the given + key, and any s that reference + it. + + + If removal of the results in an empty group, the + group should be removed from the 's list of + known group names. + + + if a with the given name and + group was found and removed from the store. + + + + + Retrieve the for the given + . + + + The desired , or null if there is no match. + + + + + Store the given . + + The to be stored. + If , any existing in + the with the same name and group should + be over-written. + ObjectAlreadyExistsException + + + + Remove (delete) the with the given key. + + + + If removal of the results in an empty group, the + group should be removed from the 's list of + known group names. + + + If removal of the results in an 'orphaned' + that is not 'durable', then the should be deleted + also. + + + + if a with the given + name and group was found and removed from the store. + + + + + Remove (delete) the with the + given name, and store the new given one - which must be associated + with the same job. + + The to be replaced. + The new to be stored. + + if a with the given + name and group was found and removed from the store. + + + + + Retrieve the given . + + + The desired , or null if there is no + match. + + + + + Determine whether a with the given identifier already + exists within the scheduler. + + + + the identifier to check for + true if a job exists with the given identifier + + + + Determine whether a with the given identifier already + exists within the scheduler. + + + + the identifier to check for + true if a trigger exists with the given identifier + + + + Clear (delete!) all scheduling data - all s, s + s. + + + + + + + Store the given . + + The name. + The to be stored. + If , any existing + in the with the same name and group + should be over-written. + If , any s existing + in the that reference an existing + Calendar with the same name with have their next fire time + re-computed with the new . + ObjectAlreadyExistsException + + + + Remove (delete) the with the + given name. + + + If removal of the would result in + s pointing to non-existent calendars, then a + will be thrown. + + The name of the to be removed. + + if a with the given name + was found and removed from the store. + + + + + Retrieve the given . + + The name of the to be retrieved. + + The desired , or null if there is no + match. + + + + + Get the number of s that are + stored in the . + + + + + + Get the number of s that are + stored in the . + + + + + + Get the number of s that are + stored in the . + + + + + + Get the names of all of the s that + have the given group name. + + If there are no jobs in the given group name, the result should be a + zero-length array (not ). + + + + + + + + Get the names of all of the s + that have the given group name. + + If there are no triggers in the given group name, the result should be a + zero-length array (not ). + + + + + + Get the names of all of the + groups. + + If there are no known group names, the result should be a zero-length + array (not ). + + + + + + Get the names of all of the + groups. + + If there are no known group names, the result should be a zero-length + array (not ). + + + + + + Get the names of all of the s + in the . + + + If there are no Calendars in the given group name, the result should be + a zero-length array (not ). + + + + + + Get all of the Triggers that are associated to the given Job. + + + If there are no matches, a zero-length array should be returned. + + + + + Get the current state of the identified . + + + + + + Pause the with the given key. + + + + + Pause all of the s in the + given group. + + + The JobStore should "remember" that the group is paused, and impose the + pause on any new triggers that are added to the group while the group is + paused. + + + + + Pause the with the given key - by + pausing all of its current s. + + + + + Pause all of the s in the given + group - by pausing all of their s. + + The JobStore should "remember" that the group is paused, and impose the + pause on any new jobs that are added to the group while the group is + paused. + + + + + + + + Resume (un-pause) the with the + given key. + + + If the missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + + + Resume (un-pause) all of the s + in the given group. + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Gets the paused trigger groups. + + + + + + Resume (un-pause) the with the + given key. + + If any of the 's s missed one + or more fire-times, then the 's misfire + instruction will be applied. + + + + + + Resume (un-pause) all of the s in + the given group. + + If any of the s had s that + missed one or more fire-times, then the 's + misfire instruction will be applied. + + + + + + Pause all triggers - equivalent of calling + on every group. + + When is called (to un-pause), trigger misfire + instructions WILL be applied. + + + + + + + Resume (un-pause) all triggers - equivalent of calling + on every group. + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + + + Get a handle to the next trigger to be fired, and mark it as 'reserved' + by the calling scheduler. + + If > 0, the JobStore should only return a Trigger + that will fire no later than the time represented in this value as + milliseconds. + + + + + + + + + Inform the that the scheduler no longer plans to + fire the given , that it had previously acquired + (reserved). + + + + + Inform the that the scheduler is now firing the + given (executing its associated ), + that it had previously acquired (reserved). + + + May return null if all the triggers or their calendars no longer exist, or + if the trigger was not successfully put into the 'executing' + state. Preference is to return an empty list if none of the triggers + could be fired. + + + + + Inform the that the scheduler has completed the + firing of the given (and the execution its + associated ), and that the + in the given should be updated if the + is stateful. + + + + + Indicates whether job store supports persistence. + + + + + + How long (in milliseconds) the implementation + estimates that it will take to release a trigger and acquire a new one. + + + + + Whether or not the implementation is clustered. + + + + + + Inform the of the Scheduler instance's Id, + prior to initialize being invoked. + + + + + Inform the of the Scheduler instance's name, + prior to initialize being invoked. + + + + + Tells the JobStore the pool size used to execute jobs. + + + + + Initializes a new instance of the class. + + + + + Gets the connection and starts a new transaction. + + + + + + Called by the QuartzScheduler before the is + used, in order to give it a chance to Initialize. + + + + + + + + Called by the QuartzScheduler to inform the JobStore that + the scheduler has been paused. + + + + + Called by the QuartzScheduler to inform the JobStore that + the scheduler has resumed after being paused. + + + + + Called by the QuartzScheduler to inform the that + it should free up all of it's resources because the scheduler is + shutting down. + + + + + Will recover any failed or misfired jobs and clean up the data store as + appropriate. + + + + + Will recover any failed or misfired jobs and clean up the data store as + appropriate. + + + + + Store the given and . + + Job to be stored. + Trigger to be stored. + + + + returns true if the given JobGroup + is paused + + + + + + + returns true if the given TriggerGroup + is paused + + + + + + + Stores the given . + + The to be stored. + + If , any existing in the + with the same name & group should be over-written. + + + + + Insert or update a job. + + + + + + Check existence of a given job. + + + + + Store the given . + + The to be stored. + + If , any existing in + the with the same name & group should + be over-written. + + + if a with the same name/group already + exists, and replaceExisting is set to false. + + + + + Insert or update a trigger. + + + + + Check existence of a given trigger. + + + + + Remove (delete) the with the given + name, and any s that reference + it. + + + + If removal of the results in an empty group, the + group should be removed from the 's list of + known group names. + + + if a with the given name & + group was found and removed from the store. + + + + + Delete a job and its listeners. + + + + + + + Delete a trigger, its listeners, and its Simple/Cron/BLOB sub-table entry. + + + + + + + + Retrieve the for the given + . + + The key identifying the job. + The desired , or null if there is no match. + + + + Remove (delete) the with the + given name. + + + + + If removal of the results in an empty group, the + group should be removed from the 's list of + known group names. + + + + If removal of the results in an 'orphaned' + that is not 'durable', then the should be deleted + also. + + + The key identifying the trigger. + + if a with the given + name & group was found and removed from the store. + + + + + + + + Retrieve the given . + + The key identifying the trigger. + The desired , or null if there is no match. + + + + Get the current state of the identified . + + + + + + + + + + Gets the state of the trigger. + + The conn. + The key identifying the trigger. + + + + + Store the given . + + The name of the calendar. + The to be stored. + + If , any existing + in the with the same name & group + should be over-written. + + + + if a with the same name already + exists, and replaceExisting is set to false. + + + + + Remove (delete) the with the given name. + + + If removal of the would result in + s pointing to non-existent calendars, then a + will be thrown. + + The name of the to be removed. + + if a with the given name + was found and removed from the store. + + + + + Retrieve the given . + + The name of the to be retrieved. + The desired , or null if there is no match. + + + + Get the number of s that are + stored in the . + + + + + Get the number of s that are + stored in the . + + + + + Get the number of s that are + stored in the . + + + + + Get the names of all of the s that + have the given group name. + + + If there are no jobs in the given group name, the result should be a + zero-length array (not ). + + + + + Determine whether a with the given identifier already + exists within the scheduler. + + + + the identifier to check for + true if a Job exists with the given identifier + + + + Determine whether a with the given identifier already + exists within the scheduler. + + + + the identifier to check for + true if a Trigger exists with the given identifier + + + + Clear (delete!) all scheduling data - all s, s + s. + + + + + + + Get the names of all of the s + that have the given group name. + + + If there are no triggers in the given group name, the result should be a + zero-length array (not ). + + + + + Get the names of all of the + groups. + + + + If there are no known group names, the result should be a zero-length + array (not ). + + + + + Get the names of all of the + groups. + + + + If there are no known group names, the result should be a zero-length + array (not ). + + + + + Get the names of all of the s + in the . + + + If there are no Calendars in the given group name, the result should be + a zero-length array (not ). + + + + + Get all of the Triggers that are associated to the given Job. + + + If there are no matches, a zero-length array should be returned. + + + + + Pause the with the given name. + + + + + Pause the with the given name. + + + + + Pause the with the given name - by + pausing all of its current s. + + + + + + Pause all of the s in the given + group - by pausing all of their s. + + + + + + Determines if a Trigger for the given job should be blocked. + State can only transition to StatePausedBlocked/StateBlocked from + StatePaused/StateWaiting respectively. + + StatePausedBlocked, StateBlocked, or the currentState. + + + + Resume (un-pause) the with the + given name. + + + If the missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + Resume (un-pause) the with the + given name. + + + If any of the 's s missed one + or more fire-times, then the 's misfire + instruction will be applied. + + + + + + Resume (un-pause) all of the s in + the given group. + + + If any of the s had s that + missed one or more fire-times, then the 's + misfire instruction will be applied. + + + + + + Pause all of the s in the given group. + + + + + + Pause all of the s in the given group. + + + + + Pause all of the s in the + given group. + + + + + Resume (un-pause) all of the s + in the given group. + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Pause all triggers - equivalent of calling + on every group. + + When is called (to un-pause), trigger misfire + instructions WILL be applied. + + + + + + + + Resume (un-pause) all triggers - equivalent of calling + on every group. + + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Resume (un-pause) all triggers - equivalent of calling + on every group. + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + + Get a handle to the next N triggers to be fired, and mark them as 'reserved' + by the calling scheduler. + + + + + + Inform the that the scheduler no longer plans to + fire the given , that it had previously acquired + (reserved). + + + + + Inform the that the scheduler has completed the + firing of the given (and the execution its + associated ), and that the + in the given should be updated if the + is stateful. + + + + + Get a list of all scheduler instances in the cluster that may have failed. + This includes this scheduler if it is checking in for the first time. + + + + + Create dummy objects for fired triggers + that have no scheduler state record. Checkin timestamp and interval are + left as zero on these dummy objects. + + + List of all current s + + + + Cleanup the given database connection. This means restoring + any modified auto commit or transaction isolation connection + attributes, and then closing the underlying connection. + + + + This is separate from closeConnection() because the Spring + integration relies on being able to overload closeConnection() and + expects the same connection back that it originally returned + from the datasource. + + + + + + Closes the supplied connection. + + (Optional) + + + + Rollback the supplied connection. + + (Optional) + + JobPersistenceException thrown if a SQLException occurs when the + connection is rolled back + + + + + Commit the supplied connection. + + The CTH. + if set to true opens a new transaction. + JobPersistenceException thrown if a SQLException occurs when the + + + + Execute the given callback in a transaction. Depending on the JobStore, + the surrounding transaction may be assumed to be already present + (managed). + + + This method just forwards to ExecuteInLock() with a null lockName. + + + + + + Execute the given callback having acquired the given lock. + Depending on the JobStore, the surrounding transaction may be + assumed to be already present (managed). This version is just a + handy wrapper around executeInLock that doesn't require a return + value. + + + The name of the lock to acquire, for example + "TRIGGER_ACCESS". If null, then no lock is acquired, but the + lockCallback is still executed in a transaction. + + + The callback to excute after having acquired the given lock. + + + + + + Execute the given callback having acquired the given lock. + Depending on the JobStore, the surrounding transaction may be + assumed to be already present (managed). + + + The name of the lock to acquire, for example + "TRIGGER_ACCESS". If null, then no lock is acquired, but the + lockCallback is still executed in a transaction. + + + The callback to excute after having acquired the given lock. + + + + + Execute the given callback having optionally acquired the given lock. + This uses the non-managed transaction connection. This version is just a + handy wrapper around executeInNonManagedTXLock that doesn't require a return + value. + + + The name of the lock to acquire, for example + "TRIGGER_ACCESS". If null, then no lock is acquired, but the + lockCallback is still executed in a non-managed transaction. + + + + The callback to excute after having acquired the given lock. + + + + + Execute the given callback having optionally acquired the given lock. + This uses the non-managed transaction connection. + + + The name of the lock to acquire, for example + "TRIGGER_ACCESS". If null, then no lock is acquired, but the + lockCallback is still executed in a non-managed transaction. + + + The callback to excute after having acquired the given lock. + + + + + Get or set the datasource name. + + + + + Gets the log. + + The log. + + + + Get or sets the prefix that should be pre-pended to all table names. + + + + + Set whether string-only properties will be handled in JobDataMaps. + + + + + Get or set the instance Id of the Scheduler (must be unique within a cluster). + + + + + Get or set the instance Id of the Scheduler (must be unique within this server instance). + + + + + Get or set whether this instance is part of a cluster. + + + + + Get or set the frequency at which this instance "checks-in" + with the other instances of the cluster. -- Affects the rate of + detecting failed instances. + + + + + Get or set the maximum number of misfired triggers that the misfire handling + thread will try to recover at one time (within one transaction). The + default is 20. + + + + + Gets or sets the database retry interval. + + The db retry interval. + + + + Get or set whether this instance should use database-based thread + synchronization. + + + + + Whether or not to obtain locks when inserting new jobs/triggers. + Defaults to , which is safest - some db's (such as + MS SQLServer) seem to require this to avoid deadlocks under high load, + while others seem to do fine without. + + + Setting this property to will provide a + significant performance increase during the addition of new jobs + and triggers. + + + + + The time span by which a trigger must have missed its + next-fire-time, in order for it to be considered "misfired" and thus + have its misfire instruction applied. + + + + + Don't call set autocommit(false) on connections obtained from the + DataSource. This can be helpfull in a few situations, such as if you + have a driver that complains if it is called when it is already off. + + + + + Set the transaction isolation level of DB connections to sequential. + + + + + Whether or not the query and update to acquire a Trigger for firing + should be performed after obtaining an explicit DB lock (to avoid + possible race conditions on the trigger's db row). This is + is considered unnecessary for most databases (due to the nature of + the SQL update that is performed), and therefore a superfluous performance hit. + + + However, if batch acquisition is used, it is important for this behavior + to be used for all dbs. + + + + + Get or set the ADO.NET driver delegate class name. + + + + + The driver delegate's initialization string. + + + + + set the SQL statement to use to select and lock a row in the "locks" + table. + + + + + + Get whether the threads spawned by this JobStore should be + marked as daemon. Possible threads include the + and the . + + + + + + Get whether to check to see if there are Triggers that have misfired + before actually acquiring the lock to recover them. This should be + set to false if the majority of the time, there are are misfired + Triggers. + + + + + + Get the driver delegate for DB operations. + + + + + Get whether String-only properties will be handled in JobDataMaps. + + + + + Indicates whether this job store supports persistence. + + + + + + + An interface for classes wishing to provide the service of loading classes + and resources within the scheduler... + + James House + Marko Lahma (.NET) + + + + Called to give the ClassLoadHelper a chance to Initialize itself, + including the oportunity to "steal" the class loader off of the calling + thread, which is the thread that is initializing Quartz. + + + + + Return the class with the given name. + + + + + Finds a resource with a given name. This method returns null if no + resource with this name is found. + + name of the desired resource + + a java.net.URL object + + + + + Finds a resource with a given name. This method returns null if no + resource with this name is found. + + name of the desired resource + + a java.io.InputStream object + + + + + Helper class for returning the composite result of trying + to recover misfired jobs. + + + + + Initializes a new instance of the class. + + if set to true [has more misfired triggers]. + The processed misfired trigger count. + + + + + Gets a value indicating whether this instance has more misfired triggers. + + + true if this instance has more misfired triggers; otherwise, false. + + + + + Gets the processed misfired trigger count. + + The processed misfired trigger count. + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + + + Called by the QuartzScheduler to inform the that + it should free up all of it's resources because the scheduler is + shutting down. + + + + + Gets the non managed TX connection. + + + + + + Execute the given callback having optionally acquired the given lock. + Because CMT assumes that the connection is already part of a managed + transaction, it does not attempt to commit or rollback the + enclosing transaction. + + + + + + + The name of the lock to acquire, for example + "TRIGGER_ACCESS". If null, then no lock is acquired, but the + txCallback is still executed in a transaction. + + Callback to execute. + + + + is meant to be used in a standalone environment. + Both commit and rollback will be handled by this class. + + Jeffrey Wescott + James House + Marko Lahma (.NET) + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + + + For , the non-managed TX connection is just + the normal connection because it is not CMT. + + + + + + Execute the given callback having optionally aquired the given lock. + For , because it manages its own transactions + and only has the one datasource, this is the same behavior as + . + + + The name of the lock to aquire, for example "TRIGGER_ACCESS". + If null, then no lock is aquired, but the lockCallback is still + executed in a transaction. + + Callback to execute. + + + + + + + + + Exception class for when there is a failure obtaining or releasing a + resource lock. + + + James House + Marko Lahma (.NET) + + + + An exception that is thrown to indicate that there has been a failure in the + scheduler's underlying persistence mechanism. + + James House + Marko Lahma (.NET) + + + + Create a with the given message. + + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + Create a with the given message + and cause. + + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + This is a driver delegate for the MySQL ADO.NET driver. + + Marko Lahma + + + + This is meant to be an abstract base class for most, if not all, + implementations. Subclasses should override only those methods that need + special handling for the DBMS driver in question. + + Jeffrey Wescott + James House + Marko Lahma (.NET) + + + + Initializes the driver delegate. + + + + + Insert the job detail record. + + the DB Connection + the new state for the triggers + the first old state to update + the second old state to update + number of rows updated + + + + Get the names of all of the triggers that have misfired. + + the DB Connection + The ts. + an array of objects + + + + Select all of the triggers in a given state. + + The DB Connection + The state the triggers must be in + an array of trigger s + + + + Get the names of all of the triggers in the given state that have + misfired - according to the given timestamp. + + The DB Connection + The state. + The time stamp. + An array of objects + + + + Get the names of all of the triggers in the given state that have + misfired - according to the given timestamp. No more than count will + be returned. + + The conn. + The state1. + The ts. + The most misfired triggers to return, negative for all + + Output parameter. A List of objects. Must not be null + + Whether there are more misfired triggers left to find beyond the given count. + + + + Get the number of triggers in the given state that have + misfired - according to the given timestamp. + + + + + + + + + Get the names of all of the triggers in the given group and state that + have misfired. + + The DB Connection + Name of the group. + The state. + The timestamp. + an array of objects + + + + Select all of the triggers for jobs that are requesting recovery. The + returned trigger objects will have unique "recoverXXX" trigger names and + will be in the + trigger group. + + + In order to preserve the ordering of the triggers, the fire time will be + set from the ColumnFiredTime column in the TableFiredTriggers + table. The caller is responsible for calling + on each returned trigger. It is also up to the caller to insert the + returned triggers to ensure that they are fired. + + The DB Connection + an array of objects + + + + Delete all fired triggers. + + The DB Connection. + The number of rows deleted. + + + + Delete all fired triggers of the given instance. + + The DB Connection + The instance id. + The number of rows deleted + + + + Clear (delete!) all scheduling data - all s, s + s. + + + + + + + Insert the job detail record. + + The DB Connection. + The job to insert. + Number of rows inserted. + + + + Gets the db presentation for boolean value. Subclasses can overwrite this behaviour. + + Value to map to database. + + + + + Gets the boolean value from db presentation. Subclasses can overwrite this behaviour. + + Value to map from database. + + + + + Gets the db presentation for date/time value. Subclasses can overwrite this behaviour. + + Value to map to database. + + + + + Gets the date/time value from db presentation. Subclasses can overwrite this behaviour. + + Value to map from database. + + + + + Gets the db presentation for time span value. Subclasses can overwrite this behaviour. + + Value to map to database. + + + + + Gets the time span value from db presentation. Subclasses can overwrite this behaviour. + + Value to map from database. + + + + + Update the job detail record. + + The DB Connection. + The job to update. + Number of rows updated. + + + + Get the names of all of the triggers associated with the given job. + + The DB Connection. + The key identifying the job. + An array of objects + + + + Delete the job detail record for the given job. + + the DB Connection + The key identifying the job. + the number of rows deleted + + + + Check whether or not the given job is stateful. + + the DB Connection + The key identifying the job. + + true if the job exists and is stateful, false otherwise + + + + + Check whether or not the given job exists. + + the DB Connection + The key identifying the job. + true if the job exists, false otherwise + + + + Update the job data map for the given job. + + The conn. + the job to update + the number of rows updated + + + + Select the JobDetail object for a given job name / group name. + + The DB Connection. + The key identifying the job. + The load helper. + The populated JobDetail object. + + + build Map from java.util.Properties encoding. + + + + Select the total number of jobs stored. + + The DB Connection. + The total number of jobs stored. + + + + Select all of the job group names that are stored. + + The DB Connection. + An array of group names. + + + + Select all of the jobs contained in a given group. + + The DB Connection. + + An array of job names. + + + + Insert the base trigger data. + + the DB Connection + the trigger to insert + the state that the trigger should be stored in + The job detail. + the number of rows inserted + + + + Insert the blob trigger data. + + The DB Connection. + The trigger to insert. + The number of rows inserted. + + + + Update the base trigger data. + + The DB Connection. + The trigger to insert. + The state that the trigger should be stored in. + The job detail. + The number of rows updated. + + + + Update the blob trigger data. + + The DB Connection. + The trigger to insert. + The number of rows updated. + + + + Check whether or not a trigger exists. + + The DB Connection. + the key of the trigger + true if the trigger exists, false otherwise + + + + Update the state for a given trigger. + + The DB Connection. + the key of the trigger + The new state for the trigger. + The number of rows updated. + + + + Update the given trigger to the given new state, if it is one of the + given old states. + + The DB connection. + the key of the trigger + The new state for the trigger. + One of the old state the trigger must be in. + One of the old state the trigger must be in. + One of the old state the trigger must be in. + The number of rows updated. + + + + Update all triggers in the given group to the given new state, if they + are in one of the given old states. + + The DB connection. + + The new state for the trigger. + One of the old state the trigger must be in. + One of the old state the trigger must be in. + One of the old state the trigger must be in. + The number of rows updated. + + + + Update the given trigger to the given new state, if it is in the given + old state. + + the DB connection + the key of the trigger + the new state for the trigger + the old state the trigger must be in + int the number of rows updated + + + + Update all of the triggers of the given group to the given new state, if + they are in the given old state. + + the DB connection + + the new state for the trigger group + the old state the triggers must be in + int the number of rows updated + + + + Update the states of all triggers associated with the given job. + + the DB Connection + the key of the job + the new state for the triggers + the number of rows updated + + + + Updates the state of the trigger states for job from other. + + The conn. + Key of the job. + The state. + The old state. + + + + + Delete the cron trigger data for a trigger. + + the DB Connection + the key of the trigger + the number of rows deleted + + + + Delete the base trigger data for a trigger. + + the DB Connection + the key of the trigger + the number of rows deleted + + + + Select the number of triggers associated with a given job. + + the DB Connection + the key of the job + the number of triggers for the given job + + + + Select the job to which the trigger is associated. + + the DB Connection + the key of the trigger + The load helper. + The object associated with the given trigger + + + + Select the triggers for a job + + the DB Connection + the key of the job + + an array of objects + associated with a given job. + + + + + Select the triggers for a calendar + + The DB Connection. + Name of the calendar. + + An array of objects associated with a given job. + + + + + Select a trigger. + + the DB Connection + the key of the trigger + The object + + + + Select a trigger's JobDataMap. + + the DB Connection + the key of the trigger + The of the Trigger, never null, but possibly empty. + + + + Select a trigger's state value. + + the DB Connection + the key of the trigger + The object + + + + Select a trigger status (state and next fire time). + + the DB Connection + the key of the trigger + + a object, or null + + + + + Select the total number of triggers stored. + + the DB Connection + the total number of triggers stored + + + + Select all of the trigger group names that are stored. + + the DB Connection + + an array of group names + + + + + Select all of the triggers contained in a given group. + + the DB Connection + + + an array of trigger names + + + + + Inserts the paused trigger group. + + The conn. + Name of the group. + + + + + Deletes the paused trigger group. + + The conn. + Name of the group. + + + + + Deletes all paused trigger groups. + + The conn. + + + + + Determines whether the specified trigger group is paused. + + The conn. + Name of the group. + + true if trigger group is paused; otherwise, false. + + + + + Determines whether given trigger group already exists. + + The conn. + Name of the group. + + true if trigger group exists; otherwise, false. + + + + + Insert a new calendar. + + the DB Connection + The name for the new calendar. + The calendar. + the number of rows inserted + IOException + + + + Update a calendar. + + the DB Connection + The name for the new calendar. + The calendar. + the number of rows updated + IOException + + + + Check whether or not a calendar exists. + + the DB Connection + The name of the calendar. + + true if the trigger exists, false otherwise + + + + + Select a calendar. + + the DB Connection + The name of the calendar. + the Calendar + ClassNotFoundException + IOException + + + + Check whether or not a calendar is referenced by any triggers. + + the DB Connection + The name of the calendar. + + true if any triggers reference the calendar, false otherwise + + + + + Delete a calendar. + + the DB Connection + The name of the trigger. + the number of rows deleted + + + + Select the total number of calendars stored. + + the DB Connection + the total number of calendars stored + + + + Select all of the stored calendars. + + the DB Connection + + an array of calendar names + + + + + Select the trigger that will be fired at the given fire time. + + the DB Connection + the time that the trigger will be fired + + a representing the + trigger that will be fired at the given fire time, or null if no + trigger will be fired at that time + + + + + Select the next trigger which will fire to fire between the two given timestamps + in ascending order of fire time, and then descending by priority. + + The conn. + highest value of of the triggers (exclusive) + highest value of of the triggers (inclusive) + maximum number of trigger keys allow to acquired in the returning list. + A (never null, possibly empty) list of the identifiers (Key objects) of the next triggers to be fired. + + + + Insert a fired trigger. + + the DB Connection + the trigger + the state that the trigger should be stored in + The job. + the number of rows inserted + + + + + Update a fired trigger. + + + + + + the DB Connection + + the trigger + + + the state that the trigger should be stored in + the number of rows inserted + + + + Select the states of all fired-trigger records for a given trigger, or + trigger group if trigger name is . + + The DB connection. + Name of the trigger. + Name of the group. + a List of objects. + + + + Select the states of all fired-trigger records for a given job, or job + group if job name is . + + The DB connection. + Name of the job. + Name of the group. + a List of objects. + + + + Select the states of all fired-trigger records for a given scheduler + instance. + + The DB Connection + Name of the instance. + A list of FiredTriggerRecord objects. + + + + Select the distinct instance names of all fired-trigger records. + + The conn. + + + This is useful when trying to identify orphaned fired triggers (a + fired trigger without a scheduler state record.) + + + + + Delete a fired trigger. + + the DB Connection + the fired trigger entry to delete + the number of rows deleted + + + + Selects the job execution count. + + The DB connection. + The key of the job. + + + + + Inserts the state of the scheduler. + + The conn. + The instance id. + The check in time. + The interval. + + + + + Deletes the state of the scheduler. + + The database connection. + The instance id. + + + + + Updates the state of the scheduler. + + The database connection. + The instance id. + The check in time. + + + + + A List of all current s. + + If instanceId is not null, then only the record for the identified + instance will be returned. + + + The DB Connection + The instance id. + + + + + Replace the table prefix in a query by replacing any occurrences of + "{0}" with the table prefix. + + The unsubstitued query + The query, with proper table prefix substituted + + + + Create a serialized version of an Object. + + the object to serialize + Serialized object as byte array. + + + + Remove the transient data from and then create a serialized + version of a and returns the underlying bytes. + + The data. + the serialized data as byte array + + + + serialize + + The data. + + + + + Convert the JobDataMap into a list of properties. + + + + + Convert the JobDataMap into a list of properties. + + + + + This method should be overridden by any delegate subclasses that need + special handling for BLOBs. The default implementation uses standard + ADO.NET operations. + + The data reader, already queued to the correct row. + The column index for the BLOB. + The deserialized object from the DataReader BLOB. + + + + This method should be overridden by any delegate subclasses that need + special handling for BLOBs for job details. + + The result set, already queued to the correct row. + The column index for the BLOB. + The deserialized Object from the ResultSet BLOB. + + + + Selects the paused trigger groups. + + The DB Connection. + + + + + Gets the select next trigger to acquire SQL clause. + MySQL version with LIMIT support. + + + + + + Exception class for when a driver delegate cannot be found for a given + configuration, or lack thereof. + + Jeffrey Wescott + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + This is a driver delegate for the Oracle database. + + Marko Lahma + + + + Creates the SQL for select next trigger to acquire. + + + + + Gets the db presentation for boolean value. For Oracle we use true/false of "1"/"0". + + Value to map to database. + + + + + Conveys a scheduler-instance state record. + + James House + Marko Lahma (.NET) + + + + Gets or sets the checkin interval. + + The checkin interval. + + + + Gets or sets the checkin timestamp. + + The checkin timestamp. + + + + Gets or sets the scheduler instance id. + + The scheduler instance id. + + + + Internal in-memory lock handler for providing thread/resource locking in + order to protect resources from being altered by multiple threads at the + same time. + + James House + Marko Lahma (.NET) + + + + Grants a lock on the identified resource to the calling thread (blocking + until it is available). + + True if the lock was obtained. + + + Release the lock on the identified resource if it is held by the calling + thread. + + + + + Determine whether the calling thread owns a lock on the identified + resource. + + + + + Gets the thread locks. + + The thread locks. + + + + Whether this Semaphore implementation requires a database connection for + its lock management operations. + + + + + + + + + This is a driver delegate for the SQLiteDelegate ADO.NET driver. + + Marko Lahma + + + + Gets the select next trigger to acquire SQL clause. + SQLite version with LIMIT support. + + + + + + A SQL Server specific driver delegate. + + Marko Lahma + + + + Gets the select next trigger to acquire SQL clause. + SQL Server specific version with TOP functionality + + + + + + Internal database based lock handler for providing thread/resource locking + in order to protect resources from being altered by multiple threads at the + same time. + + James House + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + The table prefix. + the scheduler name + The select with lock SQL. + + + + + Execute the SQL select for update that will lock the proper database row. + + + + + Property name and value holder for trigger state data. + + + + + Object representing a job or trigger key. + + James House + Marko Lahma (.NET) + + + + Construct a new TriggerStatus with the status name and nextFireTime. + + The trigger's status + The next time trigger will fire + + + + Return the string representation of the TriggerStatus. + + + + + + Provide thread/resource locking in order to protect + resources from being altered by multiple threads at the same time using + a db row update. + + + + Note: This Semaphore implementation is useful for databases that do + not support row locking via "SELECT FOR UPDATE" or SQL Server's type syntax. + + + As of Quartz.NET 2.0 version there is no need to use this implementation for + SQL Server databases. + + + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + + + + Execute the SQL that will lock the proper database row. + + + + + + + + + This implementation of the Calendar excludes a set of days of the year. You + may use it to exclude bank holidays which are on the same date every year. + + + + Juergen Donnerstag + Marko Lahma (.NET) + + + + This implementation of the Calendar may be used (you don't have to) as a + base class for more sophisticated one's. It merely implements the base + functionality required by each Calendar. + + + Regarded as base functionality is the treatment of base calendars. Base + calendar allow you to chain (stack) as much calendars as you may need. For + example to exclude weekends you may use WeeklyCalendar. In order to exclude + holidays as well you may define a WeeklyCalendar instance to be the base + calendar for HolidayCalendar instance. + + + Juergen Donnerstag + James House + Marko Lahma (.NET) + + + + An interface to be implemented by objects that define spaces of time during + which an associated may (not) fire. Calendars + do not define actual fire times, but rather are used to limit a + from firing on its normal schedule if necessary. Most + Calendars include all times by default and allow the user to specify times + to exclude. + + + As such, it is often useful to think of Calendars as being used to exclude a block + of time - as opposed to include a block of time. (i.e. the + schedule "fire every five minutes except on Sundays" could be + implemented with a and a + which excludes Sundays) + + Implementations MUST take care of being properly cloneable and Serializable. + + + James House + Juergen Donnerstag + Marko Lahma (.NET) + + + + Determine whether the given UTC time is 'included' by the + Calendar. + + + + + Determine the next UTC time that is 'included' by the + Calendar after the given UTC time. + + + + + Gets or sets a description for the instance - may be + useful for remembering/displaying the purpose of the calendar, though + the description has no meaning to Quartz. + + + + + Set a new base calendar or remove the existing one. + Get the base calendar. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The base calendar. + + + + Initializes a new instance of the class. + + The time zone. + + + + Initializes a new instance of the class. + + The base calendar. + The time zone. + + + + Serialization constructor. + + + + + + + checks whether two arrays have + the same length and + for any given place there are equal elements + in both arrays + + + + + + Get the base calendar. Will be null, if not set. + + + + + Check if date/time represented by timeStamp is included. If included + return true. The implementation of BaseCalendar simply calls the base + calendars IsTimeIncluded() method if base calendar is set. + + + + + + Determine the next UTC time (in milliseconds) that is 'included' by the + Calendar after the given time. Return the original value if timeStamp is + included. Return 0 if all days are excluded. + + + + + + Creates a new object that is a copy of the current instance. + + A new object that is a copy of this instance. + + + + Gets or sets the time zone. + + The time zone. + + + + Gets or sets the description given to the instance by + its creator (if any). + + + + + Set a new base calendar or remove the existing one + + + + + + Constructor + + + + + Constructor + + The base calendar. + + + + Serialization constructor. + + + + + + + Return true, if day is defined to be exluded. + + + + + Redefine a certain day to be excluded (true) or included (false). + + + + + Determine whether the given UTC time (in milliseconds) is 'included' by the + Calendar. + + Note that this Calendar is only has full-day precision. + + + + + + Determine the next UTC time (in milliseconds) that is 'included' by the + Calendar after the given time. Return the original value if timeStampUtc is + included. Return 0 if all days are excluded. + + Note that this Calendar is only has full-day precision. + + + + + + Get or the array which defines the exclude-value of each day of month. + Setting will redefine the array of days excluded. The array must of size greater or + equal 31. + + + + + This implementation of the Calendar excludes the set of times expressed by a + given CronExpression. + + + For example, you could use this calendar to exclude all but business hours (8AM - 5PM) every + day using the expression "* * 0-7,18-23 ? * *". + + It is important to remember that the cron expression here describes a set of + times to be excluded from firing. Whereas the cron expression in + CronTrigger describes a set of times that can + be included for firing. Thus, if a has a + given cron expression and is associated with a with + the same expression, the calendar will exclude all the times the + trigger includes, and they will cancel each other out. + + + Aaron Craven + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + a string representation of the desired cron expression + + + + Create a with the given cron expression and + . + + + the base calendar for this calendar instance + see BaseCalendar for more information on base + calendar functionality + + a string representation of the desired cron expression + + + + Create a with the given cron expression and + . + + + the base calendar for this calendar instance + see BaseCalendar for more information on base + calendar functionality + + a string representation of the desired cron expression + + + + + Serialization constructor. + + + + + + + Determine whether the given time is 'included' by the + Calendar. + + the time to test + a boolean indicating whether the specified time is 'included' by the CronCalendar + + + + Determine the next time that is 'included' by the + Calendar after the given time. Return the original value if timeStamp is + included. Return 0 if all days are excluded. + + + + + + + Creates a new object that is a copy of the current instance. + + A new object that is a copy of this instance. + + + + Returns a that represents the current . + + + A that represents the current . + + + + + Sets the cron expression for the calendar to a new value. + + The expression. + + + + Returns the object representation of the cron expression that defines the + dates and times this calendar excludes. + + + + + This implementation of the Calendar excludes (or includes - see below) a + specified time range each day. + + + For example, you could use this calendar to + exclude business hours (8AM - 5PM) every day. Each + only allows a single time range to be specified, and that time range may not + * cross daily boundaries (i.e. you cannot specify a time range from 8PM - 5AM). + If the property is (default), + the time range defines a range of times in which triggers are not allowed to + * fire. If is , the time range + is inverted: that is, all times outside the defined time range + are excluded. + + Note when using , it behaves on the same principals + as, for example, WeeklyCalendar defines a set of days that are + excluded every week. Likewise, defines a + set of times that are excluded every day. + + + Mike Funk + Aaron Craven + Marko Lahma (.NET) + + + + Create a with a time range defined by the + specified strings and no baseCalendar. + and + must be in the format "HH:MM[:SS[:mmm]]" where: +
    +
  • + HH is the hour of the specified time. The hour should be + specified using military (24-hour) time and must be in the range + 0 to 23. +
  • +
  • + MM is the minute of the specified time and must be in the range + 0 to 59. +
  • +
  • + SS is the second of the specified time and must be in the range + 0 to 59. +
  • +
  • + mmm is the millisecond of the specified time and must be in the + range 0 to 999. +
  • +
  • items enclosed in brackets ('[', ']') are optional.
  • +
  • + The time range starting time must be before the time range ending + time. Note this means that a time range may not cross daily + boundaries (10PM - 2AM) +
  • +
+
+
+ + + Create a with a time range defined by the + specified strings and the specified baseCalendar. + and + must be in the format "HH:MM[:SS[:mmm]]" where: +
    +
  • + HH is the hour of the specified time. The hour should be + specified using military (24-hour) time and must be in the range + 0 to 23. +
  • +
  • + MM is the minute of the specified time and must be in the range + 0 to 59. +
  • +
  • + SS is the second of the specified time and must be in the range + 0 to 59. +
  • +
  • + mmm is the millisecond of the specified time and must be in the + range 0 to 999. +
  • +
  • + items enclosed in brackets ('[', ']') are optional. +
  • +
  • + The time range starting time must be before the time range ending + time. Note this means that a time range may not cross daily + boundaries (10PM - 2AM) +
  • +
+
+ The base calendar for this calendar instance see BaseCalendar for more + information on base calendar functionality. +
+ + + Create a with a time range defined by the + specified values and no baseCalendar. Values are subject to + the following validations: +
    +
  • + Hours must be in the range 0-23 and are expressed using military + (24-hour) time. +
  • +
  • Minutes must be in the range 0-59
  • +
  • Seconds must be in the range 0-59
  • +
  • Milliseconds must be in the range 0-999
  • +
  • + The time range starting time must be before the time range ending + time. Note this means that a time range may not cross daily + boundaries (10PM - 2AM) +
  • +
+
+ The range starting hour of day. + The range starting minute. + The range starting second. + The range starting millis. + The range ending hour of day. + The range ending minute. + The range ending second. + The range ending millis. +
+ + + Create a with a time range defined by the + specified values and the specified . Values are + subject to the following validations: +
    +
  • + Hours must be in the range 0-23 and are expressed using military + (24-hour) time. +
  • +
  • Minutes must be in the range 0-59
  • +
  • Seconds must be in the range 0-59
  • +
  • Milliseconds must be in the range 0-999
  • +
  • + The time range starting time must be before the time range ending + time. Note this means that a time range may not cross daily + boundaries (10PM - 2AM) +
  • +
+
+ The range starting hour of day. + The range starting minute. + The range starting second. + The range starting millis. + The range ending hour of day. + The range ending minute. + The range ending second. + The range ending millis. +
+ + + Create a with a time range defined by the + specified s and no + baseCalendar. The Calendars are subject to the following + considerations: +
    +
  • + Only the time-of-day fields of the specified Calendars will be + used (the date fields will be ignored) +
  • +
  • + The starting time must be before the ending time of the defined + time range. Note this means that a time range may not cross + daily boundaries (10PM - 2AM). (because only time fields are + are used, it is possible for two Calendars to represent a valid + time range and + rangeStartingCalendar.after(rangeEndingCalendar) == true) + +
  • +
+
+ The range starting calendar. + The range ending calendar. +
+ + + Create a with a time range defined by the + specified s and the specified + . The Calendars are subject to the following + considerations: +
    +
  • + Only the time-of-day fields of the specified Calendars will be + used (the date fields will be ignored) +
  • +
  • + The starting time must be before the ending time of the defined + time range. Note this means that a time range may not cross + daily boundaries (10PM - 2AM). (because only time fields are + are used, it is possible for two Calendars to represent a valid + time range and + rangeStartingCalendarUtc > rangeEndingCalendarUtc == true) +
  • +
+
+ The range starting calendar. + The range ending calendar. +
+ + + Create a with a time range defined by the + specified values and no baseCalendar. The values are + subject to the following considerations: +
    +
  • + Only the time-of-day portion of the specified values will be + used +
  • +
  • + The starting time must be before the ending time of the defined + time range. Note this means that a time range may not cross + daily boundaries (10PM - 2AM). (because only time value are + are used, it is possible for the two values to represent a valid + time range and rangeStartingTime > rangeEndingTime) +
  • +
+
+ The range starting time in millis. + The range ending time in millis. +
+ + + Create a with a time range defined by the + specified values and the specified . The values + are subject to the following considerations: +
    +
  • + Only the time-of-day portion of the specified values will be + used +
  • +
  • + The starting time must be before the ending time of the defined + time range. Note this means that a time range may not cross + daily boundaries (10PM - 2AM). (because only time value are + are used, it is possible for the two values to represent a valid + time range and rangeStartingTime > rangeEndingTime) +
  • +
+
+ The range starting time in millis. + The range ending time in millis. +
+ + + Serialization constructor. + + + + + + + Determine whether the given time is 'included' by the + Calendar. + + + + + + + Determine the next time (in milliseconds) that is 'included' by the + Calendar after the given time. Return the original value if timeStamp is + included. Return 0 if all days are excluded. + + + + + + + + Returns the start time of the time range of the day + specified in . + + + a DateTime representing the start time of the + time range for the specified date. + + + + + Returns the end time of the time range of the day + specified in + + + A DateTime representing the end time of the + time range for the specified date. + + + + + Returns a that represents the current . + + + A that represents the current . + + + + + Sets the time range for the to the times + represented in the specified Strings. + + The range starting time string. + The range ending time string. + + + + Sets the time range for the to the times + represented in the specified values. + + The range starting hour of day. + The range starting minute. + The range starting second. + The range starting millis. + The range ending hour of day. + The range ending minute. + The range ending second. + The range ending millis. + + + + Sets the time range for the to the times + represented in the specified s. + + The range starting calendar. + The range ending calendar. + + + + Sets the time range for the to the times + represented in the specified values. + + The range starting time. + The range ending time. + + + + Gets the start of day, practically zeroes time part. + + The time. + + + + + Gets the end of day, pratically sets time parts to maximum allowed values. + + The time. + + + + + Checks the specified values for validity as a set of time values. + + The hour of day. + The minute. + The second. + The millis. + + + + Indicates whether the time range represents an inverted time range (see + class description). + + true if invert time range; otherwise, false. + + + + This implementation of the Calendar stores a list of holidays (full days + that are excluded from scheduling). + + + The implementation DOES take the year into consideration, so if you want to + exclude July 4th for the next 10 years, you need to add 10 entries to the + exclude list. + + Sharada Jambula + Juergen Donnerstag + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The base calendar. + + + + Serialization constructor. + + + + + + + Determine whether the given time (in milliseconds) is 'included' by the + Calendar. + + Note that this Calendar is only has full-day precision. + + + + + + Determine the next time (in milliseconds) that is 'included' by the + Calendar after the given time. + + Note that this Calendar is only has full-day precision. + + + + + + Creates a new object that is a copy of the current instance. + + A new object that is a copy of this instance. + + + + Add the given Date to the list of excluded days. Only the month, day and + year of the returned dates are significant. + + + + + Removes the excluded date. + + The date to remove. + + + + Returns a of Dates representing the excluded + days. Only the month, day and year of the returned dates are + significant. + + + + + This implementation of the Calendar excludes a set of days of the month. You + may use it to exclude every 1. of each month for example. But you may define + any day of a month. + + + + Juergen Donnerstag + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + + + + Constructor + + The base calendar. + + + + Serialization constructor. + + + + + + + Initialize internal variables + + + + + Return true, if mday is defined to be exluded. + + + + + Redefine a certain day of the month to be excluded (true) or included + (false). + + + + + Check if all days are excluded. That is no day is included. + + boolean + + + + + Determine whether the given time (in milliseconds) is 'included' by the + Calendar. + + Note that this Calendar is only has full-day precision. + + + + + + Determine the next time (in milliseconds) that is 'included' by the + Calendar after the given time. Return the original value if timeStamp is + included. Return DateTime.MinValue if all days are excluded. + + Note that this Calendar is only has full-day precision. + + + + + + Creates a new object that is a copy of the current instance. + + A new object that is a copy of this instance. + + + + Get or set the array which defines the exclude-value of each day of month + Setting will redefine the array of days excluded. The array must of size greater or + equal 31. + + + + + This implementation of the Calendar excludes a set of days of the week. You + may use it to exclude weekends for example. But you may define any day of + the week. + + + + Juergen Donnerstag + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The base calendar. + + + + Serialization constructor. + + + + + + + Initialize internal variables + + + + + Return true, if wday is defined to be exluded. E. g. + saturday and sunday. + + + + + Redefine a certain day of the week to be excluded (true) or included + (false). Use java.util.Calendar's constants like MONDAY to determine the + wday. + + + + + Check if all week ays are excluded. That is no day is included. + + + + + Determine whether the given time (in milliseconds) is 'included' by the + Calendar. + + Note that this Calendar is only has full-day precision. + + + + + + Determine the next time (in milliseconds) that is 'included' by the + Calendar after the given time. Return the original value if timeStamp is + included. Return DateTime.MinValue if all days are excluded. + + Note that this Calendar is only has full-day precision. + + + + + + Get the array with the week days. + Setting will redefine the array of days excluded. The array must of size greater or + equal 8. java.util.Calendar's constants like MONDAY should be used as + index. A value of true is regarded as: exclude it. + + + + + Matches using an AND operator on two Matcher operands. + + James House + Marko Lahma (.NET) + + + + Matchers can be used in various API methods to + select the entities that should be operated upon. + + James House + + + + + Create an AndMatcher that depends upon the result of both of the given matchers. + + + + + + + + + Matches on the complete key being equal (both name and group). + + + + jhouse + + + + Create an EverythingMatcher that matches all jobs. + + + + + + Create an EverythingMatcher that matches all triggers. + + + + + + Matches on group (ignores name) property of Keys. + + James House + Marko Lahma (.NET) + + + + An abstract base class for some types of matchers. + + James House + Marko Lahma (.NET) + + + + Create a GroupMatcher that matches groups equaling the given string. + + + + + + + Create a GroupMatcher that matches groups starting with the given string. + + + + + + + Create a GroupMatcher that matches groups ending with the given string. + + + + + + + Create a GroupMatcher that matches groups containing the given string. + + + + + + + Matches on the complete key being equal (both name and group). + + James House + Marko Lahma (.NET) + + + + Create a KeyMatcher that matches Keys that equal the given key. + + + + + + + + Matches on name (ignores group) property of Keys. + + James House + Marko Lahma (.NET) + + + + Create a NameMatcher that matches names equaling the given string. + + + + + + + Create a NameMatcher that matches names starting with the given string. + + + + + + + Create a NameMatcher that matches names ending with the given string. + + + + + + + Create a NameMatcher that matches names containing the given string. + + + + + + + Matches using an NOT operator on another Matcher. + + James House + Marko Lahma (.NET) + + + + Create a NotMatcher that reverses the result of the given matcher. + + + + + + + + Matches using an OR operator on two Matcher operands. + + James House + Marko Lahma (.NET) + + + + Create an OrMatcher that depends upon the result of at least one of the given matchers. + + + + + + + + + Operators available for comparing string values. + + + + + The base abstract class to be extended by all triggers. + + + + s have a name and group associated with them, which + should uniquely identify them within a single . + + + + s are the 'mechanism' by which s + are scheduled. Many s can point to the same , + but a single can only point to one . + + + + Triggers can 'send' parameters/data to s by placing contents + into the on the . + + + + + + + + James House + Sharada Jambula + Marko Lahma (.NET) + + + + Internal interface for managing triggers. This interface should not be used by the Quartz client. + + + + + Should not be used by end users. + + + + + The base interface with properties common to all s - + use to instantiate an actual Trigger. + + + + s have a associated with them, which + should uniquely identify them within a single . + + + + s are the 'mechanism' by which s + are scheduled. Many s can point to the same , + but a single can only point to one . + + + + Triggers can 'send' parameters/data to s by placing contents + into the on the . + + + + + + + + + + James House + Sharada Jambula + Marko Lahma (.NET) + + + + Get a that is configured to produce a + schedule identical to this trigger's schedule. + + + + + + Used by the to determine whether or not + it is possible for this to fire again. + + If the returned value is then the + may remove the from the . + + + + + + Returns the next time at which the is scheduled to fire. If + the trigger will not fire again, will be returned. Note that + the time returned can possibly be in the past, if the time that was computed + for the trigger to next fire has already arrived, but the scheduler has not yet + been able to fire the trigger (which would likely be due to lack of resources + e.g. threads). + + + The value returned is not guaranteed to be valid until after the + has been added to the scheduler. + + + + + + Returns the previous time at which the fired. + If the trigger has not yet fired, will be returned. + + + + + Returns the next time at which the will fire, + after the given time. If the trigger will not fire after the given time, + will be returned. + + + + + Get or set the description given to the instance by + its creator (if any). + + + + + Get or set the with the given name with + this Trigger. Use when setting to dis-associate a Calendar. + + + + + Get or set the that is associated with the + . + + Changes made to this map during job execution are not re-persisted, and + in fact typically result in an illegal state. + + + + + + Returns the last UTC time at which the will fire, if + the Trigger will repeat indefinitely, null will be returned. + + Note that the return time *may* be in the past. + + + + + + Get or set the instruction the should be given for + handling misfire situations for this - the + concrete type that you are using will have + defined a set of additional MISFIRE_INSTRUCTION_XXX + constants that may be set to this property. + + If not explicitly set, the default value is . + + + + + + + + + Gets and sets the date/time on which the trigger must stop firing. This + defines the final boundary for trigger firings 舒 the trigger will + not fire after to this date and time. If this value is null, no end time + boundary is assumed, and the trigger can continue indefinitely. + + + + + The time at which the trigger's scheduling should start. May or may not + be the first actual fire time of the trigger, depending upon the type of + trigger and the settings of the other properties of the trigger. However + the first actual first time will not be before this date. + + + Setting a value in the past may cause a new trigger to compute a first + fire time that is in the past, which may cause an immediate misfire + of the trigger. + + + + + The priority of a acts as a tie breaker such that if + two s have the same scheduled fire time, then Quartz + will do its best to give the one with the higher priority first access + to a worker thread. + + + If not explicitly set, the default value is 5. + + + + + + + Set a description for the instance - may be + useful for remembering/displaying the purpose of the trigger, though the + description has no meaning to Quartz. + + + + + Associate the with the given name with this Trigger. + + + + + Set the to be associated with the + . + + + + + The priority of a acts as a tie breaker such that if + two s have the same scheduled fire time, then Quartz + will do its best to give the one with the higher priority first access + to a worker thread. + + + If not explicitly set, the default value is 5. + + + + + + + The time at which the trigger's scheduling should start. May or may not + be the first actual fire time of the trigger, depending upon the type of + trigger and the settings of the other properties of the trigger. However + the first actual first time will not be before this date. + + + Setting a value in the past may cause a new trigger to compute a first + fire time that is in the past, which may cause an immediate misfire + of the trigger. + + ew DateTimeOffset StartTimeUtc { get; set; } + + + + + + Set the time at which the should quit repeating - + regardless of any remaining repeats (based on the trigger's particular + repeat settings). + + + + + + + + Set the instruction the should be given for + handling misfire situations for this - the + concrete type that you are using will have + defined a set of additional MisfireInstruction.XXX + constants that may be passed to this method. + + + If not explicitly set, the default value is . + + + + + + + + This method should not be used by the Quartz client. + + + Called when the has decided to 'fire' + the trigger (Execute the associated ), in order to + give the a chance to update itself for its next + triggering (if any). + + + + + + This method should not be used by the Quartz client. + + + + Called by the scheduler at the time a is first + added to the scheduler, in order to have the + compute its first fire time, based on any associated calendar. + + + + After this method has been called, + should return a valid answer. + + + + The first time at which the will be fired + by the scheduler, which is also the same value + will return (until after the first firing of the ). + + + + + This method should not be used by the Quartz client. + + + Called after the has executed the + associated with the + in order to get the final instruction code from the trigger. + + + is the that was used by the + 's method. + is the thrown by the + , if any (may be null). + + + One of the members. + + + + + + + + + + This method should not be used by the Quartz client. + + To be implemented by the concrete classes that extend this class. + + + The implementation should update the 's state + based on the MISFIRE_INSTRUCTION_XXX that was selected when the + was created. + + + + + + This method should not be used by the Quartz client. + + The implementation should update the 's state + based on the given new version of the associated + (the state should be updated so that it's next fire time is appropriate + given the Calendar's new settings). + + + + + + + + Validates whether the properties of the are + valid for submission into a . + + + + + This method should not be used by the Quartz client. + + + Usable by + implementations, in order to facilitate 'recognizing' instances of fired + s as their jobs complete execution. + + + + + Returns the previous time at which the fired. + If the trigger has not yet fired, will be returned. + + + + + Create a with no specified name, group, or . + + + Note that the , and + the and properties + must be set before the can be placed into a + . + + + + + Create a with the given name, and default group. + + + Note that the and + properties must be set before the + can be placed into a . + + The name. + + + + Create a with the given name, and group. + + + Note that the and + properties must be set before the + can be placed into a . + + The name. + if , Scheduler.DefaultGroup will be used. + + + + Create a with the given name, and group. + + The name. + if , Scheduler.DefaultGroup will be used. + Name of the job. + The job group. + ArgumentException + if name is null or empty, or the group is an empty string. + + + + + This method should not be used by the Quartz client. + + + Called when the has decided to 'fire' + the trigger (Execute the associated ), in order to + give the a chance to update itself for its next + triggering (if any). + + + + + + This method should not be used by the Quartz client. + + + + Called by the scheduler at the time a is first + added to the scheduler, in order to have the + compute its first fire time, based on any associated calendar. + + + + After this method has been called, + should return a valid answer. + + + + The first time at which the will be fired + by the scheduler, which is also the same value + will return (until after the first firing of the ). + + + + + This method should not be used by the Quartz client. + + + Called after the has executed the + associated with the + in order to get the final instruction code from the trigger. + + + is the that was used by the + 's method. + is the thrown by the + , if any (may be null). + + + One of the members. + + + + + + + Used by the to determine whether or not + it is possible for this to fire again. + + If the returned value is then the + may remove the from the . + + + + + + Returns the next time at which the is scheduled to fire. If + the trigger will not fire again, will be returned. Note that + the time returned can possibly be in the past, if the time that was computed + for the trigger to next fire has already arrived, but the scheduler has not yet + been able to fire the trigger (which would likely be due to lack of resources + e.g. threads). + + + The value returned is not guaranteed to be valid until after the + has been added to the scheduler. + + + + + + Returns the next time at which the will fire, + after the given time. If the trigger will not fire after the given time, + will be returned. + + + + + Validates the misfire instruction. + + The misfire instruction. + + + + + This method should not be used by the Quartz client. + + To be implemented by the concrete classes that extend this class. + + + The implementation should update the 's state + based on the MISFIRE_INSTRUCTION_XXX that was selected when the + was created. + + + + + + This method should not be used by the Quartz client. + + The implementation should update the 's state + based on the given new version of the associated + (the state should be updated so that it's next fire time is appropriate + given the Calendar's new settings). + + + + + + + + Validates whether the properties of the are + valid for submission into a . + + + + + Return a simple string representation of this object. + + + + + Compare the next fire time of this to that of + another by comparing their keys, or in other words, sorts them + according to the natural (i.e. alphabetical) order of their keys. + + + + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + + Trigger equality is based upon the equality of the TriggerKey. + + + true if the key of this Trigger equals that of the given Trigger + + + + Serves as a hash function for a particular type. is suitable for use in hashing algorithms and data structures like a hash table. + + + A hash code for the current . + + + + + Creates a new object that is a copy of the current instance. + + + A new object that is a copy of this instance. + + + + + Get or sets the name of this . + + If name is null or empty. + + + + Get the group of this . If , Scheduler.DefaultGroup will be used. + + + if group is an empty string. + + + + + Get or set the name of the associated . + + + if jobName is null or empty. + + + + + Gets or sets the name of the associated 's + group. If set with , Scheduler.DefaultGroup will be used. + + ArgumentException + if group is an empty string. + + + + + Returns the 'full name' of the in the format + "group.name". + + + + + Gets the key. + + The key. + + + + Returns the 'full name' of the that the + points to, in the format "group.name". + + + + + Get or set the description given to the instance by + its creator (if any). + + + + + Get or set the with the given name with + this Trigger. Use when setting to dis-associate a Calendar. + + + + + Get or set the that is associated with the + . + + Changes made to this map during job execution are not re-persisted, and + in fact typically result in an illegal state. + + + + + + Returns the last UTC time at which the will fire, if + the Trigger will repeat indefinitely, null will be returned. + + Note that the return time *may* be in the past. + + + + + + Get or set the instruction the should be given for + handling misfire situations for this - the + concrete type that you are using will have + defined a set of additional MISFIRE_INSTRUCTION_XXX + constants that may be passed to this method. + + If not explicitly set, the default value is . + + + + + + + + + + This method should not be used by the Quartz client. + + + Usable by + implementations, in order to facilitate 'recognizing' instances of fired + s as their jobs complete execution. + + + + + Gets and sets the date/time on which the trigger must stop firing. This + defines the final boundary for trigger firings 舒 the trigger will + not fire after to this date and time. If this value is null, no end time + boundary is assumed, and the trigger can continue indefinitely. + + + + + The time at which the trigger's scheduling should start. May or may not + be the first actual fire time of the trigger, depending upon the type of + trigger and the settings of the other properties of the trigger. However + the first actual first time will not be before this date. + + + Setting a value in the past may cause a new trigger to compute a first + fire time that is in the past, which may cause an immediate misfire + of the trigger. + + + + + Tells whether this Trigger instance can handle events + in millisecond precision. + + + + + The priority of a acts as a tie breaker such that if + two s have the same scheduled fire time, then Quartz + will do its best to give the one with the higher priority first access + to a worker thread. + + + If not explicitly set, the default value is 5. + + + + + + + Gets a value indicating whether this instance has additional properties + that should be considered when for example saving to database. + + + If trigger implementation has additional properties that need to be saved + with base properties you need to make your class override this property with value true. + Returning true will effectively mean that ADOJobStore needs to serialize + this trigger instance to make sure additional properties are also saved. + + + true if this instance has additional properties; otherwise, false. + + + + + A concrete that is used to fire a + based upon repeating calendar time intervals. + + + The trigger will fire every N (see ) units of calendar time + (see ) as specified in the trigger's definition. + This trigger can achieve schedules that are not possible with (e.g + because months are not a fixed number of seconds) or (e.g. because + "every 5 months" is not an even divisor of 12). + + If you use an interval unit of then care should be taken when setting + a value that is on a day near the end of the month. For example, + if you choose a start time that occurs on January 31st, and have a trigger with unit + and interval 1, then the next fire time will be February 28th, + and the next time after that will be March 28th - and essentially each subsequent firing will + occur on the 28th of the month, even if a 31st day exists. If you want a trigger that always + fires on the last day of the month - regardless of the number of days in the month, + you should use . + + + + + + + 2.0 + James House + Marko Lahma (.NET) + + + + A that is used to fire a + based upon repeating calendar time intervals. + + + + + Get or set the interval unit - the time unit on with the interval applies. + + + + + Get the the time interval that will be added to the 's + fire time (in the set repeat interval unit) in order to calculate the time of the + next trigger repeat. + + + + + Get the number of times the has already fired. + + + + + Create a with no settings. + + + + + Create a that will occur immediately, and + repeat at the the given interval. + + Name for the trigger instance. + The repeat interval unit (minutes, days, months, etc). + The number of milliseconds to pause between the repeat firing. + + + + Create a that will occur immediately, and + repeat at the the given interval + + Name for the trigger instance. + Group for the trigger instance. + The repeat interval unit (minutes, days, months, etc). + The number of milliseconds to pause between the repeat firing. + + + + Create a that will occur at the given time, + and repeat at the the given interval until the given end time. + + Name for the trigger instance. + A set to the time for the to fire. + A set to the time for the to quit repeat firing. + The repeat interval unit (minutes, days, months, etc). + The number of milliseconds to pause between the repeat firing. + + + + Create a that will occur at the given time, + and repeat at the the given interval until the given end time. + + Name for the trigger instance. + Group for the trigger instance. + A set to the time for the to fire. + A set to the time for the to quit repeat firing. + The repeat interval unit (minutes, days, months, etc). + The number of milliseconds to pause between the repeat firing. + + + + Create a that will occur at the given time, + and repeat at the the given interval until the given end time. + + Name for the trigger instance. + Group for the trigger instance. + Name of the associated job. + Group of the associated job. + A set to the time for the to fire. + A set to the time for the to quit repeat firing. + The repeat interval unit (minutes, days, months, etc). + The number of milliseconds to pause between the repeat firing. + + + + Validates the misfire instruction. + + The misfire instruction. + + + + + Updates the 's state based on the + MisfireInstruction.XXX that was selected when the + was created. + + + If the misfire instruction is set to , + then the following scheme will be used: +
    +
  • The instruction will be interpreted as
  • +
+
+
+ + + This method should not be used by the Quartz client. + + Called when the has decided to 'fire' + the trigger (Execute the associated ), in order to + give the a chance to update itself for its next + triggering (if any). + + + + + + + This method should not be used by the Quartz client. + + The implementation should update the 's state + based on the given new version of the associated + (the state should be updated so that it's next fire time is appropriate + given the Calendar's new settings). + + + + + + + + This method should not be used by the Quartz client. + + + + Called by the scheduler at the time a is first + added to the scheduler, in order to have the + compute its first fire time, based on any associated calendar. + + + + After this method has been called, + should return a valid answer. + + + + The first time at which the will be fired + by the scheduler, which is also the same value + will return (until after the first firing of the ). + + + + + Returns the next time at which the is scheduled to fire. If + the trigger will not fire again, will be returned. Note that + the time returned can possibly be in the past, if the time that was computed + for the trigger to next fire has already arrived, but the scheduler has not yet + been able to fire the trigger (which would likely be due to lack of resources + e.g. threads). + + + The value returned is not guaranteed to be valid until after the + has been added to the scheduler. + + + + + + Returns the previous time at which the fired. + If the trigger has not yet fired, will be returned. + + + + + Returns the next time at which the will fire, + after the given time. If the trigger will not fire after the given time, + will be returned. + + + + + Determines whether or not the will occur + again. + + + + + + Validates whether the properties of the are + valid for submission into a . + + + + + Get a that is configured to produce a + schedule identical to this trigger's schedule. + + + + + + + + Get the time at which the should occur. + + + + + Tells whether this Trigger instance can handle events + in millisecond precision. + + + + + Get the time at which the should quit + repeating. + + + + + Get or set the interval unit - the time unit on with the interval applies. + + + + + Get the the time interval that will be added to the 's + fire time (in the set repeat interval unit) in order to calculate the time of the + next trigger repeat. + + + + + Get the number of times the has already fired. + + + + + Returns the final time at which the will + fire, if there is no end time set, null will be returned. + + + Note that the return time may be in the past. + + + + A concrete that is used to fire a + at given moments in time, defined with Unix 'cron-like' definitions. + + + + For those unfamiliar with "cron", this means being able to create a firing + schedule such as: "At 8:00am every Monday through Friday" or "At 1:30am + every last Friday of the month". + + + + The format of a "Cron-Expression" string is documented on the + class. + + + + Here are some full examples:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Expression Meaning
"0 0 12 * * ?"" /> Fire at 12pm (noon) every day" />
"0 15 10 ? * *"" /> Fire at 10:15am every day" />
"0 15 10 * * ?"" /> Fire at 10:15am every day" />
"0 15 10 * * ? *"" /> Fire at 10:15am every day" />
"0 15 10 * * ? 2005"" /> Fire at 10:15am every day during the year 2005" /> +
"0 * 14 * * ?"" /> Fire every minute starting at 2pm and ending at 2:59pm, every day" /> +
"0 0/5 14 * * ?"" /> Fire every 5 minutes starting at 2pm and ending at 2:55pm, every day" /> +
"0 0/5 14,18 * * ?"" /> Fire every 5 minutes starting at 2pm and ending at 2:55pm, AND fire every 5 minutes starting at 6pm and ending at 6:55pm, every day" /> +
"0 0-5 14 * * ?"" /> Fire every minute starting at 2pm and ending at 2:05pm, every day" /> +
"0 10,44 14 ? 3 WED"" /> Fire at 2:10pm and at 2:44pm every Wednesday in the month of March." /> +
"0 15 10 ? * MON-FRI"" /> Fire at 10:15am every Monday, Tuesday, Wednesday, Thursday and Friday" /> +
"0 15 10 15 * ?"" /> Fire at 10:15am on the 15th day of every month" /> +
"0 15 10 L * ?"" /> Fire at 10:15am on the last day of every month" /> +
"0 15 10 ? * 6L"" /> Fire at 10:15am on the last Friday of every month" /> +
"0 15 10 ? * 6L"" /> Fire at 10:15am on the last Friday of every month" /> +
"0 15 10 ? * 6L 2002-2005"" /> Fire at 10:15am on every last Friday of every month during the years 2002, 2003, 2004 and 2005" /> +
"0 15 10 ? * 6#3"" /> Fire at 10:15am on the third Friday of every month" /> +
+
+ + + Pay attention to the effects of '?' and '*' in the day-of-week and + day-of-month fields! + + + + NOTES: +
    +
  • Support for specifying both a day-of-week and a day-of-month value is + not complete (you'll need to use the '?' character in on of these fields). +
  • +
  • Be careful when setting fire times between mid-night and 1:00 AM - + "daylight savings" can cause a skip or a repeat depending on whether the + time moves back or jumps forward.
  • +
+
+
+ + + Sharada Jambula + James House + Contributions from Mads Henderson + Marko Lahma (.NET) +
+ + + The public interface for inspecting settings specific to a CronTrigger, + which is used to fire a + at given moments in time, defined with Unix 'cron-like' schedule definitions. + + + + For those unfamiliar with "cron", this means being able to create a firing + schedule such as: "At 8:00am every Monday through Friday" or "At 1:30am + every last Friday of the month". + + + + The format of a "Cron-Expression" string is documented on the + class. + + + + Here are some full examples:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Expression Meaning
"0 0 12 * * ?"" /> Fire at 12pm (noon) every day" />
"0 15 10 ? * *"" /> Fire at 10:15am every day" />
"0 15 10 * * ?"" /> Fire at 10:15am every day" />
"0 15 10 * * ? *"" /> Fire at 10:15am every day" />
"0 15 10 * * ? 2005"" /> Fire at 10:15am every day during the year 2005" /> +
"0 * 14 * * ?"" /> Fire every minute starting at 2pm and ending at 2:59pm, every day" /> +
"0 0/5 14 * * ?"" /> Fire every 5 minutes starting at 2pm and ending at 2:55pm, every day" /> +
"0 0/5 14,18 * * ?"" /> Fire every 5 minutes starting at 2pm and ending at 2:55pm, AND fire every 5 minutes starting at 6pm and ending at 6:55pm, every day" /> +
"0 0-5 14 * * ?"" /> Fire every minute starting at 2pm and ending at 2:05pm, every day" /> +
"0 10,44 14 ? 3 WED"" /> Fire at 2:10pm and at 2:44pm every Wednesday in the month of March." /> +
"0 15 10 ? * MON-FRI"" /> Fire at 10:15am every Monday, Tuesday, Wednesday, Thursday and Friday" /> +
"0 15 10 15 * ?"" /> Fire at 10:15am on the 15th day of every month" /> +
"0 15 10 L * ?"" /> Fire at 10:15am on the last day of every month" /> +
"0 15 10 ? * 6L"" /> Fire at 10:15am on the last Friday of every month" /> +
"0 15 10 ? * 6L"" /> Fire at 10:15am on the last Friday of every month" /> +
"0 15 10 ? * 6L 2002-2005"" /> Fire at 10:15am on every last Friday of every month during the years 2002, 2003, 2004 and 2005" /> +
"0 15 10 ? * 6#3"" /> Fire at 10:15am on the third Friday of every month" /> +
+
+ + + Pay attention to the effects of '?' and '*' in the day-of-week and + day-of-month fields! + + + + NOTES: +
    +
  • Support for specifying both a day-of-week and a day-of-month value is + not complete (you'll need to use the '?' character in on of these fields). +
  • +
  • Be careful when setting fire times between mid-night and 1:00 AM - + "daylight savings" can cause a skip or a repeat depending on whether the + time moves back or jumps forward.
  • +
+
+
+ + + Sharada Jambula + James House + Contributions from Mads Henderson + Marko Lahma (.NET) +
+ + + Gets the expression summary. + + + + + + Gets or sets the cron expression string. + + The cron expression string. + + + + Sets the time zone for which the of this + will be resolved. + + + If is set after this + property, the TimeZone setting on the CronExpression will "win". However + if is set after this property, the + time zone applied by this method will remain in effect, since the + string cron expression does not carry a time zone! + + The time zone. + + + + Create a with no settings. + + + The start-time will also be set to the current time, and the time zone + will be set the the system's default time zone. + + + + + Create a with the given name and default group. + + + The start-time will also be set to the current time, and the time zone + will be set the the system's default time zone. + + The name of the + + + + Create a with the given name and group. + + + The start-time will also be set to the current time, and the time zone + will be set the the system's default time zone. + + The name of the + The group of the + + + + Create a with the given name, group and + expression. + + + The start-time will also be set to the current time, and the time zone + will be set the the system's default time zone. + + The name of the + The group of the + A cron expression dictating the firing sequence of the + + + + Create a with the given name and group, and + associated with the identified . + + + The start-time will also be set to the current time, and the time zone + will be set the the system's default time zone. + + The name of the . + The group of the + name of the executed on firetime + Group of the executed on firetime + + + + Create a with the given name and group, + associated with the identified , + and with the given "cron" expression. + + + The start-time will also be set to the current time, and the time zone + will be set the the system's default time zone. + + The name of the + The group of the + name of the executed on firetime + Group of the executed on firetime + A cron expression dictating the firing sequence of the + + + + Create a with the given name and group, + associated with the identified , + and with the given "cron" expression resolved with respect to the . + + The name of the + The group of the + name of the executed on firetime + Group of the executed on firetime + A cron expression dictating the firing sequence of the + + Specifies for which time zone the cronExpression should be interpreted, + i.e. the expression 0 0 10 * * ?, is resolved to 10:00 am in this time zone. + + + + + Create a that will occur at the given time, + until the given end time. + + If null, the start-time will also be set to the current time, the time + zone will be set the the system's default. + + + The name of the + The group of the + name of the executed on firetime + Group of the executed on firetime + A set to the earliest time for the to start firing. + A set to the time for the to quit repeat firing. + A cron expression dictating the firing sequence of the + + + + Create a with fire time dictated by the + resolved with respect to the specified + occurring from the until + the given . + + The name of the + The group of the + name of the executed on firetime + Group of the executed on firetime + A set to the earliest time for the to start firing. + A set to the time for the to quit repeat firing. + + + + Clones this instance. + + + + + + Returns the next time at which the is scheduled to fire. If + the trigger will not fire again, will be returned. Note that + the time returned can possibly be in the past, if the time that was computed + for the trigger to next fire has already arrived, but the scheduler has not yet + been able to fire the trigger (which would likely be due to lack of resources + e.g. threads). + + + The value returned is not guaranteed to be valid until after the + has been added to the scheduler. + + + + + + Returns the previous time at which the fired. + If the trigger has not yet fired, will be returned. + + + + + + Sets the next fire time. + + This method should not be invoked by client code. + + + The fire time. + + + + Sets the previous fire time. + + This method should not be invoked by client code. + + + The fire time. + + + + Returns the next time at which the will fire, + after the given time. If the trigger will not fire after the given time, + will be returned. + + + + + + + Used by the to determine whether or not + it is possible for this to fire again. + + If the returned value is then the + may remove the from the . + + + + + + + Validates the misfire instruction. + + The misfire instruction. + + + + + This method should not be used by the Quartz client. + + To be implemented by the concrete classes that extend this class. + + + The implementation should update the 's state + based on the MISFIRE_INSTRUCTION_XXX that was selected when the + was created. + + + + + + + + Determines whether the date and (optionally) time of the given Calendar + instance falls on a scheduled fire-time of this trigger. + + + + Equivalent to calling . + + + The date to compare. + + + + + Determines whether the date and (optionally) time of the given Calendar + instance falls on a scheduled fire-time of this trigger. + + Note that the value returned is NOT validated against the related + ICalendar (if any). + + + The date to compare + If set to true, the method will only determine if the + trigger will fire during the day represented by the given Calendar + (hours, minutes and seconds will be ignored). + + + + + Called when the has decided to 'fire' + the trigger (Execute the associated ), in order to + give the a chance to update itself for its next + triggering (if any). + + + + + + + Updates the trigger with new calendar. + + The calendar to update with. + The misfire threshold. + + + + Called by the scheduler at the time a is first + added to the scheduler, in order to have the + compute its first fire time, based on any associated calendar. + + After this method has been called, + should return a valid answer. + + + + + the first time at which the will be fired + by the scheduler, which is also the same value + will return (until after the first firing of the ). + + + + + Gets the expression summary. + + + + + + Gets the next time to fire after the given time. + + The time to compute from. + + + + + NOT YET IMPLEMENTED: Returns the time before the given time + that this will fire. + + The date. + + + + + Gets or sets the cron expression string. + + The cron expression string. + + + + Set the CronExpression to the given one. The TimeZone on the passed-in + CronExpression over-rides any that was already set on the Trigger. + + The cron expression. + + + + Returns the date/time on which the trigger may begin firing. This + defines the initial boundary for trigger firings the trigger + will not fire prior to this date and time. + + + + + + Get or sets the time at which the CronTrigger should quit + repeating - even if repeastCount isn't yet satisfied. + + + + + Sets the time zone for which the of this + will be resolved. + + + If is set after this + property, the TimeZone setting on the CronExpression will "win". However + if is set after this property, the + time zone applied by this method will remain in effect, since the + string cron expression does not carry a time zone! + + The time zone. + + + + Returns the last UTC time at which the will fire, if + the Trigger will repeat indefinitely, null will be returned. + + Note that the return time *may* be in the past. + + + + + + Tells whether this Trigger instance can handle events + in millisecond precision. + + + + + + A concrete implementation of DailyTimeIntervalTrigger that is used to fire a + based upon daily repeating time intervals. + + + + The trigger will fire every N ( ) seconds, minutes or hours + (see ) during a given time window on specified days of the week. + + + For example#1, a trigger can be set to fire every 72 minutes between 8:00 and 11:00 everyday. It's fire times would + be 8:00, 9:12, 10:24, then next day would repeat: 8:00, 9:12, 10:24 again. + + + For example#2, a trigger can be set to fire every 23 minutes between 9:20 and 16:47 Monday through Friday. + + + On each day, the starting fire time is reset to startTimeOfDay value, and then it will add repeatInterval value to it until + the endTimeOfDay is reached. If you set daysOfWeek values, then fire time will only occur during those week days period. Again, + remember this trigger will reset fire time each day with startTimeOfDay, regardless of your interval or endTimeOfDay! + + + The default values for fields if not set are: startTimeOfDay defaults to 00:00:00, the endTimeOfDay default to 23:59:59, + and daysOfWeek is default to every day. The startTime default to current time-stamp now, while endTime has not value. + + + If startTime is before startTimeOfDay, then startTimeOfDay will be used and startTime has no affect. Else if startTime is + after startTimeOfDay, then the first fire time for that day will be the next interval after the startTime. For example, if + you set startingTimeOfDay=9am, endingTimeOfDay=11am, interval=15 mins, and startTime=9:33am, then the next fire time will + be 9:45pm. Note also that if you do not set startTime value, the trigger builder will default to current time, and current time + maybe before or after the startTimeOfDay! So be aware how you set your startTime. + + + This trigger also supports "repeatCount" feature to end the trigger fire time after + a certain number of count is reached. Just as the SimpleTrigger, setting repeatCount=0 + means trigger will fire once only! Setting any positive count then the trigger will repeat + count + 1 times. Unlike SimpleTrigger, the default value of repeatCount of this trigger + is set to REPEAT_INDEFINITELY instead of 0 though. + + + + + 2.0 + James House + Zemian Deng saltnlight5@gmail.com + Nuno Maia (.NET) + + + + A that is used to fire a + based upon daily repeating time intervals. + + + The trigger will fire every N (see ) seconds, minutes or hours + (see during a given time window on specified days of the week. + + For example#1, a trigger can be set to fire every 72 minutes between 8:00 and 11:00 everyday. It's fire times + be 8:00, 9:12, 10:24, then next day would repeat: 8:00, 9:12, 10:24 again. + + For example#2, a trigger can be set to fire every 23 minutes between 9:20 and 16:47 Monday through Friday. + + On each day, the starting fire time is reset to startTimeOfDay value, and then it will add repeatInterval value to it until + the endTimeOfDay is reached. If you set daysOfWeek values, then fire time will only occur during those week days period. + + The default values for fields if not set are: startTimeOfDay defaults to 00:00:00, the endTimeOfDay default to 23:59:59, + and daysOfWeek is default to every day. The startTime default to current time-stamp now, while endTime has not value. + + If startTime is before startTimeOfDay, then it has no affect. Else if startTime after startTimeOfDay, then the first fire time + for that day will be normal startTimeOfDay incremental values after startTime value. Same reversal logic is applied to endTime + with endTimeOfDay. + + + + James House + Zemian Deng saltnlight5@gmail.com + Nuno Maia (.NET) + + + + + + + + + Get the the number of times for interval this trigger should repeat, + after which it will be automatically deleted. + + + + + Get the interval unit - the time unit on with the interval applies. + The only intervals that are valid for this type of trigger are , + , and + + + + + Get the the time interval that will be added to the 's + fire time (in the set repeat interval unit) in order to calculate the time of the + next trigger repeat. + + + + + The time of day to start firing at the given interval. + + + + + The time of day to complete firing at the given interval. + + + + + The days of the week upon which to fire. + + + A Set containing the integers representing the days of the week, per the values 0-6 as defined by + DayOfWees.Sunday - DayOfWeek.Saturday. + + + + + Get the number of times the has already fired. + + + + + Used to indicate the 'repeat count' of the trigger is indefinite. Or in + other words, the trigger should repeat continually until the trigger's + ending timestamp. + + + + + Create a with no settings. + + + + + Create a that will occur immediately, and + repeat at the the given interval. + + + The that the repeating should begin occurring. + The that the repeating should stop occurring. + The repeat interval unit. The only intervals that are valid for this type of trigger are + , , and . + + + + + Create a that will occur immediately, and + repeat at the the given interval. + + + + The that the repeating should begin occurring. + The that the repeating should stop occurring. + The repeat interval unit. The only intervals that are valid for this type of trigger are + , , and . + + + + + Create a that will occur at the given time, + and repeat at the the given interval until the given end time. + + + A set to the time for the to fire. + A set to the time for the to quit repeat firing. + The that the repeating should begin occurring. + The that the repeating should stop occurring. + The repeat interval unit. The only intervals that are valid for this type of trigger are + , , and . + The number of milliseconds to pause between the repeat firing. + + + + Create a that will occur at the given time, + and repeat at the the given interval until the given end time. + + + + A set to the time for the to fire. + A set to the time for the to quit repeat firing. + The that the repeating should begin occurring. + The that the repeating should stop occurring. + The repeat interval unit. The only intervals that are valid for this type of trigger are + , , and . + The number of milliseconds to pause between the repeat firing. + + + + Create a that will occur at the given time, + fire the identified job and repeat at the the given + interval until the given end time. + + + + + + A set to the time for the to fire. + A set to the time for the to quit repeat firing. + The that the repeating should begin occurring. + The that the repeating should stop occurring. + The repeat interval unit. The only intervals that are valid for this type of trigger are + , , and . + The number of milliseconds to pause between the repeat firing. + + + + Updates the 's state based on the + MisfireInstruction.XXX that was selected when the + was created. + + + If the misfire instruction is set to , + then the following scheme will be used: +
    +
  • The instruction will be interpreted as
  • +
+
+
+ + + Called when the scheduler has decided to 'fire' + the trigger (execute the associated job), in order to + give the trigger a chance to update itself for its next + triggering (if any). + + + + + + + + + + + + + + + This method should not be used by the Quartz client. + + + + Called by the scheduler at the time a is first + added to the scheduler, in order to have the + compute its first fire time, based on any associated calendar. + + + + After this method has been called, + should return a valid answer. + + + + The first time at which the will be fired + by the scheduler, which is also the same value + will return (until after the first firing of the ). + + + + + Returns the next time at which the is scheduled to fire. If + the trigger will not fire again, will be returned. Note that + the time returned can possibly be in the past, if the time that was computed + for the trigger to next fire has already arrived, but the scheduler has not yet + been able to fire the trigger (which would likely be due to lack of resources + e.g. threads). + + + The value returned is not guaranteed to be valid until after the + has been added to the scheduler. + + + + + + Returns the previous time at which the fired. + If the trigger has not yet fired, will be returned. + + + + + Set the next time at which the should fire. + + + This method should not be invoked by client code. + + + + + + Set the previous time at which the fired. + + + This method should not be invoked by client code. + + + + + + Returns the next time at which the will + fire, after the given time. If the trigger will not fire after the given + time, will be returned. + + + + + + + Given fireTime time, we need to advance/calculate and return a time of next available week day. + + given next fireTime. + flag to whether to advance day without check existing week day. This scenario + can happen when a caller determine fireTime has passed the endTimeOfDay that fireTime should move to next day anyway. + + a next day fireTime. + + + + Determines whether or not the will occur + again. + + + + + + Validates whether the properties of the are + valid for submission into a . + + + + + Get a that is configured to produce a + schedule identical to this trigger's schedule. + + + + + + + The time at which the should occur. + + + + + the time at which the should quit repeating. + + + + + + Get the the number of times for interval this trigger should repeat, + after which it will be automatically deleted. + + + + + the interval unit - the time unit on with the interval applies. + + + The repeat interval unit. The only intervals that are valid for this type of trigger are + , , and . + + + + + the the time interval that will be added to the 's + fire time (in the set repeat interval unit) in order to calculate the time of the + next trigger repeat. + + + + + the number of times the has already + fired. + + + + + Returns the final time at which the will + fire, if there is no end time set, null will be returned. + + Note that the return time may be in the past. + + + + + The days of the week upon which to fire. + + + A Set containing the integers representing the days of the week, per the values 0-6 as defined by + DayOfWees.Sunday - DayOfWeek.Saturday. + + + + + The time of day to start firing at the given interval. + + + + + The time of day to complete firing at the given interval. + + + + + This trigger has no additional properties besides what's defined in this class. + + + + + + Tells whether this Trigger instance can handle events + in millisecond precision. + + + + + A concrete that is used to fire a + at a given moment in time, and optionally repeated at a specified interval. + + + + James House + Contributions by Lieven Govaerts of Ebitec Nv, Belgium. + Marko Lahma (.NET) + + + + A that is used to fire a + at a given moment in time, and optionally repeated at a specified interval. + + + + James House + Contributions by Lieven Govaerts of Ebitec Nv, Belgium. + Marko Lahma (.NET) + + + + Get or set thhe number of times the should + repeat, after which it will be automatically deleted. + + + + + + Get or set the the time interval at which the should repeat. + + + + + Get or set the number of times the has already + fired. + + + + + Used to indicate the 'repeat count' of the trigger is indefinite. Or in + other words, the trigger should repeat continually until the trigger's + ending timestamp. + + + + + Create a with no settings. + + + + + Create a that will occur immediately, and + not repeat. + + + + + Create a that will occur immediately, and + not repeat. + + + + + Create a that will occur immediately, and + repeat at the the given interval the given number of times. + + + + + Create a that will occur immediately, and + repeat at the the given interval the given number of times. + + + + + Create a that will occur at the given time, + and not repeat. + + + + + Create a that will occur at the given time, + and not repeat. + + + + + Create a that will occur at the given time, + and repeat at the the given interval the given number of times, or until + the given end time. + + The name. + A UTC set to the time for the to fire. + A UTC set to the time for the + to quit repeat firing. + The number of times for the to repeat + firing, use for unlimited times. + The time span to pause between the repeat firing. + + + + Create a that will occur at the given time, + and repeat at the the given interval the given number of times, or until + the given end time. + + The name. + The group. + A UTC set to the time for the to fire. + A UTC set to the time for the + to quit repeat firing. + The number of times for the to repeat + firing, use for unlimited times. + The time span to pause between the repeat firing. + + + + Create a that will occur at the given time, + fire the identified and repeat at the the given + interval the given number of times, or until the given end time. + + The name. + The group. + Name of the job. + The job group. + A set to the time for the + to fire. + A set to the time for the + to quit repeat firing. + The number of times for the to repeat + firing, use RepeatIndefinitely for unlimited times. + The time span to pause between the repeat firing. + + + + Validates the misfire instruction. + + The misfire instruction. + + + + + Updates the 's state based on the + MisfireInstruction value that was selected when the + was created. + + + If MisfireSmartPolicyEnabled is set to true, + then the following scheme will be used:
+
    +
  • If the Repeat Count is 0, then the instruction will + be interpreted as .
  • +
  • If the Repeat Count is , then + the instruction will be interpreted as . + WARNING: using MisfirePolicy.SimpleTrigger.RescheduleNowWithRemainingRepeatCount + with a trigger that has a non-null end-time may cause the trigger to + never fire again if the end-time arrived during the misfire time span. +
  • +
  • If the Repeat Count is > 0, then the instruction + will be interpreted as . +
  • +
+
+
+ + + Called when the has decided to 'fire' + the trigger (Execute the associated ), in order to + give the a chance to update itself for its next + triggering (if any). + + + + + + Updates the instance with new calendar. + + The calendar. + The misfire threshold. + + + + Called by the scheduler at the time a is first + added to the scheduler, in order to have the + compute its first fire time, based on any associated calendar. + + After this method has been called, + should return a valid answer. + + + + The first time at which the will be fired + by the scheduler, which is also the same value + will return (until after the first firing of the ). + + + + + Returns the next time at which the will + fire. If the trigger will not fire again, will be + returned. The value returned is not guaranteed to be valid until after + the has been added to the scheduler. + + + + + Returns the previous time at which the fired. + If the trigger has not yet fired, will be + returned. + + + + + Returns the next UTC time at which the will + fire, after the given UTC time. If the trigger will not fire after the given + time, will be returned. + + + + + Returns the last UTC time at which the will + fire, before the given time. If the trigger will not fire before the + given time, will be returned. + + + + + Computes the number of times fired between the two UTC date times. + + The UTC start date and time. + The UTC end date and time. + + + + + Determines whether or not the will occur + again. + + + + + Validates whether the properties of the are + valid for submission into a . + + + + + Get or set thhe number of times the should + repeat, after which it will be automatically deleted. + + + + + + Get or set the the time interval at which the should repeat. + + + + + Get or set the number of times the has already + fired. + + + + + Returns the final UTC time at which the will + fire, if repeatCount is RepeatIndefinitely, null will be returned. + + Note that the return time may be in the past. + + + + + + Tells whether this Trigger instance can handle events + in millisecond precision. + + + + + + Schedules work on a newly spawned thread. This is the default Quartz behavior. + + matt.accola + + + + Allows different strategies for scheduling threads. The + method is required to be called before the first call to + . The Thread containing the work to be performed is + passed to execute and the work is scheduled by the underlying implementation. + + matt.accola + + + + Submit a task for execution. + + Thread to execute. + + + + Initialize any state prior to calling . + + + + + A singleton implementation of . + + + Here are some examples of using this class: + + To create a scheduler that does not write anything to the database (is not + persistent), you can call : + + + DirectSchedulerFactory.Instance.CreateVolatileScheduler(10); // 10 threads + // don't forget to start the scheduler: + DirectSchedulerFactory.Instance.GetScheduler().Start(); + + + Several create methods are provided for convenience. All create methods + eventually end up calling the create method with all the parameters: + + + public void CreateScheduler(string schedulerName, string schedulerInstanceId, IThreadPool threadPool, IJobStore jobStore) + + + Here is an example of using this method: + + + // create the thread pool + SimpleThreadPool threadPool = new SimpleThreadPool(maxThreads, ThreadPriority.Normal); + threadPool.Initialize(); + // create the job store + JobStore jobStore = new RAMJobStore(); + + DirectSchedulerFactory.Instance.CreateScheduler("My Quartz Scheduler", "My Instance", threadPool, jobStore); + // don't forget to start the scheduler: + DirectSchedulerFactory.Instance.GetScheduler("My Quartz Scheduler", "My Instance").Start(); + + > + Mohammad Rezaei + James House + Marko Lahma (.NET) + + + + + + Provides a mechanism for obtaining client-usable handles to + instances. + + + + James House + Marko Lahma (.NET) + + + + Returns a client-usable handle to a . + + + + + Returns a handle to the Scheduler with the given name, if it exists. + + + + + Returns handles to all known Schedulers (made by any SchedulerFactory + within this app domain.). + + + + + Initializes a new instance of the class. + + + + + Creates an in memory job store () + The thread priority is set to Thread.NORM_PRIORITY + + The number of threads in the thread pool + + + + Creates a proxy to a remote scheduler. This scheduler can be retrieved + via . + + SchedulerException + + + + Same as , + with the addition of specifying the scheduler name and instance ID. This + scheduler can only be retrieved via . + + The name for the scheduler. + The instance ID for the scheduler. + + SchedulerException + + + + Creates a scheduler using the specified thread pool and job store. This + scheduler can be retrieved via DirectSchedulerFactory#GetScheduler() + + + The thread pool for executing jobs + + + The type of job store + + SchedulerException + if initialization failed + + + + + Same as DirectSchedulerFactory#createScheduler(ThreadPool threadPool, JobStore jobStore), + with the addition of specifying the scheduler name and instance ID. This + scheduler can only be retrieved via DirectSchedulerFactory#getScheduler(String) + + The name for the scheduler. + The instance ID for the scheduler. + The thread pool for executing jobs + The type of job store + + + + Creates a scheduler using the specified thread pool and job store and + binds it for remote access. + + The name for the scheduler. + The instance ID for the scheduler. + The thread pool for executing jobs + The type of job store + The idle wait time. You can specify "-1" for + the default value, which is currently 30000 ms. + The db failure retry interval. + + + + Creates a scheduler using the specified thread pool and job store and + binds it for remote access. + + The name for the scheduler. + The instance ID for the scheduler. + The thread pool for executing jobs + The type of job store + + The idle wait time. You can specify TimeSpan.Zero for + the default value, which is currently 30000 ms. + The db failure retry interval. + + + + Creates a scheduler using the specified thread pool and job store and + binds it for remote access. + + The name for the scheduler. + The instance ID for the scheduler. + The thread pool for executing jobs + Thread executor. + The type of job store + + The idle wait time. You can specify TimeSpan.Zero for + the default value, which is currently 30000 ms. + The db failure retry interval. + + + + Creates a scheduler using the specified thread pool and job store and + binds it for remote access. + + The name for the scheduler. + The instance ID for the scheduler. + The thread pool for executing jobs + Thread executor. + The type of job store + + The idle wait time. You can specify TimeSpan.Zero for + the default value, which is currently 30000 ms. + The db failure retry interval. + The maximum batch size of triggers, when acquiring them + The time window for which it is allowed to "pre-acquire" triggers to fire + + + + Returns a handle to the Scheduler produced by this factory. + + you must call createRemoteScheduler or createScheduler methods before + calling getScheduler() + + + + SchedulerException + + + + Returns a handle to the Scheduler with the given name, if it exists. + + + + + Gets the log. + + The log. + + + + Gets the instance. + + The instance. + + + + Returns a handle to all known Schedulers (made by any + StdSchedulerFactory instance.). + + + + + + Conveys the detail properties of a given job instance. + + + Quartz does not store an actual instance of a type, but + instead allows you to define an instance of one, through the use of a . + + s have a name and group associated with them, which + should uniquely identify them within a single . + + + s are the 'mechanism' by which s + are scheduled. Many s can point to the same , + but a single can only point to one . + + + + + + + + James House + Marko Lahma (.NET) + + + + Conveys the detail properties of a given job instance. + JobDetails are to be created/defined with . + + + Quartz does not store an actual instance of a type, but + instead allows you to define an instance of one, through the use of a . + + s have a name and group associated with them, which + should uniquely identify them within a single . + + + s are the 'mechanism' by which s + are scheduled. Many s can point to the same , + but a single can only point to one . + + + + + + + + James House + Marko Lahma (.NET) + + + + Get a that is configured to produce a + identical to this one. + + + + + The key that identifies this jobs uniquely. + + + + + Get or set the description given to the instance by its + creator (if any). + + + + + Get or sets the instance of that will be executed. + + + + + Get or set the that is associated with the . + + + + + Whether or not the should remain stored after it is + orphaned (no s point to it). + + + If not explicitly set, the default value is . + + + if the Job should remain persisted after being orphaned. + + + + + Whether the associated Job class carries the . + + + + + + Whether the associated Job class carries the . + + + + + + Set whether or not the the should re-Execute + the if a 'recovery' or 'fail-over' situation is + encountered. + + + If not explicitly set, the default value is . + + + + + + Create a with no specified name or group, and + the default settings of all the other properties. + + Note that the , and + properties must be set before the job can be + placed into a . + + + + + + Create a with the given name, default group, and + the default settings of all the other properties. + If , Scheduler.DefaultGroup will be used. + + + If name is null or empty, or the group is an empty string. + + + + + Create a with the given name, and group, and + the default settings of all the other properties. + If , Scheduler.DefaultGroup will be used. + + + If name is null or empty, or the group is an empty string. + + + + + Create a with the given name, and group, and + the given settings of all the other properties. + + The name. + if , Scheduler.DefaultGroup will be used. + Type of the job. + if set to true, job will be durable. + if set to true, job will request recovery. + + ArgumentException if name is null or empty, or the group is an empty string. + + + + + Validates whether the properties of the are + valid for submission into a . + + + + + Return a simple string representation of this object. + + + + + Creates a new object that is a copy of the current instance. + + + A new object that is a copy of this instance. + + + + + Determines whether the specified detail is equal to this instance. + + The detail to examine. + + true if the specified detail is equal; otherwise, false. + + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + if the specified is equal to the + current ; otherwise, . + + + + + Checks equality between given job detail and this instance. + + The detail to compare this instance with. + + + + + Serves as a hash function for a particular type, suitable + for use in hashing algorithms and data structures like a hash table. + + + A hash code for the current . + + + + + Get or sets the name of this . + + + if name is null or empty. + + + + + Get or sets the group of this . + If , will be used. + + + If the group is an empty string. + + + + + Returns the 'full name' of the in the format + "group.name". + + + + + Gets the key. + + The key. + + + + Get or set the description given to the instance by its + creator (if any). + + + May be useful for remembering/displaying the purpose of the job, though the + description has no meaning to Quartz. + + + + + Get or sets the instance of that will be executed. + + + if jobType is null or the class is not a . + + + + + Get or set the that is associated with the . + + + + + Set whether or not the the should re-Execute + the if a 'recovery' or 'fail-over' situation is + encountered. + + If not explicitly set, the default value is . + + + + + + + Whether or not the should remain stored after it is + orphaned (no s point to it). + + If not explicitly set, the default value is . + + + + if the Job should remain persisted after + being orphaned. + + + + + Whether the associated Job class carries the attribute. + + + + + Whether the associated Job class carries the attribute. + + + + + A context bundle containing handles to various environment information, that + is given to a instance as it is + executed, and to a instance after the + execution completes. + + + + The found on this object (via the + method) serves as a convenience - + it is a merge of the found on the + and the one found on the , with + the value in the latter overriding any same-named values in the former. + It is thus considered a 'best practice' that the Execute code of a Job + retrieve data from the JobDataMap found on this object + + + NOTE: Do not + expect value 'set' into this JobDataMap to somehow be set back onto a + job's own JobDataMap. + + + + s are also returned from the + + method. These are the same instances as those past into the jobs that are + currently executing within the scheduler. The exception to this is when your + application is using Quartz remotely (i.e. via remoting or WCF) - in which case you get + a clone of the s, and their references to + the and instances have been lost (a + clone of the is still available - just not a handle + to the job instance that is running). + + + + + + + + James House + Marko Lahma (.NET) + + + + A context bundle containing handles to various environment information, that + is given to a instance as it is + executed, and to a instance after the + execution completes. + + + + + Put the specified value into the context's data map with the given key. + Possibly useful for sharing data between listeners and jobs. + + NOTE: this data is volatile - it is lost after the job execution + completes, and all TriggerListeners and JobListeners have been + notified. + + + + + + + + + + Get the value with the given key from the context's data map. + + + + + + + Get a handle to the instance that fired the + . + + + + + Get a handle to the instance that fired the + . + + + + + Get a handle to the referenced by the + instance that fired the . + + + + + If the is being re-executed because of a 'recovery' + situation, this method will return . + + + + + Gets the refire count. + + The refire count. + + + + Get the convenience of this execution context. + + + + The found on this object serves as a convenience - + it is a merge of the found on the + and the one found on the , with + the value in the latter overriding any same-named values in the former. + It is thus considered a 'best practice' that the Execute code of a Job + retrieve data from the JobDataMap found on this object. + + + NOTE: Do not expect value 'set' into this JobDataMap to somehow be + set back onto a job's own JobDataMap. + + + Attempts to change the contents of this map typically result in an + illegal state. + + + + + + Get the associated with the . + + + + + Get the instance of the that was created for this + execution. + + Note: The Job instance is not available through remote scheduler + interfaces. + + + + + + The actual time the trigger fired. For instance the scheduled time may + have been 10:00:00 but the actual fire time may have been 10:00:03 if + the scheduler was too busy. + + Returns the fireTimeUtc. + + + + + The scheduled time the trigger fired for. For instance the scheduled + time may have been 10:00:00 but the actual fire time may have been + 10:00:03 if the scheduler was too busy. + + Returns the scheduledFireTimeUtc. + + + + + Gets the previous fire time. + + The previous fire time. + + + + Gets the next fire time. + + The next fire time. + + + + Get the unique Id that identifies this particular firing instance of the + trigger that triggered this job execution. It is unique to this + JobExecutionContext instance as well. + + the unique fire instance id + + + + + Returns the result (if any) that the set before its + execution completed (the type of object set as the result is entirely up + to the particular job). + + + + The result itself is meaningless to Quartz, but may be informative + to s or + s that are watching the job's + execution. + + + Set the result (if any) of the 's execution (the type of + object set as the result is entirely up to the particular job). + + + The result itself is meaningless to Quartz, but may be informative + to s or + s that are watching the job's + execution. + + + + + + The amount of time the job ran for. The returned + value will be until the job has actually completed (or thrown an + exception), and is therefore generally only useful to + s and s. + + + + + Create a JobExcecutionContext with the given context data. + + + + + Increments the refire count. + + + + + Returns a that represents the current . + + + A that represents the current . + + + + + Put the specified value into the context's data map with the given key. + Possibly useful for sharing data between listeners and jobs. + + NOTE: this data is volatile - it is lost after the job execution + completes, and all TriggerListeners and JobListeners have been + notified. + + + + + + + + + + Get the value with the given key from the context's data map. + + + + + + + Get a handle to the instance that fired the + . + + + + + Get a handle to the instance that fired the + . + + + + + Get a handle to the referenced by the + instance that fired the . + + + + + If the is being re-executed because of a 'recovery' + situation, this method will return . + + + + + Gets the refire count. + + The refire count. + + + + Get the convenience of this execution context. + + + + The found on this object serves as a convenience - + it is a merge of the found on the + and the one found on the , with + the value in the latter overriding any same-named values in the former. + It is thus considered a 'best practice' that the Execute code of a Job + retrieve data from the JobDataMap found on this object. + + + NOTE: Do not expect value 'set' into this JobDataMap to somehow be + set back onto a job's own JobDataMap. + + + Attempts to change the contents of this map typically result in an + illegal state. + + + + + + Get the associated with the . + + + + + Get the instance of the that was created for this + execution. + + Note: The Job instance is not available through remote scheduler + interfaces. + + + + + + The actual time the trigger fired. For instance the scheduled time may + have been 10:00:00 but the actual fire time may have been 10:00:03 if + the scheduler was too busy. + + Returns the fireTimeUtc. + + + + + The scheduled time the trigger fired for. For instance the scheduled + time may have been 10:00:00 but the actual fire time may have been + 10:00:03 if the scheduler was too busy. + + Returns the scheduledFireTimeUtc. + + + + + Gets the previous fire time. + + The previous fire time. + + + + Gets the next fire time. + + The next fire time. + + + + Returns the result (if any) that the set before its + execution completed (the type of object set as the result is entirely up + to the particular job). + + + + The result itself is meaningless to Quartz, but may be informative + to s or + s that are watching the job's + execution. + + + Set the result (if any) of the 's execution (the type of + object set as the result is entirely up to the particular job). + + + The result itself is meaningless to Quartz, but may be informative + to s or + s that are watching the job's + execution. + + + + + + The amount of time the job ran for. The returned + value will be until the job has actually completed (or thrown an + exception), and is therefore generally only useful to + s and s. + + + + + Returns the fire instace id. + + + + + An implementation of the interface that remotely + proxies all method calls to the equivalent call on a given + instance, via remoting or similar technology. + + + + James House + Marko Lahma (.NET) + + + + This is the main interface of a Quartz Scheduler. + + + + A maintains a registry of + s and s. Once + registered, the is responsible for executing + s when their associated s + fire (when their scheduled time arrives). + + + instances are produced by a + . A scheduler that has already been + created/initialized can be found and used through the same factory that + produced it. After a has been created, it is in + "stand-by" mode, and must have its method + called before it will fire any s. + + + s are to be created by the 'client program', by + defining a class that implements the interface. + objects are then created (also by the client) to + define a individual instances of the . + instances can then be registered with the + via the %IScheduler.ScheduleJob(JobDetail, + Trigger)% or %IScheduler.AddJob(JobDetail, bool)% method. + + + s can then be defined to fire individual + instances based on given schedules. + s are most useful for one-time firings, or + firing at an exact moment in time, with N repeats with a given delay between + them. s allow scheduling based on time of day, + day of week, day of month, and month of year. + + + s and s have a name and + group associated with them, which should uniquely identify them within a single + . The 'group' feature may be useful for creating + logical groupings or categorizations of s and + s. If you don't have need for assigning a group to a + given s of s, then you can use + the constant defined on + this interface. + + + Stored s can also be 'manually' triggered through the + use of the %IScheduler.TriggerJob(string, string)% function. + + + Client programs may also be interested in the 'listener' interfaces that are + available from Quartz. The interface provides + notifications of executions. The + interface provides notifications of + firings. The + interface provides notifications of events and + errors. Listeners can be associated with local schedulers through the + interface. + + + The setup/configuration of a instance is very + customizable. Please consult the documentation distributed with Quartz. + + + + + + + + + Marko Lahma (.NET) + + + + returns true if the given JobGroup + is paused + + + + + + + returns true if the given TriggerGroup + is paused + + + + + + + Get a object describing the settings + and capabilities of the scheduler instance. + + + Note that the data returned is an 'instantaneous' snap-shot, and that as + soon as it's returned, the meta data values may be different. + + + + + Return a list of objects that + represent all currently executing Jobs in this Scheduler instance. + + + + This method is not cluster aware. That is, it will only return Jobs + currently executing in this Scheduler instance, not across the entire + cluster. + + + Note that the list returned is an 'instantaneous' snap-shot, and that as + soon as it's returned, the true list of executing jobs may be different. + Also please read the doc associated with - + especially if you're using remoting. + + + + + + + Get the names of all known groups. + + + + + Get the names of all known groups. + + + + + Get the names of all groups that are paused. + + + + + Starts the 's threads that fire s. + When a scheduler is first created it is in "stand-by" mode, and will not + fire triggers. The scheduler can also be put into stand-by mode by + calling the method. + + + The misfire/recovery process will be started, if it is the initial call + to this method on this scheduler instance. + + + + + + + + Calls after the indicated delay. + (This call does not block). This can be useful within applications that + have initializers that create the scheduler immediately, before the + resources needed by the executing jobs have been fully initialized. + + + + + + + + Temporarily halts the 's firing of s. + + + + When is called (to bring the scheduler out of + stand-by mode), trigger misfire instructions will NOT be applied + during the execution of the method - any misfires + will be detected immediately afterward (by the 's + normal process). + + + The scheduler is not destroyed, and can be re-started at any time. + + + + + + + + Halts the 's firing of s, + and cleans up all resources associated with the Scheduler. Equivalent to + . + + + The scheduler cannot be re-started. + + + + + + Halts the 's firing of s, + and cleans up all resources associated with the Scheduler. + + + The scheduler cannot be re-started. + + + if the scheduler will not allow this method + to return until all currently executing jobs have completed. + + + + + + Add the given to the + Scheduler, and associate the given with + it. + + + If the given Trigger does not reference any , then it + will be set to reference the Job passed with it into this method. + + + + + Schedule the given with the + identified by the 's settings. + + + + + Schedule all of the given jobs with the related set of triggers. + + + If any of the given jobs or triggers already exist (or more + specifically, if the keys are not unique) and the replace + parameter is not set to true then an exception will be thrown. + + + + + Remove the indicated from the scheduler. + If the related job does not have any other triggers, and the job is + not durable, then the job will also be deleted. + + + + + Remove all of the indicated s from the scheduler. + + + If the related job does not have any other triggers, and the job is + not durable, then the job will also be deleted. + Note that while this bulk operation is likely more efficient than + invoking several + times, it may have the adverse affect of holding data locks for a + single long duration of time (rather than lots of small durations + of time). + + + + + Remove (delete) the with the + given key, and store the new given one - which must be associated + with the same job (the new trigger must have the job name & group specified) + - however, the new trigger need not have the same name as the old trigger. + + The to be replaced. + + The new to be stored. + + + if a with the given + name and group was not found and removed from the store (and the + new trigger is therefore not stored), otherwise + the first fire time of the newly scheduled trigger. + + + + + Add the given to the Scheduler - with no associated + . The will be 'dormant' until + it is scheduled with a , or + is called for it. + + + The must by definition be 'durable', if it is not, + SchedulerException will be thrown. + + + + + Delete the identified from the Scheduler - and any + associated s. + + true if the Job was found and deleted. + + + + Delete the identified jobs from the Scheduler - and any + associated s. + + + Note that while this bulk operation is likely more efficient than + invoking several + times, it may have the adverse affect of holding data locks for a + single long duration of time (rather than lots of small durations + of time). + + + true if all of the Jobs were found and deleted, false if + one or more were not deleted. + + + + + Trigger the identified + (Execute it now). + + + + + Trigger the identified (Execute it now). + + + the (possibly ) JobDataMap to be + associated with the trigger that fires the job immediately. + + + The of the to be executed. + + + + + Pause the with the given + key - by pausing all of its current s. + + + + + Pause all of the s in the + matching groups - by pausing all of their s. + + + + The Scheduler will "remember" that the groups are paused, and impose the + pause on any new jobs that are added to any of those groups until it is resumed. + + NOTE: There is a limitation that only exactly matched groups + can be remembered as paused. For example, if there are pre-existing + job in groups "aaa" and "bbb" and a matcher is given to pause + groups that start with "a" then the group "aaa" will be remembered + as paused and any subsequently added jobs in group "aaa" will be paused, + however if a job is added to group "axx" it will not be paused, + as "axx" wasn't known at the time the "group starts with a" matcher + was applied. HOWEVER, if there are pre-existing groups "aaa" and + "bbb" and a matcher is given to pause the group "axx" (with a + group equals matcher) then no jobs will be paused, but it will be + remembered that group "axx" is paused and later when a job is added + in that group, it will become paused. + + + + + + Pause the with the given key. + + + + + Pause all of the s in the groups matching. + + + + The Scheduler will "remember" all the groups paused, and impose the + pause on any new triggers that are added to any of those groups until it is resumed. + + NOTE: There is a limitation that only exactly matched groups + can be remembered as paused. For example, if there are pre-existing + triggers in groups "aaa" and "bbb" and a matcher is given to pause + groups that start with "a" then the group "aaa" will be remembered as + paused and any subsequently added triggers in that group be paused, + however if a trigger is added to group "axx" it will not be paused, + as "axx" wasn't known at the time the "group starts with a" matcher + was applied. HOWEVER, if there are pre-existing groups "aaa" and + "bbb" and a matcher is given to pause the group "axx" (with a + group equals matcher) then no triggers will be paused, but it will be + remembered that group "axx" is paused and later when a trigger is added + in that group, it will become paused. + + + + + + Resume (un-pause) the with + the given key. + + + If any of the 's s missed one + or more fire-times, then the 's misfire + instruction will be applied. + + + + + Resume (un-pause) all of the s + in matching groups. + + + If any of the s had s that + missed one or more fire-times, then the 's + misfire instruction will be applied. + + + + + + Resume (un-pause) the with the given + key. + + + If the missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + Resume (un-pause) all of the s in matching groups. + + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Pause all triggers - similar to calling + on every group, however, after using this method + must be called to clear the scheduler's state of 'remembering' that all + new triggers will be paused as they are added. + + + When is called (to un-pause), trigger misfire + instructions WILL be applied. + + + + + + + + Resume (un-pause) all triggers - similar to calling + on every group. + + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Get the keys of all the s in the matching groups. + + + + + Get all s that are associated with the + identified . + + + The returned Trigger objects will be snap-shots of the actual stored + triggers. If you wish to modify a trigger, you must re-store the + trigger afterward (e.g. see ). + + + + + Get the names of all the s in the given + groups. + + + + + Get the for the + instance with the given key . + + + The returned JobDetail object will be a snap-shot of the actual stored + JobDetail. If you wish to modify the JobDetail, you must re-store the + JobDetail afterward (e.g. see ). + + + + + Get the instance with the given key. + + + The returned Trigger object will be a snap-shot of the actual stored + trigger. If you wish to modify the trigger, you must re-store the + trigger afterward (e.g. see ). + + + + + Get the current state of the identified . + + + + + + + + + + + Add (register) the given to the Scheduler. + + Name of the calendar. + The calendar. + if set to true [replace]. + whether or not to update existing triggers that + referenced the already existing calendar so that they are 'correct' + based on the new trigger. + + + + Delete the identified from the Scheduler. + + Name of the calendar. + + true if the Calendar was found and deleted. + + + + + Get the instance with the given name. + + + + + Get the names of all registered . + + + + + Request the interruption, within this Scheduler instance, of all + currently executing instances of the identified , which + must be an implementor of the interface. + + + + If more than one instance of the identified job is currently executing, + the method will be called on + each instance. However, there is a limitation that in the case that + on one instances throws an exception, all + remaining instances (that have not yet been interrupted) will not have + their method called. + + + + If you wish to interrupt a specific instance of a job (when more than + one is executing) you can do so by calling + to obtain a handle + to the job instance, and then invoke on it + yourself. + + + This method is not cluster aware. That is, it will only interrupt + instances of the identified InterruptableJob currently executing in this + Scheduler instance, not across the entire cluster. + + + + true is at least one instance of the identified job was found and interrupted. + + + + + + + Request the interruption, within this Scheduler instance, of the + identified executing job instance, which + must be an implementor of the interface. + + + This method is not cluster aware. That is, it will only interrupt + instances of the identified InterruptableJob currently executing in this + Scheduler instance, not across the entire cluster. + + + + + + + the unique identifier of the job instance to be interrupted (see + + true if the identified job instance was found and interrupted. + + + + Determine whether a with the given identifier already + exists within the scheduler. + + the identifier to check for + true if a Job exists with the given identifier + + + + Determine whether a with the given identifier already + exists within the scheduler. + + the identifier to check for + true if a Trigger exists with the given identifier + + + + Clears (deletes!) all scheduling data - all s, s + s. + + + + + Returns the name of the . + + + + + Returns the instance Id of the . + + + + + Returns the of the . + + + + + Reports whether the is in stand-by mode. + + + + + + + Reports whether the has been Shutdown. + + + + + Set the that will be responsible for producing + instances of classes. + + + JobFactories may be of use to those wishing to have their application + produce instances via some special mechanism, such as to + give the opportunity for dependency injection. + + + + + + Get a reference to the scheduler's , + through which listeners may be registered. + + the scheduler's + + + + + + + + Whether the scheduler has been started. + + + Note: This only reflects whether has ever + been called on this Scheduler, so it will return even + if the is currently in standby mode or has been + since shutdown. + + + + + + + + Construct a instance to proxy the given + RemoteableQuartzScheduler instance. + + + + + returns true if the given JobGroup + is paused + + + + + + + returns true if the given TriggerGroup + is paused + + + + + + + Get a object describiing the settings + and capabilities of the scheduler instance. + + Note that the data returned is an 'instantaneous' snap-shot, and that as + soon as it's returned, the meta data values may be different. + + + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Get the names of all groups that are paused. + + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Get the names of all registered . + + + + + + Calls the equivalent method on the 'proxied' . + + + + + Returns the name of the . + + + + + Returns the instance Id of the . + + + + + Returns the of the . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Set the that will be responsible for producing + instances of classes. + + JobFactories may be of use to those wishing to have their application + produce instances via some special mechanism, such as to + give the opertunity for dependency injection. + + + + + SchedulerException + + + + Whether the scheduler has been started. + + + + Note: This only reflects whether has ever + been called on this Scheduler, so it will return even + if the is currently in standby mode or has been + since shutdown. + + + + + + + + This utility calls methods reflectively on the given objects even though the + methods are likely on a proper interface (ThreadPool, JobStore, etc). The + motivation is to be tolerant of older implementations that have not been + updated for the changes in the interfaces (eg. LocalTaskExecutorThreadPool in + spring quartz helpers) + + teck + Marko Lahma (.NET) + + + + Holds references to Scheduler instances - ensuring uniqueness, and + preventing garbage collection, and allowing 'global' lookups. + + James House + Marko Lahma (.NET) + + + + Binds the specified sched. + + The sched. + + + + Removes the specified sched name. + + Name of the sched. + + + + + Lookups the specified sched name. + + Name of the sched. + + + + + Lookups all. + + + + + + Gets the singleton instance. + + The instance. + + + + Responsible for creating the instances of + to be used within the instance. + + James House + Marko Lahma (.NET) + + + + Initialize the factory, providing a handle to the + that should be made available within the and + the s within it. + + + + + Called by the to obtain instances of + . + + + + + An implementation of the interface that directly + proxies all method calls to the equivalent call on a given + instance. + + + + James House + Marko Lahma (.NET) + + + + returns true if the given JobGroup + is paused + + + + + + + returns true if the given TriggerGroup + is paused + + + + + + + Get a object describiing the settings + and capabilities of the scheduler instance. + + Note that the data returned is an 'instantaneous' snap-shot, and that as + soon as it's returned, the meta data values may be different. + + + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Construct a instance to proxy the given + instance. + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Get the names of all registered . + + + + + + Request the interruption, within this Scheduler instance, of all + currently executing instances of the identified , which + must be an implementor of the interface. + + + + If more than one instance of the identified job is currently executing, + the method will be called on + each instance. However, there is a limitation that in the case that + on one instances throws an exception, all + remaining instances (that have not yet been interrupted) will not have + their method called. + + + If you wish to interrupt a specific instance of a job (when more than + one is executing) you can do so by calling + to obtain a handle + to the job instance, and then invoke on it + yourself. + + + This method is not cluster aware. That is, it will only interrupt + instances of the identified InterruptableJob currently executing in this + Scheduler instance, not across the entire cluster. + + + true is at least one instance of the identified job was found and interrupted. + UnableToInterruptJobException if the job does not implement + + + + + + Returns the name of the . + + + + + Returns the instance Id of the . + + + + + Returns the of the . + + + + + Whether the scheduler has been started. + + + + Note: This only reflects whether has ever + been called on this Scheduler, so it will return even + if the is currently in standby mode or has been + since shutdown. + + + + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + + + + + An implementation of that + does all of it's work of creating a instance + based on the contents of a properties file. + + + + By default a properties are loaded from App.config's quartz section. + If that fails, then the file is loaded "quartz.properties". If file does not exist, + default configration located (as a embedded resource) in Quartz.dll is loaded. If you + wish to use a file other than these defaults, you must define the system + property 'quartz.properties' to point to the file you want. + + + See the sample properties that are distributed with Quartz for + information about the various settings available within the file. + + + Alternativly, you can explicitly Initialize the factory by calling one of + the methods before calling . + + + Instances of the specified , + , classes will be created + by name, and then any additional properties specified for them in the config + file will be set on the instance by calling an equivalent 'set' method. For + example if the properties file contains the property 'quartz.jobStore. + myProp = 10' then after the JobStore class has been instantiated, the property + 'MyProp' will be set with the value. Type conversion to primitive CLR types + (int, long, float, double, boolean, enum and string) are performed before calling + the property's setter method. + + + James House + Anthony Eden + Mohammad Rezaei + Marko Lahma (.NET) + + + + Returns a handle to the default Scheduler, creating it if it does not + yet exist. + + + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The props. + + + + Initialize the . + + + By default a properties file named "quartz.properties" is loaded from + the 'current working directory'. If that fails, then the + "quartz.properties" file located (as an embedded resource) in the Quartz.NET + assembly is loaded. If you wish to use a file other than these defaults, + you must define the system property 'quartz.properties' to point to + the file you want. + + + + + Creates a new name value collection and overrides its values + with system values (environment variables). + + The base properties to override. + A new NameValueCollection instance. + + + + Initialize the with + the contents of the given key value collection object. + + + + + + + + Needed while loadhelper is not constructed. + + + + + + + Returns a handle to the Scheduler produced by this factory. + + + If one of the methods has not be previously + called, then the default (no-arg) method + will be called by this method. + + + + + Returns a handle to the Scheduler with the given name, if it exists (if + it has already been instantiated). + + + + + + Returns a handle to all known Schedulers (made by any + StdSchedulerFactory instance.). + + + + + + Inspects a directory and compares whether any files' "last modified dates" + have changed since the last time it was inspected. If one or more files + have been updated (or created), the job invokes a "call-back" method on an + identified that can be found in the + . + + pl47ypus + James House + Marko Lahma (.NET) + + + + + The interface to be implemented by classes which represent a 'job' to be + performed. + + + Instances of this interface must have a + no-argument constructor. provides a mechanism for 'instance member data' + that may be required by some implementations of this interface. + + + + + + + + James House + Marko Lahma (.NET) + + + + Called by the when a + fires that is associated with the . + + + The implementation may wish to set a result object on the + JobExecutionContext before this method exits. The result itself + is meaningless to Quartz, but may be informative to + s or + s that are watching the job's + execution. + + The execution context. + + + key with which to specify the directory to be + monitored - an absolute path is recommended. + + + key with which to specify the + to be + notified when the directory contents change. + + + key with which to specify a + value that represents the minimum number of milliseconds that must have + passed since the file's last modified time in order to consider the file + new/altered. This is necessary because another process may still be + in the middle of writing to the file when the scan occurs, and the + file may therefore not yet be ready for processing. + If this parameter is not specified, a default value of 5000 (five seconds) will be used. + + + + This is the main entry point for job execution. The scheduler will call this method on the + job once it is triggered. + + The that + the job will use during execution. + + + + Inspects a file and compares whether it's "last modified date" has changed + since the last time it was inspected. If the file has been updated, the + job invokes a "call-back" method on an identified + that can be found in the + . + + James House + Marko Lahma (.NET) + + + + + JobDataMap key with which to specify the name of the file to monitor. + + + + + JobDataMap key with which to specify the + to be notified when the file contents change. + + + + + key with which to specify a long + value that represents the minimum number of milliseconds that must have + past since the file's last modified time in order to consider the file + new/altered. This is necessary because another process may still be + in the middle of writing to the file when the scan occurs, and the + file may therefore not yet be ready for processing. + + If this parameter is not specified, a default value of + 5000 (five seconds) will be used. + + + + + Initializes a new instance of the class. + + + + + Called by the when a + fires that is associated with the . + + The implementation may wish to set a result object on the + JobExecutionContext before this method exits. The result itself + is meaningless to Quartz, but may be informative to + s or + s that are watching the job's + execution. + + + The execution context. + + + + + + Gets the last modified date. + + Name of the file. + + + + + Gets the log. + + The log. + + + Interface for objects wishing to receive a 'call-back' from a + Instances should be stored in the such that the + can find it. + James House + Marko Lahma (.NET) + + + An array of objects that were updated/added + since the last scan of the directory + + + + Interface for objects wishing to receive a 'call-back' from a + . + + James House + Marko Lahma (.NET) + + + + + Ãnforms that certain file has been updated. + + Name of the file. + + + + Built in job for executing native executables in a separate process. + + + + JobDetail job = new JobDetail("dumbJob", null, typeof(Quartz.Jobs.NativeJob)); + job.JobDataMap.Put(Quartz.Jobs.NativeJob.PropertyCommand, "echo \"hi\" >> foobar.txt"); + Trigger trigger = TriggerUtils.MakeSecondlyTrigger(5); + trigger.Name = "dumbTrigger"; + sched.ScheduleJob(job, trigger); + + If PropertyWaitForProcess is true, then the integer exit value of the process + will be saved as the job execution result in the JobExecutionContext. + + Matthew Payne + James House + Steinar Overbeck Cook + Marko Lahma (.NET) + + + + Required parameter that specifies the name of the command (executable) + to be ran. + + + + + Optional parameter that specifies the parameters to be passed to the + executed command. + + + + + Optional parameter (value should be 'true' or 'false') that specifies + whether the job should wait for the execution of the native process to + complete before it completes. + + Defaults to . + + + + + Optional parameter (value should be 'true' or 'false') that specifies + whether the spawned process's stdout and stderr streams should be + consumed. If the process creates output, it is possible that it might + 'hang' if the streams are not consumed. + + Defaults to . + + + + + Optional parameter that specifies the workling directory to be used by + the executed command. + + + + + Initializes a new instance of the class. + + + + + Called by the when a + fires that is associated with the . + + The implementation may wish to set a result object on the + JobExecutionContext before this method exits. The result itself + is meaningless to Quartz, but may be informative to + s or + s that are watching the job's + execution. + + + + + + + Gets the log. + + The log. + + + + Consumes data from the given input stream until EOF and prints the data to stdout + + cooste + James House + + + + Initializes a new instance of the class. + + The enclosing instance. + The input stream. + The type. + + + + Runs this object as a separate thread, printing the contents of the input stream + supplied during instantiation, to either Console. or stderr + + + + + An implementation of Job, that does absolutely nothing - useful for system + which only wish to use s + and s, rather than writing + Jobs that perform work. + + James House + Marko Lahma (.NET) + + + + Do nothing. + + + + + A Job which sends an e-mail with the configured content to the configured + recipient. + + James House + Marko Lahma (.NET) + + + The host name of the smtp server. REQUIRED. + + + The e-mail address to send the mail to. REQUIRED. + + + The e-mail address to cc the mail to. Optional. + + + The e-mail address to claim the mail is from. REQUIRED. + + + The e-mail address the message should say to reply to. Optional. + + + The subject to place on the e-mail. REQUIRED. + + + The e-mail message body. REQUIRED. + + + + Executes the job. + + The job execution context. + + + + Holds a List of references to JobListener instances and broadcasts all + events to them (in order). + + + The broadcasting behavior of this listener to delegate listeners may be + more convenient than registering all of the listeners directly with the + Scheduler, and provides the flexibility of easily changing which listeners + get notified. + + + + + James House (jhouse AT revolition DOT net) + + + + Construct an instance with the given name. + + + (Remember to add some delegate listeners!) + + the name of this instance + + + + Construct an instance with the given name, and List of listeners. + + + + the name of this instance + the initial List of JobListeners to broadcast to. + + + + Holds a List of references to SchedulerListener instances and broadcasts all + events to them (in order). + + + This may be more convenient than registering all of the listeners + directly with the Scheduler, and provides the flexibility of easily changing + which listeners get notified. + + + + James House + Marko Lahma (.NET) + + + + Construct an instance with the given List of listeners. + + The initial List of SchedulerListeners to broadcast to. + + + + Holds a List of references to TriggerListener instances and broadcasts all + events to them (in order). + + + The broadcasting behavior of this listener to delegate listeners may be + more convenient than registering all of the listeners directly with the + Scheduler, and provides the flexibility of easily changing which listeners + get notified. + + + + + James House (jhouse AT revolition DOT net) + + + + The interface to be implemented by classes that want to be informed when a + fires. In general, applications that use a + will not have use for this mechanism. + + + + + + + James House + Marko Lahma (.NET) + + + + Called by the when a + has fired, and it's associated + is about to be executed. + + It is called before the method of this + interface. + + + The that has fired. + + The that will be passed to the 's method. + + + + + Called by the when a + has fired, and it's associated + is about to be executed. + + It is called after the method of this + interface. If the implementation vetos the execution (via + returning ), the job's execute method will not be called. + + + The that has fired. + The that will be passed to + the 's method. + Returns true if job execution should be vetoed, false otherwise. + + + + Called by the when a + has misfired. + + Consideration should be given to how much time is spent in this method, + as it will affect all triggers that are misfiring. If you have lots + of triggers misfiring at once, it could be an issue it this method + does a lot. + + + The that has misfired. + + + + Called by the when a + has fired, it's associated + has been executed, and it's method has been + called. + + The that was fired. + + The that was passed to the + 's method. + + + The result of the call on the 's method. + + + + + Get the name of the . + + + + + Construct an instance with the given name. + + + (Remember to add some delegate listeners!) + + the name of this instance + + + + Construct an instance with the given name, and List of listeners. + + + + the name of this instance + the initial List of TriggerListeners to broadcast to. + + + + Keeps a collection of mappings of which Job to trigger after the completion + of a given job. If this listener is notified of a job completing that has a + mapping, then it will then attempt to trigger the follow-up job. This + achieves "job chaining", or a "poor man's workflow". + + + + Generally an instance of this listener would be registered as a global + job listener, rather than being registered directly to a given job. + + + If for some reason there is a failure creating the trigger for the + follow-up job (which would generally only be caused by a rare serious + failure in the system, or the non-existence of the follow-up job), an error + messsage is logged, but no other action is taken. If you need more rigorous + handling of the error, consider scheduling the triggering of the flow-up + job within your job itself. + + + James House + Marko Lahma (.NET) + + + + A helpful abstract base class for implementors of . + + + + The methods in this class are empty so you only need to override the + subset for the events you care about. + + + + You are required to implement + to return the unique name of your . + + + Marko Lahma (.NET) + + + + + Initializes a new instance of the class. + + + + + Called by the when a + is about to be executed (an associated + has occured). + + This method will not be invoked if the execution of the Job was vetoed + by a . + + + + + + + + Called by the when a + was about to be executed (an associated + has occured), but a vetoed it's + execution. + + + + + + + Called by the after a + has been executed, and be for the associated 's + method has been called. + + + + + + + Get the for this class's category. + This should be used by subclasses for logging. + + + + + Get the name of the . + + + + + + Construct an instance with the given name. + + The name of this instance. + + + + Add a chain mapping - when the Job identified by the first key completes + the job identified by the second key will be triggered. + + a JobKey with the name and group of the first job + a JobKey with the name and group of the follow-up job + + + + A helpful abstract base class for implementors of + . + + + + The methods in this class are empty so you only need to override the + subset for the events + you care about. + + + + You are required to implement + to return the unique name of your . + + + Marko Lahma (.NET) + + + + + Get the for this + class's category. This should be used by subclasses for logging. + + + + + Get the name of the . + + + + + + Logs a history of all job executions (and execution vetos) via common + logging. + + + + The logged message is customizable by setting one of the following message + properties to a string that conforms to the syntax of . + + + JobToBeFiredMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Job's Name.
1StringThe Job's Group.
2DateThe current time.
3StringThe Trigger's name.
4StringThe Triggers's group.
5DateThe scheduled fire time.
6DateThe next scheduled fire time.
7IntegerThe re-fire count from the JobExecutionContext.
+ The default message text is "Job {1}.{0} fired (by trigger {4}.{3}) at: + {2, date, HH:mm:ss MM/dd/yyyy" +
+ + JobSuccessMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Job's Name.
1StringThe Job's Group.
2DateThe current time.
3StringThe Trigger's name.
4StringThe Triggers's group.
5DateThe scheduled fire time.
6DateThe next scheduled fire time.
7IntegerThe re-fire count from the JobExecutionContext.
8ObjectThe string value (toString() having been called) of the result (if any) + that the Job set on the JobExecutionContext, with on it. "NULL" if no + result was set.
+ The default message text is "Job {1}.{0} execution complete at {2, date, + HH:mm:ss MM/dd/yyyy} and reports: {8" +
+ + JobFailedMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Job's Name.
1StringThe Job's Group.
2DateThe current time.
3StringThe Trigger's name.
4StringThe Triggers's group.
5DateThe scheduled fire time.
6DateThe next scheduled fire time.
7IntegerThe re-fire count from the JobExecutionContext.
8StringThe message from the thrown JobExecution Exception. +
+ The default message text is "Job {1}.{0} execution failed at {2, date, + HH:mm:ss MM/dd/yyyy} and reports: {8" +
+ + JobWasVetoedMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Job's Name.
1StringThe Job's Group.
2DateThe current time.
3StringThe Trigger's name.
4StringThe Triggers's group.
5DateThe scheduled fire time.
6DateThe next scheduled fire time.
7IntegerThe re-fire count from the JobExecutionContext.
+ The default message text is "Job {1}.{0} was vetoed. It was to be fired + (by trigger {4}.{3}) at: {2, date, HH:mm:ss MM/dd/yyyy" +
+
+ Marko Lahma (.NET) +
+ + + Provides an interface for a class to become a "plugin" to Quartz. + + + Plugins can do virtually anything you wish, though the most interesting ones + will obviously interact with the scheduler in some way - either actively: by + invoking actions on the scheduler, or passively: by being a , + , and/or . + + If you use to + Initialize your Scheduler, it can also create and Initialize your plugins - + look at the configuration docs for details. + + + If you need direct access your plugin, you can have it explicitly put a + reference to itself in the 's + as part of its + method. + + + James House + Marko Lahma (.NET) + + + + Called during creation of the in order to give + the a chance to Initialize. + + + At this point, the Scheduler's is not yet + + If you need direct access your plugin, you can have it explicitly put a + reference to itself in the 's + as part of its + method. + + + + The name by which the plugin is identified. + + + The scheduler to which the plugin is registered. + + + + + Called when the associated is started, in order + to let the plug-in know it can now make calls into the scheduler if it + needs to. + + + + + Called in order to inform the that it + should free up all of it's resources because the scheduler is shutting + down. + + + + + Called during creation of the in order to give + the a chance to Initialize. + + + + + Called when the associated is started, in order + to let the plug-in know it can now make calls into the scheduler if it + needs to. + + + + + Called in order to inform the that it + should free up all of it's resources because the scheduler is shutting + down. + + + + + Called by the when a is + about to be executed (an associated has occurred). + + This method will not be invoked if the execution of the Job was vetoed by a + . + + + + + + + Called by the after a + has been executed, and be for the associated 's + method has been called. + + + + + + + Called by the when a + was about to be executed (an associated + has occured), but a vetoed it's + execution. + + + + + + + Logger instance to use. Defaults to common logging. + + + + + Get or sets the message that is logged when a Job successfully completes its + execution. + + + + + Get or sets the message that is logged when a Job fails its + execution. + + + + + Gets or sets the message that is logged when a Job is about to Execute. + + + + + Gets or sets the message that is logged when a Job execution is vetoed by a + trigger listener. + + + + + Get the name of the . + + + + + + Logs a history of all trigger firings via the Jakarta Commons-Logging + framework. + + + + The logged message is customizable by setting one of the following message + properties to a string that conforms to the syntax of . + + + + TriggerFiredMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Trigger's Name.
1StringThe Trigger's Group.
2DateThe scheduled fire time.
3DateThe next scheduled fire time.
4DateThe actual fire time.
5StringThe Job's name.
6StringThe Job's group.
7IntegerThe re-fire count from the JobExecutionContext.
+ + The default message text is "Trigger {1}.{0} fired job {6}.{5} at: {4, + date, HH:mm:ss MM/dd/yyyy" +
+ + + TriggerMisfiredMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Trigger's Name.
1StringThe Trigger's Group.
2DateThe scheduled fire time.
3DateThe next scheduled fire time.
4DateThe actual fire time. (the time the misfire was detected/handled)
5StringThe Job's name.
6StringThe Job's group.
+ + The default message text is "Trigger {1}.{0} misfired job {6}.{5} at: + {4, date, HH:mm:ss MM/dd/yyyy}. Should have fired at: {3, date, HH:mm:ss + MM/dd/yyyy" +
+ + + TriggerCompleteMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Trigger's Name.
1StringThe Trigger's Group.
2DateThe scheduled fire time.
3DateThe next scheduled fire time.
4DateThe job completion time.
5StringThe Job's name.
6StringThe Job's group.
7IntegerThe re-fire count from the JobExecutionContext.
8IntegerThe trigger's resulting instruction code.
9StringA human-readable translation of the trigger's resulting instruction + code.
+ + The default message text is "Trigger {1}.{0} completed firing job + {6}.{5} at {4, date, HH:mm:ss MM/dd/yyyy} with resulting trigger instruction + code: {9" +
+
+ James House + Marko Lahma (.NET) +
+ + + Called during creation of the in order to give + the a chance to Initialize. + + + + + Called when the associated is started, in order + to let the plug-in know it can now make calls into the scheduler if it + needs to. + + + + + Called in order to inform the that it + should free up all of it's resources because the scheduler is shutting + down. + + + + + Called by the when a + has fired, and it's associated + is about to be executed. + + It is called before the method of this + interface. + + + The that has fired. + The that will be passed to the 's method. + + + + Called by the when a + has misfired. + + Consideration should be given to how much time is spent in this method, + as it will affect all triggers that are misfiring. If you have lots + of triggers misfiring at once, it could be an issue it this method + does a lot. + + + The that has misfired. + + + + Called by the when a + has fired, it's associated + has been executed, and it's method has been + called. + + The that was fired. + The that was passed to the + 's method. + The result of the call on the 's method. + + + + Called by the when a + has fired, and it's associated + is about to be executed. + + It is called after the method of this + interface. + + + The that has fired. + The that will be passed to + the 's method. + + + + + Logger instance to use. Defaults to common logging. + + + + + Get or set the message that is printed upon the completion of a trigger's + firing. + + + + + Get or set the message that is printed upon a trigger's firing. + + + + + Get or set the message that is printed upon a trigger's mis-firing. + + + + + Get the name of the . + + + + + + This plugin catches the event of the VM terminating (such as upon a CRTL-C) + and tells the scheuler to Shutdown. + + + James House + Marko Lahma (.NET) + + + + Called during creation of the in order to give + the a chance to Initialize. + + + + + Called when the associated is started, in order + to let the plug-in know it can now make calls into the scheduler if it + needs to. + + + + + Called in order to inform the that it + should free up all of it's resources because the scheduler is shutting + down. + + + + + Determine whether or not the plug-in is configured to cause a clean + Shutdown of the scheduler. + + The default value is . + + + + + + + This plugin loads XML file(s) to add jobs and schedule them with triggers + as the scheduler is initialized, and can optionally periodically scan the + file for changes. + + + The periodically scanning of files for changes is not currently supported in a + clustered environment. + + James House + Pierre Awaragi + + + + Initializes a new instance of the class. + + + + + + + + + + + Called during creation of the in order to give + the a chance to initialize. + + The name. + The scheduler. + SchedulerConfigException + + + + Called when the associated is started, in order + to let the plug-in know it can now make calls into the scheduler if it + needs to. + + + + + Helper method for generating unique job/trigger name for the + file scanning jobs (one per FileJob). The unique names are saved + in jobTriggerNameSet. + + + + + + + Called in order to inform the that it + should free up all of it's resources because the scheduler is shutting + down. + + + + + Gets the log. + + The log. + + + + Comma separated list of file names (with paths) to the XML files that should be read. + + + + + The interval at which to scan for changes to the file. + If the file has been changed, it is re-loaded and parsed. The default + value for the interval is 0, which disables scanning. + + + + + Whether or not initialization of the plugin should fail (throw an + exception) if the file cannot be found. Default is . + + + + + Information about a file that should be processed by . + + + + + Default object serialization strategy that uses + under the hood. + + Marko Lahma + + + + Interface for object serializers. + + Marko Lahma + + + + + Serializes given object as bytes + that can be stored to permanent stores. + + Object to serialize, always non-null. + + + + Deserializes object from byte array presentation. + + Data to deserialize object from, always non-null and non-empty. + + + + Serializes given object as bytes + that can be stored to permanent stores. + + Object to serialize. + + + + Deserializes object from byte array presentation. + + Data to deserialize object from. + + + + that names the scheduler instance using + just the machine hostname. + + + This class is useful when you know that your scheduler instance will be the + only one running on a particular machine. Each time the scheduler is + restarted, it will get the same instance id as long as the machine is not + renamed. + + Marko Lahma (.NET) + + + + + + An IInstanceIdGenerator is responsible for generating the clusterwide unique + instance id for a node. + + + This interface may be of use to those wishing to have specific control over + the mechanism by which the instances in their + application are named. + + + Marko Lahma (.NET) + + + + Generate the instance id for a + + The clusterwide unique instance id. + + + + + Generate the instance id for a + + The clusterwide unique instance id. + + + + A JobFactory that instantiates the Job instance (using the default no-arg + constructor, or more specifically: ), and + then attempts to set all values from the and + the 's merged onto + properties of the job. + + + Set the WarnIfPropertyNotFound property to true if you'd like noisy logging in + the case of values in the not mapping to properties on your job + class. This may be useful for troubleshooting typos of property names, etc. + but very noisy if you regularly (and purposely) have extra things in your + . + Also of possible interest is the ThrowIfPropertyNotFound property which + will throw exceptions on unmatched JobDataMap keys. + + + + + + + + James Houser + Marko Lahma (.NET) + + + + The default JobFactory used by Quartz - simply calls + on the job class. + + + + James House + Marko Lahma (.NET) + + + + A JobFactory is responsible for producing instances of + classes. + + + This interface may be of use to those wishing to have their application + produce instances via some special mechanism, such as to + give the opertunity for dependency injection. + + + + + James House + Marko Lahma (.NET) + + + + Called by the scheduler at the time of the trigger firing, in order to + produce a instance on which to call Execute. + + + It should be extremely rare for this method to throw an exception - + basically only the the case where there is no way at all to instantiate + and prepare the Job for execution. When the exception is thrown, the + Scheduler will move all triggers associated with the Job into the + state, which will require human + intervention (e.g. an application restart after fixing whatever + configuration problem led to the issue wih instantiating the Job. + + + The TriggerFiredBundle from which the + and other info relating to the trigger firing can be obtained. + + a handle to the scheduler that is about to execute the job + SchedulerException if there is a problem instantiating the Job. + the newly instantiated Job + + + + + Called by the scheduler at the time of the trigger firing, in order to + produce a instance on which to call Execute. + + + It should be extremely rare for this method to throw an exception - + basically only the the case where there is no way at all to instantiate + and prepare the Job for execution. When the exception is thrown, the + Scheduler will move all triggers associated with the Job into the + state, which will require human + intervention (e.g. an application restart after fixing whatever + configuration problem led to the issue wih instantiating the Job. + + The TriggerFiredBundle from which the + and other info relating to the trigger firing can be obtained. + + the newly instantiated Job + SchedulerException if there is a problem instantiating the Job. + + + + Called by the scheduler at the time of the trigger firing, in order to + produce a instance on which to call Execute. + + + + It should be extremely rare for this method to throw an exception - + basically only the the case where there is no way at all to instantiate + and prepare the Job for execution. When the exception is thrown, the + Scheduler will move all triggers associated with the Job into the + state, which will require human + intervention (e.g. an application restart after fixing whatever + configuration problem led to the issue wih instantiating the Job. + + + The TriggerFiredBundle from which the + and other info relating to the trigger firing can be obtained. + + the newly instantiated Job + SchedulerException if there is a problem instantiating the Job. + + + + Sets the object properties. + + The object to set properties to. + The data to set. + + + + Whether the JobInstantiation should fail and throw and exception if + a key (name) and value (type) found in the JobDataMap does not + correspond to a proptery setter on the Job class. + + + + + Get or set whether a warning should be logged if + a key (name) and value (type) found in the JobDataMap does not + correspond to a proptery setter on the Job class. + + + + + This class implements a that + utilizes RAM as its storage device. + + As you should know, the ramification of this is that access is extrememly + fast, but the data is completely volatile - therefore this + should not be used if true persistence between program shutdowns is + required. + + + James House + Sharada Jambula + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + + + + Gets the fired trigger record id. + + The fired trigger record id. + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + Called by the QuartzScheduler to inform the that + the scheduler has started. + + + + + Called by the QuartzScheduler to inform the JobStore that + the scheduler has been paused. + + + + + Called by the QuartzScheduler to inform the JobStore that + the scheduler has resumed after being paused. + + + + + Called by the QuartzScheduler to inform the that + it should free up all of it's resources because the scheduler is + shutting down. + + + + + Clears (deletes!) all scheduling data - all s, s + s. + + + + + Store the given and . + + The to be stored. + The to be stored. + + + + Returns true if the given job group is paused. + + Job group name + + + + + returns true if the given TriggerGroup is paused. + + + + + + + Store the given . + + The to be stored. + If , any existing in the + with the same name and group should be + over-written. + + + + Remove (delete) the with the given + name, and any s that reference + it. + + + if a with the given name and + group was found and removed from the store. + + + + + Remove (delete) the with the + given name. + + + if a with the given + name and group was found and removed from the store. + + + + + Store the given . + + The to be stored. + If , any existing in + the with the same name and group should + be over-written. + + + + Remove (delete) the with the + given name. + + + + if a with the given + name and group was found and removed from the store. + + The to be removed. + Whether to delete orpahaned job details from scheduler if job becomes orphaned from removing the trigger. + + + + Replaces the trigger. + + The of the to be replaced. + The new trigger. + + + + + Retrieve the for the given + . + + + The desired , or null if there is no match. + + + + + Retrieve the given . + + + The desired , or null if there is no match. + + + + + Determine whether a with the given identifier already + exists within the scheduler. + + the identifier to check for + true if a Job exists with the given identifier + + + + Determine whether a with the given identifier already + exists within the scheduler. + + triggerKey the identifier to check for + true if a Trigger exists with the given identifier + + + + Get the current state of the identified . + + + + + + + + + + + Store the given . + + The name. + The to be stored. + If , any existing + in the with the same name and group + should be over-written. + If , any s existing + in the that reference an existing + Calendar with the same name with have their next fire time + re-computed with the new . + + + + Remove (delete) the with the + given name. + + If removal of the would result in + s pointing to non-existent calendars, then a + will be thrown. + + The name of the to be removed. + + if a with the given name + was found and removed from the store. + + + + + Retrieve the given . + + The name of the to be retrieved. + + The desired , or null if there is no match. + + + + + Get the number of s that are + stored in the . + + + + + Get the number of s that are + stored in the . + + + + + Get the number of s that are + stored in the . + + + + + Get the names of all of the s that + match the given group matcher. + + + + + Get the names of all of the s + in the . + + If there are no ICalendars in the given group name, the result should be + a zero-length array (not ). + + + + + + Get the names of all of the s + that have the given group name. + + + + + Get the names of all of the + groups. + + + + + Get the names of all of the groups. + + + + + Get all of the Triggers that are associated to the given Job. + + If there are no matches, a zero-length array should be returned. + + + + + + Gets the trigger wrappers for job. + + + + + + Gets the trigger wrappers for calendar. + + Name of the cal. + + + + + Pause the with the given name. + + + + + Pause all of the s in the given group. + + The JobStore should "remember" that the group is paused, and impose the + pause on any new triggers that are added to the group while the group is + paused. + + + + + + Pause the with the given + name - by pausing all of its current s. + + + + + Pause all of the s in the + given group - by pausing all of their s. + + The JobStore should "remember" that the group is paused, and impose the + pause on any new jobs that are added to the group while the group is + paused. + + + + + + Resume (un-pause) the with the given key. + + + If the missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + Resume (un-pause) all of the s in the + given group. + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Resume (un-pause) the with + the given name. + + If any of the 's s missed one + or more fire-times, then the 's misfire + instruction will be applied. + + + + + + Resume (un-pause) all of the s + in the given group. + + If any of the s had s that + missed one or more fire-times, then the 's + misfire instruction will be applied. + + + + + + Pause all triggers - equivalent of calling + on every group. + + When is called (to un-pause), trigger misfire + instructions WILL be applied. + + + + + + + Resume (un-pause) all triggers - equivalent of calling + on every trigger group and setting all job groups unpaused />. + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + + Applies the misfire. + + The trigger wrapper. + + + + + Get a handle to the next trigger to be fired, and mark it as 'reserved' + by the calling scheduler. + + + + + + Inform the that the scheduler no longer plans to + fire the given , that it had previously acquired + (reserved). + + + + + Inform the that the scheduler is now firing the + given (executing its associated ), + that it had previously acquired (reserved). + + + + + Inform the that the scheduler has completed the + firing of the given (and the execution its + associated ), and that the + in the given should be updated if the + is stateful. + + + + + Sets the state of all triggers of job to specified state. + + + + + Peeks the triggers. + + + + + + + + + The time span by which a trigger must have missed its + next-fire-time, in order for it to be considered "misfired" and thus + have its misfire instruction applied. + + + + + Returns whether this instance supports persistence. + + + + + + + Inform the of the Scheduler instance's Id, + prior to initialize being invoked. + + + + + Inform the of the Scheduler instance's name, + prior to initialize being invoked. + + + + + Comparer for trigger wrappers. + + + + + Indicates whether the current object is equal to another object of the same type. + + + true if the current object is equal to the parameter; otherwise, false. + + An object to compare with this object. + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + 2 + + + + Possible internal trigger states + in RAMJobStore + + + + + Waiting + + + + + Acquired + + + + + Executing + + + + + Complete + + + + + Paused + + + + + Blocked + + + + + Paused and Blocked + + + + + Error + + + + + Helper wrapper class + + + + + The key used + + + + + Job's key + + + + + The trigger + + + + + Current state + + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + + Serves as a hash function for a particular type. is suitable for use in hashing algorithms and data structures like a hash table. + + + A hash code for the current . + + + + + Scheduler exporter that exports scheduler to remoting context. + + Marko Lahma + + + + Service interface for scheduler exporters. + + Marko Lahma + + + + Binds (exports) scheduler to external context. + + + + + + Unbinds scheduler from external context. + + + + + + Registers remoting channel if needed. This is determined + by checking whether there is a positive value for port. + + + + + Gets or sets the port used for remoting. + + + + + Gets or sets the name to use when exporting + scheduler to remoting context. + + + + + Gets or sets the name to use when binding to + tcp channel. + + + + + Sets the channel type when registering remoting. + + + + + + Sets the used when + exporting to remoting context. Defaults to + . + + + + + A implementation that creates + connection to remote scheduler using remoting. + + + + + Client Proxy to a IRemotableQuartzScheduler + + + + + Returns a client proxy to a remote . + + + + + Returns a client proxy to a remote . + + + + + Gets or sets the remote scheduler address. + + The remote scheduler address. + + + + The default InstanceIdGenerator used by Quartz when instance id is to be + automatically generated. Instance id is of the form HOSTNAME + CURRENT_TIME. + + Marko Lahma (.NET) + + + + + + Generate the instance id for a + + The clusterwide unique instance id. + + + + This is class is a simple implementation of a thread pool, based on the + interface. + + + objects are sent to the pool with the + method, which blocks until a becomes available. + + The pool has a fixed number of s, and does not grow or + shrink based on demand. + + James House + Juergen Donnerstag + Marko Lahma (.NET) + + + + The interface to be implemented by classes that want to provide a thread + pool for the 's use. + + + implementation instances should ideally be made + for the sole use of Quartz. Most importantly, when the method + returns a value of 1 or greater, + there must still be at least one available thread in the pool when the + method is called a few moments (or + many moments) later. If this assumption does not hold true, it may + result in extra JobStore queries and updates, and if clustering features + are being used, it may result in greater imballance of load. + + + James House + Marko Lahma (.NET) + + + + Execute the given in the next + available . + + + The implementation of this interface should not throw exceptions unless + there is a serious problem (i.e. a serious misconfiguration). If there + are no available threads, rather it should either queue the Runnable, or + block until a thread is available, depending on the desired strategy. + + + + + Determines the number of threads that are currently available in in + the pool. Useful for determining the number of times + can be called before returning + false. + + + The implementation of this method should block until there is at + least one available thread. + + the number of currently available threads + + + + Must be called before the is + used, in order to give the it a chance to Initialize. + + + Typically called by the . + + + + + Called by the QuartzScheduler to inform the + that it should free up all of it's resources because the scheduler is + shutting down. + + + + + Get the current number of threads in the . + + + + + Inform the of the Scheduler instance's Id, + prior to initialize being invoked. + + + + + Inform the of the Scheduler instance's name, + prior to initialize being invoked. + + + + + Create a new (unconfigured) . + + + + + Create a new with the specified number + of s that have the given priority. + + + the number of worker s in the pool, must + be > 0. + + + the thread priority for the worker threads. + + + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + Terminate any worker threads in this thread group. + Jobs currently in progress will complete. + + + + + Run the given object in the next available + . If while waiting the thread pool is asked to + shut down, the Runnable is executed immediately within a new additional + thread. + + The to be added. + + + + Creates the worker threads. + + The thread count. + + + + + Terminate any worker threads in this thread group. + Jobs currently in progress will complete. + + + + + Gets or sets the number of worker threads in the pool. + Set has no effect after has been called. + + + + + Get or set the thread priority of worker threads in the pool. + Set operation has no effect after has been called. + + + + + Gets or sets the thread name prefix. + + The thread name prefix. + + + + Gets or sets the value of makeThreadsDaemons. + + + + + Gets the size of the pool. + + The size of the pool. + + + + Inform the of the Scheduler instance's Id, + prior to initialize being invoked. + + + + + Inform the of the Scheduler instance's name, + prior to initialize being invoked. + + + + + A Worker loops, waiting to Execute tasks. + + + + + Create a worker thread and start it. Waiting for the next Runnable, + executing it, and waiting for the next Runnable, until the Shutdown + flag is set. + + + + + Create a worker thread, start it, Execute the runnable and terminate + the thread (one time execution). + + + + + Signal the thread that it should terminate. + + + + + Loop, executing targets as they are received. + + + + + A that simply calls . + + + James House + Marko Lahma (.NET) + + + + Called to give the ClassLoadHelper a chance to Initialize itself, + including the oportunity to "steal" the class loader off of the calling + thread, which is the thread that is initializing Quartz. + + + + Return the class with the given name. + + + + Finds a resource with a given name. This method returns null if no + resource with this name is found. + + name of the desired resource + + a Uri object + + + + Finds a resource with a given name. This method returns null if no + resource with this name is found. + + name of the desired resource + + a Stream object + + + + + InstanceIdGenerator that will use a to configure the scheduler. + If no value set for the property, a is thrown. + Alex Snaps + + + + + System property to read the instanceId from. + + + + + Returns the cluster wide value for this scheduler instance's id, based on a system property. + + + + + This is class is a simple implementation of a zero size thread pool, based on the + interface. + + + The pool has zero s and does not grow or shrink based on demand. + Which means it is obviously not useful for most scenarios. When it may be useful + is to prevent creating any worker threads at all - which may be desirable for + the sole purpose of preserving system resources in the case where the scheduler + instance only exists in order to schedule jobs, but which will never execute + jobs (e.g. will never have Start() called on it). + + Wayne Fay + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + Shutdowns this instance. + + + + + Called by the QuartzScheduler to inform the + that it should free up all of it's resources because the scheduler is + shutting down. + + + + + + Execute the given in the next + available . + + + + + The implementation of this interface should not throw exceptions unless + there is a serious problem (i.e. a serious misconfiguration). If there + are no available threads, rather it should either queue the Runnable, or + block until a thread is available, depending on the desired strategy. + + + + + Determines the number of threads that are currently available in in + the pool. Useful for determining the number of times + can be called before returning + false. + + + the number of currently available threads + + + The implementation of this method should block until there is at + least one available thread. + + + + + Gets the log. + + The log. + + + + Gets the size of the pool. + + The size of the pool. + + + + Inform the of the Scheduler instance's Id, + prior to initialize being invoked. + + + + + Inform the of the Scheduler instance's name, + prior to initialize being invoked. + + + + + A simple class (structure) used for returning execution-time data from the + JobStore to the . + + + James House + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + The job. + The trigger. + The calendar. + if set to true [job is recovering]. + The fire time. + The scheduled fire time. + The previous fire time. + The next fire time. + + + + Gets the job detail. + + The job detail. + + + + Gets the trigger. + + The trigger. + + + + Gets the calendar. + + The calendar. + + + + Gets a value indicating whether this is recovering. + + true if recovering; otherwise, false. + + + + Returns the UTC fire time. + + + + + Gets the next UTC fire time. + + The next fire time. + Returns the nextFireTimeUtc. + + + + Gets the previous UTC fire time. + + The previous fire time. + Returns the previous fire time. + + + + Returns the scheduled UTC fire time. + + + + + Result holder for trigger firing event. + + + + + Constructor. + + + + + + Constructor. + + + + + Bundle. + + + + + Possible exception. + + + + + Extension methods for . + + + + + Tries to read value and returns the value if successfully read. Otherwise return default value + for value's type. + + + + + + + + + + Extension methods for simplified access. + + + + + Returns string from given column name, or null if DbNull. + + + + + Returns int from given column name. + + + + + Returns long from given column name. + + + + + Returns long from given column name, or null if DbNull. + + + + + Returns decimal from given column name. + + + + + Manages a collection of IDbProviders, and provides transparent access + to their database. + + + James House + Sharada Jambula + Mohammad Rezaei + Marko Lahma (.NET) + + + + Private constructor + + + + + Adds the connection provider. + + Name of the data source. + The provider. + + + + Get a database connection from the DataSource with the given name. + + a database connection + + + + Shuts down database connections from the DataSource with the given name, + if applicable for the underlying provider. + + a database connection + + + + Gets the db provider. + + Name of the ds. + + + + + Get the class instance. + + an instance of this class + + + + + An implementation of that wraps another + and flags itself 'dirty' when it is modified. + + James House + Marko Lahma (.NET) + + + + Create a DirtyFlagMap that 'wraps' a . + + + + + Create a DirtyFlagMap that 'wraps' a that has the + given initial capacity. + + + + + Serialization constructor. + + + + + + + Creates a new object that is a copy of the current instance. + + + A new object that is a copy of this instance. + + + + + When implemented by a class, removes all elements from the . + + + The is read-only. + + + + + When implemented by a class, determines whether the contains an element with the specified key. + + The key to locate in the . + + if the contains an element with the key; otherwise, . + + + is . + + + + When implemented by a class, removes the element with the + specified key from the . + + The key of the element to remove. + + is . + + The is read-only. + -or- + The has a fixed size. + + + + + When implemented by a class, returns an + for the . + + + An for the . + + + + + When implemented by a class, adds an element with the provided key and value to the . + + The to use as the key of the element to add. + The to use as the value of the element to add. + is . + + An element with the same key already exists in the . + + + The is read-only. + -or- + The has a fixed size. + + + + + When implemented by a class, copies the elements of + the to an , starting at a particular index. + + The one-dimensional that is the destination of the elements copied from . The must have zero-based indexing. + The zero-based index in at which copying begins. + + is . + + is less than zero. + + + is multidimensional. + -or- + + is equal to or greater than the length of . + -or- + The number of elements in the source is greater than the available space from to the end of the destination . + + The type of the source cannot be cast automatically to the type of the destination . + + + + Clear the 'dirty' flag (set dirty flag to ). + + + + + Determines whether the specified obj contains value. + + The obj. + + true if the specified obj contains value; otherwise, false. + + + + + Gets the entries as a set. + + + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + if the specified is equal to the + current ; otherwise, . + + + + + Serves as a hash function for a particular type, suitable + for use in hashing algorithms and data structures like a hash table. + + + A hash code for the current . + + + + + Gets keyset for this map. + + + + + + Puts the value behind a specified key. + + The key. + The val. + + + + + Puts all. + + The t. + + + + Determine whether the is flagged dirty. + + + + + Get a direct handle to the underlying Map. + + + + + Gets a value indicating whether this instance is empty. + + true if this instance is empty; otherwise, false. + + + + Gets or sets the with the specified key. + + + + + + When implemented by a class, gets the number of + elements contained in the . + + + + + + When implemented by a class, gets an containing the values in the . + + + + + + When implemented by a class, gets an containing the keys of the . + + + + + + When implemented by a class, gets a value indicating whether the + is read-only. + + + + + + When implemented by a class, gets a value indicating whether the + has a fixed size. + + + + + + When implemented by a class, gets an object that + can be used to synchronize access to the . + + + + + + When implemented by a class, gets a value + indicating whether access to the is synchronized + (thread-safe). + + + + + + Utility class for file handling related things. + + Marko Lahma + + + + Resolves file to actual file if for example relative '~' used. + + File name to check + Expanded file name or actual no resolving was done. + + + + Object representing a job or trigger key. + + Jeffrey Wescott + Marko Lahma (.NET) + + + + The default group for scheduling entities, with the value "DEFAULT". + + + + + Construct a new key with the given name and group. + + the name + the group + + + + Return the string representation of the key. The format will be: + <group>.<name>. + + + + the string representation of the key + + + + + Get the name portion of the key. + + the name + + + + + Get the group portion of the key. + + + + the group + + + + + Wrapper class to access thread local data. + Data is either accessed from thread or HTTP Context's + data if HTTP Context is avaiable. + + Marko Lahma .NET + + + + Retrieves an object with the specified name. + + The name of the item. + The object in the call context associated with the specified name or null if no object has been stored previously + + + + Stores a given object and associates it with the specified name. + + The name with which to associate the new item. + The object to store in the call context. + + + + Empties a data slot with the specified name. + + The name of the data slot to empty. + + + + Generic extension methods for objects. + + + + + Creates a deep copy of object by serializing to memory stream. + + + + + + Utility methods that are used to convert objects from one type into another. + + Aleksandar Seovic + Marko Lahma + + + + Convert the value to the required (if necessary from a string). + + The proposed change value. + + The we must convert to. + + The new value, possibly the result of type conversion. + + + + Determines whether value is assignable to required type. + + The value to check. + Type of the required. + + true if value can be assigned as given type; otherwise, false. + + + + + Instantiates an instance of the type specified. + + + + + + Sets the object properties using reflection. + + + + + Sets the object properties using reflection. + + The object to set values to. + The properties to set to object. + + + + This is an utility class used to parse the properties. + + James House + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + The props. + + + + Gets the string property. + + The name. + + + + + Gets the string property. + + The name. + The default value. + + + + + Gets the string array property. + + The name. + + + + + Gets the string array property. + + The name. + The default value. + + + + + Gets the boolean property. + + The name. + + + + + Gets the boolean property. + + The name. + if set to true [defaultValue]. + + + + + Gets the byte property. + + The name. + + + + + Gets the byte property. + + The name. + The default value. + + + + + Gets the char property. + + The name. + + + + + Gets the char property. + + The name. + The default value. + + + + + Gets the double property. + + The name. + + + + + Gets the double property. + + The name. + The default value. + + + + + Gets the float property. + + The name. + + + + + Gets the float property. + + The name. + The default value. + + + + + Gets the int property. + + The name. + + + + + Gets the int property. + + The name. + The default value. + + + + + Gets the int array property. + + The name. + + + + + Gets the int array property. + + The name. + The default value. + + + + + Gets the long property. + + The name. + + + + + Gets the long property. + + The name. + The def. + + + + + Gets the TimeSpan property. + + The name. + The def. + + + + + Gets the short property. + + The name. + + + + + Gets the short property. + + The name. + The default value. + + + + + Gets the property groups. + + The prefix. + + + + + Gets the property group. + + The prefix. + + + + + Gets the property group. + + The prefix. + if set to true [strip prefix]. + + + + + Get all properties that start with the given prefix. + + The prefix for which to search. If it does not end in a "." then one will be added to it for search purposes. + Whether to strip off the given in the result's keys. + Optional array of fully qualified prefixes to exclude. For example if is "a.b.c", then might be "a.b.c.ignore". + Group of that start with the given prefix, optionally have that prefix removed, and do not include properties that start with one of the given excluded prefixes. + + + + Reads the properties from assembly (embedded resource). + + The file name to read resources from. + + + + + Reads the properties from file system. + + The file name to read resources from. + + + + + Gets the underlying properties. + + The underlying properties. + + + + Extension methods for . + + + + + Allows null-safe trimming of string. + + + + + + + Trims string and if resulting string is empty, null is returned. + + + + + + + An implementation of that wraps another + and flags itself 'dirty' when it is modified, enforces that all keys are + strings. + + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The initial capacity. + + + + Serialization constructor. + + + + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + if the specified is equal to the + current ; otherwise, . + + + + + Serves as a hash function for a particular type, suitable + for use in hashing algorithms and data structures like a hash table. + + + A hash code for the current . + + + + + Gets the keys. + + + + + + Adds the name-value pairs in the given to the . + + All keys must be s, and all values must be serializable. + + + + + + Adds the given value to the 's + data map. + + + + + Adds the given value to the 's + data map. + + + + + Adds the given value to the 's + data map. + + + + + Adds the given value to the 's + data map. + + + + + Adds the given value to the 's + data map. + + + + + Adds the given value to the 's + data map. + + + + + Adds the given value to the 's + data map. + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Reports JobSchedulingDataProcessor validation exceptions. + + Chris Bonham + Marko Lahma (.NET) + + + + Constructor for ValidationException. + + + + + Constructor for ValidationException. + + exception message. + + + + Constructor for ValidationException. + + collection of validation exceptions. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + Gets the validation exceptions. + + The validation exceptions. + + + + Returns the detail message string. + + + + + Parses an XML file that declares Jobs and their schedules (Triggers). + + + + The xml document must conform to the format defined in "job_scheduling_data_2_0.xsd" + + + + After creating an instance of this class, you should call one of the + functions, after which you may call the ScheduledJobs() + function to get a handle to the defined Jobs and Triggers, which can then be + scheduled with the . Alternatively, you could call + the function to do all of this + in one step. + + + + The same instance can be used again and again, with the list of defined Jobs + being cleared each time you call a method, + however a single instance is not thread-safe. + + + Chris Bonham + James House + Marko Lahma (.NET) + + + + Constructor for XMLSchedulingDataProcessor. + + + + + Process the xml file in the default location (a file named + "quartz_jobs.xml" in the current working directory). + + + + + Process the xml file named . + + meta data file name. + + + + Process the xmlfile named with the given system + ID. + + Name of the file. + The system id. + + + + Process the xmlfile named with the given system + ID. + + The stream. + The system id. + + + + Process the xml file in the default location, and schedule all of the jobs defined within it. + + Note that we will set overWriteExistingJobs after the default xml is parsed. + + + + + + Process the xml file in the default location, and schedule all of the + jobs defined within it. + + + + + Process the xml file in the given location, and schedule all of the + jobs defined within it. + + meta data file name. + The scheduler. + + + + Process the xml file in the given location, and schedule all of the + jobs defined within it. + + Name of the file. + The system id. + The sched. + + + + Schedules the given sets of jobs and triggers. + + The sched. + + + + Adds a detected validation exception. + + The exception. + + + + Resets the the number of detected validation exceptions. + + + + + Throws a ValidationException if the number of validationExceptions + detected is greater than zero. + + + DTD validation exception. + + + + + Whether the existing scheduling data (with same identifiers) will be + overwritten. + + + If false, and is not false, and jobs or + triggers with the same names already exist as those in the file, an + error will occur. + + + + + + If true (and is false) then any + job/triggers encountered in this file that have names that already exist + in the scheduler will be ignored, and no error will be produced. + + + + + + Gets the log. + + The log. + + + + Helper class to map constant names to their values. + + + + + CalendarIntervalScheduleBuilder is a + that defines calendar time (day, week, month, year) interval-based + schedules for Triggers. + + + + Quartz provides a builder-style API for constructing scheduling-related + entities via a Domain-Specific Language (DSL). The DSL can best be + utilized through the usage of static imports of the methods on the classes + , , + , , + and the various implementations. + + Client code can then use the DSL to write code such as this: + + JobDetail job = JobBuilder.Create<MyJob>() + .WithIdentity("myJob") + .Build(); + Trigger trigger = TriggerBuilder.Create() + .WithIdentity("myTrigger", "myTriggerGroup") + .WithSimpleSchedule(x => x + .WithIntervalInHours(1) + .RepeatForever()) + .StartAt(DateBuilder.FutureDate(10, IntervalUnit.Minute)) + .Build(); + scheduler.scheduleJob(job, trigger); + + + + + + + + + + + Base class for implementors. + + + + + + Schedule builders offer fluent interface and are responsible for creating schedules. + + + + + + + + + Build the actual Trigger -- NOT intended to be invoked by end users, + but will rather be invoked by a TriggerBuilder which this + ScheduleBuilder is given to. + + + + + + Build the actual Trigger -- NOT intended to be invoked by end users, + but will rather be invoked by a TriggerBuilder which this + ScheduleBuilder is given to. + + + + + + Create a CalendarIntervalScheduleBuilder. + + + + + + Build the actual Trigger -- NOT intended to be invoked by end users, + but will rather be invoked by a TriggerBuilder which this + ScheduleBuilder is given to. + + + + + + Specify the time unit and interval for the Trigger to be produced. + + + + the interval at which the trigger should repeat. + the time unit (IntervalUnit) of the interval. + the updated CalendarIntervalScheduleBuilder + + + + + + Specify an interval in the IntervalUnit.SECOND that the produced + Trigger will repeat at. + + + + the number of seconds at which the trigger should repeat. + the updated CalendarIntervalScheduleBuilder + + + + + + Specify an interval in the IntervalUnit.MINUTE that the produced + Trigger will repeat at. + + + + the number of minutes at which the trigger should repeat. + the updated CalendarIntervalScheduleBuilder + + + + + + Specify an interval in the IntervalUnit.HOUR that the produced + Trigger will repeat at. + + + + the number of hours at which the trigger should repeat. + the updated CalendarIntervalScheduleBuilder + + + + + + Specify an interval in the IntervalUnit.DAY that the produced + Trigger will repeat at. + + + + the number of days at which the trigger should repeat. + the updated CalendarIntervalScheduleBuilder + + + + + + Specify an interval in the IntervalUnit.WEEK that the produced + Trigger will repeat at. + + + + the number of weeks at which the trigger should repeat. + the updated CalendarIntervalScheduleBuilder + + + + + + Specify an interval in the IntervalUnit.MONTH that the produced + Trigger will repeat at. + + + + the number of months at which the trigger should repeat. + the updated CalendarIntervalScheduleBuilder + + + + + + Specify an interval in the IntervalUnit.YEAR that the produced + Trigger will repeat at. + + + + the number of years at which the trigger should repeat. + the updated CalendarIntervalScheduleBuilder + + + + + + If the Trigger misfires, use the + instruction. + + + + the updated CronScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + + + the updated CalendarIntervalScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + + + the updated CalendarIntervalScheduleBuilder + + + + + Extension methods that attach to . + + + + + Provides a parser and evaluator for unix-like cron expressions. Cron + expressions provide the ability to specify complex time combinations such as + "At 8:00am every Monday through Friday" or "At 1:30am every + last Friday of the month". + + + + Cron expressions are comprised of 6 required fields and one optional field + separated by white space. The fields respectively are described as follows: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Name Allowed Values Allowed Special Characters
Seconds 0-59 , - /// /
Minutes 0-59 , - /// /
Hours 0-23 , - /// /
Day-of-month 1-31 , - /// ? / L W C
Month 1-12 or JAN-DEC , - /// /
Day-of-Week 1-7 or SUN-SAT , - /// ? / L #
Year (Optional) empty, 1970-2199 , - /// /
+ + The '*' character is used to specify all values. For example, "*" + in the minute field means "every minute". + + + The '?' character is allowed for the day-of-month and day-of-week fields. It + is used to specify 'no specific value'. This is useful when you need to + specify something in one of the two fields, but not the other. + + + The '-' character is used to specify ranges For example "10-12" in + the hour field means "the hours 10, 11 and 12". + + + The ',' character is used to specify additional values. For example + "MON,WED,FRI" in the day-of-week field means "the days Monday, + Wednesday, and Friday". + + + The '/' character is used to specify increments. For example "0/15" + in the seconds field means "the seconds 0, 15, 30, and 45". And + "5/15" in the seconds field means "the seconds 5, 20, 35, and + 50". Specifying '*' before the '/' is equivalent to specifying 0 is + the value to start with. Essentially, for each field in the expression, there + is a set of numbers that can be turned on or off. For seconds and minutes, + the numbers range from 0 to 59. For hours 0 to 23, for days of the month 0 to + 31, and for months 1 to 12. The "/" character simply helps you turn + on every "nth" value in the given set. Thus "7/6" in the + month field only turns on month "7", it does NOT mean every 6th + month, please note that subtlety. + + + The 'L' character is allowed for the day-of-month and day-of-week fields. + This character is short-hand for "last", but it has different + meaning in each of the two fields. For example, the value "L" in + the day-of-month field means "the last day of the month" - day 31 + for January, day 28 for February on non-leap years. If used in the + day-of-week field by itself, it simply means "7" or + "SAT". But if used in the day-of-week field after another value, it + means "the last xxx day of the month" - for example "6L" + means "the last friday of the month". You can also specify an offset + from the last day of the month, such as "L-3" which would mean the third-to-last + day of the calendar month. When using the 'L' option, it is important not to + specify lists, or ranges of values, as you'll get confusing/unexpected results. + + + The 'W' character is allowed for the day-of-month field. This character + is used to specify the weekday (Monday-Friday) nearest the given day. As an + example, if you were to specify "15W" as the value for the + day-of-month field, the meaning is: "the nearest weekday to the 15th of + the month". So if the 15th is a Saturday, the trigger will fire on + Friday the 14th. If the 15th is a Sunday, the trigger will fire on Monday the + 16th. If the 15th is a Tuesday, then it will fire on Tuesday the 15th. + However if you specify "1W" as the value for day-of-month, and the + 1st is a Saturday, the trigger will fire on Monday the 3rd, as it will not + 'jump' over the boundary of a month's days. The 'W' character can only be + specified when the day-of-month is a single day, not a range or list of days. + + + The 'L' and 'W' characters can also be combined for the day-of-month + expression to yield 'LW', which translates to "last weekday of the + month". + + + The '#' character is allowed for the day-of-week field. This character is + used to specify "the nth" XXX day of the month. For example, the + value of "6#3" in the day-of-week field means the third Friday of + the month (day 6 = Friday and "#3" = the 3rd one in the month). + Other examples: "2#1" = the first Monday of the month and + "4#5" = the fifth Wednesday of the month. Note that if you specify + "#5" and there is not 5 of the given day-of-week in the month, then + no firing will occur that month. If the '#' character is used, there can + only be one expression in the day-of-week field ("3#1,6#3" is + not valid, since there are two expressions). + + + + + + The legal characters and the names of months and days of the week are not + case sensitive. + + + NOTES: +
    +
  • Support for specifying both a day-of-week and a day-of-month value is + not complete (you'll need to use the '?' character in one of these fields). +
  • +
  • Overflowing ranges is supported - that is, having a larger number on + the left hand side than the right. You might do 22-2 to catch 10 o'clock + at night until 2 o'clock in the morning, or you might have NOV-FEB. It is + very important to note that overuse of overflowing ranges creates ranges + that don't make sense and no effort has been made to determine which + interpretation CronExpression chooses. An example would be + "0 0 14-6 ? * FRI-MON".
  • +
+
+
+ Sharada Jambula + James House + Contributions from Mads Henderson + Refactoring from CronTrigger to CronExpression by Aaron Craven + Marko Lahma (.NET) +
+ + + Field specification for second. + + + + + Field specification for minute. + + + + + Field specification for hour. + + + + + Field specification for day of month. + + + + + Field specification for month. + + + + + Field specification for day of week. + + + + + Field specification for year. + + + + + Field specification for all wildcard value '*'. + + + + + Field specification for not specified value '?'. + + + + + Field specification for wildcard '*'. + + + + + Field specification for no specification at all '?'. + + + + + Seconds. + + + + + minutes. + + + + + Hours. + + + + + Days of month. + + + + + Months. + + + + + Days of week. + + + + + Years. + + + + + Last day of week. + + + + + Nth day of week. + + + + + Last day of month. + + + + + Nearest weekday. + + + + + Calendar day of week. + + + + + Calendar day of month. + + + + + Expression parsed. + + + + + Constructs a new based on the specified + parameter. + + + String representation of the cron expression the new object should represent + + + + + + Indicates whether the given date satisfies the cron expression. + + + Note that milliseconds are ignored, so two Dates falling on different milliseconds + of the same second will always have the same result here. + + The date to evaluate. + a boolean indicating whether the given date satisfies the cron expression + + + + Returns the next date/time after the given date/time which + satisfies the cron expression. + + the date/time at which to begin the search for the next valid date/time + the next valid date/time + + + + Returns the next date/time after the given date/time which does + not satisfy the expression. + + the date/time at which to begin the search for the next invalid date/time + the next valid date/time + + + + Returns the string representation of the + + The string representation of the + + + + Indicates whether the specified cron expression can be parsed into a + valid cron expression + + the expression to evaluate + a boolean indicating whether the given expression is a valid cron + expression + + + + Builds the expression. + + The expression. + + + + Stores the expression values. + + The position. + The string to traverse. + The type of value. + + + + + Checks the next value. + + The position. + The string to check. + The value. + The type to search. + + + + + Gets the expression summary. + + + + + + Gets the expression set summary. + + The data. + + + + + Skips the white space. + + The i. + The s. + + + + + Finds the next white space. + + The i. + The s. + + + + + Adds to set. + + The val. + The end. + The incr. + The type. + + + + Gets the set of given type. + + The type of set to get. + + + + + Gets the value. + + The v. + The s. + The i. + + + + + Gets the numeric value from string. + + The string to parse from. + The i. + + + + + Gets the month number. + + The string to map with. + + + + + Gets the day of week number. + + The s. + + + + + Gets the time from given time parts. + + The seconds. + The minutes. + The hours. + The day of month. + The month. + + + + + Gets the next fire time after the given time. + + The UTC time to start searching from. + + + + + Creates the date time without milliseconds. + + The time. + + + + + Advance the calendar to the particular hour paying particular attention + to daylight saving problems. + + The date. + The hour. + + + + + Gets the time before. + + The end time. + + + + + NOT YET IMPLEMENTED: Returns the final time that the + will match. + + + + + + Determines whether given year is a leap year. + + The year. + + true if the specified year is a leap year; otherwise, false. + + + + + Gets the last day of month. + + The month num. + The year. + + + + + Creates a new object that is a copy of the current instance. + + + A new object that is a copy of this instance. + + + + + Determines whether the specified is equal to the current . + + + true if the specified is equal to the current ; otherwise, false. + + The to compare with the current . + + + + Determines whether the specified is equal to the current . + + + true if the specified is equal to the current ; otherwise, false. + + The to compare with the current . + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + 2 + + + + Sets or gets the time zone for which the of this + will be resolved. + + + + + Gets the cron expression string. + + The cron expression string. + + + + Helper class for cron expression handling. + + + + + The value. + + + + + The position. + + + + + CronScheduleBuilder is a that defines + -based schedules for s. + + + + Quartz provides a builder-style API for constructing scheduling-related + entities via a Domain-Specific Language (DSL). The DSL can best be + utilized through the usage of static imports of the methods on the classes + , , + , , + and the various implementations. + + + Client code can then use the DSL to write code such as this: + + + IJobDetail job = JobBuilder.Create<MyJob>() + .WithIdentity("myJob") + .Build(); + ITrigger trigger = newTrigger() + .WithIdentity(triggerKey("myTrigger", "myTriggerGroup")) + .WithSimpleSchedule(x => x.WithIntervalInHours(1).RepeatForever()) + .StartAt(DateBuilder.FutureDate(10, IntervalUnit.Minute)) + .Build(); + scheduler.scheduleJob(job, trigger); + + + + + + + + + + + + Build the actual Trigger -- NOT intended to be invoked by end users, + but will rather be invoked by a TriggerBuilder which this + ScheduleBuilder is given to. + + + + + + Create a CronScheduleBuilder with the given cron-expression - which + is presumed to b e valid cron expression (and hence only a RuntimeException + will be thrown if it is not). + + + + the cron expression to base the schedule on. + the new CronScheduleBuilder + + + + + Create a CronScheduleBuilder with the given cron-expression string - which + may not be a valid cron expression (and hence a ParseException will be thrown + f it is not). + + the cron expression string to base the schedule on + the new CronScheduleBuilder + + + + + Create a CronScheduleBuilder with the given cron-expression. + + the cron expression to base the schedule on. + the new CronScheduleBuilder + + + + + Create a CronScheduleBuilder with a cron-expression that sets the + schedule to fire every day at the given time (hour and minute). + + + + the hour of day to fire + the minute of the given hour to fire + the new CronScheduleBuilder + + + + + Create a CronScheduleBuilder with a cron-expression that sets the + schedule to fire at the given day at the given time (hour and minute) on the given days of the week. + + the hour of day to fire + the minute of the given hour to fire + the days of the week to fire + the new CronScheduleBuilder + + + + + Create a CronScheduleBuilder with a cron-expression that sets the + schedule to fire one per week on the given day at the given time + (hour and minute). + + + + the day of the week to fire + the hour of day to fire + the minute of the given hour to fire + the new CronScheduleBuilder + + + + + Create a CronScheduleBuilder with a cron-expression that sets the + schedule to fire one per month on the given day of month at the given + time (hour and minute). + + + + the day of the month to fire + the hour of day to fire + the minute of the given hour to fire + the new CronScheduleBuilder + + + + + The in which to base the schedule. + + + + the time-zone for the schedule. + the updated CronScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + + + the updated CronScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + + + the updated CronScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + + + the updated CronScheduleBuilder + + + + + Extension methods that attach to . + + + + + A implementation that build schedule for DailyTimeIntervalTrigger. + + + + This builder provide an extra convenient method for you to set the trigger's EndTimeOfDay. You may + use either endingDailyAt() or EndingDailyAfterCount() to set the value. The later will auto calculate + your EndTimeOfDay by using the interval, IntervalUnit and StartTimeOfDay to perform the calculation. + + + When using EndingDailyAfterCount(), you should note that it is used to calculating EndTimeOfDay. So + if your startTime on the first day is already pass by a time that would not add up to the count you + expected, until the next day comes. Remember that DailyTimeIntervalTrigger will use StartTimeOfDay + and endTimeOfDay as fresh per each day! + + + Quartz provides a builder-style API for constructing scheduling-related + entities via a Domain-Specific Language (DSL). The DSL can best be + utilized through the usage of static imports of the methods on the classes + , , + , , + and the various implementations. + + Client code can then use the DSL to write code such as this: + + IJobDetail job = JobBuilder.Create<MyJob>() + .WithIdentity("myJob") + .Build(); + + ITrigger trigger = TriggerBuilder.Create() + .WithIdentity(triggerKey("myTrigger", "myTriggerGroup")) + .WithDailyTimeIntervalSchedule(x => + x.WithIntervalInMinutes(15) + .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(8, 0)) + .Build(); + + scheduler.scheduleJob(job, trigger); + + + James House + Zemian Deng saltnlight5@gmail.com + Nuno Maia (.NET) + + + + A set of all days of the week. + + + The set contains all values between and + + + + + A set of the business days of the week (for locales similar to the USA). + + + The set contains all values between and + + + + + A set of the weekend days of the week (for locales similar to the USA). + + + The set contains and + + + + + Create a DailyTimeIntervalScheduleBuilder + + The new DailyTimeIntervalScheduleBuilder + + + + Build the actual Trigger -- NOT intended to be invoked by end users, + but will rather be invoked by a TriggerBuilder which this + ScheduleBuilder is given to. + + + + + + Specify the time unit and interval for the Trigger to be produced. + + + + the interval at which the trigger should repeat. + the time unit (IntervalUnit) of the interval. + the updated CalendarIntervalScheduleBuilder + + + + + + Specify an interval in the IntervalUnit.Second that the produced + Trigger will repeat at. + + The number of seconds at which the trigger should repeat. + the updated DailyTimeIntervalScheduleBuilder> + + + + + + Specify an interval in the IntervalUnit.Minute that the produced + Trigger will repeat at. + + The number of minutes at which the trigger should repeat. + the updated DailyTimeIntervalScheduleBuilder> + + + + + + Specify an interval in the IntervalUnit.Hour that the produced + Trigger will repeat at. + + The number of hours at which the trigger should repeat. + the updated DailyTimeIntervalScheduleBuilder> + + + + + + Set the trigger to fire on the given days of the week. + + a Set containing the integers representing the days of the week, defined by - . + + the updated DailyTimeIntervalScheduleBuilder + + + + Set the trigger to fire on the given days of the week. + + a variable length list of week days representing the days of the week + the updated DailyTimeIntervalScheduleBuilder + + + + Set the trigger to fire on the days from Monday through Friday. + + the updated DailyTimeIntervalScheduleBuilder + + + + Set the trigger to fire on the days Saturday and Sunday. + + the updated DailyTimeIntervalScheduleBuilder + + + + Set the trigger to fire on all days of the week. + + the updated DailyTimeIntervalScheduleBuilder + + + + Set the trigger to begin firing each day at the given time. + + + the updated DailyTimeIntervalScheduleBuilder + + + + Set the startTimeOfDay for this trigger to end firing each day at the given time. + + + the updated DailyTimeIntervalScheduleBuilder + + + + Calculate and set the EndTimeOfDay using count, interval and StarTimeOfDay. This means + that these must be set before this method is call. + + + the updated DailyTimeIntervalScheduleBuilder + + + + If the Trigger misfires, use the + instruction. + + the updated DailyTimeIntervalScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + the updated DailyTimeIntervalScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + the updated DailyTimeIntervalScheduleBuilder + + + + + Set number of times for interval to repeat. + + + Note: if you want total count = 1 (at start time) + repeatCount + + + + + + + Extension methods that attach to . + + + + + DateBuilder is used to conveniently create + instances that meet particular criteria. + + + + Quartz provides a builder-style API for constructing scheduling-related + entities via a Domain-Specific Language (DSL). The DSL can best be + utilized through the usage of static imports of the methods on the classes + , , + , , + and the various implementations. + + Client code can then use the DSL to write code such as this: + + IJobDetail job = JobBuilder.Create<MyJob>() + .WithIdentity("myJob") + .Build(); + ITrigger trigger = newTrigger() + .WithIdentity(triggerKey("myTrigger", "myTriggerGroup")) + .WithSimpleSchedule(x => x + .WithIntervalInHours(1) + .RepeatForever()) + .StartAt(DateBuilder.FutureDate(10, IntervalUnit.Minutes)) + .Build(); + scheduler.scheduleJob(job, trigger); + + + + + + + + Create a DateBuilder, with initial settings for the current date + and time in the system default timezone. + + + + + Create a DateBuilder, with initial settings for the current date and time in the given timezone. + + + + + + Create a DateBuilder, with initial settings for the current date and time in the system default timezone. + + + + + + Create a DateBuilder, with initial settings for the current date and time in the given timezone. + + Time zone to use. + + + + + Build the defined by this builder instance. + + New date time based on builder parameters. + + + + Set the hour (0-23) for the Date that will be built by this builder. + + + + + + + Set the minute (0-59) for the Date that will be built by this builder. + + + + + + + Set the second (0-59) for the Date that will be built by this builder, and truncate the milliseconds to 000. + + + + + + + Set the day of month (1-31) for the Date that will be built by this builder. + + + + + + + Set the month (1-12) for the Date that will be built by this builder. + + + + + + + Set the year for the Date that will be built by this builder. + + + + + + + Set the TimeZoneInfo for the Date that will be built by this builder (if "null", system default will be used) + + + + + + + Get a object that represents the given time, on + tomorrow's date. + + + + + + + + + Get a object that represents the given time, on + today's date (equivalent to . + + + + + + + + + Get a object that represents the given time, on today's date. + + The value (0-59) to give the seconds field of the date + The value (0-59) to give the minutes field of the date + The value (0-23) to give the hours field of the date + the new date + + + + Get a object that represents the given time, on the + given date. + + The value (0-59) to give the seconds field of the date + The value (0-59) to give the minutes field of the date + The value (0-23) to give the hours field of the date + The value (1-31) to give the day of month field of the date + The value (1-12) to give the month field of the date + the new date + + + + Get a object that represents the given time, on the + given date. + + + + The value (0-59) to give the seconds field of the date + The value (0-59) to give the minutes field of the date + The value (0-23) to give the hours field of the date + The value (1-31) to give the day of month field of the date + The value (1-12) to give the month field of the date + The value (1970-2099) to give the year field of the date + the new date + + + + Returns a date that is rounded to the next even hour after the current time. + + + For example a current time of 08:13:54 would result in a date + with the time of 09:00:00. If the date's time is in the 23rd hour, the + date's 'day' will be promoted, and the time will be set to 00:00:00. + + the new rounded date + + + + Returns a date that is rounded to the next even hour above the given date. + + + For example an input date with a time of 08:13:54 would result in a date + with the time of 09:00:00. If the date's time is in the 23rd hour, the + date's 'day' will be promoted, and the time will be set to 00:00:00. + + the Date to round, if the current time will + be used + the new rounded date + + + + Returns a date that is rounded to the previous even hour below the given date. + + + For example an input date with a time of 08:13:54 would result in a date + with the time of 08:00:00. + + the Date to round, if the current time will + be used + the new rounded date + + + + + Returns a date that is rounded to the next even minute after the current time. + + + + For example a current time of 08:13:54 would result in a date + with the time of 08:14:00. If the date's time is in the 59th minute, + then the hour (and possibly the day) will be promoted. + + the new rounded date + + + + Returns a date that is rounded to the next even minute above the given date. + + + For example an input date with a time of 08:13:54 would result in a date + with the time of 08:14:00. If the date's time is in the 59th minute, + then the hour (and possibly the day) will be promoted. + + The Date to round, if the current time will be used + The new rounded date + + + + Returns a date that is rounded to the previous even minute below the given date. + + + For example an input date with a time of 08:13:54 would result in a date + with the time of 08:13:00. + + the Date to round, if the current time will + be used + the new rounded date + + + + Returns a date that is rounded to the next even second after the current time. + + the new rounded date + + + + Returns a date that is rounded to the next even second above the given date. + + + the Date to round, if the current time will + be used + the new rounded date + + + + Returns a date that is rounded to the previous even second below the + given date. + + + + For example an input date with a time of 08:13:54.341 would result in a + date with the time of 08:13:00.000. + + + + the Date to round, if the current time will + be used + the new rounded date + + + + Returns a date that is rounded to the next even multiple of the given + minute. + + + + For example an input date with a time of 08:13:54, and an input + minute-base of 5 would result in a date with the time of 08:15:00. The + same input date with an input minute-base of 10 would result in a date + with the time of 08:20:00. But a date with the time 08:53:31 and an + input minute-base of 45 would result in 09:00:00, because the even-hour + is the next 'base' for 45-minute intervals. + + + More examples: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Input TimeMinute-BaseResult Time
11:16:412011:20:00
11:36:412011:40:00
11:46:412012:00:00
11:26:413011:30:00
11:36:413012:00:00
11:16:411711:17:00
11:17:411711:34:00
11:52:411712:00:00
11:52:41511:55:00
11:57:41512:00:00
11:17:41012:00:00
11:17:41111:08:00
+
+
+ + the Date to round, if the current time will + be used + + the base-minute to set the time on + the new rounded date + +
+ + + + Returns a date that is rounded to the next even multiple of the given + minute. + + + + The rules for calculating the second are the same as those for + calculating the minute in the method . + + the Date to round, if the current time will + be used + the base-second to set the time on + the new rounded date + + + + + An attribute that marks a class as one that must not have multiple + instances executed concurrently (where instance is based-upon a + definition - or in other words based upon a . + + + This can be used in lieu of implementing the StatefulJob marker interface that + was used prior to Quartz 2.0 + + + James House + Marko Lahma (.NET) + + + + The interface to be implemented by s that provide a + mechanism for having their execution interrupted. It is NOT a requirement + for jobs to implement this interface - in fact, for most people, none of + their jobs will. + + + + The means of actually interrupting the Job must be implemented within the + itself (the method of this + interface is simply a means for the scheduler to inform the + that a request has been made for it to be interrupted). The mechanism that + your jobs use to interrupt themselves might vary between implementations. + However the principle idea in any implementation should be to have the + body of the job's periodically check some flag to + see if an interruption has been requested, and if the flag is set, somehow + abort the performance of the rest of the job's work. An example of + interrupting a job can be found in the java source for the class + . It is legal to use + some combination of and + synchronization within and + in order to have the method block until the + signals that it has noticed the set flag. + + + + If the Job performs some form of blocking I/O or similar functions, you may + want to consider having the method store a + reference to the calling as a member variable. Then the + implementation of this interfaces method can call + on that Thread. Before attempting this, make + sure that you fully understand what + does and doesn't do. Also make sure that you clear the Job's member + reference to the Thread when the Execute(..) method exits (preferably in a + block. + + + + + + James House + Marko Lahma (.NET) + + + + Called by the when a user + interrupts the . + + void (nothing) if job interrupt is successful. + + + + Supported interval units used by . + + + + + A marker interface for s that + wish to have their state maintained between executions. + + + instances follow slightly different rules from + regular instances. The key difference is that their + associated is re-persisted after every + execution of the job, thus preserving state for the next execution. The + other difference is that stateful jobs are not allowed to Execute + concurrently, which means new triggers that occur before the completion of + the method will be delayed. + + + + + + + + James House + Marko Lahma (.NET) + + + + JobBuilder is used to instantiate s. + + + + The builder will always try to keep itself in a valid state, with + reasonable defaults set for calling Build() at any point. For instance + if you do not invoke WithIdentity(..) a job name will be generated + for you. + + + Quartz provides a builder-style API for constructing scheduling-related + entities via a Domain-Specific Language (DSL). The DSL can best be + utilized through the usage of static imports of the methods on the classes + , , + , , + and the various implementations. + + + Client code can then use the DSL to write code such as this: + + + IJobDetail job = JobBuilder.Create<MyJob>() + .WithIdentity("myJob") + .Build(); + + ITrigger trigger = TriggerBuilder.Create() + .WithIdentity("myTrigger", "myTriggerGroup") + .WithSimpleSchedule(x => x.WithIntervalInHours(1).RepeatForever()) + .StartAt(DateBuilder.FutureDate(10, IntervalUnit.Minute)) + .Build(); + + scheduler.scheduleJob(job, trigger); + + + + + + + + + Create a JobBuilder with which to define a . + + a new JobBuilder + + + + Create a JobBuilder with which to define a , + and set the class name of the job to be executed. + + a new JobBuilder + + + + Create a JobBuilder with which to define a , + and set the class name of the job to be executed. + + a new JobBuilder + + + + Produce the instance defined by this JobBuilder. + + the defined JobDetail. + + + + Use a with the given name and default group to + identify the JobDetail. + + + If none of the 'withIdentity' methods are set on the JobBuilder, + then a random, unique JobKey will be generated. + + the name element for the Job's JobKey + the updated JobBuilder + + + + + + Use a with the given name and group to + identify the JobDetail. + + + If none of the 'withIdentity' methods are set on the JobBuilder, + then a random, unique JobKey will be generated. + + the name element for the Job's JobKey + the group element for the Job's JobKey + the updated JobBuilder + + + + + + Use a to identify the JobDetail. + + + If none of the 'withIdentity' methods are set on the JobBuilder, + then a random, unique JobKey will be generated. + + the Job's JobKey + the updated JobBuilder + + + + + + Set the given (human-meaningful) description of the Job. + + the description for the Job + the updated JobBuilder + + + + + Set the class which will be instantiated and executed when a + Trigger fires that is associated with this JobDetail. + + the updated JobBuilder + + + + + Set the class which will be instantiated and executed when a + Trigger fires that is associated with this JobDetail. + + the updated JobBuilder + + + + + Instructs the whether or not the job + should be re-executed if a 'recovery' or 'fail-over' situation is + encountered. + + + If not explicitly set, the default value is . + + the updated JobBuilder + + + + + Instructs the whether or not the job + should be re-executed if a 'recovery' or 'fail-over' situation is + encountered. + + + If not explicitly set, the default value is . + + + the updated JobBuilder + + + + Whether or not the job should remain stored after it is + orphaned (no s point to it). + + + If not explicitly set, the default value is . + + the updated JobBuilder + + + + + Whether or not the job should remain stored after it is + orphaned (no s point to it). + + + If not explicitly set, the default value is . + + the value to set for the durability property. + the updated JobBuilder + + + + + Add the given key-value pair to the JobDetail's . + + the updated JobBuilder + + + + + Add the given key-value pair to the JobDetail's . + + the updated JobBuilder + + + + + Add the given key-value pair to the JobDetail's . + + the updated JobBuilder + + + + + Add the given key-value pair to the JobDetail's . + + the updated JobBuilder + + + + + Add the given key-value pair to the JobDetail's . + + the updated JobBuilder + + + + + Add the given key-value pair to the JobDetail's . + + the updated JobBuilder + + + + + Set the JobDetail's , adding any values to it + that were already set on this JobBuilder using any of the + other 'usingJobData' methods. + + the updated JobBuilder + + + + + Holds state information for instances. + + + instances are stored once when the + is added to a scheduler. They are also re-persisted after every execution of + instances that have present. + + instances can also be stored with a + . This can be useful in the case where you have a Job + that is stored in the scheduler for regular/repeated use by multiple + Triggers, yet with each independent triggering, you want to supply the + Job with different data inputs. + + + The passed to a Job at execution time + also contains a convenience that is the result + of merging the contents of the trigger's JobDataMap (if any) over the + Job's JobDataMap (if any). + + + + + + + James House + Marko Lahma (.NET) + + + + Create an empty . + + + + + Create a with the given data. + + + + + Create a with the given data. + + + + + Serialization constructor. + + + + + + + Adds the given value as a string version to the + 's data map. + + + + + Adds the given value as a string version to the + 's data map. + + + + + Adds the given value as a string version to the + 's data map. + + + + + Adds the given value as a string version to the + 's data map. + + + + + Adds the given value as a string version to the + 's data map. + + + + + Adds the given value as a string version to the + 's data map. + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the + . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Gets the date time. + + The key. + + + + + Gets the value behind the specified key. + + The key. + + + + + An exception that can be thrown by a + to indicate to the Quartz that an error + occurred while executing, and whether or not the requests + to be re-fired immediately (using the same , + or whether it wants to be unscheduled. + + + Note that if the flag for 'refire immediately' is set, the flags for + unscheduling the Job are ignored. + + + + + James House + Marko Lahma (.NET) + + + + Create a JobExcecutionException, with the 're-fire immediately' flag set + to . + + + + + Create a JobExcecutionException, with the given cause. + + The cause. + + + + Create a JobExcecutionException, with the given message. + + + + + Initializes a new instance of the class. + + The message. + The original cause. + + + + Create a JobExcecutionException with the 're-fire immediately' flag set + to the given value. + + + + + Create a JobExcecutionException with the given underlying exception, and + the 're-fire immediately' flag set to the given value. + + + + + Create a JobExcecutionException with the given message, and underlying + exception, and the 're-fire immediately' flag set to the given value. + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + Creates and returns a string representation of the current exception. + + + A string representation of the current exception. + + + + + + Gets or sets a value indicating whether to unschedule firing trigger. + + + true if firing trigger should be unscheduled; otherwise, false. + + + + + Gets or sets a value indicating whether to unschedule all triggers. + + + true if all triggers should be unscheduled; otherwise, false. + + + + + Gets or sets a value indicating whether to refire immediately. + + true if to refire immediately; otherwise, false. + + + + Uniquely identifies a . + + + Keys are composed of both a name and group, and the name must be unique + within the group. If only a group is specified then the default group + name will be used. + + Quartz provides a builder-style API for constructing scheduling-related + entities via a Domain-Specific Language (DSL). The DSL can best be + utilized through the usage of static imports of the methods on the classes + , , + , , + and the various implementations. + + Client code can then use the DSL to write code such as this: + + IJobDetail job = JobBuilder.Create<MyJob>() + .WithIdentity("myJob") + .Build(); + ITrigger trigger = TriggerBuilder.Create() + .WithIdentity("myTrigger", "myTriggerGroup") + .WithSimpleSchedule(x => x + .WithIntervalInHours(1) + .RepeatForever()) + .StartAt(DateBuilder.FutureDate(10, IntervalUnit.Minute)) + .Build(); + scheduler.scheduleJob(job, trigger); + + + + + + + + Misfire instructions. + + Marko Lahma (.NET) + + + + Instruction not set (yet). + + + + + Use smart policy. + + + + + Instructs the that the + will never be evaluated for a misfire situation, + and that the scheduler will simply try to fire it as soon as it can, + and then update the Trigger as if it had fired at the proper time. + + + NOTE: if a trigger uses this instruction, and it has missed + several of its scheduled firings, then several rapid firings may occur + as the trigger attempt to catch back up to where it would have been. + For example, a SimpleTrigger that fires every 15 seconds which has + misfired for 5 minutes will fire 20 times once it gets the chance to + fire. + + + + + Misfire policy settings for SimpleTrigger. + + + + + Instructs the that upon a mis-fire + situation, the wants to be fired + now by . + + NOTE: This instruction should typically only be used for + 'one-shot' (non-repeating) Triggers. If it is used on a trigger with a + repeat count > 0 then it is equivalent to the instruction + . + + + + + + Instructs the that upon a mis-fire + situation, the wants to be + re-scheduled to 'now' (even if the associated + excludes 'now') with the repeat count left as-is. This does obey the + end-time however, so if 'now' is after the + end-time the will not fire again. + + + + NOTE: Use of this instruction causes the trigger to 'forget' + the start-time and repeat-count that it was originally setup with (this + is only an issue if you for some reason wanted to be able to tell what + the original values were at some later time). + + + + + + Instructs the that upon a mis-fire + situation, the wants to be + re-scheduled to 'now' (even if the associated + excludes 'now') with the repeat count set to what it would be, if it had + not missed any firings. This does obey the end-time + however, so if 'now' is after the end-time the will + not fire again. + + + NOTE: Use of this instruction causes the trigger to 'forget' + the start-time and repeat-count that it was originally setup with. + Instead, the repeat count on the trigger will be changed to whatever + the remaining repeat count is (this is only an issue if you for some + reason wanted to be able to tell what the original values were at some + later time). + + + + NOTE: This instruction could cause the + to go to the 'COMPLETE' state after firing 'now', if all the + repeat-fire-times where missed. + + + + + + Instructs the that upon a mis-fire + situation, the wants to be + re-scheduled to the next scheduled time after 'now' - taking into + account any associated , and with the + repeat count set to what it would be, if it had not missed any firings. + + + NOTE/WARNING: This instruction could cause the + to go directly to the 'COMPLETE' state if all fire-times where missed. + + + + + Instructs the that upon a mis-fire + situation, the wants to be + re-scheduled to the next scheduled time after 'now' - taking into + account any associated , and with the + repeat count left unchanged. + + + + NOTE/WARNING: This instruction could cause the + to go directly to the 'COMPLETE' state if all the end-time of the trigger + has arrived. + + + + + + misfire instructions for CronTrigger + + + + + Instructs the that upon a mis-fire + situation, the wants to be fired now + by . + + + + + Instructs the that upon a mis-fire + situation, the wants to have it's + next-fire-time updated to the next time in the schedule after the + current time (taking into account any associated , + but it does not want to be fired now. + + + + + misfire instructions for NthIncludedDayTrigger + + + + + Instructs the that upon a mis-fire situation, the + wants to be fired now by the + + + + + + Instructs the that upon a mis-fire situation, the + wants to have + nextFireTime updated to the next time in the schedule after + the current time, but it does not want to be fired now. + + + + + Misfire instructions for DateIntervalTrigger + + + + + Instructs the that upon a mis-fire + situation, the wants to be + fired now by . + + + + + Instructs the that upon a mis-fire + situation, the wants to have it's + next-fire-time updated to the next time in the schedule after the + current time (taking into account any associated , + but it does not want to be fired now. + + + + + Misfire instructions for DailyTimeIntervalTrigger + + + + + Instructs the that upon a mis-fire + situation, the wants to be + fired now by . + + + + + Instructs the that upon a mis-fire + situation, the wants to have it's + next-fire-time updated to the next time in the schedule after the + current time (taking into account any associated , + but it does not want to be fired now. + + + + + A trigger which fires on the Nth day of every interval type + , or + that is not excluded by the associated + calendar. + + + When determining what the Nth day of the month or year + is, will skip excluded days on the + associated calendar. This would commonly be used in an Nth + business day situation, in which the user wishes to fire a particular job on + the Nth business day (i.e. the 5th business day of + every month). Each also has an associated + which indicates at what time of day the trigger is + to fire. + + All s default to a monthly interval type + (fires on the Nth day of every month) with N = 1 (first + non-excluded day) and set to 12:00 PM (noon). These + values can be changed using the , , and + methods. Users may also want to note the + and + methods. + + + Take, for example, the following calendar: + + + July August September + Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa + 1 W 1 2 3 4 5 W 1 2 W + W H 5 6 7 8 W W 8 9 10 11 12 W W H 6 7 8 9 W + W 11 12 13 14 15 W W 15 16 17 18 19 W W 12 13 14 15 16 W + W 18 19 20 21 22 W W 22 23 24 25 26 W W 19 20 21 22 23 W + W 25 26 27 28 29 W W 29 30 31 W 26 27 28 29 30 + W + + Where W's represent weekend days, and H's represent holidays, all of which + are excluded on a calendar associated with an + with n=5 and + intervalType=IntervalTypeMonthly. In this case, the trigger + would fire on the 8th of July (because of the July 4 holiday), + the 5th of August, and the 8th of September (because + of Labor Day). + + Aaron Craven + Marko Lahma (.NET) + + + + Indicates a monthly trigger type (fires on the Nth included + day of every month). + + + + indicates a yearly trigger type (fires on the Nth included + day of every year). + + + + + Indicates a weekly trigger type (fires on the Nth included + day of every week). When using this interval type, care must be taken + not to think of the value of as an analog to + . Such a comparison can only + be drawn when there are no calendars associated with the trigger. To + illustrate, consider an with + n = 3 which is associated with a Calendar excluding + non-weekdays. The trigger would fire on the 3rd + included day of the week, which would be 4th + actual day of the week. + + + + + Create an with no specified name, + group, or . This will result initially in a + default monthly trigger that fires on the first day of every month at + 12:00 PM (n = 1, + intervalType=, + fireAtTime="12:00"). + + + Note that and , must be + called before the can be placed into + a . + + + + + Create an with the given name and + default group but no specified . This will result + initially in a default monthly trigger that fires on the first day of + every month at 12:00 PM (=1, + intervalType=, + fireAtTime=12:00"). + + Note that must + be called before the can be placed + into a . + + + the name for the + + + + + Create an with the given name and + group but no specified . This will result + initially in a default monthly trigger that fires on the first day of + every month at 12:00 PM (=1, + intervalType=, + fireAtTime=12:00"). + + Note that must + be called before the can be placed + into a . + + + the name for the + + the group for the + + + + + Create an with the given name and + group and the specified . This will result + initially in a default monthly trigger that fires on the first day of + every month at 12:00 PM (=1, + intervalType=, + fireAtTime="12:00"). + + The name for the . + The group for the . + The name of the job to associate with the . + The group containing the job to associate with the . + + + + Returns the next UTC time at which the + will fire. If the trigger will not fire again, will be + returned. + + + + Because of the conceptual design of , + it is not always possible to decide with certainty that the trigger + will never fire again. Therefore, it will search for the next + fire time up to a given cutoff. These cutoffs can be changed by using the + property. The default cutoff is 12 + of the intervals specified by intervalType. + + + The returned value is not guaranteed to be valid until after + the trigger has been added to the scheduler. + + + the next fire time for the trigger + + + + + Returns the previous UTC time at which the + fired. If the trigger has not yet + fired, will be returned. + + the previous fire time for the trigger + + + + Returns the first time the will fire + after the specified date. + + + + Because of the conceptual design of , + it is not always possible to decide with certainty that the trigger + will never fire again. Therefore, it will search for the next + fire time up to a given cutoff. These cutoffs can be changed by using the + property. The default cutoff is 12 + of the intervals specified by intervalType. + + + Therefore, for triggers with intervalType = + , if the trigger + will not fire within 12 + weeks after the given date/time, will be returned. For + triggers with intervalType = + + , if the trigger will not fire within 12 + months after the given date/time, will be returned. + For triggers with intervalType = + + , if the trigger will not fire within 12 + years after the given date/time, will be returned. In + all cases, if the trigger will not fire before , + will be returned. + + + The time after which to find the nearest fire time. + This argument is treated as exclusive 舒 that is, + if afterTime is a valid fire time for the trigger, it + will not be returned as the next fire time. + + + the first time the trigger will fire following the specified date + + + + + Called when the has decided to 'fire' the trigger + (Execute the associated ), in order to give the + a chance to update itself for its next triggering + (if any). + + + + + Called by the scheduler at the time a is first + added to the scheduler, in order to have the + compute its first fire time, based on any associated calendar. + + After this method has been called, + should return a valid answer. + + + + the first time at which the will be fired + by the scheduler, which is also the same value + will return (until after the first + firing of the ). + + + + + Called after the has executed the + associated with the in order + to get the final instruction code from the trigger. + + + The that was used by the + 's method. + + + The thrown by the + , if any (may be ) + + one of the Trigger.INSTRUCTION_XXX constants. + + + + + Used by the to determine whether or not it is + possible for this to fire again. + ' + + + If the returned value is then the + may remove the from the + + + + + A boolean indicator of whether the trigger could potentially fire + again. + + + + + Indicates whether is a valid misfire + instruction for this . + + Whether is valid. + + + Updates the 's state based on the + MisfireInstruction that was selected when the + was created +

+ If the misfire instruction is set to MISFIRE_INSTRUCTION_SMART_POLICY, + then the instruction will be interpreted as + . +

+
+ a new or updated calendar to use for the trigger + +
+ + + Updates the 's state based on the + given new version of the associated . + + A new or updated calendar to use for the trigger + the amount of time that must + be between "now" and the time the next + firing of the trigger is supposed to occur. + + + + + Calculates the first time an with + intervalType = IntervalTypeWeekly will fire + after the specified date. See for more + information. + + The time after which to find the nearest fire time. + This argument is treated as exclusive 舒 that is, + if afterTime is a valid fire time for the trigger, it + will not be returned as the next fire time. + + the first time the trigger will fire following the specified + date + + + + + Calculates the first UTC time an with + intervalType = will fire + after the specified date. See for more + information. + + + The UTC time after which to find the nearest fire time. + This argument is treated as exclusive 舒 that is, + if afterTime is a valid fire time for the trigger, it + will not be returned as the next fire time. + + the first time the trigger will fire following the specified date + + + + Calculates the first time an with + intervalType = will fire + after the specified date. See for more + information. + + + The UTC time after which to find the nearest fire time. + This argument is treated as exclusive 舒 that is, + if afterTime is a valid fire time for the trigger, it + will not be returned as the next fire time. + + the first time the trigger will fire following the specified + date + + + + + Get a that is configured to produce a + schedule identical to this trigger's schedule. + + + + + + + Gets or sets the day of the interval on which the + should fire. If the Nth + day of the interval does not exist (i.e. the 32nd of a + month), the trigger simply will never fire. N may not be less than 1. + + + + + Returns the interval type for the . + + + Sets the interval type for the . If + , the trigger will fire on the + Nth included day of every month. If + , the trigger will fire on the + Nth included day of every year. If + , the trigger will fire on the + Nth included day of every week. + + + + + + + + Returns the fire time for the as a + string with the format "HH:MM[:SS]", with HH representing the + 24-hour clock hour of the fire time. Seconds are optional and their + inclusion depends on whether or not they were provided to + . + + + + + Returns the for the + . + + + + Because of the conceptual design of , + it is not always possible to decide with certainty that the trigger + will never fire again. Therefore, it will search for the next + fire time up to a given cutoff. These cutoffs can be changed by using the + property. The default cutoff is 12 + of the intervals specified by intervalType" />. + + + Because of the conceptual design of , + it is not always possible to decide with certainty that the trigger + will never fire again. Therefore, it will search for the next + fire time up to a given cutoff. These cutoffs can be changed by using the + method. The default cutoff is 12 + of the intervals specified by intervalType". + + + In most cases, the default value of this setting (12) is sufficient (it + is highly unlikely, for example, that you will need to look at more than + 12 months of dates to ensure that your trigger will never fire again). + However, this setting is included to allow for the rare exceptions where + this might not be true. + + + For example, if your trigger is associated with a calendar that excludes + a great many dates in the next 12 months, and hardly any following that, + it is possible (if is large enough) that you could run + into this situation. + + + + + + Returns the last UTC time the will fire. + If the trigger will not fire at any point between + and , will be returned. + + the last time the trigger will fire. + + + + Tells whether this Trigger instance can handle events + in millisecond precision. + + + + + + Sets or gets the time zone in which the will be resolved. + If no time zone is provided, then the default time zone will be used. + + + + + + + Gets or sets the trigger's calendar week rule. + + The trigger calendar week rule. + + + + Gets or sets the trigger's calendar first day of week rule. + + The trigger calendar first day of week. + + + + An exception that is thrown to indicate that an attempt to store a new + object (i.e. , + or ) in a + failed, because one with the same name and group already exists. + + James House + Marko Lahma (.NET) + + + + Create a with the given + message. + + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + Create a and auto-generate a + message using the name/group from the given . + + + + The message will read:
"Unable to store Job with name: '__' and + group: '__', because one already exists with this identification." +
+
+
+ + + Create a and auto-generate a + message using the name/group from the given . + + + + The message will read:
"Unable to store Trigger with name: '__' and + group: '__', because one already exists with this identification." +
+
+
+ + + An attribute that marks a class as one that makes updates to its + during execution, and wishes the scheduler to re-store the + when execution completes. + + + + Jobs that are marked with this annotation should also seriously consider + using the attribute, to avoid data + storage race conditions with concurrently executing job instances. + + + This can be used in lieu of implementing the StatefulJob marker interface that + was used prior to Quartz 2.0 + + + + James House + Marko Lahma (.NET) + + + + An exception that is thrown to indicate that there is a misconfiguration of + the - or one of the components it + configures. + + James House + Marko Lahma (.NET) + + + + Create a with the given message. + + + + + Create a with the given message + and cause. + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + Scheduler constants. + + Marko Lahma (.NET) + + + + A (possibly) useful constant that can be used for specifying the group + that and instances belong to. + + + + + A constant group name used internally by the + scheduler - clients should not use the value of this constant + ("RECOVERING_JOBS") for thename of a 's group. + + + + + A constant group name used internally by the + scheduler - clients should not use the value of this constant + ("FAILED_OVER_JOBS") for thename of a 's group. + + + + + A constant key that can be used to retrieve the + name of the original from a recovery trigger's + data map in the case of a job recovering after a failed scheduler + instance. + + + + + + A constant key that can be used to retrieve the + group of the original from a recovery trigger's + data map in the case of a job recovering after a failed scheduler + instance. + + + + + + A constant key that can be used to retrieve the + scheduled fire time of the original from a recovery + trigger's data map in the case of a job recovering after a failed scheduler + instance. + + + + + + Holds context/environment data that can be made available to Jobs as they + are executed. + + + Future versions of Quartz may make distinctions on how it propagates + data in between instances of proxies to a + single scheduler instance - i.e. if Quartz is being used via WCF of Remoting. + + + James House + Marko Lahma (.NET) + + + + Create an empty . + + + + + Create a with the given data. + + + + + Serialization constructor. + + + + + + + Instructs Scheduler what to do with a trigger and job. + + Marko Lahma (.NET) + + + + Instructs the that the + has no further instructions. + + + + + Instructs the that the + wants the to re-Execute + immediately. If not in a 'RECOVERING' or 'FAILED_OVER' situation, the + execution context will be re-used (giving the the + ability to 'see' anything placed in the context by its last execution). + + + + + Instructs the that the + should be put in the state. + + + + + Instructs the that the + wants itself deleted. + + + + + Instructs the that all + s referencing the same as + this one should be put in the state. + + + + + Instructs the that all + s referencing the same as + this one should be put in the state. + + + + + Instructs the that the + should be put in the state. + + + + + Describes the settings and capabilities of a given + instance. + + James House + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + Name of the scheduler. + The scheduler instance. + The scheduler type. + if set to true, scheduler is a remote scheduler. + if set to true, scheduler is started. + if set to true, scheduler is in standby mode. + if set to true, scheduler is shutdown. + The start time. + The number of jobs executed. + The job store type. + if set to true, job store is persistent. + if set to true, the job store is clustered + The thread pool type. + Size of the thread pool. + The version string. + + + + Returns a formatted (human readable) string describing all the 's + meta-data values. + + + + The format of the string looks something like this: +
+            Quartz Scheduler 'SchedulerName' with instanceId 'SchedulerInstanceId' Scheduler class: 'Quartz.Impl.StdScheduler' - running locally. Running since: '11:33am on Jul 19, 2002' Not currently paused. Number of Triggers fired: '123' Using thread pool 'Quartz.Simpl.SimpleThreadPool' - with '8' threads Using job-store 'Quartz.Impl.JobStore' - which supports persistence.
+            
+
+
+
+ + + Return a simple string representation of this object. + + + + + Returns the name of the . + + + + + Returns the instance Id of the . + + + + + Returns the class-name of the instance. + + + + + Returns whether the is being used remotely (via remoting). + + + + + Returns whether the scheduler has been started. + + + Note: may return even if + returns . + + + + + Reports whether the is in standby mode. + + + Note: may return even if + returns . + + + + + Reports whether the has been Shutdown. + + + + + Returns the class-name of the instance that is + being used by the . + + + + + Returns the type name of the instance that is + being used by the . + + + + + Returns the number of threads currently in the 's + + + + + Returns the version of Quartz that is running. + + + + + Returns the at which the Scheduler started running. + + null if the scheduler has not been started. + + + + + Returns the number of jobs executed since the + started.. + + + + + Returns whether or not the 's + instance supports persistence. + + + + + Returns whether or not the 's + is clustered. + + + + + SimpleScheduleBuilder is a + that defines strict/literal interval-based schedules for + s. + + + + Quartz provides a builder-style API for constructing scheduling-related + entities via a Domain-Specific Language (DSL). The DSL can best be + utilized through the usage of static imports of the methods on the classes + , , + , , + and the various implementations. + + Client code can then use the DSL to write code such as this: + + JobDetail job = JobBuilder.Create<MyJob>() + .WithIdentity("myJob") + .Build(); + Trigger trigger = TriggerBuilder.Create() + .WithIdentity(triggerKey("myTrigger", "myTriggerGroup")) + .WithSimpleSchedule(x => x + .WithIntervalInHours(1) + .RepeatForever()) + .StartAt(DateBuilder.FutureDate(10, IntervalUnit.Minute)) + .Build(); + scheduler.scheduleJob(job, trigger); + + + + + + + + + + + Create a SimpleScheduleBuilder. + + + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat forever with a 1 minute interval. + + + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat forever with an interval + of the given number of minutes. + + + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat forever with a 1 second interval. + + + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat forever with an interval + of the given number of seconds. + + + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat forever with a 1 hour interval. + + + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat forever with an interval + of the given number of hours. + + + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat the given number + of times - 1 with a 1 minute interval. + + + Note: Total count = 1 (at start time) + repeat count + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat the given number + of times - 1 with an interval of the given number of minutes. + + + Note: Total count = 1 (at start time) + repeat count + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat the given number + of times - 1 with a 1 second interval. + + + Note: Total count = 1 (at start time) + repeat count + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat the given number + of times - 1 with an interval of the given number of seconds. + + + Note: Total count = 1 (at start time) + repeat count + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat the given number + of times - 1 with a 1 hour interval. + + + Note: Total count = 1 (at start time) + repeat count + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat the given number + of times - 1 with an interval of the given number of hours. + + + Note: Total count = 1 (at start time) + repeat count + + the new SimpleScheduleBuilder + + + + Build the actual Trigger -- NOT intended to be invoked by end users, + but will rather be invoked by a TriggerBuilder which this + ScheduleBuilder is given to. + + + + + + + + Specify a repeat interval in milliseconds. + + + + the time span at which the trigger should repeat. + the updated SimpleScheduleBuilder + + + + + + Specify a repeat interval in seconds. + + + + the time span at which the trigger should repeat. + the updated SimpleScheduleBuilder + + + + + + Specify a the number of time the trigger will repeat - total number of + firings will be this number + 1. + + + + the number of seconds at which the trigger should repeat. + the updated SimpleScheduleBuilder + + + + + + Specify that the trigger will repeat indefinitely. + + + + the updated SimpleScheduleBuilder + + + + + + + If the Trigger misfires, use the + instruction. + + + + the updated CronScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + + + the updated SimpleScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + + + the updated SimpleScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + + + the updated SimpleScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + + + the updated SimpleScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + + + the updated SimpleScheduleBuilder + + + + + Extension methods that attach to . + + + + + A time source for Quartz.NET that returns the current time. + Original idea by Ayende Rahien: + http://ayende.com/Blog/archive/2008/07/07/Dealing-with-time-in-tests.aspx + + + + + Return current UTC time via . Allows easier unit testing. + + + + + Return current time in current time zone via . Allows easier unit testing. + + + + + Represents a time in hour, minute and second of any given day. + + + The hour is in 24-hour convention, meaning values are from 0 to 23. + + + + + James House + Zemian Deng saltnlight5@gmail.com + Nuno Maia (.NET) + + + + Create a TimeOfDay instance for the given hour, minute and second. + + The hour of day, between 0 and 23. + The minute of the hour, between 0 and 59. + The second of the minute, between 0 and 59. + + + + Create a TimeOfDay instance for the given hour, minute (at the zero second of the minute). + + The hour of day, between 0 and 23. + The minute of the hour, between 0 and 59. + + + + Create a TimeOfDay instance for the given hour, minute and second. + + The hour of day, between 0 and 23. + The minute of the hour, between 0 and 59. + The second of the minute, between 0 and 59. + + + + + Create a TimeOfDay instance for the given hour, minute (at the zero second of the minute).. + + The hour of day, between 0 and 23. + The minute of the hour, between 0 and 59. + The newly instantiated TimeOfDay + + + + Determine with this time of day is before the given time of day. + + + True this time of day is before the given time of day. + + + + Return a date with time of day reset to this object values. The millisecond value will be zero. + + + + + + The hour of the day (between 0 and 23). + + + + + The minute of the hour (between 0 and 59). + + + + + The second of the minute (between 0 and 59). + + + + + Attribute to use with public properties that + can be set with Quartz configuration. Attribute can be used to advice + parsing to use correct type of time span (milliseconds, seconds, minutes, hours) + as it may depend on property. + + Marko Lahma (.NET) + + + + + Initializes a new instance of the class. + + The rule. + + + + Gets the rule. + + The rule. + + + + Possible parse rules for s. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TriggerBuilder is used to instantiate s. + + + + The builder will always try to keep itself in a valid state, with + reasonable defaults set for calling build() at any point. For instance + if you do not invoke WithSchedule(..) method, a default schedule + of firing once immediately will be used. As another example, if you + do not invoked WithIdentity(..) a trigger name will be generated + for you. + + + Quartz provides a builder-style API for constructing scheduling-related + entities via a Domain-Specific Language (DSL). The DSL can best be + utilized through the usage of static imports of the methods on the classes + , , + , , + and the various implementations. + + + Client code can then use the DSL to write code such as this: + + + IJobDetail job = JobBuilder.Create<MyJob>() + .WithIdentity("myJob") + .Build(); + ITrigger trigger = TriggerBuilder.Create() + .WithIdentity("myTrigger", "myTriggerGroup") + .WithSimpleSchedule(x => x + .WithIntervalInHours(1) + .RepeatForever()) + .StartAt(DateBuilder.FutureDate(10, IntervalUnit.Minute)) + .Build(); + scheduler.scheduleJob(job, trigger); + + + + + + + + + + Create a new TriggerBuilder with which to define a + specification for a Trigger. + + + + the new TriggerBuilder + + + + Produce the . + + + + a Trigger that meets the specifications of the builder. + + + + Use a with the given name and default group to + identify the Trigger. + + + If none of the 'withIdentity' methods are set on the TriggerBuilder, + then a random, unique TriggerKey will be generated. + + the name element for the Trigger's TriggerKey + the updated TriggerBuilder + + + + + + Use a TriggerKey with the given name and group to + identify the Trigger. + + + If none of the 'withIdentity' methods are set on the TriggerBuilder, + then a random, unique TriggerKey will be generated. + + the name element for the Trigger's TriggerKey + the group element for the Trigger's TriggerKey + the updated TriggerBuilder + + + + + + Use the given TriggerKey to identify the Trigger. + + + If none of the 'withIdentity' methods are set on the TriggerBuilder, + then a random, unique TriggerKey will be generated. + + the TriggerKey for the Trigger to be built + the updated TriggerBuilder + + + + + + Set the given (human-meaningful) description of the Trigger. + + + + the description for the Trigger + the updated TriggerBuilder + + + + + Set the Trigger's priority. When more than one Trigger have the same + fire time, the scheduler will fire the one with the highest priority + first. + + + + the priority for the Trigger + the updated TriggerBuilder + + + + + + Set the name of the that should be applied to this + Trigger's schedule. + + + + the name of the Calendar to reference. + the updated TriggerBuilder + + + + + + Set the time the Trigger should start at - the trigger may or may + not fire at this time - depending upon the schedule configured for + the Trigger. However the Trigger will NOT fire before this time, + regardless of the Trigger's schedule. + + + + the start time for the Trigger. + the updated TriggerBuilder + + + + + + Set the time the Trigger should start at to the current moment - + the trigger may or may not fire at this time - depending upon the + schedule configured for the Trigger. + + + + the updated TriggerBuilder + + + + + Set the time at which the Trigger will no longer fire - even if it's + schedule has remaining repeats. + + + + the end time for the Trigger. If null, the end time is indefinite. + the updated TriggerBuilder + + + + + + Set the that will be used to define the + Trigger's schedule. + + + The particular used will dictate + the concrete type of Trigger that is produced by the TriggerBuilder. + + the SchedulerBuilder to use. + the updated TriggerBuilder + + + + + + + + Set the identity of the Job which should be fired by the produced + Trigger. + + + + the identity of the Job to fire. + the updated TriggerBuilder + + + + + Set the identity of the Job which should be fired by the produced + Trigger - a will be produced with the given + name and default group. + + + + the name of the job (in default group) to fire. + the updated TriggerBuilder + + + + + Set the identity of the Job which should be fired by the produced + Trigger - a will be produced with the given + name and group. + + + + the name of the job to fire. + the group of the job to fire. + the updated TriggerBuilder + + + + + Set the identity of the Job which should be fired by the produced + Trigger, by extracting the JobKey from the given job. + + + + the Job to fire. + the updated TriggerBuilder + + + + + Add the given key-value pair to the Trigger's . + + + + the updated TriggerBuilder + + + + + Add the given key-value pair to the Trigger's . + + + + the updated TriggerBuilder + + + + + Add the given key-value pair to the Trigger's . + + + + the updated TriggerBuilder + + + + + Add the given key-value pair to the Trigger's . + + + + the updated TriggerBuilder + + + + + Add the given key-value pair to the Trigger's . + + + + the updated TriggerBuilder + + + + + Add the given key-value pair to the Trigger's . + + + + the updated TriggerBuilder + + + + + Add the given key-value pair to the Trigger's . + + + + the updated TriggerBuilder + + + + + Add the given key-value pair to the Trigger's . + + + + the updated TriggerBuilder + + + + + Common constants for triggers. + + + + + The default value for priority. + + + + + Uniquely identifies a . + + + Keys are composed of both a name and group, and the name must be unique + within the group. If only a name is specified then the default group + name will be used. + + + Quartz provides a builder-style API for constructing scheduling-related + entities via a Domain-Specific Language (DSL). The DSL can best be + utilized through the usage of static imports of the methods on the classes + , , + , , + and the various implementations. + + + Client code can then use the DSL to write code such as this: + + + IJobDetail job = JobBuilder.Create<MyJob>() + .WithIdentity("myJob") + .Build(); + ITrigger trigger = TriggerBuilder.Create() + .WithIdentity("myTrigger", "myTriggerGroup") + .WithSimpleSchedule(x => x + .WithIntervalInHours(1) + .RepeatForever()) + .StartAt(DateBuilder.FutureDate(10, IntervalUnit.Minute)) + .Build(); + scheduler.scheduleJob(job, trigger); + + + + + + + + All trigger states known to Scheduler. + + Marko Lahma (.NET) + + + + Indicates that the is in the "normal" state. + + + + + Indicates that the is in the "paused" state. + + + + + Indicates that the is in the "complete" state. + + + "Complete" indicates that the trigger has not remaining fire-times in + its schedule. + + + + + Indicates that the is in the "error" state. + + + + A arrives at the error state when the scheduler + attempts to fire it, but cannot due to an error creating and executing + its related job. Often this is due to the 's + class not existing in the classpath. + + + + When the trigger is in the error state, the scheduler will make no + attempts to fire it. + + + + + + Indicates that the is in the "blocked" state. + + + A arrives at the blocked state when the job that + it is associated with has a and it is + currently executing. + + + + + + Indicates that the does not exist. + + + + + A Comparator that compares trigger's next fire times, or in other words, + sorts them according to earliest next fire time. If the fire times are + the same, then the triggers are sorted according to priority (highest + value first), if the priorities are the same, then they are sorted + by key. + + + + + Convenience and utility methods for simplifying the construction and + configuration of s and DateTimeOffsetOffsets. + + + + James House + Marko Lahma (.NET) + + + + Returns a list of Dates that are the next fire times of a + . + The input trigger will be cloned before any work is done, so you need + not worry about its state being altered by this method. + + The trigger upon which to do the work + The calendar to apply to the trigger's schedule + The number of next fire times to produce + List of java.util.Date objects + + + + Compute the that is 1 second after the Nth firing of + the given , taking the triger's associated + into consideration. + + + The input trigger will be cloned before any work is done, so you need + not worry about its state being altered by this method. + + The trigger upon which to do the work + The calendar to apply to the trigger's schedule + The number of next fire times to produce + the computed Date, or null if the trigger (as configured) will not fire that many times + + + + Returns a list of Dates that are the next fire times of a + that fall within the given date range. The input trigger will be cloned + before any work is done, so you need not worry about its state being + altered by this method. + + NOTE: if this is a trigger that has previously fired within the given + date range, then firings which have already occurred will not be listed + in the output List. + + + The trigger upon which to do the work + The calendar to apply to the trigger's schedule + The starting date at which to find fire times + The ending date at which to stop finding fire times + List of java.util.Date objects + + + + An exception that is thrown to indicate that a call to + failed without interrupting the Job. + + + James House + Marko Lahma (.NET) + + + + Create a with the given message. + + + + + Create a with the given cause. + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + diff --git a/lib/Quartz20/net/4.0/C5.dll b/lib/Quartz20/net/4.0/C5.dll new file mode 100644 index 0000000000000000000000000000000000000000..2130d1fa206f3d5b518d8863687feda53fa93395 GIT binary patch literal 272384 zcmeFa37lM2l|TOay;twm)}2&$r>aRHodDew^{RRcOA;UfWDQ$b#O|;OBw$$bpc+t9 z6q}-`5F7bN`OHZC(iN5k*?J?Fkxud1sPa2$X0|9t-a zN$T$Bo_o%{=bn4+@=n?Ca?7zS%fZ${NX<9q0ASSf3WA| zFDyUnIh$vfT~!Y+tzUTMvWqX=vL(D`*+rX{)vw*MZ1a|7$DDTNvMa-lo5p&3v-=y+ z>yNdplY1O1Jnq5cquRb}^)1i!q%CV1u<|r^+gkXS!G9z%JyQL);*AKwpRRQi(h+~| zq7>S7WXiG@%D^UVBYZ*} zvaGRdHa+hegzp+Q?OLXIC$g})&mODK)-Oh+;07Em{ImAuPwVeUU_VyhbVZ1a#MJ`M zq=7X$C*RRbPX1j*y5f(x*;dNhxYoATKiOktB)0Xlewk(6)C$h)d-rP^&p&Zw`nE@2 zyw^*r-*-R$`6s{qo@bvvdf)i2Hw(3jy^Cxeyt<%48=&fH`clIl9*|_P~M<2Rm!nO_pc0HC= zu&)I}mt?)F?}Z0iR<=^i*0CNogh1`LJG1Gkmkvt^JnkdC2VKUt7F!D| zR+bH2YKH-fFSW~6y4hl7gWagXTg|K67-M{~a-1EG!{=O3^JbstSl-skz=UIs0tVPo zuuJ6$q-v3o+JaGgb`s%{Y?H7&C!B&)`FLBl>N3slge&5rQd`Zp2c=x)>~>u2@F0Rg zoo#gw?V;|2weDoLR^6beLA#^w^G)4->e`MQ9!fwLnfL{9d@5YYgf^TO?*XS(ic>OM z3#Zjj1E<3XsGS~5_fYrYT6Z#AtL`J7M%`=Tx(|r@!SKR8RKAvFK54h*Yt??_)2RI@ zsa^X*tNvwss2^fN>QClt)&GpAQU5W7^spU5%x9~kcB&K}$I>Y$gt*VzZYhN1f$M}P z(hb+)w{nBYUyS3Ue42i~N$;~A18+{etMzn&7u73x%t<%!09Wvulb%wzPAZw+hEJj# z_`L+9bbtl|z9&r-BfNcIK;8EI4A^8r4W7U&sm*AI7QGgU96 z?eZ!LdyzGKPz2kyAYcux2rU=%MaX*LsfaLW{;Um6h2vX`m$%?RoMAR2j)apB2GdGu z#|uwGMAa?jb{5S9fJV0_fMSJHfN8gHEjyqE6aBso=8_JWIoG?H!~p1h4Cp74pxs@I zm@G9!I3F<9g1-lxYi@BKoJ-wt9>844c^xWLp?o@89iD+7yKyFdS1hs{XTcrbwIXL1 zoAlb*V4yhrO!%^%-8dU=lRxl3i~ec)IS0rZxB>v@$3a~wqlIh*1m{O$8E`arI}+f zWmAoi{}lox=*JB_+ZwX$#R_jq;oVN=R<^2=U_09I7Tud9du2;R5ovZcXRxR4fw_@T zm0!cVB2Fk1oF#~7C;#09CzAoY(Z2c3W=|4L7-62Efg{DfUS^SHI-dC#}7k9|2 zuWFYncGYoecCliIS0l!e-!Tc-CCpz5UkmMW$w;;uI_k?+H+kVKQhoVd@hqKA@=+`H zQ{gk}YHL(Vg;;H5Yw6-Z{)vx)R0j92l@NY6!?9d$i9$QPmSvvlsN3g+*CA}n@6=kY zZJ;+;Qs|Z8JK#D6H+*hf%?5x)k_^nppI9fMs*f0U_Qws-wTk;dAHeh}n3P>eCBO`@ zU|$5rkr2T2DHuD1u*p_WbJRWFfLjpkS6HCnJiFk9&qpT5xMM7LZ*{vur;2UTQgVDl5g_bT2WD0&E-Jb~?thkqfLZ&nwUXLJh3BZ5anJ+8^w1p9p z>|O(fV7yRJFj*AK_UFPTVGI^>#mNPXDdb8s0w_pIshN$)kx_A`TV-K%o!z(vNmXz58iwr=fmNDr5+vl9q|)WMtz;L|E2FxiQIKPmqrc3N zQGNk(-1I_b+ZV&@R>@yP{_sWgB8Qm=RUcraSq1(#CUBj<^VR_?l-_F~k6sMOK;Smk zO1N(PL#lLei}{`V8WrnXNfm1+7SWy;b-px^>)D%qX_XahjQZP@ zwdN}I@3I?0in#y0loYY;Yk>F?(=A?xs3zm1PNXFy=c$@A>Or@&G}he0$HUP6UPIFW z3BAEkOJ=KP=jC@U_DZpM{%%q{FRB1}>H~inPN-0QIW30P)Vila*z)?L&h8T-Sk1;5zm z`P+9C{8DN?ezjnQC0lR+)PPAB(g5QDOuFRa$AHNcG63TNOs3T50#3%jkv4f2^f{{^ zZA!Vq5_k5sKrgESugRY0dQCD5lL48B$$(DhfJi2}o`5RZ;XTOdOqX8=hr-hVPcB4# z{IeZRcBjktGM5x_g!WRadNsPO{+apf*Ca;<5P3$~{1vzZ`w-5p zMCFzr{vG^SR2_z~Zh3-spSxm_CoL{c<~@T4M};P9(lm1AJy)@250A=@L!h(qakj}m zPwAIZ`b8Nh1|r{zQdAwY?m%H=rK7Tc^|LS{lHwl?RGC?_-u0H)# z&3F@eKP7#wNoG1w5+@1}E4_YSf{n;r_R`}yKkX{w!9l*GE$}i^PBCyYo;EaC;$$XD zzL%LyIq8|eRESa>5I~BW;_3_7UPu%ui>}Vs(R{bmdh;h$AEf-lqFdyjEkssfIgOz~ z(&Zd!O5RUT_xj#=CZm}q>>&tOR#xqWQplVWo|l=xl$NgcYJ@-GWxNSY4tt@`Q17}F z^#Cz5CaUKr2SjjqtAkA1Uil4xm`@+er8>HmSQ6-By0?OYQ|t4>`;jAnB0|^bDIaO? zsM=2ltrO1GeoEO48D|xVL#g=y3c}$e3Qg^ebc#Z3+b+TmPuQTzi8ji^tfq3P6cU?m zW;Hv+_!c~srdzDVw<%3u6=@yp3(!Sw5Cy)aT&Pf-Cl~RRL7}-0iC~d4(2GJ*fgE8J zh$VVav2v=(<&@va;?!C|K=O711S^rZrl4eiEM%6P=QimYO{!+oV&aDnvUGN+B6Gxv zD9^vByiqd7GUy(xD}ecnD7)o%;dj&+p1~1PdPG3#R>K-hCq$rI@KX3 ze2*!CD&oRe4&5fybHeu`*$E%Q@3cakal`i!B27M}vQ3i@`-~^D3U(sX=3?)BID-tF zO-FKhH~auR171+W8u)|o-j0Rmk_VRKM--1inTiKeejz2D7^14Tkjf!5g-Y$SkSN$i zLlC6SKAx%dR6Jigx3BZInXohSPuM0YQ=D94dubz4%zSO9olL6yA%Ko#)s(gRibz&D z)>)wCUeexUk*9i6G@C<5XTF>>WnzGzleVL}9)u%V zge|lgC_UcwB&&Bl>8@IS&Mz*y*9Re(>t0`Ve5^r~W;@bIVdfp_^5rI~xNEL?=2A;W=!Yi1n* zG#9ZRb6eV)?Xj$72^w!9je9DCSnC(Dre{xI1#QY2gu=-{cprWS zGQov~jA%5R&g`)>?Sd=nCxGLLh+Gakb3qjg!UMI zGGIU}6i|_-zKIHCGJF*#!we=vvyGXl?wtw0iu9~k^tNp-e+}NUiwY1Z&E%o(y%RA5 zDKj;cW;E;-2mIjVLQ3TBK)R4BsLmn^OTjCo#p6Ne^DtCk5l5U~{yOnUi6|am2~O`= z)MHlT8eTif&^c3Y_NvQG;Jj+71tH2Ha1y*Rn=Gp5jayq@*P45O09q}VvB;j?=S^cU z(x;%X+UfIVa=|hEcHAG4rvuy2J%eLY&3wrZ6TOEOUHiX81TD6*=l7g;aAuSaKAu_(mzN^NB>A z7hw$SJ9iAAEA2$CWW@miThTrkEh?f?v zE}ez=ilIqHqaaB32@FK0stO3$wO0j~Bv9!cgmG(aMzwtDqN$9Aobq>24n5Yb<_c~> ztvvyTGNl!QuM`JkIMth}rnOA%{qPptj9O+|lZb$?-IhR9y=E0gh(c`zZc0-~ia3h) z70KgYgU9=U-cVZZLb|Gt%Dag^J6i&2iP%Cb$UBfjk(%k{(}MzbC6z6|dP;yTbTvmV zwCw64R{<$d1vkFauAbvLf}*3XccLOaux74pg&Y9rg3nH;y4bU|jmB6O0kD8*)pJ(Y zVFIwL3)^#H0bT8DuQ`p*H+vQ4t?;{Ooy@%{>k2ew|9Sh~?DvopbA6bifOEp{BbZ=3 zO{hb@m&U=5duI6@ZTG`Q;x08sRalZa_yr8c3H^zV>bO#A`0t3uMoDy# z=a$H95dH=UvZ?QA#@`}5YW6hRaQPh)D%+xRuHdExLn#x(W;;?AluPS?xc^X#egFV! z5Sejr=6+8+B;Yq0RK;e`Muw!m4IR|?q!UAqZ$r8W#I!7(ME7I8H=|zB!G%tLiFz|} z%UqpIgwzo#qX|?Dtv?CW3_h-PE9S&EwvF>W@(0Tr%D15JsBJbm?G)U+slTrdj{Uq!i$!I>5F{|4B;Esbm+TYY!nCCd+9YG4RVz zG9x@94tVT9#6X1Kk!Mou3pv<3M7~WIyqRF3Mz&%G-1f?iv?!$1lC0UQgNC$HE=u!4 zt4D^C$k&^|lLMbRPq21Z2K0gjhW@D}{k@eR1^snsK)L0dJK%{a$|y`@3qTGf>}g1> zepT~AJ%+}RF^n);u^$|wslpCZO4y-nO~Q`>2rs%u_Kb+!qN_Qm^8x<%Fly9xpX&Pup_`~&;!01j?!qUY-WN8)+C%BXlJTg&fSTmS;i6cs*RZr0tU?nQTMmm&&H65-fh6tUr|2K_u z8G`@Q<6MNv|3A)mH_mH+&2e7+-#pH3i*`q-IPrQkp5}OegwvcShq85isl6$l;BW}j zGxHL=_GpJ<{(UdBMY?nThw!DHB(CQMiji5IzT?~)L(Kc)?+s3H%zBb?8PZ)%$XMo; zGn$amEd~(?84>Nhe%mg;ISYX^ESzmuJm`z7tGYj{eJq|khrKaDO*{03nyyZGd(4-L^10SEfAM+oAz;{jM#M30 zB5kHc)7G!X6N;!N@r*d}XU~P*s;RyEsn3Nc|F!1AXrUpq3|Al?`O;c&_{t{fLoijF zGv8^%W<5FaokHYG@qZ=u`z##lW0Kv-;5WPzgvJVq{?-s^W|_gna)P7wC0RIRsC`L* zDY606%prg942`xM49Rv2KoF8>H_bd@mZWZ2nhX*q1Jxp}R0`x(9yBv6wr_(po1-IuNpd7akdvlvAk~*Wv}vn)p*RJPzPqTsikwd?0<%R z$X%-NU$L^rV~G=);Q}HARxG5Oj3_VyYdP3`4{~uQQpO-DRb5o>M_TOFe4(OSyB;Xx5dzA!^@DRdr1qj2akPMcKTIJioFXUu9X_RJN+YbZdt@?IUw?wPs zS+4f#{Eq7Uj_Ulq4AAw~}t3N5zJ2JiOLkai*i< zOh?5T(v9FFy3s#}8kv}GiQ3yJn24WSI;N%Uc4$u?3+v}OG2++KZFbyS?|s5r-p2`O1|Zn51KY}H8t zs=L;sqZqN=eOZ0g3L7vfJ&oX1j@n!Ib}j@e*}ki| z9HJ&1LT|3rZ+5M##O|~jV{{zDiUNh0@kXy;xEJ%Os#D9?UxWPR#WD<44kGRo$+#^j zTRT5&w1^sl}P9Mu-QQx+oyg!@+5?i0k*dipu7*Ft*3P=8|tqWelbZJP(F}VMfcUuzM+EP zNG(4)8_;tTgJ=}z{u0_myTO7U*=fu6Tez~#J-2d|nI49!!2LW__ziJt1xF?xJt7Fh zHMapc6E#@~_u?J#;P9CgD@rk$<9+KtQP&jd$G_r8t~rJ({E>Wf9Bz7~w>befGcw>d zC*di$%_%sxJvcIuYOY{Rs(BC`M`Ty^I(5VQP%ln4t;gx4zk?U+ps{1@1~b-*_UyrM zrIhg!j;4BM%l8n(jM@z*cxK;MqN2l3Z)!jMWI*>+py;rY@KF3nOEfGSz~M?nD$G{c z+;=_8I`7@B{Z%y4S|Q_x#3-(LJ7^S4^;@!wn)7{8LL76XRToUyrl+)lorv_oA!#9# z1ndT(j31?_*b*16LexlBnCebG5bSS&=hFt9vBHcrNOgdtV@tq*!<`K!8&lfAO}$sM z6eq6=`hXA_2ncj+2^a_mMhG!QAQ*H$C&kEr6r*D|^jF#uSIoFXvC_=cXQcl+)`vi^ z-O*1w>;GQ*p&7Ck!F1f#4#;&Y*eC7>t{(85pTf9N!rrJCRXGBSAmenay2rlh}Ciyu_5t;;KGq2ZO%F*%J`OH7^@XdyvC*DBq9) z?K}CeXY5`KJrX4vq#LhO)8);09T!+|3qi3;<#O0*o`__0!gX-ec6AfrA1d&fBq&z* zwHpj@{_PQ;L>ry;B%}ljk_m&mda7&e24UX58R+o54+FXW9%PH7cNLi!vV0{OkK#b? zeCJvWl_hcq*?EB8^2y9Oy1;VOHx>EV=cQks1>CVO4%)PE$IdSUsN3K>h>$3U%l_#n zDGP7q#0XW9mw`Nv(kpHz?=&d*qWXtKjfo*A3YJeHWunJo%)whB0Lpo zqc}t~G;>x0FJ6@22(tlj$K`20o^ZBPe{4?v7`M6kM|bY)Vfj%1R*EX2y@T}|dRLK&ai5Cg z<30s5S=6WKEuR4x+NZ=PeTu%gPu+~RAJ)-!^b9`Ah&XeeoZ5+ZSWrwD&E)n0w+yDA=t##?5LkGH>^d zTQ)cU)9AkDPSl|Fg1?RXFPV2cf1>`o75(=tG#&l-nRHUkv*}<)eU=b}{n){*bhz-6 zIpcoJfcE1!y0ah03Ft_x9tL&n25X7CG6UL`45J&GSGBF+saeO=!{szfLywY2q1`Hhv;*+63p9}?&uMeW( zM|98+U6#bz%~*&V&hE{??#4pgN@ixD+gOMOPTVG(BbA2Z^nh#HJ&3Xp^Az2{UEk4L z1KjH=KeFdxNu|h3PuSrBNQ~PFJv`%xa|JCxTm zRXooZUaS?cPhHW1p9HO^w*;%Gf+O8z1;D4t+7t;d+z5YkdutH7{?)_+1vVi*yaYd8 zPjy|2gygBN=MV}FSLXCsxH--cnzVY9=1Mcn(Jqrn-QKlse9CRwU=D+rtF8v$(hAsU z$Ph2Qj0gpL_gf><669lpqSR!gdu>CW@+Z+d4ErC>`9B#1;kGnANk~aGOE$qTPwx*Yi|T~LJy zb{%q1jyl$Tn46DEz-{ez8`7oaih3a}q|5c&ev5RoR|0IZSJ+CqtJ1w*8z~P54cG^9 zz@N_eY5ft+rloIc?uce>M*xET`khi+rY(RlYHqW`TEWHwJ0a`YO4c+s0?gB$YOmI7 z;wx}vgon(IMF~8(ceT7?g$O}43;`B*MvlQ9j;rWR^``_`4=#m9cr|`zgKG!imFu7>`ORQCAMdQNdIoN2fnLCorG?O+m67vfd;v6uuv-pVv z*DwG$l*6+I-kxROX+}O6;L$ry+K|>Iz@pu!9`vFX%=S&JW{MuRH;Y7|NsC4^h&GFfy-p&KcCeU&nP|9ePnT zuAA2IJ?cNs45RBna~UpZINSY8l=EfGJr^nFjl~oqX~25}{;zx#Kd=Kb878>ru{<|U zo6k=~$izXZ*WAk3lH?Aai~I~r&uTU_KOGT<&FkR{*4YgK)B+s6-~~Q02UHF^03{_k z(wj|23`r$;sBzNNXG{L##5+u_BF6bXhh4q_1@zIz8{y-ljU4~j#$NG`xY&%=ggvh4tpKnqKeADfO*7x3MsLA=0;PhV72BKD-qn zv5k%+{|SPhX2=GvH?#qpZd3p1$&7%8GR1exFM?zHO@{c^f+u(BP~4m`j;dGz9p%Ny zgDYpOY8*QdEP|joC3A4ZnJM2!fEw$H)awux+|OJF_@X;1b((6s0gjY8bB{p z^S04Th~s5O5H6K=NH(Kjfk-?P$@%9*X?tt_Q+({kO96pvU8V@4vL<#cgk}6j2bMHH z9_8J?egXKB;7F9B`}V>f?DhxPIum-nfzzjSS8U?;D zi3n1`q>(Vw%{vo`jA_1HBj_~$20y_`njdEX5Q9bEpFU)DPHCfOZep-6bhp*Ti#j($QCUhA2-b>MYz_LYd_{s3|DD!-36pYB4~ z)=j78-SqdlHD^)KQ)<47A>97crvEKNsphNUa7#&wHCVuGDKUZepNr;6M{rI7nzpp_`g1>e0_tnZ@CZYRphZEH8#%tjkG{oC#KqAf5 zCmE#KT1@ECAfye`%EEgHywqeJ!a}KRM6!T|%xO!&z-G(VJ`Xd6u#$z_SjmV^RuUp* zTXen=Ybx;ab%-S|iJ`tv09j_8EMvNZ#h5(nVYUniW_71c(4INqFNRA-v14 zMm@_VV(g!Z zj4EaWoG6VXnn+>oW90_`scL%_p8E#M6iHKGQ}+_uo>JUHGIEZIc=l`0pk^TC$1(U= z;1a6Fm}XFq&Tkh39{+41yW+HMb7FoIfq?gEG((q}P6~FN=}P4{k%T3u{AQ_d0P`sn zSH59fK=Tb`*#6$aY{DQ%##+{1q(v3>WHh~UUL_k1GHsPAe(?)fGS^~0WB;LjRQr$g zkY-yCIVbKRW9vP^$sNb*ZNe2H*|a{>M(UaVYO+oA8&CVwbS#OCbWBfsUB^K#T_+A& zmo}nxs$*T#j^pKRIG)(TagEmL@P)Yqj?UZ{<^&IkrVlD_0;31pFpBVb=H>_=SMC6x zMn0Lh1H|95CEy4kYiF|Cv7mPYym1{i|$NJ@=I6>skcqp#+iuN@( zWu@Z2)T+NcT65c!jpiHzYtoL7cjDaXoP(F)pmH!e`7)g8jCdK&=gV*|Uxs5ID1g3s z8IJvEJK(MtIV9BB)=rIFa7Bwv7s7r*2x>(szZG8dN*p$#CklA~+-*6nSajObCao_DA6a$kFC`R&M#alh0lzk@!U_fy-u zgpS6XMgc~#@J=Rgj|3Qdd~0szxKku$h~ku;3P>3v-Le_FN6H#5Ify`QJjhB~kETfw zkESuPh~xX>>GG0lQd~MJE_JSS<;*4R@u~}VDVq>BZBj-9MlWwoZn)5H9$Z^o`NbTd zIL8TfgD3)r*reFR{6JpIj}}E#m|Z z1F>TyKAREQ$G+M=R(D?L^O0I_d_}7kE!tL@;j-YEnf5X><%a+sFR(4QGdd+?bT&!o zB2FfJA2K~&QCr0et%-*sTgCO(aUZuX#3;ku>B!spvPKX~O!Zi`ckn5;gPd$o!ODPb z@uYuy`UG1tN^K`HHA9w6ec70)x0@wc(dq0CMu_OkYhN+hbXauB%i%`VjB;Swi5}*o z{fbMNGuQ{r2%_GBu_&hS_ais#N4}uGZ8NVa2WJ{83MkyfmIe)^aQ9n2PJs*L=Bk@l z-8Y?Ck@tr(8%BE5qE0CwxsFmu$s}s7l*0~945!}Ur^P62?zHiI@tFzSm}m9_KneoI zD`z0zbk7Xqb51^Y_CswM+1B%r59f7YOE9e@z~bautSYC_)mu`?*JjD{Z+X)oxA9>B z^wak@F?f>8%TE~WlW)7}y9zD2q3y%lSWp$Bx7}=!Ry8w+;NWmivHbUfb4yyZzu$)Q zFv<5fR64f7oC`sD9=*V!eU&=?o^aD1GY27Ui0McXRQ7*#80(oWUPZ8zXc@Ocg&Pi=d?k&<#>)e|bfa3m}t+}*uJM)P{V{Ep|q!l7ZD3_R7O>8u2}r3hwve|e-!XB;<}j^y;Jol5|!@yEfb-; zk!!>YVA>FbG06;jeBMR`nO3Y)I`LSQ*8f=Rb*fLWrd<(F4IPrrQW7}jEQA!^shS6E zeQoIbAfxOhPz8S0T>2``9jN=H?y(LwuRaM}F!_xglti9ednB@1n`WeS3EJXKw-#yB zQy-WQM_7WXJeiS2!>|c*5Gk!4>nPyek|#+WDOdk5cJxmnGjy6R(u8br;s=7HZ{x%n zT>dG2^=%+EPDX-ZVGmWxPZKj~Cgx1ziDrD)m`B}BI<;$;leyoOc|SSHyWwZpoTv8e zkG|d`WGMfFtZNbFmkgc}(}=>TxXU%?`rOu=6o!ab(}XD^Yb0Bo;uk`a<3d<=Gqcb@ zLK%zBq;%$)kk1lhj!S*lU3CwP(1=$Ad7SA5+JnsS6OipyIi_dC<7$u3`+N?yCl7*r z9^tlwAYX_xgeEQV#t(5f2SFq;amIn|JQD4kPK*Pp@ijg`%uW|zC$1&t@pg|V-3p>7 z#vWq=bSMeUpx>(8H}ZFWSc&&|3`|3*81CG6cs%Qh9?Qa97R&co7KjG*AHbviAp$wK z5JS|18os>IgQFRC`HN_wa!X(35qZj2c{osvT*bRQv^ppY@zRTaQVzFhr}>baywQWV zSH_3T*e|F!8yQIJLp`6;*KW#RA~E+(bI&iW2Q>6u9)V->d>MK8&|)`WyU@1UN0~Zx zXCZ}lv5XGCGRq~qn87?kS#xQlpp}wlX1EqobH{5TB?A`UVKS#gXzRfdCBE4{m+tMf zjov@vTRSb<%7Z&fT0FRuB(1j+2F~d5YZ;FCx{-_yeYHp*f-ZRDLuRxVQZi0QU<`yw zBU^n`g_b@zpfoOPlwVDQR^}*-a7pNGatfvKgynpIYado9d}C?tR+xSZl#49&kCRJ*z)c0D=eI-;;%fyWKjI2M%W+Nq5g^^EINcm+F$&?b9~kQr^Z+H|H1f* z1{cTHg&14sP@Wlmb-w9CURtHZYS*>%!Ez(+eUV2YJL0ImeZ%)5WWk!A!uN|%4{iO2 z!ENcsMV_PCzkT1pEP{34KwpbVY^pvc`?-JVw_-eN2L0~b{|UK%7aFYdPX^C%nl(rv z1^F`zuKEsJB6(gwBZF zJ=#Nf&tH^cZHw%~pPAm{K78AxsQ@Nx^*2dDc23!|*J(h#Qity3FG4!hHko#dpDxDmcg(-qJEE`aL~VjkoF^02Vkna5=!G z6|W`4D=VL}%1nJaF@^96ZQcLdXgs<@;Ri=xKHq_2c+Jo?eLcj0PrK0ZuAKtU>MS8{&sw^lL*#ecU_*e^oB(RK*r=gqEwz~%WP1tsy zw)s}DRklp$l&pSa%*8GTJH8(obA4mXHRp~0JEq(xUIP5h!3|@t6wB^OTBWw#pcR=8 z@FiMq>uOq5C~-JOliMu5BeBKThZ&eVhzUv}Dic12I5{VUg{_T~krQu-?7o*JjC-AEKIkFoRl-f+b3Hz=;^+RLb#SKX)^71IZEGLELd>U34mtO@6@;uPj z=t1VMcSd|eBZ}p3(gVKRavc^nD%d#hM_lzrZC7;_jxI1lKAv+QQ;>tM-FO(k;kW1= z6zdxtNf;C(TSc?+b2*GPTi^Ix4*NYnTg$4=eo@<3sEsP7duZobi=V4|Mx5(t*A-i# z>0~n3al;7a3Vlgg4q1L1G5P|8EE3HN8PxCjLI!&vkYkYVym2l3|Kg2|A8=4FN8K<3 zL~msLGf^}BgKfnbxcH3>Hf6pyG9G8S)*Bg5AlUgvhV0&;rUzJMxDz>)LP{&Cv+WIw z@31;~!-772!y&epcEWmW>1a=qS1Op1uT=a9u9Pxf zg0UM+#VZv*h73^EePGA>0NQ_nj57i$u6ZlM@=gUQ#CIwv`SDH#9rLhXbXaAiLHgi~ zhmc7Ec7ssH*D5l$#D)KcC_FYm%JZFyeQ}(bz&l^5AjtuYj@{5-0fzfVN;bx|0h@ZC z+Qj$N2DJ+RuWbYGlK-5ocALL|1H+pMU(evKMVmP)DQ|E$z*+-d>C0B=FLFy-F5j`d z3}0Nnle^Gz?T+Q;p5+d2v0QD&^}AoP3d($ZJs9ww4S3GAZ$=fo&*(frUlw+wUoqPb z*#oy5gf1V>UiOxYzh;$xjiB8i@bKU9vthdO#Y9G2q?G*EK%!KK5}A=8WqyM)ums9& zbg4$JOVX#;C1qa#X9(oaT?ZpS)vUOM(ZxH#w|;ImaZh|P?}^8aPG$rcHDKcYHk)`m ze_(o*&#a%X$Alehi~JT?z{1=79dW$OZqPLi!rd%s*W(n@>&(ewX?OGY%w3P5|7{g^FL5_q*lcHzINk3;h+6KjL0?_k9T_h z0H<=c-C&RpUD0*I|6(lds-vLfQ-bryu5kYJwBhXP3g^kE4F?)amv;3qR_{j&F+!UW zAio2bUyN@fzsp2ygNduU4(~QT8+658Lbsekx)Rk3J@{)&>hA*koZC4w)xQp}Jd`*4 z0zOozXQi-n$~!Z7G08`Pd~iWJOv97qw~rbb_*#4ah{!VHJplFq2Xdl5U+Y^g^(9Mo z)@rVOyr$#Yhmq&Lb$LC~N%Xxg)3$OBHAhX$!;fwyy57NXO`ciixtW8(WQ0Y&7g5y( zycNiybThG*OO*7;?Hl&Mu#W(76-NRK1Uh93Canl|Tm1`}W1VJqW(x>~Ic|Jca6iQj z2TXb0Z#KAHO%8M-2>b?-xw<#6ns7Yc%v|#!tL-heaBAoGBB>TMae1~MUtHHdG0Q&D zL6jn*a;YRud>LEGzH~Jy)L9q^mr$0{ssl^N1QO42rARm=$UGHX_UeL*;l%7>LWu%P z7~sR4d((4>z02DNp4p`gp}m|_j%(3oK2r1Q6?;OZ{%wqg1<_+5Lx`&Xh~s0JK;=Vk zXUuKVXoO9;jMYXxW_dEOZ!)l7GO&L#Fp><6GEjl8nkwhnk+6FO9%9$1c>q&*7VY(D zo8GZG5K-oijg83X<3E%h3pZsJHJJvnT7lDG(J;VIv&z_#BnEu@l;N<(lrg5@{VO=~ z2EhYyH*MmbP2P_oMBI-VG38BRQRm)gmoZ4NKHrJe-Xwgsn>3jP+n!M zzBGqP4ljIWw}SKs!3F6LhQl+^bVIUBI}UK?n(l76%8x^ll;8)ZLoTGO;7ag=X`t^) zmKHeVbaNGBOOhzY5QalMMVoD|W{TaQBegXTW5keTHCzyo4JjgAc*HIrj!ephBj6(! zR6pk3q}y+g`9N6n@PR^oXk{b^~ zq-Y39K!yzG)}I=~pZ${5N{G`gKHM zFVA2Kp1Fb}g1UJOBZefa;fsK5NRfyy$0C#RbK3G!YjK4F;kk43p2w&Nm-89G zB@Ag~*vqM+9rCl8A;uyB`NFx7FJe^JN#|mwfH!m_Eq^29067sSeM}#g!QkA44B-4F z%m=wcc{>aj=l`*P@>z`BYyJ@{qJPK?`Yk#G+F2eXi; zOha#a4jcu8shbJ-RvQ~b(!9aL9ewtS>dPoYG(JO$ppp4!R+2t#d zNk{J%_>yzmD_#-HR6?3(>=I=6u}jGFj9tR(l&J(HW4DDQ$F8)pZR|cr#x6*UdhI5O zBx6_TeHDQ~eJWoq9>Z2jh&m#`xLL-p1NG<$ui?+Nj6&a&nCp^(13}z4<+)6W_zkr& z;`b*Ezoq!k$qxGF@cVg)oR8m314_?_qgV*Pw=%ZWWTNn!VdZy&DViU5eHqO*G_Pm$ zkQ6Zd7QhWD81cJ_Ov>*Y;G2ivgftJo39>uC33(oV6J9632}t3jNWyQSx9}VG>6-|Qe7{*d5#P7sCZK*=-f7-~6xeHCKqu9FA@gB&Wo%-0ZJ%3j zMPh`?w=%4A>upT28+3GTeF-CmB&*?;fNV&SXl{Ke zGAXxS2H(7MD`CyUF9Pk(FT$ROUxe2=w-S)>tA!@{CFr*C3;GLm&)cP5yGa5Gzl75J z5(vhc1nx)%WNwWZvJELhB{b?9uHvJFJ3A9F`wA-|I=MDl3YTj_t$~NtUXBtuF5{>@ z$;uN)yywaLH%}w)E1pK)S9ZyZ8I446!n^RRZH=Suo*VV5xlw-`N3lH~ZT)@uGb84At@J*IV%Q9E;f;Mq8>-dp-!WBn-eb@{?AO4C^8rZNe6XKBj?=Q-WEG?r z3J|^rRy1~)uO;m;d?ixt>b^C8NMwg``1X8cPncuJpwuvSj9i-;!{2R-yOLpdky+Vq z#qaJiMReRj+TaB88{oEo=27;eZb5sn@r(XI?8E)=ql3i`?}vZ(0sP>Q+B!Jbd>$mm zU?xYxH}Z!wP;am_BNI;EPvfOIv1%8L>ElhvG-@6@_;&KK1CJYINHmq43@>0Qy;ob6 zjY{w1^!vVgVe8GzgPkR3_AT(0B?#PUSJ@9P#IAgE{jG$Gx76MSclPc0fi;!LdrjJ8 zxUZ1n_fj=KYz!v9s|DUMrvT-}2=e31FXr-hBHbwMM8FWnXvfq+y~^Sn9z=@RF<0w7 z72K5)<1achdL{-laK+%k0ljx2C$7D{8_w|X1smmKEbl>}G+ll#fm~!a7~E^J50io< z%xHp+<<|kPtEJsdCfdWxu%Sa>xONJ77vbLHLkuGt>AWyc&z(_Sp|1h_AGK7*21d_9b&<=Oeb)Bs^fKV6U(n ze~<8n&CQR%0b51x`~)tptAj@}Y|8(DH10>RI)jnFJwMo+u3izGmX@k<=Sb zbu3lI$04PBleqP{)j|qaqBROTYyVF27F>~7coYdAQ6RGUbnTsP^|Xv;^9H3MO{N4x zZuL+@gSONi?JreC+xl$KBrcOZqLnXjVU*W$^7alsa^XZ@8fCwEAKHvJi!iq21R}RP zH1|BMPgACuEJ}j1w0m!Stc&fHb{TZFX*+@w;#T6T(Q$+E`9ZBI3Ff;3KM4!p`XU*G z7Ez1!t)%#y^3O&a_y_iWlvzzj)9x7cHVq}aoO$T1t?TW!n?ORrTAeL_43%IdHoVX& zf1KWRwzJ>xt^a!Z2bcbEty}&_MqwYxv2c=H{_Hrl$zEp<%{~ez`~-eBl%|)R`IfPB zHZ(cT%!`Tce%oKezYndQ%Del0;q(0ax3!1l>etci^+{yh>J%q(^@ro2y|~Gi%ft8d zU@wyn-d9(WpxGA}C;r7Qe+sb`SZAhS`YslWNCIskC!>|GlJ%vPF$tt=xcw~PtM^{&&8UR_p_sO z%xxcS)j1Zsog^}Lo^{alb2pJharnim)mij=-THRw=*S7H2NsXNha+n&zKq^>)yMe?$ zmwZ1j{4D7nv_L2V5MHL z1aDn&SuUbhDyyY&>80&)tH%M{!xL4WemDo$swrW07$u*m^F+X_toIreQX+bhpQBZW ztS7UK&JLbTJUS}mSP<|_+nIS@x5KaEBDi$8_Uo;Xp_ejhVPbFR1l^ycMa*g zbvj|)&n)pQ^+P!?7fnr5pYxznI*LoD{>YEse2%=u`rY9@OmmN3XEn^CBE&s?^&ism z^T=D8#;f-9_}-L{BTV#aWwxYmuYSEPC}LdTSJ5vIl6HLoWfI>D_#!G!A#r6MKQQw! z8O|5!*o`m2(dT=BxZS3fj!}C$TezY z$ipB5ww8{@Txjm`I#9YlzT{#w37!I;jp4f)Ts4|(6apt>Uc z-+0X~gSShgCq?7;><+sm8pk(U!}msV*0pfX(Ar8`WlK=WL@QlpCi<~`>wmzEsIhuv zR)kC9yeNu@o|#kzQ0$OAi!o*1V%mKpT>*zvUnFHT+LVd`=tF38@EfmxQwmY~nIdiF zsT|yX0%Vzf4^Tcps2O@!-U|Nm6W1bM)7vp6Y)Rw2z?MEdc2fP~-sp*Jd1e%;?Bvq( z8LmPS`6c8xKI8*K<6GNR;RD49ezWJ~cNCwXjcC zMEee(ev_<;aFoMr<&t(VvvI)zGaGT@5>*ty#~I+G*e5X2nSBDz>`wgX0*)_VYl@rF zwC}`ek=+&NI51XEVnIT~DvfJD-NFtR2u`vlftq05fV?3Q zdU_Qn{2n0WoK*c!U`6Q;jF6sux@hl6hyQ{Ee#Anv_%kzSQEBFSl(zmG0oN&C0<%-~0 zd-!ko8R!k_h2HSz^k(n`FK9Y>8MK#F5y}oe$MxlJ&7w!XjW&RFT{gxDUeavlEYv7Q&|9C_PJDWyEcF^?NwvGa;L1XuXmyT$UT&)eDsX3MB4^4llT%Ngp&2tU4f) z8TjtqTVN%D7VmDs4S8>P*~TlI3_<8< z#>?_%jLz$>p!EoUzdGt1m=eQZflzQIt+L%Ij_2wpqCL7YoLj`XV#DUjTOD^YS8v4G za8I@qwCl_u=d{XCp1G#(SIj!wHs^vq2POp;_{u%G@;g$F5I{Yl)z`v)6 z!?w-C3&)1)zX29#yN>Sxj4!kDHgznNw@78HW`*I$Z|HLG=Ko_6JkR(ZyYX9~U){%P z{0=UThvIi?fz$X8#`;dw|!Ggr$ zSPQQKppUxN37D^B?cV4?6xKN|It!*&dCVK9CoNpJvR3YoA1rd1#ctU6UDeMR@d{b0 z7ehoiak9kW>?b0^6n>f>egc@hHH*YQf`*|GQ*=YrhYt%9Rw4@$txeJwA#d$t-HH>L zMjAg&DL&L$T++#lP7E2B#4rOG-7#cJ0>iyJtB`cXP~OudB5i9RMs%)$*tlp7v=n59 zj*B%=7O`9dkxZV`B=UH^hUDVc!yDu%IJt?OY(mOx?O60Sa>yyvsJyXjZt3Q}J)1|q ziapy)hdNQpIuAU55pd{pi)Y{~>PV;^VbAu#Z8D%y#pVL~OHKAqjl!4D<76E;&4q{n z1Iq=tSd0lUtOwZTd_m5Ur%_<`ZMYgC#=2n4^hYQQSTFDR&b2pifhKhrW!IGh~6?;TJZe}~> zR)#oiV+dB7zH1<3-~+=o?;y^2Zf$jcPpRNZyXImHOCwHrc9N>#7NBWanWS~le}NZ7xGeFwa<8@XXAA-1X)(% z>51Z}VV4?MARWJ;ju}sY^k={lK&DrqxDG2FR~}w*(eVp=pq1UX-Z#Ohgm3B816 z(kcExU-uD-^~=8P9lNiM#uPdOz3m;^D^5HZ^*Pi4eTS!uKo=8w^5aeABB08~ zlfDe-<2|`PXk_vsiE;^vG=qr@$4Mu1SI{j&8684ebuk7k4Wk&abg&FC8w>KqBB&ma z{n(bXUW~!fZORaQiWo2Eb5d=lHEc7+rnLdr(IuT9ti;V^8thxvWvqJ(ILJ`MmV;nb zq#~WEE-1L^np;Q(J-%Am%tg>gu%bzP`+=`Unr3*~j7;?)tbW8)pTEU z!iW@o)J8rck^G{KV4wIh4D>OvogZ%W46LbiiF zp8~T8FFfm$aBl-mozjXc?DbG|*2~~I9pA}4&>NINXs=hXfn=|gGBZb;2Rt&~HSO&^Okma`i`uf$R=y z!hnkvCshcUw+&Wz6=6sd6G6F+};nhtfsk z$;cQ=tpa25#?P^6{o)I%TV&^GAZ@me^5~Cw?T?v48sCD4k>yO1?~*w{{3rp<7|db{-Dr9Hz(M7D`DdWNr7zuM8WduhLP_(m|l_u6f& z^W*`Wn+qbFV(Fr(eA9kcVcOHK)Wd=a~#>>s@u!baARfk<9t44~DU`_23%kv#g<$P-&P{()kGI zXm-yZ0|vO1qWLNk^k%*?9O}36WjZJD49=YYJQ!v<5_rBuqf6$ygP03l>lvu~_TBPG z7df;mW4|BOF9YH^1Cu*HW=kHnKf*h4Pw=As`W9H3gy)A!8o6>M>JH$UDxTH8V#0M& zN;(y1<`4@^i#W=P+x8l(%cjy7VQmFGn=Mt^^;4F^o~qE*kPx=@^WRB z=nnV52(V4)CECIYEC%*PGJ1y5AN1Ubi+lLgWmnw{dN`^NK3{8bOQseV3!H_vvqN(( z>5fs8l>$%Lq zW+C*}JeX;;TsNUWx|m^Mf8cm>x8p%b^$qSY$llevpeKXXUKa&D18Qqktddnj`7sN? z8Bt#c2U3Fr-pb#CNO;+WsI2}4{3wVs1VX?7U&_*=SZY>rNI`Rbx|K_s#9X8|H?@$< z(_A|QuCBb?+EPcSad1l3WHUNhIkM0#!EVL+t2vVkTl1GV1F+vp!?EUEXm@RWw?-;O z3SCIj-u(1x4?-fnYK@0Zg0-iTVAX0YhOvGdZM7*Tfv%7SGVuZpyC5bJXWNtn*#1(A zF_#bpE3H-kOj=~6jjM2g&gySpDNEPsPlJIdl`|LKy(mFf+|X!$VD&0 zM9nzzM&gJ@!ClycZ_dd&7z(JmSq(c_aB~Htt0VLlS_ zxI$*tD=^&@GTOoy!QbEB4rw8i&2%D1Xi4(MBhINur(}qK;q_4amMherXy7U~=r@EO_y7ZKeR;m~={i8H(dIF5< zm?Bm^%D%3WViguxkvw4&M4qsb1K#d1YvWzibMQ6Jh}Bq(Mg5#{gp9;g%o}1$aiX2v zScfoqN%$!>*}BGIVZQYv@9LXp`2l_s*A} z-E_WsT0@?&q?>w}wYrg_g9LwepGB)x>Y>l7C+?a?E=t1O-X7%YKaN*pF7;ZO23Eco z-NhL&)2N|z7JWsTM!9a1 z_wL}{x!Zb08y${5r3@vc^(p1(*iq{&W6LxGm7djA_swMSrPCrlrb(5tDrb*8^RBKg z9y`u5;!tKDLepxqRsKo0)Q;N-@kLOLc$c(HS^DKB$Le0 z4$yvtld6^Uh)i`&Ci>#>KG7GCJsTffx(JoS*+d+U14_}SjK2+%WU%VbL`NSwR`5M# zEDo*1tX0=UHmHZKQ}fYU{=A;bi`CDwob3O&rO=J9%D4DB(hWe6)k)0|dnVU5vW*YqMH7`UL ze4K!2jv>ZS0cI;uXCPY|z&GQt*^rwVzz^D=E5LY$v|J&p?H6x(97UU4mU~cIC+X@S zln;z}m0P+QF&*t7a_08zZW$_(gIUBU zy96100Y*LeXnk8VdegO>>t(P*;+}<5E$FZr?EcB5h$-T2u6M~<-X*w^*<~xhDIcOp z@~p`eaHK7&TSh&0@01Tkb~Dq#eBsHB0`2pz^=~MD*Y3(EKf7>n{Z4XBKfCbXIKL26 zuRCq>PI_|G!HFQSSXBluG7(_MmYbx8P{AWkddyf6yvWQDXJN0&1@|apdTn0~8>1QN z2auKX^#inc0X`L;laD{JE8??Nr@+~2?tEa^0bfIe1|@_Ym9szY)UOh%M9~eefUwt? zgh_S-Oj7s&AQtnm9Ku(cT}e*j2<0lc?YI1vYQNIHXv@1mchAEo6-v!n@Bay{-&eKvMhIH&1hW&PIY(SZ9Z;2N_zz{e1& z`OU*4?FF@eR!-$(PT?3D#^ImUb{e3gwu}ES)b_*v{I+-R!rGJPYrDhqcGlm{$9IvL zgSp^%?JG&UJPx~#=e-ak&=sbX83!FsooBqX$`qr0Yu}XR3B{v`7<3l5d^CNG zdImj0KR!|RYJodPci|)Vs=wp|ymu+uKw=vbCn?5pVUx2_J~+tOs&L~osnqoPwO+U8 zK_4hhSMY1}foRjS_7+apg2xN7e#0T1uJgT0{y}Kl#om=!WHkF`;YQTW%LB#91+9_4 z@+Sa^xbX!ZzC|Z9M0Vv@5m)LpLFlvCc1%eUPd-%_Ky4RoN+4FhkEp|OUWs|wO_Be= zwj8LhJ-H2B?J?86qk0rZ_j-;gr1C9XI_nunJ;`LLCjwV{4BsDJ{VSZQ>Pw{uclE&f zk6ROGz;M2x&+He=j!BU2GaFASKg#BxfkkUya?>sFO{Pp`TenUuQzkaf%g2BsGnJiP z^GF|Y%`P?fV_ePODp&7T&OnWH0?HknpYPfiBHiy;U?HE^)LkT1NtRyFI-kKid5iF| zb>!>ihKO!V%dHk~>c{xFjP1{N!I1k@Hv@;)?j8rXd|Zr#7(?2t@5Kiq-170rf-`(D z#o;W-G6Y6ZHFh~GTziTcZ-ec3QvV5C&cKeM$-i;p$Qe8r%99J@IV+!LCr3& zgIie?@#<>O=^mjI(`)u3*rDiaoP?h&=5XIrFM6fdI2n=QDfk)5Re#LWO@mElZY$)C zK?7&3*CY%q<``(6iXZKJ}n_5oG;ZEIbXx?DBg28pNtoNd$4& zyoJ=YgbvK`-6R%>5U)LM(6q~^6V5v$i`k%_Z64Iq%!5t#ei+r{9I`e{Wi0xUb+6!P zWbCiG+BgHbx0>g-SaH^yJrhy5kJW^71f8acR!l2?;j^v07HLNnNX z(!NqGK|S^Qk^_5ZJS~Dn0uUXuKZqa7W{9aCUf0 zqTG8&9&RJBhPOO}pV9iO`_T^Ks(4)W*TKUrZ$Ryd%C|YSrG0Mw zqrk>(5nJ1r3eQ1i2WwK_dKCTY^`KLUw3W?Sk01F9dP+{+9U8lZuu#@0;T4h&{Q$M#ep%0rFq+t#A#L{$tBj;yv9qd_u zK!3YW_&I;uG5xmPF2TkKZwq zDaFbLqx&$Wz60bgUx;{)Vc+^!z}f*=I`~)ZM9|D+YjJ3U3t~`*4}S~d&?wZJ2+kRC z@kYQi$bzQm$f6kI_P8lt1cm!8C?V`4IG>91f;92R>=H1rM9ZkavxJq%v;;eFly=x(ed`q=%*=Rj%DL!CH~ zw_XN(*7a6E*TiCFz05JGiDTg7&89^w7TfEcCOe+JKGl@VPB?_h{tzrf9ws;|kS4iP z<9Qn+Q!inZa!wTqy8Q`D0(=~9KJG(lEzZO;94`$&3psxcxV7YTX5kcPuU{lJ@xXB% zcSksc;0SFrMXw#}eKnr5;$M6f`C?{w^i740^ba|DJxcF7ZDN$}CR{>qgTIb+5J8a7 z^IwW6Xljk;z^%+~#_v|pI%RzU^*kW7mP#4~AIh~PfgzUb{;~rE{gH5Tb z)MO^=kU7}laE@92?4m&8li6F4%x4D89ubZnWb|E8*fc|=>GdYu%e;zkl8;oQ4BrEq z!&lsrjQLupzn!nMj8eW{LvMq>NxlLuc?eC>dZX}A05%B9@K7UIF60t1>s2@6eNgyt z7nQ#r-UeZ+51u6Qs@)1-Lzb+#s){V&X}(DhEH&U0OJ%y0@@k(64p!*3UT_qQyAD}l z_Xp3C;K0+Az$>J-3pAt?sLXcF=fX#xdRp3JA0{03VWycr{6^^Af_G8!+1E2IW-q}Z z18b$>`FU_-COw~#?M!mOcb=K#A6ALbr5s&2wC&!w&8-BRYBuQfxy|e8I?bjyI!JGT zA1_2Tn1zB325x%!^3pBp#rHmtiMQ9JT!Sz}ykpM}NS+pP?&(d!)0+^PPalhOV{#`E zs;X5)VCC=egZqd~wi`F&*FX|45zsD>NK=V$3kyL1jEf{i$qSfRY`&0=$wI`Nw=$x^ z-&FvOX-G=5<*VKcgrdA`Me{|Hm(_?Uu43602cn%V0An_9azCs(#K&_!Qqtt6WNors z@LrRbU*{J5MjFI#q!%j{dNNvK2at&Ck&-K~!wI}7RwTuXk$vS4$X>kn34il8{6G+s zh?s!)OiitUxN#r}HiAr43sczTiAcfS5#W7^T-ULpPqRJny&dkcpI=ZK;tEZ}&ftlgx zrtGTjp6*8N9%KL!#8GfS#O@hkxDiDPx&~B=!odSwQb3Gpe+0G4odYylipx1eUJpIlK@l=LB@j%?y zRvGZH@@QgX5P~11|K{=dUT191%{Gr^056C?4zHaX@xwWY&zN_!L^^kUkv`ijqDzKr z6Ac_eYZGBrm^*FeGaAuRr%ePKxCAGef^{&<8*iKxexlQsYHF%0f%TN%0>8z@Ki1_)O;YPMKe z9?xN_>0BX<%yy9c+Qb9yOlc3r2Ky(%h0ySFJdM!6`Sq)qU*9PGl86b?PFr3{KO;S{ zrh0^c*v+3!E-U~yRmnj$J==FaP>xFEMKJF0Z4Mj5oM|MM%**6p>(_3<542^|o1L~$ zXte#$h{4Y$c#dTqX3XccFen8Vk&+ImH48V@JWbi3u3@3fY5++v!s_QPF}{v@lvOYDJ4Z zD%!6_fL9Yd2*HPns_a>&Fd4}+_?n30NS4;F%qU?8w7dZx7#6~=8mFW?sDVL@LdI_T zqYz9;K(O;aOmrrhABjP|okYc85tYb|@$UXrvi%F3mk@gOFE)hKv%WvT_i6>Dg7%!t z_tA-lw5~&=<+4_<+=I5mO55Rmb|Uuq`_hS+ZnV5wd%^16%h6}$`g?Suiegc5;AgC= z*{dsM&n@djBU;gs(ei#;(fxW=iUo+>{DgU*Pq8SC0*@rO zwO^_XV0TE8@r%N?pDX+v1AP^NA~m1lt-JMV#$X-&8a{DDW$m?i!4&d3hLMs_`bfyP zUe6f7m6(e$BQWqU{QL&6OocA&|(e!Mf zsBJGxHuMA7n{2B;g zeTJ!_Kv|7_OQ?nX%m1g|Egk-y2-(1;Nuqo<`30U<<7Cp6dR|em&Cua<$h)%u(YdvU zP}mN9L2G`VVcMfV4m0zcg{Ls;(teS%8zGp;olF8Hw6HSRgu~OO9C3%$XY)dGHa{97k2UqM|P{n;dnsLHXN84d$>K@;AGBTvCJ>9OsDxpJgSR0%=;z02w&Yt z`HT0V{E5uiW3+tGm=$e8q?6vkfZO~se%X8E(@*g!>fG`@?%YI(zHLEaNh=gCrYQUs zBmsrL%9I!#d}4HbEgk%NI{1xr@Gb_?btP}}?o?=RD)h}%=sy_3tsz>b-U;@tR0^nu zlUQLxB2f^=i1aRIZ~iCq-QQsW>PqHscW1UAzO&MY7Rv_r5CVg`0!FAiN$P%=`PhH? z0_uK`VNi%qxA}dBKx+xX6KCq<4^yEZrIY?R_3o?5y1`xq?vEL%>Hs21)HOg?Q%$MOx z>vxFl{GLfKODBa|fzePl{DEJAJOMQSm<;?W8Tc~;lS|h{ToQ~MbyX>f2&!T1E80CKfSFc1L=x>A4^q~pWzd<*F4Uix#HHlSO2 zuI>vEurJ`7A@aha-5DN-B15TL9P^jad8PIOQzkHRqu9(5kEjbsXr+8B#bcC8t-WSy zlqx0iDfniT#@#;&(~i=WM)6AVKBo?r)|7D#RVJ=#X0a<}z+_{)1Ww~~DImUlPQnwL z8L$hT8T535%>Fp6`O1=}s5E1}Hndtz6&*m@#0KtIUT+NVSQ!0>3BJ5qoIjRiM zzIcQ$ya#$eyy!j9X%5#jWDEXhO4?DuuSkVJbm3!yl-FF#g22{HaDN7S!cIrpl6Dg| zI+#>NI@ktwumcE&WZ?_QvW{Wo;j_7(f&4H_Wf-!`4TKU0|1lkWK|1(C22nZ5EBC0y zp%w$@IcBiHnl`QtUZ6KeEf!;VG3cE`^cWWO^n-wpKM=iMIZSyY3G{m9 zcO-L+-d_!ROZow#h(d?|_#3hrzj-K;x!in&Mpt0+!rImgqR%8{Ew045tOUbS3H>0I zh(E9ry>ggJtVvX&SAH!nuEd|?N-#MqA=yxg2O!)Wx5(7-Vn~f+l50B*3zqspu#7(t z%U(GQmg^E&_R8-_<`~Q0$5=8sv6O5U%Z5c}BF6GOV#%;zsUHN(_`@wgr&kVx<@&({ zn!Nxxk~>E8=P{a0PBbMO(40iLIc2ed3}K1+1ft2Xps61O&G-Y+?3Kf!xgmjOF943@ zj?w&Pj3$#4P041_oF+C<<#BTm+BCZpIfH13(z6!V!|;;i4Gc>q^n+AFn1*}+JL1!6 z6O4{vk)=+?eEwF<=fn8K1QXbOe;}V#xX$Xw%<~`wS`Wq#?8y1SX%hoY)STn%sAOD* z%EzJ)X;e%(P^BjT%>$4izX>l%mcnr2gMbp2A|Jqb`P5o@I^cu3i*WrBH zdOZYz7Chy!Ui@Iu;d^s4BSr=GGGtgULUe0sWE7Q&s9pl-NF)^WkCGh1$%UCPocJK1 z;t!}76WDqQ7l`YH1(&oJldxV#^J(k#Py|}X;0N{M2U{<`Hy_4`QGsph6_?3+DVAwu z6qUGM0toKD75(GzVnE5jW?1T_9|TnV0rg_Mt(OeQxL#O#NWGYZ^?Ep;wqD00(0T-Z zP%nP4_2PST3nNAa_A+ExuU^O~DsjC8&?5mz(0>$O3@Bl%3@1KFz2Xn37Zcce2|tYM zb(^UdldxVV@M-IHA_A>P;|KNP2U{<`H@7lkRA4VdhV>#u(+?wL6qUGM0_Y?p6!cG) z9MTVk!!exrAoYqrpk7R1>m{5iuGc$Fy_kgcdJLboUZ)_?dMtiWFMhD~;(PN{MvMw< zQ?Iy8)=RNWBcrIq^%6jj10eFq1p;(Ci+p&UZH&EoX{5qib{LSu0ZyBrWie4Zf$M@e z-*(OSc+Iy}@-blY@pI37-{CzJUgx`bpuFoO9|I;IKVP#IMkZR`LwR${ZIPU`8uRIMnHGFxD@8SBV_DswddB1r&KFq%wJJbFi zEY|uYy19d?ORaaJ@SP7q;?Z5qKkn}VpG+rt|FR^H=}z+DWl2uyPV&iRNgmssT>Pe*aj96v-7M!J zy7AyE&&NXni0Qh&8+vlWD2Drju`~k^zFf-FdJeTIH|@c0ha=r*7eVg9CV&YN#bND1 z*SRt+SuCjfMmVM&D_-a>I1uxnk29)3B7 z`2|dbg(9C=H$G8P~cq{!@E})Q28rP|0XaP6c|sAVNAC8ZI^tyS9m|O@IEE* z7!-IH#qjPG26SqQ(;k7rpulL}4;a6&Fup7>7#znTCZ#ekcpzHp!7H}ZFKzC-BsYVC z!NvCjgI`$~|0ysS6d0GJVC)-@Ut1VI5Eu*!jHMKeefPTGSQtMO7z_%G*8PC-TMOei z0)s(;u``Bo7G{=95yYV_uXY(E%q`!?j|AG{4Qa&`=w0=~4FQqpO-fqSMIKP=$JVO)uTtEre&UmGQT>Ss+# z`nj1sC}V;2XzxO5+@pi}U2N8G!gCIiqu8tC6Ux5|4=Jqk47|-VZ#>lG zn_*M55QIo*c+&+iZ4zr+W`c%m2bs3q>B$Hw3w_D1Y6+6MWouviUeKb_dM;wcz7|i~ zTIyQ(ESpP!sMRbh9woR1u6c^kOoO{DIM-beX{58Qe?T%9v9;$hJp{k!<0-KfB-GgZ zkoy|uz7OfHHKjCAcg$DUAqX+?dd5m!z047KhNvsN{H$L;J;7mwKkq1BC}skgqiQ!G z$F|x(;`ai;@%-8g2!dnng*{+pab3+I4|d`Ejr>mF0~;kQ>G|PB_yAabR$w{4r!SmN zi65p@u>z&NC;T{N{*~h=@3{*j+Y5022pu3RMif~U@ z_Ct72)`avw2NO}Dl&#myw|N(ll#I&-XeKJ375SNO!$(~(g*GB)CC!Pe15D6nlN?f{ zjVXl^tX~aFRN>bz1XbS8Hie(8xo1SARERh;zlcUMBbp;TJTL|2ZA5eSmTTtEyP@ZPa3c$SI zpQY$r&W@D4ZE(XyXMw;J?gM>qYJJp*TC;-b+S5o=&IbLZAdyC~87;u`oBersQRD=ehahOGRiR@)FcdHi*T62=_V|)4(*p{zwkqCxg{s@b1I| zd-dvk-PK!9Oj0m-0U`j*r}5Kytm#=;4db3Ur}k2SY(AT7WBLMpJZSSlp^X#;r1(T3 zl7h^HFEB$VA{f|wHeZGx_!|tG|AZILuLR!VkJrc`>zuivl<;dvN zZXoN_I!1`oRv)Igd|+FteG3v|@AnEZ=m++aQ4W*2_F8Q5<%ao{cjuIbGH&b1K;)_y zfqB848QF(2%`*|xIBX~*{x_ZW^AMaFO$GHR?!wfnRP5ro#-ArUb*}(0%iFPFHsxVJ z6P~-!+Oe$MS0YEFvh)TlY;^4;jvrdjl$~tQb~nB|=+p!Nw?DO4NeMjH!7;)=Z7z|*iMm;&b`{qaE_)dh`*r@7}M+Qb@WSFOF85r%_^P9CA+nynbP$`vQWh%l24?sYrFW;P|YU-KYEE|-F@_OQ={7J z3~pYg4%|48y7@Y|Fq>4%RfdMM)Ro?HILx0f}%%)kBUs<}%M2JnIi~8>2oLGm~#K$ZEDlg<&W+ z;5Xj@Fz{a`Pt&)qNwuVX@*>$NQpa@N(}h-`3Xw$81+iElKucs;19p{pV5lev<` z-wG5QueA-2)^_}KIL5|rw%nFY0UnG4t~{5^5wBPaPrz2QVah8dGj%gk0?;t&-^@Zb z+1q$J543{_v=5PhD*7>&eOC8gY?sU z3(Ddt=$|da9SfY7;3HIGUh}O&dYRxQqc+2W*TgPZe*AZCV?-_WC_|vGQ9{g=YCPpO z-+`2F^EUi0IL%vu_M+E(3mXEoTZ?%B&7XlZzMO^@kC=vD4M&_Y{lfzi9Q0GHSWseN zRW|HIQL(^brle@vFr@XOK{gGf?|`j_u{}^q#)=|LAsII4EV?kTpO@bsVP*WO5Oteye!sk zLlN|-M}IFmF$OY?A*gd}q77Uyv$p~qtf2H>xo2e-?y^3;ugF~Vqs+x<0?`+oh$rVe zb=1~4R-fyKcQg*e6gUpqlz5uiulWenDix(ygo)G*-Z!&H-Lhght3SAk+ue^0)6-sb zr%9%xwnthH^Xj7Mdah>D@ke#WzY*_*lm=G8;naE?st!LlfuMff1>y<(FNCHPDX}ui@zzF@?2rZ^0-Tpn&d9B-038@=Z3(b4eLn8y z-iD#VhSK^4T0LG3m_j1k9_xfzju+--Xv9xA|^7(3uY!0ke>M>%8{+*qOsu zcaTgj^){7!xv6ajRmyuRo4VpB82FnptVy9>KOqBnPZuWcw8?EJ47$}txUi|c2Qi3< zn19MPcrUz|DjGUwvSzk8i;dQCSdL5ua{lf%!~;RgXP9+H;PhrTK>%-Vzr5M@^E(4qLj%x&PXLJIRsdMwBi z#i`algyu;MoaPpMg!!S`72nRLRQ`A(>LBf5_#*)VyoD?<3vg?yI6@gB4AF$--Kc2L zG{WA4nJ@6TlNNM`6vXyfVB_G=aB}GwbW@n9x{}GQ<-zcriq^p5q4iAEFm5bcwbsSx zKFtqn)zCg(=G7?gam(9BVRls!+L>bgSQlo&9|Hy8)sr4f;wg=qHwo!O^;3zqfznYz zLV|GS-S-=RXr@JtphFfSs10&-N?W;^qfwuj-z8~P}YM>k$&!iWl(^_ z^)&>%4EUho$)0$PR6b=H4*cAMbNw4oprd4}FI>8xFV+tk!g7NIQAJbdEW8>~Qy0%N zBZM?Pu)#F-fttm>)kmqA+ z84KEt%orBGfpq;q-j5Ef?F66K&5zpl^D=D<*E+#v$pm?Z>0Qe~D%EVfYkC|7Ow&ZZ zs(4iTPZ3M7ZejxxOwzapuE3*_DZBYGz-Wk%J5Bg;gvTnl*}*3GM3kUuzFlX(;e1%v z$EX0-|0vWG<2{<|WnRZ_K#hGFZr>8q68X7wSFlP>IHGC97!<4t3#KGS?o`Fx%CHjt z;SEe_lmuLJ8>a#XT#kYFV{L(%Il`44O8AmUh`&dO2aJ8NBwyT*$hQd77IrbAZ)l%` z2bKX&?USg3wpQ7r2R>oVJZF<&VC7&a)WI|d$rM{LC4Xwe5O3_`D8h@^IX484id|Jmc+Wunf(7vR6B%+X_k$wpC%sNwyUwf74W^ z$qb^PL13Ed%V;X?|JbpaT0evL4IJk;7{0nMiRvKBho&g~3wvX~AUZuc^(~)Ph z^*9AE^L=SOT&u{HXwSy$!PL=c(s(&(JDk7qZQHrr$Ja5g(%_<^rA;8?jU5B7&NN1* zBc((0N$d~nt|fmKRlmIwE#@VPpRY5A1=0KrFsB^sXFha)$A927?_{S-@Rk47TtG(X z|Ib`NIL-eI7ceY9+Vai+_w#^>|HC|>@ju4{3%%Tx z8;oT{5UWfj?}q!@Ud{%gYR_=%JLEXk#rJ3GbE+RFWTYfu zGR82Z427^d0iiNgUFyrRxF}a`t$c?r=K(s&s01#iDHB6W2O@Q#fFxmFRWkyA=Cg_l zHm()r{`z4?OQ+ToluO7UEQbQwz%BWc(@Q_v zS9+6B5t2rRR7Ek1w>fhvJ@OpP!BpaC-+f5mmaFw1MRX`pbZ|`z=|%QVP)B5$hxp{`dNjRf4HtO~h6hw+TRwH9n@9AuboouaK zw;Fz$;;L+IM{0Q79-S9TQZRWq7Z4WH1t2Q%L_%VM14z8ckz*2Y4FC{+6*2nf4^N^K7?L01&s z{9HUgNZu?uz{b-R@5Vf&Eh+_F+~B3-A1Oqo*`_+O`FZ@nvlRt!JmkZ$C@R4o8ES0Q zr!n0ausfF3CJQ%via$#3DH_pB$H!@zHBV9APMT1Mj)fgC(BUA8 zYC}*9(n&C;m6YjZtiE_vU;C>pZYTq{41B9K*k!D##?)oB2{sd*QK}o4d_0yRuA0O!i>WakKdd*?Pbe1<}=cVS@p{1 zHy~V}f$p)=Nq@en|nFd8h6x+*=)FfA@cH9bn$}Jygw@w}CZC2m%wI z?eF7f+|kEn8aEN5Bb#`pF@Y|_I9Qkc03WS&nE-`#8K0xFNtduL`ynDD>#|!-MoEgY zBr)x&1s@uu#U^J@blN{6243^Wcr-;2F1vcc7bI1rb*Fy`C#Qlenukokzg`I2M5vg9xlhjB z_)A>WNgJG_QO+uq5r1m0&kPNCoRYQIK_g{*&bF{n(ht|XDbd&^mXda520wM|+@D*{ zQWN#?tOJM01Agr{$ac~Ijs=cf%L8qcD=P!p;Ko}ZWxDtoxweQsM%a=Dl>tAvc{i+m zvs>}28OND3h6A7m3@?Hn$oc>iRz3U}Fu76=V0?hdRR=u4$r(6?MzBEV8G}-`^;_VT z*RGj`KKyqGrmZ5Xu(bU>V$mnEnI|CM=b6vzkX~6&S`@PZ8#c&mFe~4@tV9}{Q;Z;; z`O|}oarRTT_6Gpry&#@ntBfiM0^YvDR-wT+tQUV?H3J%3+iz3YBq1IR{Z0_e7HDWEh_I1Ne##wf$n#!y#x; zgjW}Gf%#S$SMjZZ{ePBVvNuZ5@F!YbtP*vtfaBnqFGcOa+i2KNwR6@V61BwSG!!{L zz8FiyGO|JAlHs!-|LeFY2u6khQqahdPqQF+f4WyFjfOMFKi<;F%lrlaD#W4M36T*G z&Z*dTdM%iNQ;FM%a%Nu4x_xCHkx8&{E$O7rkfTbGP~+HQN(`lda0Y$VXypt-u2v4k zck;wR8;GwPfZeW6Ast!i6eWVtlerjfOD;}aCRY?`a=ER3WbTlcaOeH?sAX*cF*?7v znafZjwlC0U2njrt4_H;qR&nv!D!fAi81OuOUBvZRetQtHjp5{HnK|(-u-~K}$$Y_h z*2ZaKsR)peITLz>uLut8iQuj5n3&Ls3M{br=!ZSkBivBv6^^z^5O8ije1l~m&)Luk zYb8XFgY_u-Bir>;b#Y|-LWgnVq2hVG1?YB$5Zw!|AiE6c$acmb2@80Ims5BrxH&;E z=XOY=TnbM`LWnSn6C_eAgDE3#UxuVm2zyV}S{cAFsS9ju|9CE)x)bA4RtkdLAf&Ku z%By9*8n-E!lh6z2cS1>53hDTzHVgB3VkzrWo=C*t%Kl@d$v~ zKGP+Hjf_IxA~Tp=7fKCB3z~c*#0n`v0M`#w$kNcv!d}}m3rm!$*85EF;(lBpK%oU1 z&iP7lfz)qJ>Pp#}@0nU_Qtc|~I%|yq&etlHgZi3W$zQj)e*d$iS#t)cQN)#kng5{7 z2>mbU`!%62X@>sFhg4tc+~)W#xI#Mt5yuwS?~ls|wKdicZZCUbbg(Y75L^f~&&a}s z+b_V89f)Yz2DbWeyF)o!0d70BKS1Ov`C%!$IE8~hrR+kzFQj9C7Fh~??GEAkL22g- z)U1bK6HrLxmvZYCbL-dd(8?Kc84}t;8S>it!I>{3zf?lI7Iedu2TR_})r#@@K^#0< zEW>x6c8*eB3UOCLhk|ycT&N%5mkR3#dlX$j358Ojl%Kg9J&i+ON;a(oWtntMfS;vV zz-rXc@QVk6{$D5k^KRi_j2-;_;>dpOj~5Nq*AP8D-L9iWiD*cs$_;jk54n(L!qZ~XthaXdMotSFgp;^dHkZx zn&;{~ev@7JQi_fZ{Ub3)Rbp&8AYt7vL0I?mqg;z4 zsodIHB-5NackKdxcaeV9Ziflbbtue3^y0eO3v@+Yg>@#QRd|OH{r*TgR-ZOuv;KiP zN`(7Bg?p37+Tx3Otyx5=U5|s-gkG5f;2F@ttg|MD_QMx*#xWobtrF~tC(tS4TLx}EcJR%!&tsM zqF;qaT-d71@C8ZPXrqPVuvpK4Z99QK+0p%UzDWVtypLxze81Ew-{uv9q&E9@WfI_1*7f^#Bo^e%-^H6)Hjpe#}U zJwLqoH-tKw%DPl4Hx1S4GxX9BdR zNAOrzv}R^6>nbC^bubXY>cFpI4}o1)=z;Y^B8}G??Mg&lMHc<~n}nn6$HBFU*5W>@ zXTfWaA!`wH*zK4LzIn7Jwj#kVj$GK@UoCsX`#t#MFfI31#oXZ5MQ=5P@9} z(sA|{Xj}wS$=yNixJ2wsUkylkFqskzKLRw3oxdlxJh6?cp-jroU%2qZ zS}4sUHm%7ZryhnP>afj<`$FRX`F9)p5TFa>XfVwPV(kF0U?|7 z1bmgr8`A^TI0d&j)TbJslrE!B6h2{6;iE?m9Jjg%OJ4s9_HO?QR?#R4sh3=R3q*6p zA8$rYn8jtmO7z{3%CyPxR(lZ22O7lQZ$6l~Q;xvqH{0=S)b(4@_@tKAD8+DyA+8;c zc?#XSYZqL>%BgB5Ffu0*#=ER~h;~pFMjG%4b#o5MxdW;)0;$B~4it+-7Io#$2<%N6 ze&GmwrQ4jMz@1FylWyCssYW$f{OnJhAfb6sAoDCbK2xy?!LBnE=_u^dDTSMiC$CzI zzEOte{QAI*C?<&Uy7Mp>0B==!JgVv|r9PUrt)@ zZk%7wj8zJEzZg%K_LC$#j1RL`iRc?8qF-NC@(@imqIN1+zy=bmOy%%Kr6W%JOkC-5 z>J~7$p_~O{nzED!m=MtkFa@t%94gp^{ieMB`YJ>+S*d8sg9`y^AM&g6s-Xe>x@tOy zS5rE-d`#1_RWKn)XHSx8jVjg$OM?~v-0I>jrNJsX{osi0^n*sm61M2``x@1`W3>V* zMm=PAsRUZGQ{WA`*(330bDN-08QxoD##bF}dB`o7hlXs0hfRftQQ;x2QaLed#Sn^e zHQFijsHIGJIK*tur{^*XfA=cox#^>sBIKE~GOUakYuowy9UyIVh*MHF4+kB!kA|6- zp_hCo(MMS;*me$Mv{axRAS0NE;wm$Y(=ZIk8Uib|Ga-F(6~V0!XYw($rl8uej9cT5 z^^l&&mZ>=8v(En;bE6aCSnDB3G)iSb>j*;Ij2}#Wl{f@J&=b9)74L3Ji+8!k{<-Fn z$cDXOAFg_i!fOp&zm5R?(Nsj#mP^)I7ffChy=4_z-wA6bt^&%Kc1yZWkW~SM&@iz) zFsWeWax}6Up;eQYe2Me19`kYUJN?kW#=7=Uq(d(9F&b%$xC||VS;uQX9N9jz%WvS| zFVPw~4Z>9f!6pzm+99P4^$3kwgH2^FdU?Dj-9fuylL0ag$7TP3U&cN5wgYBO2h5@a zy4nFf?SQC_jAJlAqJaVL+f1-AdoK7^DMTh;GX-Xt_8j#CX3QJqdbt1`?q$@g8op3} z*pSmc252`{FoweM zNTvO$fu$}vn<7wOqe~vEofK`7LB|$$cOt_|8yUm0K&qdwtEv8aE>|?KxyEWYluG21 zRr_YBSzw&cw#^kVZ?bAKVkDtvQc7$z>d8dgdNBA?fffe|Bt*-;0MB(HAm z5vV>EpxH(N<5bsl@E{~~K#-%g1ot~|(}OGxup!Ad@m2}IG%~ScAY_xzo36leA%V2M z3a|ub`q~YE(?vB+oGl^dR?Rj2^z_MY9vtsGWm&zWB-H( z4)x8{K`oRD8v}X40rLXba0neC74D^CN)?XyqAIhsp}-1p!e#dTC8IpnmGDp$6wz!@ z;FwCwQdts24X0Yme5n9!eW|D`V?i>>#dQ6~ebVovuR<p*0foQ{bH!ZO+yYt(ugGR# zCX)HVisQEREihHv7E_79ms9Oc%;5RN1g4A9K&C3Q`n2oGe_uAe zoMj|zyMTd`sP#xel4~mZNlD1qy7vurnK5PY#gc^vFzmJGrMMjKY{L=(OPNOjTEhwO zQ4>+PKS9YL>xyGhMq=G&v}JCu6{fDtk~%XZ=R{{Hqmy)cV$z(R6q%=aA`885#}w_l zqxK`zi)R##4)Vtgo@fuO)E*6patk4rCThT`=Nlz;biUE#{W}6h<#wmr4!K86wT*h;wGLke&6Cp~n$cQHs#2L57R68O^b!H=V|LUZsE`Pin9z!TlFNB+cFOXUH2)Y5<)OMvV? zb4mYFWUc7m(R!7mRnB=uh{%a5Fwt}HrQoXT6|epvNbG5?Z@-g+IR>lL*e_@leKV>5 z1=*Z%{bf?YG2{~c?Hy_J&G`I@?mbLpj#-N3UT%{71Lb0U zIFvgrG5hhO*?$O?KHo{6qH$`cAY-B-mH+w8$08ccMQJvZ*>G}fcX24z3O^-Y!hd;| z5U%1*MS577J`Rt{^b^6WswLTb`zoq=;=s%18Yb6VK!$8l`AB4SVylLQ2f zHsTo@fc}1^KMOIGB*qx5B5V3_=x)HDL9?IrYRleZ!FaB@1D=PA+NNc{K8V%gBhmCQ zplE&xU&auY9{+vxcprX+d_5Uu22xPpzZ7&0BBw;jF+&+jA$|!isgD`|9cG4HyOOyrVj^hn1junt5ol=Z|L5#Dma1FYR9W~H0JGC%VrKhzxhQ}hS_&$ZO52Mjj%vQTmL?GA7uAj z?GAjXMMcuznIsUr#~PPMLF1I1S!?M|n{;&502m}p z0$Eu}p_0MCCp(>egZRs4=9Ir|M%eQw)?YS3D;*q>DY3qSzwC1ni={({`1_D4z06Ud zLM#Wmy<{RdrCU)tGbhh*;LV(Qmztde8l;8-IZ6vKE^SV}h&VImst ztZ0QiF+}m2gvg2gG4_Qc?~ZTpk`*e`8$fWT4Sch|iW!G}#$QClK|&oJr~7A4zDW7h zTG)0U1|{XMiMvb&jn%awbf~3&fNEaduC~6i73SV&&)|v=7wG$ptTXXJN@BiE~dP z7*BRh6_t%73KhDQsclOb4i~Sv7Q9F8%aee2V`DuD9AUUIjtf8->#3+b1Z&WxZa_`Zx9xrlC-5GXxG!9@J>+z~BB+pj%& zvbl7c8zBx2e;4BUF2wU)i06qoM^aqe?oxh@879#PKwMlpIj}SN#3kI5Z7Bv5tgeC! zT?H4q3NEl&kh|Ib*;SZ~PhrrS1IeI>iIZ`tqog<6 zIDb67Fwk5y16`k^X{0|4DMaeA>B%63L4z7X>J`Pk;)OTyZH3=|tcOyy{FI3#+CWn^3 zfLf)F;2X?wJ8VV|D5;(O#M75f0jT|zzZFZxihdQ;VfqyKdu_lDBT-u}hEMKZ3ccw5n3d8W^i$aH}G4tJ2_BrHCWs1y1Zn8y~Y&JRkzh zU10OUKpzA#*qxG1G8h#zm@a0}Vy$MN+Q5?wOJ9jg;I1)BU{_AkvSfQhg1)7wm{Pi! zk}U?83K*ML!Lb~`=%@~dv9tvW?cuZ#9v=#Ry7!KoRrpcWzj8l9B-R<7^CrMYxL#-+ zwDgj7T@Dx+FLW_(63iI*09s!&S2n**dYyD^8HJeP=byN8?-(i#b@h&+xH*R+0t}@I zFk}hPvv-tB<+yj0V{qjNTsaM{d>?zqaA~-!cMSLF9m7#E!|7s%E!L^tu{GH{R+m;+ z9Me5ygzhe_u434do;DnTU!4ZO+JeU(92;u#0ZaaRFg5GyB5J&ZyjD|}6-MfvJYebJ z=qQQrhU2NH4X5@5^xB5&!>ofR)1hir?oH`LGa2>N1xN=69v7qd1hB-%bSH{dfaQGs zaYpH&qhqKbdj%6~mfpjvB!-M(`1N(zwkk}HEd8$ccVyvGiIxRAH_ZOC*dsY&FZf$< zEu(zl(HicT9Kih&@g?vi#Hd$+3*`-qmy66$0lkQ`slR#^_@D48@MIt+%ouB1>r>z& z#Oaz&{U<N0sjJ#<`ZqMoEKGlx`@DFQtMon&BwGZI^6NT#z}pfxRo@ zmkLii)(I4w1Rp)uyBYW_U5NBL)4}+|N$_(Y3)doWQI1bf`J69zb74a^z1y!X5}x&j zV4tU6iOn^b%M{027xQHogX6ctmjcZQP(MB<_e+QMpdQwQt5M?*qoxl-B2u!JXW z5%M}MykLKNCm!^@fFntlGA7%(3=dai?FPIrh|JxGC@3ShLfh!z)p%cELV90#3Z9b7 zyb_Mn=2v)M5EGrJ;vG8&`~dF@agq%ZJ=+>ry--%M8jgR)4Uv!3NsFm z>pK0E%xQ14`b01DbWA+Im%b>P>dn~c%+wd4xF+@Jdx4AQe%QI~+xjJO0MsbN>|Hpc zZBh~HF(IY|9MOtTLAoX#9EoeT@d^(OY&+rQdSFvFfa!Hr@G0UL8wGRtQQ!mC;cO_t z=EISIfxSU1uW?D(<{ap)ny#|>8LaOBAhGQMi4R8t2GXp>l3xT;H;xl`2mp2>0N}%E z>n}+PPI}% zn^06Y+9n7(^gU~ZZ`fMz&a`Iy?aSgE1vHJtGs~7KWLz&DLH(!`=AM_%Vb4SY=!CI6 z1v|`SVB;o-_2-~6qh6Sw!K$7`FvPC&Y({8U(U(t&IxxXJwLLZ)=`jIyrX*z5gRVulk}V~2~7fQQ-!t<^p+Jgk}e3WgcZPzas{bs zP}%rwy`B-VDRnc^w4#Zf)rl(f7^-XjBgO*mW<(Tq&8$6j&2DBAwE2^alkWCcEAjn| z4Ls?F&LI7Xw>maAagxR&MhJ=-wlY4jewFf`*P^xl%<^#VFhH~a1M&vfZvdqB^Y9Al zCt{wDn6l?qrXh+ZqOW0eb|lz_8?V~eA~5w}+^dEsP9_@DyD{oz5?QWi7Mym1aTssv z#uST_d}S{Ot1_<~3Md}o#A*#nuNRS1im5qPNF(Of&P&&rU36> z6bkek3LKKkAoU+e)W5&KG!WH)?$7u9?QelQ>-r6Bnni`uS048qu3fp!h)BB4q$IZ4 zmJ|YPT>5KHHPcjgGfBNoGqKwD(o9kN_iQNQmT0KyWJ9fx(=?UljG78LZBtF|Otq6# z*0vM-RaZMntwEnu(@dqCM(S*uM(UhyngEKibkndLHVxV)o1q;AwtV5^XEV({6gxNW zaqz{HieqU-ToO659Y>3KT>??VB8r{MM345z*+-2n>lAFgu$W~kGYkkwx@M5i;ka65 z<88Q!Q9J8>!Hp#D#*NgxkGM$-Sv%WhxDk*H^E7TG9M+TT2Wv0j+c@6b+6(!*1-5Em z$7ojH4mUCi4%9ra^)J|cuSrA-#vIHR`Ki+H@fTmuC_B7?w8XK69@_ z+G4(a5gyfi9Zqr1g490q2gkpb46j3K!ehMfjQDUZV=HkB$QX2JkCOQ-${o%-*wns> zIUx%;nWGTTKLe$(G;|;k&>LR_aCH_o*WEBvF{Gu;1?e(g%xE0cVI|CVAwsMRL%fRe zC3uH4!-q5M)?SKdV-V*$n#Y40dNz@~U;61&!9(sL-L$qtm^aBPoeFMEVy~xRH6yU( zBeJ-)a<(473%v|SH{B3N2Ck;`;|m#0=F>LOX3PY(7oaz0KR45i;jOH$8IoSkFw04B zMlIMRk{(37oDc}I{0%-UN}7XG_OqCgAB)+@gs%;)&)VIng}w82_w7Q_kRZNCcQu zXGdI2A)S9>2Ej|eXFII__{WlQUWXOSHge3l+S$q*oox9Wf z&F0`N@KigP{WD_^Rof2-()FR&>AKZ)Ny@qC`J^MSYr9EbG1ey&L#=y+kvD%0@P${j zUyi&9dxjU|gLsmH+{#Z78E?Tu22|&t8ByuH0*|?8A|YI{GbT=9??6Q^Cc+UEYzRqy zBB7Dhv$cP*o$I)=bA``r(#|WHt15_y7%Lc!3T*TZ7NIZ=6w=|y^D!%lw8_jVX_FD% z(k3AqJ~oINW%?*@?nWf#O`=A5Gn+XBvV9-ES=miH<0a&kxa?fyL!78=%K(;+t1WR9 zw){aQ@+mJg1NxYyQ_(nyope`KO3=~krL5dN4+T%%H)pME5~ICUkf9YRk6F4s2FcxW z3o@u$K*31XfDE9qN`MRuNMO%#(m2z+v^nxnmC3D3wSyvjxtDE$ht*_KgJC#=JoY_Z zlHJCp@4l5O!cA*iLN206E}}>-4K$agh~=8cEWIK|n%l`1WIm!uek5lol23!QTf~ZG zE++DyVvyV@wjc{t3#bqgxsV1~xL-u(exL_y~ag2=^mNp^z|O+!Z6IM=+`=BzGE zp1gF%!BK;9JI|KY&$5_H5}QWsXIa$+8%mdEH}@n7kGRmd3p?a?wE?YN5fea&s~-TC zI|3u6Z2Dt1@zIA*zO0<(=1?@uOb#}&!&Ya(ExMSQwBYbPePo0*>FN5Mis0ZBJY>9k zqJzGMbAcWqcr`wc1+WYfAb!lG&|L}E#E>sRKEqLl*D!;D#d*a6e{e57P*$E3v6-|l z)GP!e+i_#yX+X3;SUt(>UsOhGi~-=;G3QY-K{$f`USW3T4Wl{pHv^#3ap+iEPWmQruA$wTk<_CRC(P( z75U{M;FsPq_z6lE!_{V{mZpXCE?ih&@{WS>WG0w@nKXYF)gc)%?Z{~pr{FrzWSg+c zsfbucN+i32$<(1+GV!oT6!r6xaaWLHy^^v8c+qMCH9|G(Ozk53EXN8ziz58Y{Q~nt zFb^#UdV2yUi;t_jV5@6Iv$(!CrmMmxdKo4r-c+(aXpa!Dae% z6>$jSb%+EX@Ks91QXzwPN{4e)_ogath-upSzE=DOmMZl7`&N88-0ps{?~1>k70;Q< z!i-!g;N+^!3#?Pj=uf0hWse6#4$M-Q zNIB_zbzF$8>k@P=?U!sGu1f01*-uBLiX<*wRg>Z8*H&mH0yOzDuxur+(Q3MXM$S%O9L>pogKYTkkW}rpmcGp5{i@cFz&AE^Ys>?5jRA|-`#^Wr zzB+q$4>HOsBt=+}=nKh4h+A#nM8_K0FlN)D>>z2_>_jQpg4uteiDEAM_iLhMFz;6r zab$Nj5jwNgIUfkxgd88z6P16d_Nhg69PLBaiG9e`OSgd6;(ivyilFMq0#ROTCvYQT z+tO{4f@>|2uxk%s^d>C6Me!kfBI9eWd;`AAMg?WJEhs;S@+)W$?g1BMn!tTN?KdKs zUSr~Ic@@xH>k1bgEz-U`tW0OUErmLMVD0YVW?f7!fxqz+P=jII>v>Vp2|ymMy$PTi z4*bEM2S+*UYHub2X;tK{j2d&+xwW_OEuoZ@FPA%RwstFOLq+86oO47GiLE|jsl3J& zr@yH(G1st8{-XK=0wHye&EhmhpXh?!7;uMmQNW~vf06BCtNp2k5z2(PTzLm4dwa=o}_lIv~EZL{=N2fZL`G4ozHlauPO z9zo_sD7PTxGSX|kjRkAc%Je0^T;5&5gzzlXydvF1e2c;8LoW0#d4+0!{U{F(Bi@G; zIg?V6G%2&1GCNvqHgM@F{OB*O9Yhn$G1{<@MDE>&)}4<48M8OwWg5$9=O>m-&_ohB zd*!fMy0DKvusdG^s%u<{Y$%af78wvyzx3K?V>gTmz*vOk$<)5Hv;1Xw$L?Fv%*+1O z)jzE?kgl)k&-L!~>AD(eELl$-Gd$a!DkrL6&nz-_mgR}+wQ?SCung`MD6Nk8kj{bG z%E<%fH1Yu6>EnkTv41t3kaL+=pEX^oTLC7+e6~!HP(q!)d76QjRtxlRQ$a%j_p)jjKIsD4-Luu zFyJ&*5|7FhymEj^O4&iU@k{pxm!`G-^#}MlxQkv1<}|?N1tu3BlYtLkuLDR-tviUUgWQEV~4M$OSE}0ME$s zwz_B>Ic+)`y5GGMr5w(#np2d?yrxf}3I)MiG8=4XzKrb}(iZ-fq^5eQC~>I0lf;Mq z7Ybqr-cmo7)4SQI=XgBmb$oixQG&y7w!Zj_LSt-o3jKmgfbAjPe;w4`1-K^Krq!EL z4JJYD-7J}Rl|BpQz;S`-s+P}98~Zp7N;w#8QchS2O*vtr98^}mYH{Y$HI1`T{sKTL z8fs~Vps_UzV|+Nbb=4d8cz&{~mAI-=sVv;|VH6^_fD1yl`o0!ygW4d548o@-Q0^+w z!KH7K;Xv;$#7>(^({f=8=sWX0_qq!z(-6eAphd^?`^g%61M&)Alre-GdG6#KQ<)xc zs($lAyqo0Y)p?uN$^wQb$9z(pNmxN?*l-fPea%caDp&cL=UZ6DKgPZ1)cPycuDf6s z^>_}^vu!6$NHYQU*AyLn^@SlF8w(HN6~=L_evw0#vhSI`tGxCe?c=OF+EwWk`|}WK zaB?}*H7J?O$y@5!FtfjU=EvQ^%VjfIR>AMC(i6! z-xaoJG@#Fx77?Ce$2prPG1UA;c!^8&chfeDu)Jj>g}hKi7_y=h)INq-*`e05VK--d z^xl9Ek%ZbfXT>(TuLu+bfgrl-LJ?5k9R`c2B{5fk=M^#Umts1k9Cm0!tUbHBAPy7Z z!Q3-*OMojum$@Fug4@EXR=U@^Ft_&X>yHGV9leCVReH0h8}~D=Vi1{SyOdXgCVUg% zfLMJiyy31r`^IX?H#v6ToUu^fOduwpqf;tauLKPkU1=hX*SoYan^Q{Add$4mg3&N< zZ@i5o5r)xhw)ie6+UD%XLkQ%1nI#@?V z4uB2?${SU>po2RCg@ZeTOgTUI3RXGYiPh1BP;sH+2cJ zPrn&n`e5iIB5IKSHdTjDJD}EVpXv9+>Va3zPFVD<5_H2WjnTq;?F-=)hp_gq}Szh9rSa0S>UMw-e zu9`GXFHcohpt=&uexm}JB29scu$vMxdQlU;?msT%qOn)N7Xq$RwSs;nEd{3uGfcXIHe4TOfzXn~a0-GTA1Z;qNNom_UwWFNlWgr7( za9STaGp4me6p~lIMXe%rtLsI#>cfoRSd6zmgfE@jS>UNQPJ+-i-oaRyd-H4a!^yzE zG4LS$;x@m75}ol74Jbd66d2cGWpo*L#mxhPTRP&thpvlIxE(0$ zL|4YWtE_~$xomx$m|!5VI&Sk5_`R1TpIk8sI&q3P;QTSAKE-k(;(VH+m^hzFef;Uw@to-IXf-%PhhI{YoD#QvKhbW{AZh`bs~IEoQzpr6u~YH85qe%QRpE#HTc@`Th-rVS>XI3t$MC zr|O9KJ3cI`4oP7Hk0PaQ;4Yw%=md8&Xus`cAZosErb7Rb&iAd<$Nyx=Liu*;6Shg? zPjzCl*>rs`+x$*4pZMsAyXP56tgmJu{`Otw!}-zg@d;8sQOS+TSeT5V_#0XDaVEgJ zwZ6~v>E=Uji@481Wc_v$cr46w%$?@7A0S)zo#wS4BC_!JxzoJ%Bfye9FVxYTKd$|l zxB?H#tK6TNrYxb?kk@{KZ|3~5AXkm=G_U=X`Jy|`Yd=G<>rV69&zZ!YKd$`(AvvF2 z`=z{1F0CtIl7)Mo{N<-RwQqqcIHksE)`8AQR&~f+I}G0u|0}}Uf|-ji&7FvB{+dxB zs>EEzL1P0CFl{Pdp29Dbsoe~XnYf;C+P^{GLLleF97JA<|J(7u-okz#zoDSt;-RpS zJKy;oW2^G9z6qZh7KeYG-^b~lHUolL=MRh?kqp)R-cgg+WE9E!y-w|qNL0!14V>Da z@OBq=Ww?IzfXWMAKvXjs%npQv?z97FT#kA;@&1L>gS#`wvKCk|$p3M|BV=AWr0e04 zjI&1JfkuRP%>^I{>5Kgz(wCLSAwE-ksU42_Xf3NGr#%M-4+OBw{WFr&E|)~|MWXr( z0UYF3TRS)$C}aIqVsM`NEXGhrdpbHh+)b6Pya%5ezC6bFVBTI^dnU@jEhMMo)Z6^4 zQ4xO+21lPnH+LYiQKHJz-w8GE+RmPK$J_b~GE#mDi6g`10^f;=Yd205JsNfT&*469)TGK@i%y}L2@!_5tr zd_1m(D*Mj-m?D?^~;H_u?#Uw>r|fvVDxX2Jl}A7>t~~u{*&>`>0wykG zh_LBGqRf|F435tztlBUGTQs0>Y8MkV;}^qCTVJ@H)l3h$0HOn5vDo2`oE{{xm8#%_ zlvm};E(XUpMWh;Ga3w|?Mw)-#P9<(2g{wB#8$`QsHk8}J2Zw(`;D)Paa_+6UoxBNkWu?6esdRCLuT zYh28>CZ~SnNv&kk(5NjKR|$+xDm3fkN=M32a2=N91RbWt47ILyFkgTl=QiG5BYRTS z&LK=z?TqrFhy7lQhFQnMc_YAH59e{#Qb-Wpk(X!gkH(XKNnL{9dI>ULj%_JovM|`E z*dt6duDf8$b?f;kq{>Fc$(7^lhl#vGTp)Jt6pQasIj@gnH`t2+#dLkH(5j2rqpFP& z^Yo_EsE~OSJVvMx7`j_5aPw=5ee2YbpuW{LX?n4`_cROqDp#2biZyy1&21FPpv?z=_@RbQP*Xr`pNgT z-2@pp&sJ=V^^l^orZ+l5H&%PH|l=R8jc5bebEBbf?0!1B-qDf2gmF#(~Ee(5N!i>tu(COEPR2ORc4;5lZ748 zQ%}%ATbbFRFVP3sx{ZCGF&iOIL%LC!B6E zTF;x&=@!A75N30-a}$CZO5vHXp0R@tiekXqoi^0l`Njcmdm2xtJ%itwRc?Ehv4Pt@ z49{`5{XjnUnRp^j{2(U2r#|igkq6@)VufsTcNj=ULegE^nPa3$hYa%wZkzcC1h2$- z{!NIavclEl{1W_?qgQJhsMp58s-43L)2mT3pkx;x@W*2MA%ulCW!p9}ICTy`0bZSqiJdKUGx!mAT`TwKMX&eWAW1)qNF*FX$0a(7sSyv zvx1#23Jmz1d7pvHR_m?^u5B9nHYsO6O6`Tln`X2U=A932?H;9)rn?4}?zA5Fhm|xyI&z#*Z9?{>?a}ts~LDv2qWrH&T#K zMv}4Y#6TK^$vV6nyS$6}%Enu>TqA{*jbYGc@2TTb0x}P(7$!~@67f~B<1TYVgrUBW zg=Uu*+Fc^qh#%fE_cmy(48Gwl1`+O|2hd&==H5e(I5b|7y1~m*{$|is0>iu06@^ru zAfZ&WXPGxrS0Pnnl~^@akq(yUUxUVhBV@MtJf-jwrWOWVted&RT>Oa;S2pcoel zfwr*eC&i!yO_LPY7%(p~9C6|sLFScszS#H$eBi)c7%i{raLktUVMZ0;{g)vMIMYJ_ zgunwWYe7EYsDbI1=!t))fmAO9GDbF?1#j-SL9u>9P#)+#L~+mJLFt}8kRm#VX}Le$ z!~M#}w?sIjM^o;D?pN=$>oGZqS;kOC4QIq$@G*cY-gu)`m$`6*CP1g)@B7y8slzSSeIvCADg(?r2y8V`!RT z-0I-=pJT64+Z!kIuFU!`>HD23wN|D>Q2JnQ>aIv3cqppYV82z@w(xmIpZEQg-0D%+ zgS^gG$W~irK%E5lh;#n13`}RMvJ!mubskjSAzfele4MSiIOrnptVs!Q93W<7I9nB< zEkrq=mQoK)ab^ba$Gz&=gHG1l=z{bfu41e%dO>Xg(2CC1{;0%UC|o0_EF&k$vamg8 zLMbhmlhK(I2BO&Hq>c&9a=LfH-4~W1*M{_VTn|mH;+nt7tfx-$dE%HT2Dsv=?N}f=dsK6g{j@~YI8xfd5ti=dX1-AywBN?9EO+4<+PUzzdPxJUND>PZ0z;3gBaMC90<`>ItmKl6`E{X!y{KH>_a>vAUZAV z1}e{8iI+QSzwbsI`Oq{+HkMYa{E4DTD(u}KuS$K2fKU5-7rUDz%C;M6!wiw~IBl9G|g4@uEp=iz=U#BYja^nJ>)Jp^{lh#$7nrA}!B zur82B$TiQyb`91ZDiL;x&|zf;B0NPaE9Vx1O?8a5gqgd{uX#f=q1fX|F>R|R;>BKJ zrM8OB4|r8Of7*!$5->TIX{{m0pMWCXH#cSSv;mwWb=9V7Y9s6VV^H=r`3oc@NK<-N=D-$hvlBE;DYN&r6U4-Mf( zMOH>P7m-=}1DAlg6d+j`rL#sW4YT}vmmO|u^q8%lQXS7KZl~1exOP&$UdKhG>|1ox zqn97ZqAo}-N>EaRNeubqz6G8X@aji7^MEV7GKanW^c2kQbY6=xW`x8f@X z9=s^Cp!pY*Y%-_Jqi2|9kXJPY(l!~64|i+g!M-{ivJoS1^|AzE64qyl>XfguzZsrD-ybbR*_}^IeR`tP#=^m%o3e-b`XlX2!rI)j=5skEO49m?z zbAJTMaN>{HZ2C3dkrTdpl|R5*T=U{YNCPhDHQ8qp$)sLPCT)&IG?JNxfUM=Ry3q9| z*10PFpc}~&cv0tM*Hl*N(I}WyI2(R}OG|gDGg#xG)0+fDcUeUZU3x9e(=^C!>I2`) z&0pc83qhPvI?SI9^#cG;mev{a*{bIB*-It*KjoUTqG7KvC1IfQX+BFanp zF+11?rX<=2*l6gppkcR^6XqeTqXexlS%~)LMYKIb+I0XekRTrH>x-yX{B`a^=vqtp z`PYC2LL;Dx6TJ6S0s!-~hqBNrq=uMQ7?<3wsBFN+ZYwDpC5mNGlX$M1O)0L1+ z`&5(+VUu59q7RxMdKFtf+h_sF-tK3;Xv<>DiH2 zDko+Tge3$CFa`D^NEacHghL;X|5C4prdabUhefZ}m#Fg^rYawnkBWL>>HE=w*Q3ZU z^N1YZcgv8mde0lHj27GzEqHM`ZPU|3{d~7<+4qFR(_(nV-Y4%!En)Q%K((7|Zb%muKR9C(uhhU4Yo`uWSXJKUsqqTf| zA1$cG1!?1;9KB>$hCC6>MIwiG;x9;xETU}s2$W4(ERnOiM8+9Y*d@~ZOl@j6XO6nk zo-y?@U&07Gc;D-{PXYGMDM)dV_RVjSRtDLy-hf^!jVyc=*Umr^l+4F8UWWRb)F6&o zmDs1dRASN!zWl=V!7%RCCf(QVn7;!QZNVKR{24aS1cc@o-r?&p5y;h-;I83f)Dfza z({+IWy&NONigze04_RAJOxrK#;xoSRvB)F4mFY&#q%8Sj58ONyMb#^iDFl`T@h((; zsc{)G@$9|(CH+P8O#CCqm)6rBqqWpdPD{X8-I_!(>|MH z1}CL@^<8c2VtrkAOT%?S?JTqk4%Qa-R*bsy>wEJdd!1kfO$i2v_PsTk@rT)SweazY zzK8$4%F{M%oejtslT-^8hKs{=M*?kI{b_+wwB{Oh)7pMc782UTm0T~K+A%KlaE}J4 z#(X%D7k%1jKdNN3hcch%Vl|se75%(>Ty$)5-JzZ#-*g3~-bOK*ldCmcMG74sF5Re> zbI`HjK<6U#YB}iGAn=JjZ>|(hf8U2sa|o8W{$c_3lRg27SNZ@vm`cBZZk0U7D%sQz z)ppQpv^TxH);U5d$wfpGL>q!Sp#$y&%2~H9b8q?oczYK(ovJ9OkqQbMA~g^BQT93@Jh0fW*hL+wv4p9 zG%NlR`6(?NZkjx1D7~iGlj+LdG+3pAU5JuN{k5ja$C@wr2Nuw3UhzaR2a8LuA|-|` zD;z>T8(Jp!rKLEiN-Ho?@J482i!ZOX4ZUsbo-$ z$I>cLoQ-jQ%pXoRm0m-NPaXOZ__g(a^mZw<9epUY|8ZWBHZ9bcyNgcS(VbUl)&FjC z@U4uKZ#uzjqpjG+jG?lR!#aO$vBr#qrI>FymHfv0Jx`#^wrfcmlSY_dp$`_=X&YKM z@bj;Q72GzC4#HOiU2&tk;Miy@O1z0O>q$F7FQCnx$b!wg*rkBNgc?f%)VrqJ8C%qG zCA`J`@R^L}xbBVn(y;|^x}jE#=-tE?ylA(RwxP+RQS^e#D$m3szG_l43$xg`5 zfiP?qO!za zK|wu6QOEg{x)+MBkUU}jvW-i0XS7`(krj}*f>_#{ZC696d>pWg7g9dDlb!!Q&mU_u zuNXM_H;}iY#UL?yLzBH?3GJa#SCG9YlV5}EiLXKMZ0U)!l+C?OKerhx{y$`_aCOEC z+p_yV#0?gOqH)8|{~yK8xc@zFPFx~w!Tew2##NIkEeifF-|$LWB(C6`zqXmEm*eR> zPJTYGpA|F=H?1xCD7F9}Q4)dQ^guy4D)5^=AF6rVV~wp}IMjeP<^RDyEv$dAuooNk zkM*4O4-2CHVZndlpBw+1`04PU!hN1t|H^2QR9yqK-9tg6 zcg>T0d2K9M=GHQKj8{j>0I@_e-KTShL?E()5Kv%LVB1*+cPg?k&* zoqRNa3AmU%hPRaP#f^T;st`@wg+`6WK{rp?$m%bNH@q=;7_4M0}%Pr(hophQf#Z$>tQevqsr;#5&Qm*t%rqRn$=hFZ( zFRri(yCWl|(0q&`zZs1{@YXMdK^k`hN~e<&;^{@+@Empj8gifJ9HZ$(`N0nOQmwI3 zGsu{ee;cXdu|gVHGe0y62BIEsx=p<48{N$qV@98r^!WFU2*v@-u18??v9E=ik}IdUmx;yp`XNWchT&iH1Ymo*f^28XB>| z{5!~g9$S=9+Tv`}=s(E5I?;G>DIV;!h}bO0a)fF}gO_DDGD)b8kk#|si^XA9PCo6@XvW^n->Yw3+?Cdzj{zHzBq zP~Dap`}e`8rudk{akP&FhvS;o*iVA;ik@8I8Du+sc!A=@&7VszPZTTi?Y(HM(1&-b zHJ-?!n)`x|bBH28(ff}MNo*bC5G8eIayC>PE=Fu%OhQX2>OsomW4@+-X)G-bQSPVB z${{YX*a}M1tD|r~Q~q6KGUMd_(iehc^iqoT{JZHr>Jgx#l3n`?V;;ipfIw4%Nz4Ptt5o8uLArl%HUM|!I) zr-xgL%;)s*O7RLi+L0#;a!C&aZYz4ny1nM{4i!*)AS^S^EhK^AwR@UjpeK~N5FP2X zuDC_Hv=M#Oo78lV#a6b9pao5y(<7Z-!U2Xm=qwvb68&)8WR@Zi(aA{mioF$shBuU# zuwN2?!3{?9pwYF*%ID*`mdgp&e->OTU4U11QR-eimOypwVj?_BHx`yGq+ja6mD~p& zb2a78iImqo^$xjn3dcD+QUdEoy-WeIws7@QNXw<{M#&fd$mx>KsTfb4z%3(82hjQci;gDF+T=@wWezwZ<;lsays6ZcvsVx&k_F{ zUqW2Nm$i>~hvn9nd~zCLIp*XvUd+6QmcDD;7>AH@S~v=4r`u53${6!Jy~NpR#3-Ge zMgZvSG@_F)S3r7>a=1^9eG-La?o^ng)d}p^h@-Q6>`z{!k!$9^`vSMShwL5*U-sU_ zsLWiu{~@-P{l-1^0E3&3^4LR?4rEBq%XiC@N*DZa4e{2SQk)BVc z!VfKIbnDqi+-N%4K31ReW^*O5bJThmv-M0B?Ky4B^~?r(86W0520ilFU6k=Q(0<;w zZ;%ekAP_qxFOgbeZQ@6Gz*b8&WVV%h83t&a6d0-5yuAWpM(L~g5iJNq>1%jV0=3;ma#Q_~`bLVh$+XI}W2uqXy7a zvSn@C(B6jVTdn|KCsA8E)qw!xxwMiLDy~QbF0TJ6HS$W}acU%}`oqX6wgUg|?TR{wYnEwyl3$=BSaUib?Mq zWU7Y83Qv?(=;Rl)g<9Mw5Bhli(Ch+kzUJhr&MBuJpHnuGSK7weoPuYYQ)>M$IVH~Kl(>x3 zU#!k4aQehK#io0_P51Z{<&*@QymX+mI@jRNo#nst>9wSX=cvC8)QkTDGh3wD8^@O$j-I_ZUBB)VPa$CiO&1 zr;)(U|C~ndk#_3;O{aGb&$*UP4IT?gU)p>@a&bojh{rX^d0<~(svn6>3jU^mu{wC+dwsK?U<$+iH1h{qiAtIwjh^A+oNtF zc>&(WxZbET06ozAa(XO%pA>Z8@LSy$!9{AU#(ZFZOW*|jTVtG50&mdq@e+8Lw_MT2 zB$(qxtBjU;P6<3%NH_7-)PXQq9eE$H{@xPk?s(uoaIbc!7^ifW#8aCfNP$8Gn6` zVr%ue95LK_Q$MK${*bjEB-p2f=x={UztZ2vxFnVO26P1wWj}a~JuQ!jKN)2rq0^%dPN1WI zpo4C$V*A;8u@V=Q!J_uI8s|saOhX}p%S~%J7#sPV0dRObREjXCgfL2~;aA%tvR|o1 zge7fvA;5p}E(LP>KkImj@fA$Z_IVF5xXnTH_r`IHz_- zOB=CC*1e>>v}EgEGTdYPxJf|9!)P+aN>iw~a-PEpz8dcEIkTw2)?~)!h?3~58W}F| z0(P++pW#xY8IC#`@WhESTy=KJChPw;J4&va$ejb&)&4KJD$NEyEiWx%gBLkLWT)H6 zPXD*L3Yp=*$yLyomzH6(MaI&v_-&UnmUa#d{`(As%v zSvH_qCkSXA>qMP@pR2fKIWAWPbx1~Yo2#;|d)awub*+1KPn@gjS!unKF&n{k`6Oi4 zU>X9+MiMSz5w6WK8}S9b4Q3<0BsgX^f-+{OUfnur?wQcHQi;d4Y*y5)be%%lNM+dX+-b(^is25(khwWH8`iwxt-~E z3Gu2ki93xLHJBKGR23&*y!iRJn0f@i=~gPk_KPkh{G9%GAPo=3kYDKk7xYYi=I=$# zq9G#sPt+#x#2NLY_Q}xY6Dy(g)ylX>;(YaP+_R+q z5Vwug-}y~A9`E-myieojWR2&Xc<9MvwM9JMoX*noSslV}Ci3%iR%fw#H>(e@`V#AT zn{C+2Z@yyndsYv#+CSlf1YZqHfFE8*PSqXZ5YzS95(;Tpw?i=0WY$ zq(Kv3-Pd$RQ(ry9>U*qy&uXX{-siG<8moO-9mVQ&Rv%(@eKXkhO|uW0y`g?>Mpurg z{N~~2zUs>A(B_a%V)dz_51RREYtb9j_w!odeVrE2*@mBousXd3++EDiYgzSL;>}4d zp}#q+eOSGe)f-zP6th@e(HeR_XZ0&qYq!ChQ&=6%>cTdNhh_ZS{8UIkV)Z*#e`578 ztADWSwuPQpR+CxHWVKsc_^PxW)Z18H*$!cOu^se(NGfF_$vr45<+;f;$6KFD2k1eP zRLaj6vAM}?E>R6)S|Bu-bv{d! zr4rQ;rniae6J5RxS~BR4EL#)rA`0WJjsZjgf*&32PuKKIZEc=jT zPZE8=vI8W0o<8NVja`Vi^~s+DsD6dd>QT+wk?5eKh+2{CC3UH4>LRq~5oHmzbZK@{ z^&y>SsbT6e7v?S@@@OB=Wvp`u>71v=szGi!rQZ!i9?=lG9x7Rt5_KWEnrSN0xwKbw z44YdZG?r<#&^V^|g~l`O6Pm~rHrAF&O!b6rVrnT=#?)D8GSlTkQ?%Xm|hW@%Ty^ekLhipg-jm^J;1b8XerYdLXR@-5_+6zuh5e&a@Kw# zMSgjPNqd%FU|**bbtKt~oGP|#mZ@ChQOxJiD9TeaR0F1yndYcMgL2!BsHa+>S{bBf zCzjo>IM)%{v{${NT6;*%%ZbiXud4GsMdfxBk*D4gn#A;h8p-DFAnK=fsF_Sln7&eX zFg?e#OU-7gBwDX`tGVpLHlp)YmAaeh7oi1AsUa&{#MDS=2~!85hnac`E%#84t|s!x z&XpcY<5;G>>Pe=lLaUhW6?%r!FnTv$sm+#dkHdkMWKEy_{woE^$cUg9h&}Noh%Cui?VcBpY`o%Qg$qhoV%n+Rb!O?ejFzK_U7O6H#mo z!tk^DiDk8g=p#R5XA#pOb(rluQ|LFQVxpJSFN!{}LwV_HqO*ux>Qp7GNv!h-5o&f@ z{{B!QAFkidGNr>lO59!4rzLOb1Rtrnh-8D6qtjVtThXwd;a9guVSPK3ZI5F0EH?Kf znd?a37@zH<+*-1uw^E`bO`z$*aVF$rn z1Ck9^-SyQWhupL6$_08g&Bi3F79{gj4UIn&sdUb;gV?es#X{`!nCTwl#JK>vejGt)rbm1!T-CAvFPS{(dx zslJe@9n)pHS6Gt^mlIt{y_bu_@b&dX9o6N!AL}e<8mfndtJ7$dem7iQCr{AtGub-1 zTz?iuXm6*U=43rX?_{zy^zC{N+hS|z+4@H|XH)DheV~S&_vxcymwdK>HvfC-5gm#F zy-QbtdFlzB%(S2-=oy{C^cK?^on3=o(hX{udtEnSx~dh-{ZluuA$wQ1VS0`RW1jj@ zpU!0M+^Rb>^=u85UHdy{vOo}=_kdOrIndVV9@BxvfTSP)dQPT)R?+^>CKF~@YP+cE@1TmR+q8*Ox-_7 z&)T{nT6wMDH(Tn)Ci;F+y`sdvWo_&2P3T+Jk=5?34rFyWtK(R`nbn!3x(a!~Rg3HG zq+Z>!dgqayd+IGAb#J{`QuncHLp>(vktD6g=fH2b%w-asE)w z`Xm}DpM?Ad`)SUE%+lAlSw#-_S--CmPr`HElOSzK`n5X!q}P)vhx4;d&8{bnqL}YN zdZI2~Os2FN{eP+7=9cdDVbN+v&TLkTEB|?VD-SaT3u5gzPi3Xd@`QZ zvidN48>{!!-xv7#MSf#r?C*U3YJD%omI$rht6!U*KdWCrs?8e{l3LO8H}yM^`g48c zlNrgK={ek>FR7^whLKvk!6Z@}H<(RodHMoUTQq=wE^e@ap6|_ik5uF? zi=xlNlJI<09?GwM9+5XKl}7e?@m>pc3#l|WkvBf}B=uC@uc;~O*}SwgsI6JOnAHia z-pA@1R^MfHKdY$`=s$(kzN}7+MB}hQ+GCNvWiRAGtz`8hQnhN5^=!mdJM*fNU8-I2 zdOc4xH*snPW6*LYuY z-?BX^D4Vt{+fr%U*6SNLqCL?l-3SHhzy_?o(RgevSAEDT(gJmIDd~jSsJllS<4xlR zXj#hBAA>zqT3e`aKJsB2t2wNm#p;!;-b8AOnwh_g?0hyat~S(sR=d!rZ(u*(4CXht z*7nt7`OE436ZuHZXIVwtr#S|w{?A8ww;>vnvx0OUTQjewHz%r@Um}~2t(jNQo2SVJ znz`kg`5kiW`1%>rX#IQ#9sf8{{R}@$&w;zg*3ZZ5|B%BHts9RwwKX65cd(wnud(mQ zLXC~EcsWo{RAa-Q|EiOzSdVQ&=dQi1#CE0`W4MfuWSiB*R(`G>R9Qr`o8*-rF&UD z-0~@Uqgt)2f4t7uVtiGv73^usYI|1CCG~inO&j>?B6;7kkqsC8d3qyXZETfG_PpDw z8@=D&9K9ff8q!%L9ehelQiq?ifThtmf%G+cf0U)6)>c~6YpX*2E8c4Zo!i-i>3LbLRvFE-)et+Y}bsj zx5&<2Y<54ZM_G+&54UQOdc0dGecv@folrC0>a+f)?QQHmMY%DWPxf^@R{w+T*HMmr zg4E+}u73vg22X>#`KQ7D)~Br|^-O-#oz;P?4ml06J%*nr(KAgI&|jtJB=n(K;?23B zyH#?+r9=%+0`1gw5{9|7JCI%M9TAm1`U8ECFw+eMw1>!g3^JWK-=*ml(V0v{Qxih<6PLQYNW`|ZBEnj#wey_B zC)|X9iir{f8j-lxO$z8HBCMa{uQK7T#0ochlAtnSapD^_=&{7Ns>xfM_ZywZy20eC>qI9~rGZ*1gj8v$J`|nrB$b&wwNGS7hsLU21M33PAzxj{ zv{7#-olVp*ks&n;)O|uo%|i8#==_0nHdT8>hV*N$>NK==BK?Zg`Ai#Wim1%AP*(~? zlBbzg>K>tn$+Jxx^&Ha_)hcnex9x-RA zE<%IJmQHGr(6z}=nt#9${n@a2mG7e_b3^Z_wH(y=tL>*u3i)>OI~X( zRIgi7Wyvp_i`08ew)9`5K4F?lb-^bjOQOASN=;Q26casFSD`nPN4mY#S|*s=XL>0< zile5eW+{hEZ*`bu^HjT(Bc`t!QUF`#ss1U+Ua^YMDmcZUzAEJncYwN3=%$oL-T*a> zX``N|bTVPbodBiDUz7P;BZUvh!WG#m2;C>JxDt z<_1M=VRM7jXDr*P(^AhN*)FS7!+KKB_@m5_foG z*%ZuOnYP2bA)ry@!nhh#<>6Kc{8f76NH)O&QDEh~zo`qk8qWOoGS z5Qb_xH!|DY8OV@(<^+V?6A#jhCG@=to{8!2GGA|&6c78xT zBbok!fciz|8@eln|0ur@-51bxkp}*vfF?$o`ws*(IdY~S-D^y_AkxcU638l&J+m~R zsT70NH1`;~KQh9vmMx9k=sz5odyMFjC?%|pO!glQs3P))TTSm$%m?Is7P-AzC(#Ih zS=5}jBXW=bSPfd}KOWG(B1`<00ev4C={^zAA#$N6J>^%^QPTNjpz~;ConK8ReWd$T zAT#L|en4DHt%}Mx&j;jnN}q3@j>^1q(mnG`l-OJ~A)f{0ok!-Ljq3Dzk-61sSPQ(U z45PQUT8(2WSC6Ob&}wxn(?*51>Us5~$et!&Kd)XA8CtdH)n1XkoE{TeLp!%%XSv#x zo)KE7`U<^6v|h~=`XD_o^s+iA^l^Ig&?~BQD{Jn9^tPc2b+^#x>F0$i)i7-3BRjuN z9~OFBZ57&^J~8y3>Po9eko}lGHT1q}OKUMw+v;Y(E}gqq)F|QmRROYt&HOhN}j_(Q?sKQUsQ8nI1dL^~=4MOOZ)Y4NdX|y@D^%5cUF0%9%A@nEe=zRfIdD*(-c{U8_ zdDPQ`gwVUl(c=QD@^bYeA+%ieb%cikmAWFi%4?t>7D9g_Pq)3mhJ9{YLAa6Lc%gLx zZDV6?dRW=3RBjvVnM{=$eT~LCx2KgYC3E?DWiM+E{iP;4(i^l}qg6XuuV$*$=yern zzL=TP552BJo!`frL$9k)_YgwAr%-S1%QEiIH`QNQQW)7Z)w_i->S?NZ!>6iL80R$8 z*~QjQ^go;FZkA%uZ*8v67eY_9x$Yr4(Kl_b2Qlr|XdjC7)k0_=TIlOVC)$7(dZG~8 zfR=g+Q@MI0qrz>ecMOE<v&=Qf~=-o-R8Jg)Yva2I`qiR#GO^N4Z=Aq;3Oo(i9% zFAS*2J68{5f_ra-yXi@nL+35(r`m_id3ya|ODgM-IbTn?!cy(5_rn+J=0iZ0F&O9c z)OaT1F;`FBl4Z8s_S7A$P9Agh)JvG`*tfS{&IH%L3isA^u4G%n7&jK{Q-#puEY>}Q zFy1WILo9J_E!GEzvN_J5#X9*aOQ=JNbvGvKmtx)1%6N2EtS@6iyc`Y}>+6_y>!DdH zroTR7b*iCR1H%J!WEkw67ao}vA2U$b6PiGDsV-!yRMWEFa0ls`LKx`}(yN$uYs?7@ z(#2Q9mfae20$1n}OmMwn%$0hI$cAP$iy5YS42RB2cKvESj0vuHh#9U&3r!#zq02-k zT)$Q)Tw~3_^=owpChPjOy4DEDtn1h7LMFIg95Y6D7unFPAu%`V0VAy~2>Wu&>E9CM5IuY)bn`FPB&x;|4Sw+Pd9o+YmJr|S+vsP$*)NkXXgZ_|qcs`75vk?Yyl z8nyl`-C78>{vGsq1_2=j#0abZ(^`g<%7S#H8>)B&0p`O1-?-4@Heve*t zgO#B!pQrQ3F)7Sa&DYBg4;hGv2z6+M9NvGwsx<6&LA3rgHT_*7Gs<>xV@rYVQa1bRJ+=a*124i%P7o z(IPC?-7RUbz~BBZq&=OMiLbUbjU2$!-T$0pKTu0Z!@80SRC_^KFn0f zJ pT&eXn;&YkKx5RO_Ob-+p+*_tU78y$aGQC#_t=cjjxw+cc%XASF>Yg`amg#G) zjO(5i`ZgidJuCD>La2LI=rxu&CRXSjWz}}B&_{&e`U>5n95P$?tkA_wm0b6%&^I!b zhc{5kS)pf$4C9;?dcKwMIA?`^RA_Tnk@tjtpJ}5)d_Jl71$4+fsfSF4dv-*$O3z{{ zR~Qkk()WuDBcfG$wa7lpTH`&f4-0)o^o%~8r!O|rSZ20)R(EA8SKnvNHqYs`LceD1 z_txmbDR2)Xn?q);-Yn!%d;5YObgPx+QlIZdojui3>x?5Y8}wKqjBH-kh0`FjrT-P( zI-q^#6@5lPMc%9W{D2n6yrwT@vLl;~`c@%~Y&PoWgfOz%s4Ijpve~FV5W>jjb^W;z zMmDeO`04OVWei3(mHKKSjBGaP5tevlvq>*!vLl-}^&XL7Wb?K@Qw>t^0(-%Oc>di*pGGRnN}x8He2-qA&hLc z>K#HD*=*IP%(6N$ve~Lv31MXOncgCVk{*`|*QVJx#vhwfloVld9xrjso3 z$Yz^v9MA}VyKXOpk}b-p{&B2rbYr`t5+Kyu-TiZfgr#px^Yv_khY3#vQ-wTJu?^ zP=6lL(=G8xV$hhW1D~y@k*oDY{q8%FrGu zXV)Sog*sU~cR#?y?U8oo3!y#I&O%EX?U8mi3Zcz$oWdnASFW5ohm7ltV6wHT=Zs~l z5K+l5XBv|oTZElCLTE)}ock>C*do?>KnP=tSZBTH#MmO%DO?IW?bssTX)lDaMS|1a z5|1sCoH0TeTO>Q>LKs`5IQIx)Y?10bEQGN|#CcW-V~cd>6()=d>cwU_Uo+Wyx0ds5 zKt-{&oXA7)8DvFXmeY_4EoHaZI!?ofA+uwIY-f)U#t8MC6^}&C9S-L@F9tN<)OR*B z+0jb_CzmHZZ4bAB(?tmV$cE0fOz4UCiEZdCWkUaRaBQBlQfLBEV`shSME|;pQ)?Mq zw>{iKr;rI@Sm!r$I*V*_?XuYB&SimYq}#$79ne10!nsp)PRp7X+tPVRXlT|$v8^1~ zPq`og>oTnadLeCHY&D%5IUH^i$S_0RHlUt$Hh9%Epw26?)ikuuKdXu6(hr9N8LjSo z6pQnA)^*fGr$xy_Nv$T-3^;$xI=zbIy|JeUgwlUTK$sn=rY(tkW6um^TM`e%b_!@z z+8?oBU?T1Rw|6JE}~ z4u6m^G_I%9UT6>=MFy zf3fo;lU@HSb`l?B*JF^j{hV5ss9ri8?&lN>Asq%d2Za#V1D#rrvpJgm*&BO_(@zL- zeVH@V5|22SHTI-mowS2*Dn)&-=)l}=$mUffmA5Fw<) zaOWW*q{9ejZ9rb!wa$J^G0210JAViv4_@!2t+ZiB9=zUZD1>}{y)#Y-`FgZ-yAbmA zSZ9GHo_`tZJYtFa&|{rvgwTf`>%1(4KJ-}UZA;XLUKBUh`BcbBSWdKC2xS_#p0Lk6 zj4f_-Vp&$M`n6gYd!zFs6H54zxbaTsC!uqeP%>-uz6KXI&eu7iNgt1I! z{6y#Nr`QE*JF7$!Q-D%KfB7$!O%leKfA6R|QL6_hwbo{rkt$1QQn zEU}#>&MYC=S>h}df}JJN&?fY(lNTS5cYB>han*F!F?9bi^hixgc&bkG8n&#j)3ye^ zMN}Gf&)Z6Lb3oq`l?QaBPS^Nb0t#n$jh_-wD$%V0)hC)7P*HZ@_-O&1l080tW3G{wn?+XARTt z7{tVU=Vc+p?tJG{OB(Sq-}z1m@p7-DpF#TV)`*w;oOB_?%l%FhA;imKr-KmUWr=g4 z5aQ)QXRr|BWvO$65K{9YXR;7d^C9O>A*AL*&LSbC=0nb7LWs|YoY#a9pUa((gb<&P zIo}H*K36#USsMn#=SnA02=Ten$reI}#XjfEV46yER()ch4^m}vWL@kUXQ`Eux%h;&&T28YCnY0cos;`qw5(*u zuX8#u?dEyKbTd!;TxP%OI-doIJXI* z{B3aN3!(gNa2^(Ods2ENY;cm-RQqg$Q)r3D?;D(UOgr^Y*%_qsEGGD~A5k|k2Yrto$!7@-AMLfKs~budRqb-kiD`7A=iBr z$dKzk4hXq!tJ8~P5czC*!l%w?iBHVpYoy?sjLJB~IJz&cB3^w%eUULP*=~ zj=Rp52c*MxCtV2Xu-(ZPLON`Bnh7BtwmYpYaUHVVIa6dvhwaV?A*92X&H^E%!%k7w3o&#)gNT zq!&3=c-`q&Cshbz!(W|jrrkWI{MDHxgmLk2&Ke<%eSdde62d6?i1T_tRo)-Y+d>!@ zA9X$qsLE6BXF}+aIquGYsyx@-BZQHu=l&psQL^tI5<+h+O?sV}U14pDb2AsnC~7bsuD!7oJr2Ktig!+{$>TMXI}!$?mjBbzcF#zR z%tvOp-w7S63ktskzm%&#>K1t!?rI@ZFEugKUH-C_?M>g|)p19>VhJmu+3r>*8@_D! zn}GJ2YJCcFmsD)qRuDzAy#NC>&E!0i-Jl~?GF5JEm{=I$3lK5On4R#;n* z&ziflH(J6tpvc{4iRZRkxM#g?Whi4U+zW*;|I*U!DTFfC((NyVT;9?hVu^dBt=z&l z*cP50Y2|jc#5uW@d!7(-ax3=&OPrHixkH%j>cA=Pbs|IFZS59svOYuJZR5tj37V>s z>t!dlam$$OTuB@ESth&VvyHo+2{n6f()p=1$2qy3yE~wLrk$(aVmmo)+q>CJHt(M9 zc4eAJy^_I+r@KppR@EDsc$WJX(;W3;y>W@1-6JAeOi`{ksjdY9MvjVC}EOxsEG}7(o_6(>Z zv7b92ppkBW_lkfj68pO&0vhQKaK{EzkvPCD4QQl0(7iRFio}8L9RblEWOrUb6^WO) zivt?zUg|Cjs3P%F7qQ}U>~2b=ua7WQ>PXH=_ws<+re3j;#DEDESoPGQoLW6V7m$Ratdk{${O@$zUuopL%R ztvJTq%0L#$>5}whK!}%T0_v30Gifaom3Oau&KhrBKz(!iCA|>PV3Ms5=#=cslW@&D z{wlqW*&~u(3aA^&UI}PoWJ1!b0ZoqFp7dHk!*lZDH@d4h@7fjcjqYluayp^@deTOB zr_j?xue*sKz`b&{hH`SHdjXTJQ7YX*0j={Z-BAI375|1?w8ffxE$8E;f4cpd?E39n z?sOrn-@fIp7M+`Os*>Jvb3cPQ8vD|W{Cn;-OtuZ!?2c!`3UQV9zPn0vqDA=7efx83 zj{Ewq*#?@Uw&xs3`pDhNRIaLW!pWbyv%g@S+yZTL?_#QqK?}6aohLHPac*-LS>iT) zn|oLYZTNO~*q7Elw9{X>n}pD!f9dWBsLI>n?%!c`q7DDb4eyK+^~>EULTJOkakm6i zvH z?+*Ol5?cEo+_#00U-r98ey}p+mml4w`z@jEKj2m{*?nCH-A{$k_8)W)icYls2VM0e z%$3tu6bh1mcE>Pb2j710kXz1F8G{wgU)(8Hrm;Tui@Qq9eU{ZG`LNsOC+j*^%YJiv z3t_eFclU0la)njkBks%tRwvfZ{&2m6OuTM?)XiqHeOhgrFxeFxZCZ#<%*|-i!IH-4 zOqX|l%sNjwWOZV!rp-nnjMZGz`xh(2 zSdG?6g)mkNnSqC`3}dwzGf4=evskl82qU*Rvt9^ewRp2l2=zpQN&3~=f_fs+6bYf8 zNH#-+Fgi;yidbz-%wp*g@*u9oG3a*tXW>bizz6H~c*Hn&T1L$g8d?NoON-IG~EeMy5NLLcW|oZQ6ZI#%{Y?p4W6&3-yl37va$Z%S@u4jXIdH>r0gw>51I-eFsstdWC>wb zrJJd1iANgU%o4gCh0O6tqnlYTgb{5w^97SF{oTxNE92R;Zsq`!4PQ4Crn?f5LlA@K znI4wNXFn#NXFg@J?bt=;2O+d$7nxryv7HwgMdzoHLl)P6)Vs*^5qgy3rKh=0=xL@Y zOtzNlX;v{=fA%zMt&C%$r>PJ^O!PEw2_YtWn$1iILt;u#Q$n{~!1Xuk_e<(!Zey}( z)WGoS>q1|XX^Hb$U(=8YcD|R;*R*27ib@~%V$(%*;so=>=KMfs ze8R=%648lse8mRe`9qGx-q2z*iOHV0EjBZRcm>WZ5S=(7{#UTJU_1nM5_ z^}EX4CxjEJSDD9za3Xb>StEoKsaKmyA)H9P#%vM7-s}kN?38C*c&WyFhr%uP2av|)L8E5Vk!c5|g=6)gcbjF(%LYU>4U^WP$r!&F4CxqV9 z1hZWT{lSUmTOsrZOUy4q=nqaZZnlm2Q8aH;YLbM|AH3Pr38=~|GmVANADnDj1ytqT zV$KjkKkHU=o)CI@Q_aOf=nqaaR|uicH_eO^!d%I8GszP7ey5umLRfX4ZsrN0FFf5m zWQpsZ>1LHB?w3zDYnW`me1>^RWax?CW?mPYcYeMKRJzzc-!d&`8W|t7=(jPVlgfN%>sL?q#me5;UW)g)k&RJ%%gwU5- zZW;-pFZGydDTKb%3e!;tJ=~S%JR$UOSDK53(5GE#h6tfgyV6`|iPs-ino=ek*DKAf zOm)FfRz9H~OUcrx1FhtIQ`t=s7-Zz7ayt@fmYa2tCKu z#>urYf$_?7CRqsMmFG>4B_3(4HBFi9NMoI8AIJ`Q>&yjW4&#m&%|IcHG}fEpLKtam zFyn+Uws^@*X0l;_#oWeZ!~TkSkO^UbFy$5VHWSW9tVns)>}A@`XW%xPUxaw4s4*vT zh+=rBs7VpxouZ~LQ)LYA6g9ab3IdDl!3I*(|xxm9#xhv^4qju7^ZZZV66a3by_^F%Ju!HVN@gQL{yecZ!-FLcCMdMC#j=UW%QfrmGO|6g3kp*`1=MT!?pynmd>(?M_j1 zpP0iLxNYX8fM}yikc}*Q`Ps8L*{EUTVyx` z_l;Q^&{O_5W|a{3jqWz<16t?rHk*X7Z?wv638=!aGCM5s7My~b&1{fXTA ztw|O_Zl%=;A>`KYOg@v%tv{F|rl|_2pMEeMgs>-Zzv(K3J&F5GZz1eS{Lu_zvZIL~ z&0r>*=YKR4nCvdZAI+^o*oF9$nPZ7}As#Sy3t<=H0rRlv#4f}GCX$B`*h`*VELfD1)yBQ{gU5I~}u|n8|_@^mjLP>o+<*1p> zWY^V{cfSzInDSOw(uf!Btr0@JI9>%4Z22t3@jeuDXhmIbhYoK{a|75R3Y>kV!Vz4?TwA~ zx(K0P5bt%j#OtZ?UO$nc7ZmSZC4|0Bf_H-u_JbvQQvx~=o9x{sg#BQt-ok*qxQO?l z5cY#*ddr2dAFQ_bR6t%_9q)M|^h)Y^6-;(qT+d5oviq#+d7m*MuB%dVyuH>Ow@10& zFGAQ;lk5FviTBjxdNGY{S;3x~`d%#|?5Sz!H5S62nnqq5A?&Hi_c{woTJvD{iokG}CQ|QeT!k(H!?{OjQscGSD5W=3C zmfrh9*i&P)x&_?wQ`# zVh&@cv%J_Q@XIY>jGa1p{9Pp4zq=x-ZR$U~i>-|4jMTHeaYXQ0(}wfiZr+_j9f;2J zmWwSIb9MLL6T+D5eDA0w^-fan)C;`qldUZS8b0A(=@Nx7hn!=mDaB-a#>kF_#Ef;Z*FZt zeBS8IB!W4l=6LTBA*AL6Z;R+eYEJZ87Flyh%@S`2Q8eZ!d8I;#`BHDC=tRulT=&0`nJ)drHy@H(&yNWU_3yVsM+?nIyEjjbV@<=s|8cBi*8kc~2Tdau=x&GB{x zvK!1C@8=q_yFE(0U@bCASc|+oJWphmx=qdU=&XUx{ z0m0lu$C!IKkVSHypfw!p7r3`Bb$LKAxAGWsPXscUdnzE9dpaPPd+r!>^hE{^EyDL^ z>e_(X<4rDO*YCteo5fIG1;WccD9D>u$RjHf2xu<~aj)G0zS|*%o z=$Ev~+s0%|>YLuK8nQRNgw`-;Wp8`w0Xb=Jdo7u)E$?_|1(cBXp4TJLInsUKD`v9i zuHW|tF~MiG(%$#RiMeT6^@wg38k*H0?E~*tChO}h-W-uluH8Isi?@Wy`s`zGIg@qa zV{a7`Txg&6u~#YPre&Q;^q$brtS)JvcpnK(u6tetzkjZD_gz24hQuycLdUhgY0H!Uk6aj*A{(9o=f z{83r()Q zH|-~{Ba^lBpm#Qtwez5N0Tb-}Iqje~M9fXg`kiQ`5S?6){OpYpnp`_R@{2c_$=dm= zcN>$n^H*;!6YR{4{OT8(H*by5}1S%ckq6GFdxaKZ^-=4v4sZ5fkF` za-w!ZL$iiPjDLpE(8)1h{@U+_J=XS&YL4)|0XdvE$ddIX+lG@ZjZ$H zvze?dasJYP*7gQes(*A$d1(#{T@uWsI95%Nj6icB6(AU zE^TeRA zIP2Wj&+o+k@mCAs9P~Nlj{ z{f~t(yVc$I&w-tlJiFE1j|gFQtGnMo2(w$~`-MUnd7tkO6vFJ*1%7Tg_k|WN2s2ot{N+NJ!Me^rEQA@X>-}eY!kj$^J;wi($?mSb z!QWJkMG4|g#)uOQ~fQNHm7f{@G9j$>%!p<1X zB+mA8Eosao&h}@E40k2X^&b$zOyXVsD$$9%lJ4<85yDL3JpUUZ%p}hDe-*+^;sQTB zgx%AaNnGe>3SlPkKEELo`s^Lk7y0Kf+4}PV|H6QJq(9(~52(mn;!kHn`!_uOL4W#{ zaKWBuUg~!rY6<6=ANG^30@=3eQNJ!zd3anSy1~(JCp3jxgh&00Epa=x%pb~RTc^kT zJ4J?@I3DvCiwv#PWBywrdpUh=`s4m?p-t(P=_~y@!{BA`yhQ^`WnAX=<{@)@q*ubxRrgKep1FO{!F3!8#T|U@YOX| zwl}>~Mx{SiXnCWx>6`qOLO-TonDM5+euUNOWn7W*uD^1mrPdjvGB*3&ueF3$?R|eU z6H;ZL`M}>i3No8UANo6(XkSpHNf{sdL$0&tUT(A?;}d`N^_D7$w)&AVmOgFtP{ybJ z-D53P5q;)=bOXrVe)ze+gUROd&;14CSjH8xQ(LrB;Tv@u2^(5ZcCr{_LBq3~l2f|ELh!#$WvK%`D@#@vxsEgx2t| zpDTox^00pklfC`$uzz1bBm7_eC#_Dt{qT4Hm4FudNBsTe)^)UvfBHivTSD7-)X$y* z!tIA2XB_n(xfNtvN-wmUsgiF$^g^|!T61VA{ZM{D>wG`7WjbWI{qX0EQ0V;`Rwvrc z*wBuED*V{c@Y~o0UI&T`O<}6!-I58RZ9-^86GMB1(26F7+TCvLL@Syc>d$0b(bQ0x zmGSL|kxUwDLS}CvX%Je)RH?BR(lFF@wv}PeY{Sr`Io1~Jm}nSUJ=e<67UzX} z++}5Gi~kRM?*blGb+wQ0nK^ULJ}`kK;JQX%aUYnTI?3grkvpgk!Cs_;&I;zLCx#;b>$Y<%|`M zM&{AZPlTh9d5lvj9F5H5oC}1bk$Jpx8FN>ujH0(P%bh0-$7|TboEO@;qU;IIF6PW$ z>=BN>oAb^m93J7E%$yl5j&ROm&a8cpaAq+_>-UM-M>xM=j%EVKfm_)g?)>bdoNevg zjI5)bPnn~!zc%~F4h{uF-f8T=F?*78)4hgMc{gSsL0WJUfZyui=-ZJFj=mk~;ON_tc8-5T+`+Bu@ltjNH#y_2?27gn8oTYv zKBb-8mi}4xY3eUp7=JNKKODLH4gbIZV;-Ok+#?woe+Zg3IDS;Hm4 zzc-xb1ejZ(<`vy$PjliAklO;a0Niw^@*%_36_xsDI0uAV0&b>r^TXt3YRD|-ckSF- zdzN!gJ6GzT?X2zKa?W)cn4`M1J!OuQ{|IUMh`&9rawZB#rCa4x3P+_|<=iVAm2Q>u zjN$lAXqB^BIC`^O<-8;uor_xKyu#cIe6~oH^GD&RpQv)S8K2yvR5>_ujq`qI-uRrk z&b9T1TTwJA=OSl=a1VmJ#QBuDk37`B{LI<#82L0ca-OqUII5BJoY#b-8adB-!*JZ! z&2s`za5(PW<~ha8(YMm4p&S@Kr7OFi_=h|n8TcFk#os+Y`!4Yp91J$Kk=fYQ6;C!7cCt#jrrp9#WlC%$(73y)&$xEA?OROl;@Y+BZ1IwR5F8H#%px zbK6sHcB0IE~M_=3Bztg|OgQ=qW1Ukf9L<;3J2Qo&Inf5ERXCbGJ>_J)Zo<(wrB6HO z2}kp#xD##Xa6W@mveo#c`O-$`-ga)cf0I-8hH<0$(hE-In}(xV&}OH$(Qq{HdC_SS zj%GSroNt&jzXy8B@&1u~zTlym&Pz@g<}ey!rt^}MVcd8R;$^47xbckTW#={H#=pIK z*=dw;^vkc89qTR9X}&ORa8j8wz0E65;%#!H9f_^JSDl{QOgd?Fdfgc#9QB{CI}Zv+ z{pagWqj1!JzV3|O&f&QKeBC)hI9g@B?o4OSd_TC=nPuE~?!DEyP&k@Go zbksX0Ej0ITbfzz-z4sGDkU7Bw(rbn=WyD-bG~r&rQvSpV&P~N`Df=c;b@|`d!~NUoh}ERJmIMBe&gf|M|Bt1cnU{f zV|(>T;b^7k)khhQ`!k>Zk+{)n(5I&gN2@`fo+cdiZkE1CIO;?E`j^7dYRT5u2}ga1 ztrrVNeUGj07LIyFM?WeY^@>`r6OMXCS3ld%?e=%kFA7J!VnDyv&h7T6=(mKUUa`A= zubtcNPt{GrQ4f}`KNgPq$R2v1aI}id&|e5gJ!Xbhe=_xq=3trHCmhYeGPNxneIuBu zdk9B!uuPq0IG%%L>R!Up%qmM43P<0`W$RO!GrwlZ)@KMuzh=qSXBnR^eY=&dX9`DO z`{d{ggrhHda`h#`(HA{=`f}mutDT-YDja>a6V$&Jj=s$4rEd_9zRc;ZZxfEbzUiZv z3P)exg!FRZ=nI>CeZO$@g-u`muyFMIl>+^=a5Pse&@T%|bHxI^&2aqtl>)t6IQsoc zKiwi6{eGpN_P%fGHT{02zfKj7e!o(r`v^zBUm2hW3rD|L8K}nz$7^jpNjO>`4bmqI zM`uqB(zBQ|E5#xD62tLX>O=Gb@kuMGQhkGP^y`FDy^J~2>krp=8#n%K(r|sR_@rM( z4c8l)Gb6%q{YME$_XiBuJA|W^_XxeqaJ=#^(;o>(EAKMhB0g#5U8ZLys9em~wWIVU z!qLimw5~NAue`_VRl?EAdz@Y?9Id>^>sN%Mm3O(`Asnr|C+Lrbqm}pJ`g7svS6X51 z*-5d}YIjLaSi_3H7jWaz+Ac@vTy~=|?g8saUCbPG6i+U!EMLCkaP2Nncmw&onI-)(o>ne!vv#2l^W|C;k- zecVT+^JaBN@!!Gy)Np)b+$8-Tb7mJ{lKzl63YU>PNq@y0eHrkCf0EAFOwyQa-6=GInr`m?s58Q2}fFv z(=Q80u^+Gh#2l5&S{vU-C;2={A58K&Rj2-$Qf*>5S?4fEG0e?9Sr1{(g*#2(oD}YK{UmdyRh_9{Vvf>@GduJf#*J4*XXD4lISqwQR&|4jWfb1(25vr=yoj^;#_I%6+|dx5{{K1< DUP$wm#uw^Tg;I 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

ayY#ifgtA)}+iwJ-(*5>hh?SNzUp-ZmXII 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 literal 0 HcmV?d00001 diff --git a/lib/Quartz20/net/4.0/Quartz.xml b/lib/Quartz20/net/4.0/Quartz.xml new file mode 100644 index 00000000..c983e3df --- /dev/null +++ b/lib/Quartz20/net/4.0/Quartz.xml @@ -0,0 +1,19889 @@ + + + + Quartz + + + +

+ A wrapper for generic HashSet that brings a common interface. + + + + + + Represents a collection ob objects that contains no duplicate elements. + + Marko Lahma (.NET) + + + + A sorted set. + + Marko Lahma (.NET) + + + + Returns a portion of the list whose elements are greater than the limit object parameter. + + The start element of the portion to extract. + The portion of the collection whose elements are greater than the limit object parameter. + + + + Returns the first item in the set. + + First object. + + + + Returns the object in the specified index. + + + + + + + Simple C5 wrapper for common interface. + + + + + + Default constructor. + + + + + Constructor that accepts comparer. + + Comparer to use. + + + + Constructor that prepolutates. + + + + + + Returns the first element. + + + + + + Return items from given range. + + + + + + + Indexer. + + + + + + + Only for backwards compatibility with serialization! + + + + + Responsible for creating the instances of + to be used within the instance. + + James House + Marko Lahma (.NET) + + + + Initialize the factory, providing a handle to the + that should be made available within the and + the s within it. + + + + + Called by the + to obtain instances of . + + + + + JobRunShell instances are responsible for providing the 'safe' environment + for s to run in, and for performing all of the work of + executing the , catching ANY thrown exceptions, updating + the with the 's completion code, + etc. + + A instance is created by a + on behalf of the which then runs the + shell in a thread from the configured when the + scheduler determines that a has been triggered. + + + + + + + James House + Marko Lahma (.NET) + + + + A helpful abstract base class for implementors of + . + + + The methods in this class are empty so you only need to override the + subset for the events you care about. + + Marko Lahma (.NET) + + + + + The interface to be implemented by classes that want to be informed of major + events. + + + + + James House + Marko Lahma (.NET) + + + + Called by the when a + is scheduled. + + + + + Called by the when a + is unscheduled. + + + + + + Called by the when a + has reached the condition in which it will never fire again. + + + + + Called by the a s has been paused. + + + + + Called by the a group of + s has been paused. + + + If a all groups were paused, then the parameter + will be null. + + The trigger group. + + + + Called by the when a + has been un-paused. + + + + + Called by the when a + group of s has been un-paused. + + + If all groups were resumed, then the parameter + will be null. + + The trigger group. + + + + Called by the when a + has been added. + + + + + + Called by the when a + has been deleted. + + + + + Called by the when a + has been paused. + + + + + Called by the when a + group of s has been paused. + + If all groups were paused, then the parameter will be + null. If all jobs were paused, then both parameters will be null. + + + The job group. + + + + Called by the when a + has been un-paused. + + + + + Called by the when a + has been un-paused. + + The job group. + + + + Called by the when a serious error has + occurred within the scheduler - such as repeated failures in the , + or the inability to instantiate a instance when its + has fired. + + + + + Called by the to inform the listener + that it has move to standby mode. + + + + + Called by the to inform the listener + that it has started. + + + + + Called by the to inform the listener + that it has Shutdown. + + + + + Called by the to inform the listener + that it has begun the shutdown sequence. + + + + + Called by the to inform the listener + that all jobs, triggers and calendars were deleted. + + + + + Get the for this + type's category. This should be used by subclasses for logging. + + + + + This interface should be implemented by any class whose instances are intended + to be executed by a thread. + + Marko Lahma (.NET) + + + + This method has to be implemented in order that starting of the thread causes the object's + run method to be called in that separately executing thread. + + + + + Create a JobRunShell instance with the given settings. + + The instance that should be made + available within the . + + + + + Initializes the job execution context with given scheduler and bundle. + + The scheduler. + + + + Requests the Shutdown. + + + + + This method has to be implemented in order that starting of the thread causes the object's + run method to be called in that separately executing thread. + + + + + Runs begin procedures on this instance. + + + + + Completes the execution. + + if set to true [successful execution]. + + + + Passivates this instance. + + + + + Completes the trigger retry loop. + + The trigger. + The job detail. + The inst code. + + + + + Vetoeds the job retry loop. + + The trigger. + The job detail. + The inst code. + + + + + Default concrete implementation of . + + + + + Client programs may be interested in the 'listener' interfaces that are + available from Quartz. The interface + provides notifications of Job executions. The + interface provides notifications of + firings. The + interface provides notifications of scheduler events and + errors. Listeners can be associated with local schedulers through the + interface. + + + + jhouse + 2.0 - previously listeners were managed directly on the Scheduler interface. + + + + Add the given to the, + and register it to receive events for Jobs that are matched by ANY of the + given Matchers. + + + If no matchers are provided, the will be used. + + + + + + + Add the given to the, + and register it to receive events for Jobs that are matched by ANY of the + given Matchers. + + + If no matchers are provided, the will be used. + + + + + + + Add the given Matcher to the set of matchers for which the listener + will receive events if ANY of the matchers match. + + + + the name of the listener to add the matcher to + the additional matcher to apply for selecting events + true if the identified listener was found and updated + + + + Remove the given Matcher to the set of matchers for which the listener + will receive events if ANY of the matchers match. + + + + the name of the listener to add the matcher to + the additional matcher to apply for selecting events + true if the given matcher was found and removed from the listener's list of matchers + + + + Set the set of Matchers for which the listener + will receive events if ANY of the matchers match. + + + Removes any existing matchers for the identified listener! + + the name of the listener to add the matcher to + the matchers to apply for selecting events + true if the given matcher was found and removed from the listener's list of matchers + + + + Get the set of Matchers for which the listener + will receive events if ANY of the matchers match. + + + + the name of the listener to add the matcher to + the matchers registered for selecting events for the identified listener + + + + Remove the identified from the. + + + + true if the identified listener was found in the list, and removed. + + + + Get a List containing all of the s in + the. + + + + + Get the that has the given name. + + + + + Add the given to the, + and register it to receive events for Triggers that are matched by ANY of the + given Matchers. + + + If no matcher is provided, the will be used. + + + + + + + Add the given to the, + and register it to receive events for Triggers that are matched by ANY of the + given Matchers. + + + If no matcher is provided, the will be used. + + + + + + + Add the given Matcher to the set of matchers for which the listener + will receive events if ANY of the matchers match. + + + + the name of the listener to add the matcher to + the additional matcher to apply for selecting events + true if the identified listener was found and updated + + + + Remove the given Matcher to the set of matchers for which the listener + will receive events if ANY of the matchers match. + + + + the name of the listener to add the matcher to + the additional matcher to apply for selecting events + true if the given matcher was found and removed from the listener's list of matchers + + + + Set the set of Matchers for which the listener + will receive events if ANY of the matchers match. + + + Removes any existing matchers for the identified listener! + + the name of the listener to add the matcher to + the matchers to apply for selecting events + true if the given matcher was found and removed from the listener's list of matchers + + + + Get the set of Matchers for which the listener + will receive events if ANY of the matchers match. + + + + the name of the listener to add the matcher to + the matchers registered for selecting events for the identified listener + + + + Remove the identified from the. + + + + true if the identified listener was found in the list, and + removed. + + + + Get a List containing all of the s + in the. + + + + + Get the that has the given name. + + + + + Register the given with the + . + + + + + Remove the given from the + . + + + + true if the identified listener was found in the list, and removed. + + + + Get a List containing all of the s + registered with the. + + + + + This is the heart of Quartz, an indirect implementation of the + interface, containing methods to schedule s, + register instances, etc. + + + + + + James House + Marko Lahma (.NET) + + + + Remote scheduler service interface. + + Marko Lahma (.NET) + + + + Starts this instance. + + + + + Standbies this instance. + + + + + Shutdowns this instance. + + + + + returns true if the given JobGroup + is paused + + + + + + + returns true if the given TriggerGroup + is paused + + + + + + + Initializes the class. + + + + + Register the given with the + 's list of internal listeners. + + + + + + Remove the given from the + 's list of internal listeners. + + + true if the identified listener was found in the list, andremoved. + + + + Create a with the given configuration + properties. + + + + + + Bind the scheduler to remoting infrastructure. + + + + + Un-bind the scheduler from remoting infrastructure. + + + + + Adds an object that should be kept as reference to prevent + it from being garbage collected. + + The obj. + + + + Removes the object from garbae collection protected list. + + The obj. + + + + + Starts the 's threads that fire s. + + All s that have misfired will + be passed to the appropriate TriggerListener(s). + + + + + + Temporarily halts the 's firing of s. + + The scheduler is not destroyed, and can be re-started at any time. + + + + + + Halts the 's firing of s, + and cleans up all resources associated with the QuartzScheduler. + Equivalent to . + + The scheduler cannot be re-started. + + + + + + Halts the 's firing of s, + and cleans up all resources associated with the QuartzScheduler. + + The scheduler cannot be re-started. + + + + if the scheduler will not allow this method + to return until all currently executing jobs have completed. + + + + + Validates the state. + + + + + Add the identified by the given + to the Scheduler, and + associate the given with it. + + If the given Trigger does not reference any , then it + will be set to reference the Job passed with it into this method. + + + + + + Schedule the given with the + identified by the 's settings. + + + + + Add the given to the Scheduler - with no associated + . The will be 'dormant' until + it is scheduled with a , or + is called for it. + + The must by definition be 'durable', if it is not, + SchedulerException will be thrown. + + + + + + Delete the identified from the Scheduler - and any + associated s. + + true if the Job was found and deleted. + + + + Remove the indicated from the + scheduler. + + + + + Remove (delete) the with the + given name, and store the new given one - which must be associated + with the same job. + + the key of the trigger + The new to be stored. + + if a with the given + name and group was not found and removed from the store, otherwise + the first fire time of the newly scheduled trigger. + + + + + Creates a new positive random number + + The last random obtained + Returns a new positive random number + + + + Trigger the identified (Execute it now) - with a non-volatile trigger. + + + + + Store and schedule the identified + + + + + + Pause the with the given name. + + + + + Pause all of the s in the given group. + + + + + Pause the with the given + name - by pausing all of its current s. + + + + + Pause all of the s in the + given group - by pausing all of their s. + + + + + Resume (un-pause) the with the given + name. + + If the missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Resume (un-pause) all of the s in the + matching groups. + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Gets the paused trigger groups. + + + + + + Resume (un-pause) the with + the given name. + + If any of the 's s missed one + or more fire-times, then the 's misfire + instruction will be applied. + + + + + + Resume (un-pause) all of the s + in the matching groups. + + If any of the s had s that + missed one or more fire-times, then the 's + misfire instruction will be applied. + + + + + + Pause all triggers - equivalent of calling + with a matcher matching all known groups. + + When is called (to un-pause), trigger misfire + instructions WILL be applied. + + + + + + + + Resume (un-pause) all triggers - equivalent of calling + on every group. + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + + Get the names of all known groups. + + + + + Get the names of all the s in the + given group. + + + + + Get all s that are associated with the + identified . + + + + + Get the names of all known + groups. + + + + + Get the names of all the s in + the matching groups. + + + + + Get the for the + instance with the given name and group. + + + + + Get the instance with the given name and + group. + + + + + Determine whether a with the given identifier already + exists within the scheduler. + + + + the identifier to check for + true if a Job exists with the given identifier + + + + Determine whether a with the given identifier already + exists within the scheduler. + + + + the identifier to check for + true if a Trigger exists with the given identifier + + + + Clears (deletes!) all scheduling data - all s, s + s. + + + + + Get the current state of the identified . + + + + + + Add (register) the given to the Scheduler. + + + + + Delete the identified from the Scheduler. + + true if the Calendar was found and deleted. + + + + Get the instance with the given name. + + + + + Get the names of all registered s. + + + + + Add the given to the + 's internal list. + + + + + + Remove the identified from the 's + list of internal listeners. + + + true if the identified listener was found in the list, and removed. + + + + Get the internal + that has the given name. + + + + + + + Add the given to the + 's internal list. + + + + + + Remove the identified from the 's + list of internal listeners. + + + true if the identified listener was found in the list, and removed. + + + + Get the internal that + has the given name. + + + + + + + Notifies the job store job complete. + + The trigger. + The detail. + The instruction code. + + + + Notifies the scheduler thread. + + + + + Notifies the trigger listeners about fired trigger. + + The job execution context. + + + + + Notifies the trigger listeners about misfired trigger. + + The trigger. + + + + Notifies the trigger listeners of completion. + + The job executution context. + The instruction code to report to triggers. + + + + Notifies the job listeners about job to be executed. + + The jec. + + + + Notifies the job listeners that job exucution was vetoed. + + The job execution context. + + + + Notifies the job listeners that job was executed. + + The jec. + The je. + + + + Notifies the scheduler listeners about scheduler error. + + The MSG. + The se. + + + + Notifies the scheduler listeners about job that was scheduled. + + The trigger. + + + + Notifies the scheduler listeners about job that was unscheduled. + + + + + Notifies the scheduler listeners about finalized trigger. + + The trigger. + + + + Notifies the scheduler listeners about paused trigger. + + The group. + + + + Notifies the scheduler listeners about paused trigger. + + + + + Notifies the scheduler listeners resumed trigger. + + The group. + + + + Notifies the scheduler listeners resumed trigger. + + + + + Notifies the scheduler listeners about paused job. + + + + + Notifies the scheduler listeners about paused job. + + The group. + + + + Notifies the scheduler listeners about resumed job. + + + + + Notifies the scheduler listeners about resumed job. + + The group. + + + + Notifies the scheduler listeners about scheduler shutdown. + + + + + Interrupt all instances of the identified InterruptableJob. + + + + + Interrupt all instances of the identified InterruptableJob executing in this Scheduler instance. + + + This method is not cluster aware. That is, it will only interrupt + instances of the identified InterruptableJob currently executing in this + Scheduler instance, not across the entire cluster. + + + + + + + + Obtains a lifetime service object to control the lifetime policy for this instance. + + + + + Gets the version of the Quartz Scheduler. + + The version. + + + + Gets the version major. + + The version major. + + + + Gets the version minor. + + The version minor. + + + + Gets the version iteration. + + The version iteration. + + + + Gets the scheduler signaler. + + The scheduler signaler. + + + + Returns the name of the . + + + + + Returns the instance Id of the . + + + + + Returns the of the . + + + + + Gets or sets a value indicating whether to signal on scheduling change. + + + true if schduler should signal on scheduling change; otherwise, false. + + + + + Reports whether the is paused. + + + + + Gets the job store class. + + The job store class. + + + + Gets the thread pool class. + + The thread pool class. + + + + Gets the size of the thread pool. + + The size of the thread pool. + + + + Reports whether the has been Shutdown. + + + + + Return a list of objects that + represent all currently executing Jobs in this Scheduler instance. + + This method is not cluster aware. That is, it will only return Jobs + currently executing in this Scheduler instance, not across the entire + cluster. + + + Note that the list returned is an 'instantaneous' snap-shot, and that as + soon as it's returned, the true list of executing jobs may be different. + + + + + + Get a List containing all of the internal s + registered with the . + + + + + Gets or sets the job factory. + + The job factory. + + + + Gets the running since. + + The running since. + + + + Gets the number of jobs executed. + + The number of jobs executed. + + + + Gets a value indicating whether this scheduler supports persistence. + + true if supports persistence; otherwise, false. + + + + Get a List containing all of the s + in the 's internal list. + + + + + + Get a list containing all of the s + in the 's internal list. + + + + + Helper class to start scheduler in a delayed fashion. + + + + + ErrorLogger - Scheduler Listener Class + + + + + The interface to be implemented by classes that want to be informed when a + executes. In general, applications that use a + will not have use for this mechanism. + + + + + + + + James House + Marko Lahma (.NET) + + + + Called by the when a + is about to be executed (an associated + has occurred). + + This method will not be invoked if the execution of the Job was vetoed + by a . + + + + + + + Called by the when a + was about to be executed (an associated + has occurred), but a vetoed it's + execution. + + + + + + Called by the after a + has been executed, and be for the associated 's + method has been called. + + + + + Get the name of the . + + + + + Contains all of the resources (,, + etc.) necessary to create a instance. + + + James House + Marko Lahma (.NET) + + + + Gets the unique identifier. + + Name of the scheduler. + The scheduler instance id. + + + + + Gets the unique identifier. + + + + + + Add the given for the + to use. This method expects the plugin's + "initialize" method to be invoked externally (either before or after + this method is called). + + + + + + Get or set the name for the . + + + if name is null or empty. + + + + + Get or set the instance Id for the . + + + if name is null or empty. + + + + + Get or set the name for the . + + + if name is null or empty. + + + + + Get or set the for the + to use. + + + if threadPool is null. + + + + + Get or set the for the + to use. + + + if jobStore is null. + + + + + Get or set the for the + to use. + + + if jobRunShellFactory is null. + + + + + Get the of all s for the + to use. + + + + + + Gets or sets a value indicating whether to make scheduler thread daemon. + + + true if scheduler should be thread daemon; otherwise, false. + + + + + Gets or sets the scheduler exporter. + + The scheduler exporter. + + + + The ThreadExecutor which runs the QuartzSchedulerThread. + + + + + Gets or sets the batch time window. + + + + + The thread responsible for performing the work of firing + s that are registered with the . + + + + + James House + Marko Lahma (.NET) + + + + Support class used to handle threads + + Marko Lahma (.NET) + + + + The instance of System.Threading.Thread + + + + + Initializes a new instance of the QuartzThread class + + + + + Initializes a new instance of the Thread class. + + The name of the thread + + + + This method has no functionality unless the method is overridden + + + + + Causes the operating system to change the state of the current thread instance to ThreadState.Running + + + + + Interrupts a thread that is in the WaitSleepJoin thread state + + + + + Blocks the calling thread until a thread terminates + + + + + Obtain a string that represents the current object + + A string that represents the current object + + + + Gets or sets the name of the thread + + + + + Gets or sets a value indicating the scheduling priority of a thread + + + + + Gets or sets a value indicating whether or not a thread is a background thread. + + + + + Gets the randomized idle wait time. + + The randomized idle wait time. + + + + Construct a new for the given + as a non-daemon + with normal priority. + + + + + Construct a new for the given + as a with the given + attributes. + + + + + Signals the main processing loop to pause at the next possible point. + + + + + Signals the main processing loop to pause at the next possible point. + + + + + Signals the main processing loop that a change in scheduling has been + made - in order to interrupt any sleeping that may be occuring while + waiting for the fire time to arrive. + + + the time when the newly scheduled trigger + will fire. If this method is being called do to some other even (rather + than scheduling a trigger), the caller should pass null. + + + + + The main processing loop of the . + + + + + Trigger retry loop that is executed on error condition. + + The bndle. + + + + Releases the trigger retry loop. + + The trigger. + + + + Gets the log. + + The log. + + + + Sets the idle wait time. + + The idle wait time. + + + + Gets a value indicating whether this is paused. + + true if paused; otherwise, false. + + + + Gets or sets the db failure retry interval. + + The db failure retry interval. + + + + An interface to be used by instances in order to + communicate signals back to the . + + James House + Marko Lahma (.NET) + + + + An interface to be used by instances in order to + communicate signals back to the . + + James House + Marko Lahma (.NET) + + + + Notifies the scheduler about misfired trigger. + + The trigger that misfired. + + + + Notifies the scheduler about finalized trigger. + + The trigger that has finalized. + + + + Signals the scheduling change. + + + + + Notifies the scheduler about misfired trigger. + + The trigger that misfired. + + + + Notifies the scheduler about finalized trigger. + + The trigger that has finalized. + + + + Signals the scheduling change. + + + + + Metadata information about specific ADO.NET driver library. Metadata is used to + create correct types of object instances to interact with the underlying + database. + + Marko Lahma + + + + Initializes this instance. Parses information and initializes startup + values. + + + + + Gets the name of the parameter which includes the parameter prefix for this + database. + + Name of the parameter. + + + Gets or sets the name of the assembly that holds the connection library. + The name of the assembly. + + + + Gets or sets the name of the product. + + The name of the product. + + + + Gets or sets the type of the connection. + + The type of the connection. + + + + Gets or sets the type of the command. + + The type of the command. + + + + Gets or sets the type of the parameter. + + The type of the parameter. + + + + Gets the type of the command builder. + + The type of the command builder. + + + Gets the command builder's derive parameters method. + The command builder derive parameters method. + + + + Gets or sets the parameter name prefix. + + The parameter name prefix. + + + + Gets or sets the type of the exception that is thrown when using driver + library. + + The type of the exception. + + + + Gets or sets a value indicating whether parameters are bind by name when using + ADO.NET parameters. + + true if parameters are bind by name; otherwise, false. + + + Gets or sets the type of the database parameters. + The type of the parameter db. + + + + Gets the parameter db type property. + + The parameter db type property. + + + + Gets the parameter is nullable property. + + The parameter is nullable property. + + + + Gets or sets the type of the db binary column. This is a string representation of + Enum element because this information is database driver specific. + + The type of the db binary. + + + Gets the type of the db binary. + The type of the db binary. + + + + Sets the name of the parameter db type property. + + The name of the parameter db type property. + + + + Gets or sets a value indicating whether [use parameter name prefix in parameter collection]. + + + true if [use parameter name prefix in parameter collection]; otherwise, false. + + + + + Concrete implementation of . + + Marko Lahma + + + + Data access provider interface. + + Marko Lahma + + + + Returns a new command object for executing SQL statments/Stored Procedures + against the database. + + An new + + + + Returns a new instance of the providers CommandBuilder class. + + In .NET 1.1 there was no common base class or interface + for command builders, hence the return signature is object to + be portable (but more loosely typed) across .NET 1.1/2.0 + A new Command Builder + + + + Returns a new connection object to communicate with the database. + + A new + + + + Returns a new parameter object for binding values to parameter + placeholders in SQL statements or Stored Procedure variables. + + A new + + + + Shutdowns this instance. + + + + + Connection string used to create connections. + + + + + Registers DB metadata information for given provider name. + + + + + + + Initializes a new instance of the class. + + Name of the db provider. + The connection string. + + + + Returns a new command object for executing SQL statments/Stored Procedures + against the database. + + An new + + + + Returns a new instance of the providers CommandBuilder class. + + A new Command Builder + In .NET 1.1 there was no common base class or interface + for command builders, hence the return signature is object to + be portable (but more loosely typed) across .NET 1.1/2.0 + + + + Returns a new connection object to communicate with the database. + + A new + + + + Returns a new parameter object for binding values to parameter + placeholders in SQL statements or Stored Procedure variables. + + A new + + + + Shutdowns this instance. + + + + + Connection string used to create connections. + + + + + + Gets the metadata. + + The metadata. + + + + This interface can be implemented by any + class that needs to use the constants contained herein. + + Jeffrey Wescott + James House + Marko Lahma(.NET) + + + + Simple Trigger type. + + + + + Cron Trigger type. + + + + + Calendar Interval Trigger type. + + + + + Daily Time Interval Trigger type. + + + + + A general blob Trigger type. + + + + + This class contains utility functions for use in all delegate classes. + + Jeffrey Wescott + Marko Lahma (.NET) + + + + Replace the table prefix in a query by replacing any occurrences of + "{0}" with the table prefix. + + The unsubstitued query + The table prefix + the scheduler name + The query, with proper table prefix substituted + + + + Common helper methods for working with ADO.NET. + + Marko Lahma + + + + Persist a CalendarIntervalTriggerImpl by converting internal fields to and from + SimplePropertiesTriggerProperties. + + + + + + + A base implementation of that persists + trigger fields in the "QRTZ_SIMPROP_TRIGGERS" table. This allows extending + concrete classes to simply implement a couple methods that do the work of + getting/setting the trigger's fields, and creating the + for the particular type of trigger. + + + jhouse + Marko Lahma (.NET) + + + + An interface which provides an implementation for storing a particular + type of 's extended properties. + + jhouse + + + + Initializes the persistence delegate. + + + + + Returns whether the trigger type can be handled by delegate. + + + + + Returns database discriminator value for trigger type. + + + + + Inserts trigger's special properties. + + + + + Updates trigger's special properties. + + + + + Deletes trigger's special properties. + + + + + Loads trigger's special properties. + + + + + Returns whether the trigger type can be handled by delegate. + + + + + Returns database discriminator value for trigger type. + + + + + Utility class to keep track of both active transaction + and connection. + + Marko Lahma + + + + Initializes a new instance of the class. + + The connection. + The transaction. + + + + Gets or sets the connection. + + The connection. + + + + Gets or sets the transaction. + + The transaction. + + + + Persist a CronTriggerImpl. + + + + + + + Persist a DailyTimeIntervalTrigger by converting internal fields to and from + SimplePropertiesTriggerProperties. + + + + Zemian Deng saltnlight5@gmail.com + Nuno Maia (.NET) + + + + + + + + + + Base class for database based lock handlers for providing thread/resource locking + in order to protect resources from being altered by multiple threads at the + same time. + + Marko Lahma (.NET) + + + + This class extends + to include the query string constants in use by the + class. + + Jeffrey Wescott + Marko Lahma (.NET) + + + + An interface for providing thread/resource locking in order to protect + resources from being altered by multiple threads at the same time. + + James House + Marko Lahma (.NET) + + + + Grants a lock on the identified resource to the calling thread (blocking + until it is available). + + true if the lock was obtained. + + + + Release the lock on the identified resource if it is held by the calling + thread. + + + + + Determine whether the calling thread owns a lock on the identified + resource. + + + + + Whether this Semaphore implementation requires a database connection for + its lock management operations. + + + + + + + + Interface for Quartz objects that need to know what the table prefix of + the tables used by a ADO.NET JobStore is. + + Marko Lahma (.NET) + + + + Table prefix to use. + + + + + Initializes a new instance of the class. + + The table prefix. + the scheduler name + The SQL. + The default SQL. + The db provider. + + + + Execute the SQL that will lock the proper database row. + + + + + + + + + Grants a lock on the identified resource to the calling thread (blocking + until it is available). + + + + + true if the lock was obtained. + + + + Release the lock on the identified resource if it is held by the calling + thread. + + + + + + + Determine whether the calling thread owns a lock on the identified + resource. + + + + + + + + Gets or sets the lock owners. + + The lock owners. + + + + Gets the log. + + The log. + + + + This Semaphore implementation does use the database. + + + + + Gets or sets the table prefix. + + The table prefix. + + + + Initialization argumens holder for implementations. + + + + + Whether simple should be used (for serialization safety). + + + + + The logger to use during execution. + + + + + The prefix of all table names. + + + + + The instance's name. + + + + + The instance id. + + + + + The db provider. + + + + + The type loading strategy. + + + + + Object serializer and deserializer strategy to use. + + + + + Custom driver delegate initialization. + + + initStrings are of the format: + settingName=settingValue|otherSettingName=otherSettingValue|... + + + + + Conveys the state of a fired-trigger record. + + James House + Marko Lahma (.NET) + + + + Gets or sets the fire instance id. + + The fire instance id. + + + + Gets or sets the fire timestamp. + + The fire timestamp. + + + + Gets or sets a value indicating whether job disallows concurrent execution. + + + + + Gets or sets the job key. + + The job key. + + + + Gets or sets the scheduler instance id. + + The scheduler instance id. + + + + Gets or sets the trigger key. + + The trigger key. + + + + Gets or sets the state of the fire instance. + + The state of the fire instance. + + + + Gets or sets a value indicating whether [job requests recovery]. + + true if [job requests recovery]; otherwise, false. + + + + Gets or sets the priority. + + The priority. + + + + Service interface or modifying parameters + and resultset values. + + + + + Prepares a to be used to access database. + + Connection and tranasction pair + SQL to run + + + + + Adds a parameter to . + + Command to add parameter to + Parameter's name + Parameter's value + + + + Adds a parameter to . + + Command to add parameter to + Parameter's name + Parameter's value + Parameter's data type + + + + Gets the db presentation for boolean value. Subclasses can overwrite this behaviour. + + Value to map to database. + + + + + Gets the boolean value from db presentation. Subclasses can overwrite this behaviour. + + Value to map from database. + + + + + Gets the db presentation for date/time value. Subclasses can overwrite this behaviour. + + Value to map to database. + + + + + Gets the date/time value from db presentation. Subclasses can overwrite this behaviour. + + Value to map from database. + + + + + Gets the db presentation for time span value. Subclasses can overwrite this behaviour. + + Value to map to database. + + + + + Gets the time span value from db presentation. Subclasses can overwrite this behaviour. + + Value to map from database. + + + + + This is the base interface for all driver delegate classes. + + + + This interface is very similar to the + interface except each method has an additional + parameter. + + + Unless a database driver has some extremely-DB-specific + requirements, any IDriverDelegate implementation classes should extend the + class. + + + Jeffrey Wescott + James House + Marko Lahma (.NET) + + + + Initializes the driver delegate with configuration data. + + + + + + Update all triggers having one of the two given states, to the given new + state. + + The DB Connection + The new state for the triggers + The first old state to update + The second old state to update + Number of rows updated + + + + Get the names of all of the triggers that have misfired - according to + the given timestamp. + + The DB Connection + The timestamp. + An array of objects + + + + Get the names of all of the triggers in the given state that have + misfired - according to the given timestamp. + + The DB Connection + The state. + The time stamp. + An array of objects + + + + Get the names of all of the triggers in the given group and state that + have misfired - according to the given timestamp. + + The DB Connection + Name of the group. + The state. + The timestamp. + An array of objects + + + + Select all of the triggers for jobs that are requesting recovery. The + returned trigger objects will have unique "recoverXXX" trigger names and + will be in the trigger group. + + + In order to preserve the ordering of the triggers, the fire time will be + set from the ColumnFiredTime column in the TableFiredTriggers + table. The caller is responsible for calling + on each returned trigger. It is also up to the caller to insert the + returned triggers to ensure that they are fired. + + The DB Connection + An array of objects + + + + Delete all fired triggers. + + The DB Connection + The number of rows deleted + + + + Delete all fired triggers of the given instance. + + The DB Connection + The instance id. + The number of rows deleted + + + + Insert the job detail record. + + The DB Connection + The job to insert. + Number of rows inserted. + + + + Update the job detail record. + + The DB Connection. + The job to update. + Number of rows updated. + + + + Get the names of all of the triggers associated with the given job. + + + + The DB Connection + The key identifying the job. + + + + Delete the job detail record for the given job. + + The DB Connection + The key identifying the job. + the number of rows deleted + + + + Check whether or not the given job is stateful. + + The DB Connection + The key identifying the job. + true if the job exists and is stateful, false otherwise + + + + Check whether or not the given job exists. + + The DB Connection + The key identifying the job. + true if the job exists, false otherwise + + + + Update the job data map for the given job. + + The DB Connection + The job. + the number of rows updated + + + + Select the JobDetail object for a given job name / group name. + + The DB Connection + The key identifying the job. + The class load helper. + The populated JobDetail object + + + + Select the total number of jobs stored. + + The DB Connection + the total number of jobs stored + + + + Select all of the job group names that are stored. + + The DB Connection. + an array of group names + + + + Select all of the jobs contained in a given group. + + The DB Connection + + an array of job names + + + + Insert the base trigger data. + + The DB Connection + The trigger to insert. + The state that the trigger should be stored in. + The job detail. + The number of rows inserted + + + + Insert the blob trigger data. + + The DB Connection + The trigger to insert + The number of rows inserted + + + + Update the base trigger data. + + the DB Connection + The trigger. + The state. + The job detail. + the number of rows updated + + + + Update the blob trigger data. + + the DB Connection + The trigger. + the number of rows updated + + + + Check whether or not a trigger exists. + + the DB Connection + The key identifying the trigger. + the number of rows updated + + + + Update the state for a given trigger. + + The DB Connection + The key identifying the trigger. + The new state for the trigger. + the number of rows updated + + + + Update the given trigger to the given new state, if it is in the given + old state. + + The DB connection + The key identifying the trigger. + The new state for the trigger + The old state the trigger must be in + int the number of rows updated + + + + Update the given trigger to the given new state, if it is one of the + given old states. + + The DB connection + The key identifying the trigger. + The new state for the trigger + One of the old state the trigger must be in + One of the old state the trigger must be in + One of the old state the trigger must be in + + int the number of rows updated + + SQLException + + + + Update all triggers in the given group to the given new state, if they + are in one of the given old states. + + The DB connection + + The new state for the trigger + One of the old state the trigger must be in + One of the old state the trigger must be in + One of the old state the trigger must be in + The number of rows updated + + + + Update all of the triggers of the given group to the given new state, if + they are in the given old state. + + The DB connection + + The new state for the trigger group + The old state the triggers must be in. + int the number of rows updated + + + + Update the states of all triggers associated with the given job. + + The DB Connection + The key identifying the job. + The new state for the triggers. + The number of rows updated + + + + Update the states of any triggers associated with the given job, that + are the given current state. + + The DB Connection + The key identifying the job. + The new state for the triggers + The old state of the triggers + the number of rows updated + + + + Delete the BLOB trigger data for a trigger. + + The DB Connection + The key identifying the trigger. + The number of rows deleted + + + + Delete the base trigger data for a trigger. + + The DB Connection + The key identifying the trigger. + the number of rows deleted + + + + Select the number of triggers associated with a given job. + + The DB Connection + The key identifying the job. + the number of triggers for the given job + + + + Select the job to which the trigger is associated. + + The DB Connection + The key identifying the trigger. + The load helper. + + The object associated with the given trigger + + + + + Select the triggers for a job> + + The DB Connection + The key identifying the job. + an array of objects associated with a given job. + + + + Select the triggers for a calendar + + The DB Connection. + Name of the calendar. + + An array of objects associated with a given job. + + + + + Select a trigger. + + The DB Connection. + The key identifying the trigger. + The object. + + + + + Select a trigger's JobDataMap. + + The DB Connection. + The key identifying the trigger. + The of the Trigger, never null, but possibly empty. + + + + Select a trigger's state value. + + The DB Connection. + The key identifying the trigger. + The object. + + + + Select a triggers status (state and next fire time). + + The DB Connection. + The key identifying the trigger. + A object, or null + + + + Select the total number of triggers stored. + + The DB Connection. + The total number of triggers stored. + + + + Select all of the trigger group names that are stored. + + The DB Connection. + An array of group names. + + + + Select all of the triggers contained in a given group. + + The DB Connection. + + An array of trigger names. + + + + Select all of the triggers in a given state. + + The DB Connection. + The state the triggers must be in. + An array of trigger s. + + + + Inserts the paused trigger group. + + The conn. + Name of the group. + + + + + Deletes the paused trigger group. + + The conn. + Name of the group. + + + + + Deletes all paused trigger groups. + + The conn. + + + + + Determines whether the specified trigger group is paused. + + The conn. + Name of the group. + + true if trigger group is paused; otherwise, false. + + + + + Selects the paused trigger groups. + + The DB Connection. + + + + + Determines whether given trigger group already exists. + + The conn. + Name of the group. + + true if trigger group exists; otherwise, false. + + + + + Insert a new calendar. + + The DB Connection. + The name for the new calendar. + The calendar. + The number of rows inserted. + + + + Update a calendar. + + The DB Connection. + The name for the new calendar. + The calendar. + The number of rows updated. + + + + Check whether or not a calendar exists. + + The DB Connection. + The name of the calendar. + true if the trigger exists, false otherwise. + + + + Select a calendar. + + The DB Connection. + The name of the calendar. + The Calendar. + + + + Check whether or not a calendar is referenced by any triggers. + + The DB Connection. + The name of the calendar. + true if any triggers reference the calendar, false otherwise + + + + Delete a calendar. + + The DB Connection + The name of the trigger. + The number of rows deleted. + + + + Select the total number of calendars stored. + + The DB Connection + The total number of calendars stored. + + + + Select all of the stored calendars. + + The DB Connection + An array of calendar names. + + + + Select the trigger that will be fired at the given fire time. + + The DB Connection + The time that the trigger will be fired. + + A representing the + trigger that will be fired at the given fire time, or null if no + trigger will be fired at that time + + + + + Insert a fired trigger. + + The DB Connection + The trigger. + The state that the trigger should be stored in. + The job detail. + The number of rows inserted. + + + + Select the states of all fired-trigger records for a given trigger, or + trigger group if trigger name is . + + The DB Connection + Name of the trigger. + Name of the group. + A list of FiredTriggerRecord objects. + + + + Select the states of all fired-trigger records for a given job, or job + group if job name is . + + The DB Connection + Name of the job. + Name of the group. + A List of FiredTriggerRecord objects. + + + + Select the states of all fired-trigger records for a given scheduler + instance. + + The DB Connection + Name of the instance. + A list of FiredTriggerRecord objects. + + + + Delete a fired trigger. + + The DB Connection + The fired trigger entry to delete. + The number of rows deleted. + + + + Get the number instances of the identified job currently executing. + + The DB Connection + The key identifying the job. + + The number instances of the identified job currently executing. + + + + + Insert a scheduler-instance state record. + + The DB Connection + The instance id. + The check in time. + The interval. + The number of inserted rows. + + + + Delete a scheduler-instance state record. + + The DB Connection + The instance id. + The number of deleted rows. + + + + Update a scheduler-instance state record. + + The DB Connection + The instance id. + The check in time. + The number of updated rows. + + + + A List of all current s. + + If instanceId is not null, then only the record for the identified + instance will be returned. + + + The DB Connection + The instance id. + + + + + Select the next trigger which will fire to fire between the two given timestamps + in ascending order of fire time, and then descending by priority. + + The conn. + highest value of of the triggers (exclusive) + highest value of of the triggers (inclusive) + maximum number of trigger keys allow to acquired in the returning list. + A (never null, possibly empty) list of the identifiers (Key objects) of the next triggers to be fired. + + + + Select the distinct instance names of all fired-trigger records. + + + This is useful when trying to identify orphaned fired triggers (a + fired trigger without a scheduler state record.) + + The conn. + + + + + Counts the misfired triggers in states. + + The conn. + The state1. + The ts. + + + + + Selects the misfired triggers in states. + + The conn. + The state1. + The ts. + The count. + The result list. + + + + + Clear (delete!) all scheduling data - all s, s + s. + + + + + + Exception class for when a driver delegate cannot be found for a given + configuration, or lack thereof. + + Jeffrey Wescott + Marko Lahma (.NET) + + + + Base class for exceptions thrown by the Quartz . + + + SchedulerExceptions may contain a reference to another + , which was the underlying cause of the SchedulerException. + + James House + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The MSG. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + Initializes a new instance of the class. + + The cause. + + + + Initializes a new instance of the class. + + The MSG. + The cause. + + + + Creates and returns a string representation of the current exception. + + + A string representation of the current exception. + + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + is meant to be used in an application-server + or other software framework environment that provides + container-managed-transactions. No commit / rollback will be handled by this class. + + + If you need commit / rollback, use + instead. + + Jeffrey Wescott + James House + Srinivas Venkatarangaiah + Marko Lahma (.NET) + + + + Contains base functionality for ADO.NET-based JobStore implementations. + + Jeffrey Wescott + James House + Marko Lahma (.NET) + + + + The interface to be implemented by classes that want to provide a + and storage mechanism for the + 's use. + + + Storage of s and s should be keyed + on the combination of their name and group for uniqueness. + + + + + + + + James House + Marko Lahma (.NET) + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + Called by the QuartzScheduler to inform the that + the scheduler has started. + + + + + Called by the QuartzScheduler to inform the JobStore that + the scheduler has been paused. + + + + + Called by the QuartzScheduler to inform the JobStore that + the scheduler has resumed after being paused. + + + + + Called by the QuartzScheduler to inform the that + it should free up all of it's resources because the scheduler is + shutting down. + + + + + Store the given and . + + The to be stored. + The to be stored. + ObjectAlreadyExistsException + + + + returns true if the given JobGroup is paused + + + + + + + returns true if the given TriggerGroup + is paused + + + + + + + Store the given . + + The to be stored. + + If , any existing in the + with the same name and group should be + over-written. + + + + + Remove (delete) the with the given + key, and any s that reference + it. + + + If removal of the results in an empty group, the + group should be removed from the 's list of + known group names. + + + if a with the given name and + group was found and removed from the store. + + + + + Retrieve the for the given + . + + + The desired , or null if there is no match. + + + + + Store the given . + + The to be stored. + If , any existing in + the with the same name and group should + be over-written. + ObjectAlreadyExistsException + + + + Remove (delete) the with the given key. + + + + If removal of the results in an empty group, the + group should be removed from the 's list of + known group names. + + + If removal of the results in an 'orphaned' + that is not 'durable', then the should be deleted + also. + + + + if a with the given + name and group was found and removed from the store. + + + + + Remove (delete) the with the + given name, and store the new given one - which must be associated + with the same job. + + The to be replaced. + The new to be stored. + + if a with the given + name and group was found and removed from the store. + + + + + Retrieve the given . + + + The desired , or null if there is no + match. + + + + + Determine whether a with the given identifier already + exists within the scheduler. + + + + the identifier to check for + true if a job exists with the given identifier + + + + Determine whether a with the given identifier already + exists within the scheduler. + + + + the identifier to check for + true if a trigger exists with the given identifier + + + + Clear (delete!) all scheduling data - all s, s + s. + + + + + + + Store the given . + + The name. + The to be stored. + If , any existing + in the with the same name and group + should be over-written. + If , any s existing + in the that reference an existing + Calendar with the same name with have their next fire time + re-computed with the new . + ObjectAlreadyExistsException + + + + Remove (delete) the with the + given name. + + + If removal of the would result in + s pointing to non-existent calendars, then a + will be thrown. + + The name of the to be removed. + + if a with the given name + was found and removed from the store. + + + + + Retrieve the given . + + The name of the to be retrieved. + + The desired , or null if there is no + match. + + + + + Get the number of s that are + stored in the . + + + + + + Get the number of s that are + stored in the . + + + + + + Get the number of s that are + stored in the . + + + + + + Get the names of all of the s that + have the given group name. + + If there are no jobs in the given group name, the result should be a + zero-length array (not ). + + + + + + + + Get the names of all of the s + that have the given group name. + + If there are no triggers in the given group name, the result should be a + zero-length array (not ). + + + + + + Get the names of all of the + groups. + + If there are no known group names, the result should be a zero-length + array (not ). + + + + + + Get the names of all of the + groups. + + If there are no known group names, the result should be a zero-length + array (not ). + + + + + + Get the names of all of the s + in the . + + + If there are no Calendars in the given group name, the result should be + a zero-length array (not ). + + + + + + Get all of the Triggers that are associated to the given Job. + + + If there are no matches, a zero-length array should be returned. + + + + + Get the current state of the identified . + + + + + + Pause the with the given key. + + + + + Pause all of the s in the + given group. + + + The JobStore should "remember" that the group is paused, and impose the + pause on any new triggers that are added to the group while the group is + paused. + + + + + Pause the with the given key - by + pausing all of its current s. + + + + + Pause all of the s in the given + group - by pausing all of their s. + + The JobStore should "remember" that the group is paused, and impose the + pause on any new jobs that are added to the group while the group is + paused. + + + + + + + + Resume (un-pause) the with the + given key. + + + If the missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + + + Resume (un-pause) all of the s + in the given group. + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Gets the paused trigger groups. + + + + + + Resume (un-pause) the with the + given key. + + If any of the 's s missed one + or more fire-times, then the 's misfire + instruction will be applied. + + + + + + Resume (un-pause) all of the s in + the given group. + + If any of the s had s that + missed one or more fire-times, then the 's + misfire instruction will be applied. + + + + + + Pause all triggers - equivalent of calling + on every group. + + When is called (to un-pause), trigger misfire + instructions WILL be applied. + + + + + + + Resume (un-pause) all triggers - equivalent of calling + on every group. + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + + + Get a handle to the next trigger to be fired, and mark it as 'reserved' + by the calling scheduler. + + If > 0, the JobStore should only return a Trigger + that will fire no later than the time represented in this value as + milliseconds. + + + + + + + + + Inform the that the scheduler no longer plans to + fire the given , that it had previously acquired + (reserved). + + + + + Inform the that the scheduler is now firing the + given (executing its associated ), + that it had previously acquired (reserved). + + + May return null if all the triggers or their calendars no longer exist, or + if the trigger was not successfully put into the 'executing' + state. Preference is to return an empty list if none of the triggers + could be fired. + + + + + Inform the that the scheduler has completed the + firing of the given (and the execution its + associated ), and that the + in the given should be updated if the + is stateful. + + + + + Indicates whether job store supports persistence. + + + + + + How long (in milliseconds) the implementation + estimates that it will take to release a trigger and acquire a new one. + + + + + Whether or not the implementation is clustered. + + + + + + Inform the of the Scheduler instance's Id, + prior to initialize being invoked. + + + + + Inform the of the Scheduler instance's name, + prior to initialize being invoked. + + + + + Tells the JobStore the pool size used to execute jobs. + + + + + Initializes a new instance of the class. + + + + + Gets the connection and starts a new transaction. + + + + + + Called by the QuartzScheduler before the is + used, in order to give it a chance to Initialize. + + + + + + + + Called by the QuartzScheduler to inform the JobStore that + the scheduler has been paused. + + + + + Called by the QuartzScheduler to inform the JobStore that + the scheduler has resumed after being paused. + + + + + Called by the QuartzScheduler to inform the that + it should free up all of it's resources because the scheduler is + shutting down. + + + + + Will recover any failed or misfired jobs and clean up the data store as + appropriate. + + + + + Will recover any failed or misfired jobs and clean up the data store as + appropriate. + + + + + Store the given and . + + Job to be stored. + Trigger to be stored. + + + + returns true if the given JobGroup + is paused + + + + + + + returns true if the given TriggerGroup + is paused + + + + + + + Stores the given . + + The to be stored. + + If , any existing in the + with the same name & group should be over-written. + + + + + Insert or update a job. + + + + + + Check existence of a given job. + + + + + Store the given . + + The to be stored. + + If , any existing in + the with the same name & group should + be over-written. + + + if a with the same name/group already + exists, and replaceExisting is set to false. + + + + + Insert or update a trigger. + + + + + Check existence of a given trigger. + + + + + Remove (delete) the with the given + name, and any s that reference + it. + + + + If removal of the results in an empty group, the + group should be removed from the 's list of + known group names. + + + if a with the given name & + group was found and removed from the store. + + + + + Delete a job and its listeners. + + + + + + + Delete a trigger, its listeners, and its Simple/Cron/BLOB sub-table entry. + + + + + + + + Retrieve the for the given + . + + The key identifying the job. + The desired , or null if there is no match. + + + + Remove (delete) the with the + given name. + + + + + If removal of the results in an empty group, the + group should be removed from the 's list of + known group names. + + + + If removal of the results in an 'orphaned' + that is not 'durable', then the should be deleted + also. + + + The key identifying the trigger. + + if a with the given + name & group was found and removed from the store. + + + + + + + + Retrieve the given . + + The key identifying the trigger. + The desired , or null if there is no match. + + + + Get the current state of the identified . + + + + + + + + + + Gets the state of the trigger. + + The conn. + The key identifying the trigger. + + + + + Store the given . + + The name of the calendar. + The to be stored. + + If , any existing + in the with the same name & group + should be over-written. + + + + if a with the same name already + exists, and replaceExisting is set to false. + + + + + Remove (delete) the with the given name. + + + If removal of the would result in + s pointing to non-existent calendars, then a + will be thrown. + + The name of the to be removed. + + if a with the given name + was found and removed from the store. + + + + + Retrieve the given . + + The name of the to be retrieved. + The desired , or null if there is no match. + + + + Get the number of s that are + stored in the . + + + + + Get the number of s that are + stored in the . + + + + + Get the number of s that are + stored in the . + + + + + Get the names of all of the s that + have the given group name. + + + If there are no jobs in the given group name, the result should be a + zero-length array (not ). + + + + + Determine whether a with the given identifier already + exists within the scheduler. + + + + the identifier to check for + true if a Job exists with the given identifier + + + + Determine whether a with the given identifier already + exists within the scheduler. + + + + the identifier to check for + true if a Trigger exists with the given identifier + + + + Clear (delete!) all scheduling data - all s, s + s. + + + + + + + Get the names of all of the s + that have the given group name. + + + If there are no triggers in the given group name, the result should be a + zero-length array (not ). + + + + + Get the names of all of the + groups. + + + + If there are no known group names, the result should be a zero-length + array (not ). + + + + + Get the names of all of the + groups. + + + + If there are no known group names, the result should be a zero-length + array (not ). + + + + + Get the names of all of the s + in the . + + + If there are no Calendars in the given group name, the result should be + a zero-length array (not ). + + + + + Get all of the Triggers that are associated to the given Job. + + + If there are no matches, a zero-length array should be returned. + + + + + Pause the with the given name. + + + + + Pause the with the given name. + + + + + Pause the with the given name - by + pausing all of its current s. + + + + + + Pause all of the s in the given + group - by pausing all of their s. + + + + + + Determines if a Trigger for the given job should be blocked. + State can only transition to StatePausedBlocked/StateBlocked from + StatePaused/StateWaiting respectively. + + StatePausedBlocked, StateBlocked, or the currentState. + + + + Resume (un-pause) the with the + given name. + + + If the missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + Resume (un-pause) the with the + given name. + + + If any of the 's s missed one + or more fire-times, then the 's misfire + instruction will be applied. + + + + + + Resume (un-pause) all of the s in + the given group. + + + If any of the s had s that + missed one or more fire-times, then the 's + misfire instruction will be applied. + + + + + + Pause all of the s in the given group. + + + + + + Pause all of the s in the given group. + + + + + Pause all of the s in the + given group. + + + + + Resume (un-pause) all of the s + in the given group. + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Pause all triggers - equivalent of calling + on every group. + + When is called (to un-pause), trigger misfire + instructions WILL be applied. + + + + + + + + Resume (un-pause) all triggers - equivalent of calling + on every group. + + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Resume (un-pause) all triggers - equivalent of calling + on every group. + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + + Get a handle to the next N triggers to be fired, and mark them as 'reserved' + by the calling scheduler. + + + + + + Inform the that the scheduler no longer plans to + fire the given , that it had previously acquired + (reserved). + + + + + Inform the that the scheduler has completed the + firing of the given (and the execution its + associated ), and that the + in the given should be updated if the + is stateful. + + + + + Get a list of all scheduler instances in the cluster that may have failed. + This includes this scheduler if it is checking in for the first time. + + + + + Create dummy objects for fired triggers + that have no scheduler state record. Checkin timestamp and interval are + left as zero on these dummy objects. + + + List of all current s + + + + Cleanup the given database connection. This means restoring + any modified auto commit or transaction isolation connection + attributes, and then closing the underlying connection. + + + + This is separate from closeConnection() because the Spring + integration relies on being able to overload closeConnection() and + expects the same connection back that it originally returned + from the datasource. + + + + + + Closes the supplied connection. + + (Optional) + + + + Rollback the supplied connection. + + (Optional) + + JobPersistenceException thrown if a SQLException occurs when the + connection is rolled back + + + + + Commit the supplied connection. + + The CTH. + if set to true opens a new transaction. + JobPersistenceException thrown if a SQLException occurs when the + + + + Execute the given callback in a transaction. Depending on the JobStore, + the surrounding transaction may be assumed to be already present + (managed). + + + This method just forwards to ExecuteInLock() with a null lockName. + + + + + + Execute the given callback having acquired the given lock. + Depending on the JobStore, the surrounding transaction may be + assumed to be already present (managed). This version is just a + handy wrapper around executeInLock that doesn't require a return + value. + + + The name of the lock to acquire, for example + "TRIGGER_ACCESS". If null, then no lock is acquired, but the + lockCallback is still executed in a transaction. + + + The callback to excute after having acquired the given lock. + + + + + + Execute the given callback having acquired the given lock. + Depending on the JobStore, the surrounding transaction may be + assumed to be already present (managed). + + + The name of the lock to acquire, for example + "TRIGGER_ACCESS". If null, then no lock is acquired, but the + lockCallback is still executed in a transaction. + + + The callback to excute after having acquired the given lock. + + + + + Execute the given callback having optionally acquired the given lock. + This uses the non-managed transaction connection. This version is just a + handy wrapper around executeInNonManagedTXLock that doesn't require a return + value. + + + The name of the lock to acquire, for example + "TRIGGER_ACCESS". If null, then no lock is acquired, but the + lockCallback is still executed in a non-managed transaction. + + + + The callback to excute after having acquired the given lock. + + + + + Execute the given callback having optionally acquired the given lock. + This uses the non-managed transaction connection. + + + The name of the lock to acquire, for example + "TRIGGER_ACCESS". If null, then no lock is acquired, but the + lockCallback is still executed in a non-managed transaction. + + + The callback to excute after having acquired the given lock. + + + + + Get or set the datasource name. + + + + + Gets the log. + + The log. + + + + Get or sets the prefix that should be pre-pended to all table names. + + + + + Set whether string-only properties will be handled in JobDataMaps. + + + + + Get or set the instance Id of the Scheduler (must be unique within a cluster). + + + + + Get or set the instance Id of the Scheduler (must be unique within this server instance). + + + + + Get or set whether this instance is part of a cluster. + + + + + Get or set the frequency at which this instance "checks-in" + with the other instances of the cluster. -- Affects the rate of + detecting failed instances. + + + + + Get or set the maximum number of misfired triggers that the misfire handling + thread will try to recover at one time (within one transaction). The + default is 20. + + + + + Gets or sets the database retry interval. + + The db retry interval. + + + + Get or set whether this instance should use database-based thread + synchronization. + + + + + Whether or not to obtain locks when inserting new jobs/triggers. + Defaults to , which is safest - some db's (such as + MS SQLServer) seem to require this to avoid deadlocks under high load, + while others seem to do fine without. + + + Setting this property to will provide a + significant performance increase during the addition of new jobs + and triggers. + + + + + The time span by which a trigger must have missed its + next-fire-time, in order for it to be considered "misfired" and thus + have its misfire instruction applied. + + + + + Don't call set autocommit(false) on connections obtained from the + DataSource. This can be helpfull in a few situations, such as if you + have a driver that complains if it is called when it is already off. + + + + + Set the transaction isolation level of DB connections to sequential. + + + + + Whether or not the query and update to acquire a Trigger for firing + should be performed after obtaining an explicit DB lock (to avoid + possible race conditions on the trigger's db row). This is + is considered unnecessary for most databases (due to the nature of + the SQL update that is performed), and therefore a superfluous performance hit. + + + However, if batch acquisition is used, it is important for this behavior + to be used for all dbs. + + + + + Get or set the ADO.NET driver delegate class name. + + + + + The driver delegate's initialization string. + + + + + set the SQL statement to use to select and lock a row in the "locks" + table. + + + + + + Get whether the threads spawned by this JobStore should be + marked as daemon. Possible threads include the + and the . + + + + + + Get whether to check to see if there are Triggers that have misfired + before actually acquiring the lock to recover them. This should be + set to false if the majority of the time, there are are misfired + Triggers. + + + + + + Get the driver delegate for DB operations. + + + + + Get whether String-only properties will be handled in JobDataMaps. + + + + + Indicates whether this job store supports persistence. + + + + + + + An interface for classes wishing to provide the service of loading classes + and resources within the scheduler... + + James House + Marko Lahma (.NET) + + + + Called to give the ClassLoadHelper a chance to Initialize itself, + including the oportunity to "steal" the class loader off of the calling + thread, which is the thread that is initializing Quartz. + + + + + Return the class with the given name. + + + + + Finds a resource with a given name. This method returns null if no + resource with this name is found. + + name of the desired resource + + a java.net.URL object + + + + + Finds a resource with a given name. This method returns null if no + resource with this name is found. + + name of the desired resource + + a java.io.InputStream object + + + + + Helper class for returning the composite result of trying + to recover misfired jobs. + + + + + Initializes a new instance of the class. + + if set to true [has more misfired triggers]. + The processed misfired trigger count. + + + + + Gets a value indicating whether this instance has more misfired triggers. + + + true if this instance has more misfired triggers; otherwise, false. + + + + + Gets the processed misfired trigger count. + + The processed misfired trigger count. + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + + + Called by the QuartzScheduler to inform the that + it should free up all of it's resources because the scheduler is + shutting down. + + + + + Gets the non managed TX connection. + + + + + + Execute the given callback having optionally acquired the given lock. + Because CMT assumes that the connection is already part of a managed + transaction, it does not attempt to commit or rollback the + enclosing transaction. + + + + + + + The name of the lock to acquire, for example + "TRIGGER_ACCESS". If null, then no lock is acquired, but the + txCallback is still executed in a transaction. + + Callback to execute. + + + + is meant to be used in a standalone environment. + Both commit and rollback will be handled by this class. + + Jeffrey Wescott + James House + Marko Lahma (.NET) + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + + + For , the non-managed TX connection is just + the normal connection because it is not CMT. + + + + + + Execute the given callback having optionally aquired the given lock. + For , because it manages its own transactions + and only has the one datasource, this is the same behavior as + . + + + The name of the lock to aquire, for example "TRIGGER_ACCESS". + If null, then no lock is aquired, but the lockCallback is still + executed in a transaction. + + Callback to execute. + + + + + + + + + Exception class for when there is a failure obtaining or releasing a + resource lock. + + + James House + Marko Lahma (.NET) + + + + An exception that is thrown to indicate that there has been a failure in the + scheduler's underlying persistence mechanism. + + James House + Marko Lahma (.NET) + + + + Create a with the given message. + + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + Create a with the given message + and cause. + + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + This is a driver delegate for the MySQL ADO.NET driver. + + Marko Lahma + + + + This is meant to be an abstract base class for most, if not all, + implementations. Subclasses should override only those methods that need + special handling for the DBMS driver in question. + + Jeffrey Wescott + James House + Marko Lahma (.NET) + + + + Initializes the driver delegate. + + + + + Insert the job detail record. + + the DB Connection + the new state for the triggers + the first old state to update + the second old state to update + number of rows updated + + + + Get the names of all of the triggers that have misfired. + + the DB Connection + The ts. + an array of objects + + + + Select all of the triggers in a given state. + + The DB Connection + The state the triggers must be in + an array of trigger s + + + + Get the names of all of the triggers in the given state that have + misfired - according to the given timestamp. + + The DB Connection + The state. + The time stamp. + An array of objects + + + + Get the names of all of the triggers in the given state that have + misfired - according to the given timestamp. No more than count will + be returned. + + The conn. + The state1. + The ts. + The most misfired triggers to return, negative for all + + Output parameter. A List of objects. Must not be null + + Whether there are more misfired triggers left to find beyond the given count. + + + + Get the number of triggers in the given state that have + misfired - according to the given timestamp. + + + + + + + + + Get the names of all of the triggers in the given group and state that + have misfired. + + The DB Connection + Name of the group. + The state. + The timestamp. + an array of objects + + + + Select all of the triggers for jobs that are requesting recovery. The + returned trigger objects will have unique "recoverXXX" trigger names and + will be in the + trigger group. + + + In order to preserve the ordering of the triggers, the fire time will be + set from the ColumnFiredTime column in the TableFiredTriggers + table. The caller is responsible for calling + on each returned trigger. It is also up to the caller to insert the + returned triggers to ensure that they are fired. + + The DB Connection + an array of objects + + + + Delete all fired triggers. + + The DB Connection. + The number of rows deleted. + + + + Delete all fired triggers of the given instance. + + The DB Connection + The instance id. + The number of rows deleted + + + + Clear (delete!) all scheduling data - all s, s + s. + + + + + + + Insert the job detail record. + + The DB Connection. + The job to insert. + Number of rows inserted. + + + + Gets the db presentation for boolean value. Subclasses can overwrite this behaviour. + + Value to map to database. + + + + + Gets the boolean value from db presentation. Subclasses can overwrite this behaviour. + + Value to map from database. + + + + + Gets the db presentation for date/time value. Subclasses can overwrite this behaviour. + + Value to map to database. + + + + + Gets the date/time value from db presentation. Subclasses can overwrite this behaviour. + + Value to map from database. + + + + + Gets the db presentation for time span value. Subclasses can overwrite this behaviour. + + Value to map to database. + + + + + Gets the time span value from db presentation. Subclasses can overwrite this behaviour. + + Value to map from database. + + + + + Update the job detail record. + + The DB Connection. + The job to update. + Number of rows updated. + + + + Get the names of all of the triggers associated with the given job. + + The DB Connection. + The key identifying the job. + An array of objects + + + + Delete the job detail record for the given job. + + the DB Connection + The key identifying the job. + the number of rows deleted + + + + Check whether or not the given job is stateful. + + the DB Connection + The key identifying the job. + + true if the job exists and is stateful, false otherwise + + + + + Check whether or not the given job exists. + + the DB Connection + The key identifying the job. + true if the job exists, false otherwise + + + + Update the job data map for the given job. + + The conn. + the job to update + the number of rows updated + + + + Select the JobDetail object for a given job name / group name. + + The DB Connection. + The key identifying the job. + The load helper. + The populated JobDetail object. + + + build Map from java.util.Properties encoding. + + + + Select the total number of jobs stored. + + The DB Connection. + The total number of jobs stored. + + + + Select all of the job group names that are stored. + + The DB Connection. + An array of group names. + + + + Select all of the jobs contained in a given group. + + The DB Connection. + + An array of job names. + + + + Insert the base trigger data. + + the DB Connection + the trigger to insert + the state that the trigger should be stored in + The job detail. + the number of rows inserted + + + + Insert the blob trigger data. + + The DB Connection. + The trigger to insert. + The number of rows inserted. + + + + Update the base trigger data. + + The DB Connection. + The trigger to insert. + The state that the trigger should be stored in. + The job detail. + The number of rows updated. + + + + Update the blob trigger data. + + The DB Connection. + The trigger to insert. + The number of rows updated. + + + + Check whether or not a trigger exists. + + The DB Connection. + the key of the trigger + true if the trigger exists, false otherwise + + + + Update the state for a given trigger. + + The DB Connection. + the key of the trigger + The new state for the trigger. + The number of rows updated. + + + + Update the given trigger to the given new state, if it is one of the + given old states. + + The DB connection. + the key of the trigger + The new state for the trigger. + One of the old state the trigger must be in. + One of the old state the trigger must be in. + One of the old state the trigger must be in. + The number of rows updated. + + + + Update all triggers in the given group to the given new state, if they + are in one of the given old states. + + The DB connection. + + The new state for the trigger. + One of the old state the trigger must be in. + One of the old state the trigger must be in. + One of the old state the trigger must be in. + The number of rows updated. + + + + Update the given trigger to the given new state, if it is in the given + old state. + + the DB connection + the key of the trigger + the new state for the trigger + the old state the trigger must be in + int the number of rows updated + + + + Update all of the triggers of the given group to the given new state, if + they are in the given old state. + + the DB connection + + the new state for the trigger group + the old state the triggers must be in + int the number of rows updated + + + + Update the states of all triggers associated with the given job. + + the DB Connection + the key of the job + the new state for the triggers + the number of rows updated + + + + Updates the state of the trigger states for job from other. + + The conn. + Key of the job. + The state. + The old state. + + + + + Delete the cron trigger data for a trigger. + + the DB Connection + the key of the trigger + the number of rows deleted + + + + Delete the base trigger data for a trigger. + + the DB Connection + the key of the trigger + the number of rows deleted + + + + Select the number of triggers associated with a given job. + + the DB Connection + the key of the job + the number of triggers for the given job + + + + Select the job to which the trigger is associated. + + the DB Connection + the key of the trigger + The load helper. + The object associated with the given trigger + + + + Select the triggers for a job + + the DB Connection + the key of the job + + an array of objects + associated with a given job. + + + + + Select the triggers for a calendar + + The DB Connection. + Name of the calendar. + + An array of objects associated with a given job. + + + + + Select a trigger. + + the DB Connection + the key of the trigger + The object + + + + Select a trigger's JobDataMap. + + the DB Connection + the key of the trigger + The of the Trigger, never null, but possibly empty. + + + + Select a trigger's state value. + + the DB Connection + the key of the trigger + The object + + + + Select a trigger status (state and next fire time). + + the DB Connection + the key of the trigger + + a object, or null + + + + + Select the total number of triggers stored. + + the DB Connection + the total number of triggers stored + + + + Select all of the trigger group names that are stored. + + the DB Connection + + an array of group names + + + + + Select all of the triggers contained in a given group. + + the DB Connection + + + an array of trigger names + + + + + Inserts the paused trigger group. + + The conn. + Name of the group. + + + + + Deletes the paused trigger group. + + The conn. + Name of the group. + + + + + Deletes all paused trigger groups. + + The conn. + + + + + Determines whether the specified trigger group is paused. + + The conn. + Name of the group. + + true if trigger group is paused; otherwise, false. + + + + + Determines whether given trigger group already exists. + + The conn. + Name of the group. + + true if trigger group exists; otherwise, false. + + + + + Insert a new calendar. + + the DB Connection + The name for the new calendar. + The calendar. + the number of rows inserted + IOException + + + + Update a calendar. + + the DB Connection + The name for the new calendar. + The calendar. + the number of rows updated + IOException + + + + Check whether or not a calendar exists. + + the DB Connection + The name of the calendar. + + true if the trigger exists, false otherwise + + + + + Select a calendar. + + the DB Connection + The name of the calendar. + the Calendar + ClassNotFoundException + IOException + + + + Check whether or not a calendar is referenced by any triggers. + + the DB Connection + The name of the calendar. + + true if any triggers reference the calendar, false otherwise + + + + + Delete a calendar. + + the DB Connection + The name of the trigger. + the number of rows deleted + + + + Select the total number of calendars stored. + + the DB Connection + the total number of calendars stored + + + + Select all of the stored calendars. + + the DB Connection + + an array of calendar names + + + + + Select the trigger that will be fired at the given fire time. + + the DB Connection + the time that the trigger will be fired + + a representing the + trigger that will be fired at the given fire time, or null if no + trigger will be fired at that time + + + + + Select the next trigger which will fire to fire between the two given timestamps + in ascending order of fire time, and then descending by priority. + + The conn. + highest value of of the triggers (exclusive) + highest value of of the triggers (inclusive) + maximum number of trigger keys allow to acquired in the returning list. + A (never null, possibly empty) list of the identifiers (Key objects) of the next triggers to be fired. + + + + Insert a fired trigger. + + the DB Connection + the trigger + the state that the trigger should be stored in + The job. + the number of rows inserted + + + + + Update a fired trigger. + + + + + + the DB Connection + + the trigger + + + the state that the trigger should be stored in + the number of rows inserted + + + + Select the states of all fired-trigger records for a given trigger, or + trigger group if trigger name is . + + The DB connection. + Name of the trigger. + Name of the group. + a List of objects. + + + + Select the states of all fired-trigger records for a given job, or job + group if job name is . + + The DB connection. + Name of the job. + Name of the group. + a List of objects. + + + + Select the states of all fired-trigger records for a given scheduler + instance. + + The DB Connection + Name of the instance. + A list of FiredTriggerRecord objects. + + + + Select the distinct instance names of all fired-trigger records. + + The conn. + + + This is useful when trying to identify orphaned fired triggers (a + fired trigger without a scheduler state record.) + + + + + Delete a fired trigger. + + the DB Connection + the fired trigger entry to delete + the number of rows deleted + + + + Selects the job execution count. + + The DB connection. + The key of the job. + + + + + Inserts the state of the scheduler. + + The conn. + The instance id. + The check in time. + The interval. + + + + + Deletes the state of the scheduler. + + The database connection. + The instance id. + + + + + Updates the state of the scheduler. + + The database connection. + The instance id. + The check in time. + + + + + A List of all current s. + + If instanceId is not null, then only the record for the identified + instance will be returned. + + + The DB Connection + The instance id. + + + + + Replace the table prefix in a query by replacing any occurrences of + "{0}" with the table prefix. + + The unsubstitued query + The query, with proper table prefix substituted + + + + Create a serialized version of an Object. + + the object to serialize + Serialized object as byte array. + + + + Remove the transient data from and then create a serialized + version of a and returns the underlying bytes. + + The data. + the serialized data as byte array + + + + serialize + + The data. + + + + + Convert the JobDataMap into a list of properties. + + + + + Convert the JobDataMap into a list of properties. + + + + + This method should be overridden by any delegate subclasses that need + special handling for BLOBs. The default implementation uses standard + ADO.NET operations. + + The data reader, already queued to the correct row. + The column index for the BLOB. + The deserialized object from the DataReader BLOB. + + + + This method should be overridden by any delegate subclasses that need + special handling for BLOBs for job details. + + The result set, already queued to the correct row. + The column index for the BLOB. + The deserialized Object from the ResultSet BLOB. + + + + Selects the paused trigger groups. + + The DB Connection. + + + + + Gets the select next trigger to acquire SQL clause. + MySQL version with LIMIT support. + + + + + + Exception class for when a driver delegate cannot be found for a given + configuration, or lack thereof. + + Jeffrey Wescott + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + This is a driver delegate for the Oracle database. + + Marko Lahma + + + + Creates the SQL for select next trigger to acquire. + + + + + Gets the db presentation for boolean value. For Oracle we use true/false of "1"/"0". + + Value to map to database. + + + + + Conveys a scheduler-instance state record. + + James House + Marko Lahma (.NET) + + + + Gets or sets the checkin interval. + + The checkin interval. + + + + Gets or sets the checkin timestamp. + + The checkin timestamp. + + + + Gets or sets the scheduler instance id. + + The scheduler instance id. + + + + Internal in-memory lock handler for providing thread/resource locking in + order to protect resources from being altered by multiple threads at the + same time. + + James House + Marko Lahma (.NET) + + + + Grants a lock on the identified resource to the calling thread (blocking + until it is available). + + True if the lock was obtained. + + + Release the lock on the identified resource if it is held by the calling + thread. + + + + + Determine whether the calling thread owns a lock on the identified + resource. + + + + + Gets the thread locks. + + The thread locks. + + + + Whether this Semaphore implementation requires a database connection for + its lock management operations. + + + + + + + + + This is a driver delegate for the SQLiteDelegate ADO.NET driver. + + Marko Lahma + + + + Gets the select next trigger to acquire SQL clause. + SQLite version with LIMIT support. + + + + + + A SQL Server specific driver delegate. + + Marko Lahma + + + + Gets the select next trigger to acquire SQL clause. + SQL Server specific version with TOP functionality + + + + + + Internal database based lock handler for providing thread/resource locking + in order to protect resources from being altered by multiple threads at the + same time. + + James House + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + The table prefix. + the scheduler name + The select with lock SQL. + + + + + Execute the SQL select for update that will lock the proper database row. + + + + + Property name and value holder for trigger state data. + + + + + Object representing a job or trigger key. + + James House + Marko Lahma (.NET) + + + + Construct a new TriggerStatus with the status name and nextFireTime. + + The trigger's status + The next time trigger will fire + + + + Return the string representation of the TriggerStatus. + + + + + + Provide thread/resource locking in order to protect + resources from being altered by multiple threads at the same time using + a db row update. + + + + Note: This Semaphore implementation is useful for databases that do + not support row locking via "SELECT FOR UPDATE" or SQL Server's type syntax. + + + As of Quartz.NET 2.0 version there is no need to use this implementation for + SQL Server databases. + + + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + + + + Execute the SQL that will lock the proper database row. + + + + + + + + + This implementation of the Calendar excludes a set of days of the year. You + may use it to exclude bank holidays which are on the same date every year. + + + + Juergen Donnerstag + Marko Lahma (.NET) + + + + This implementation of the Calendar may be used (you don't have to) as a + base class for more sophisticated one's. It merely implements the base + functionality required by each Calendar. + + + Regarded as base functionality is the treatment of base calendars. Base + calendar allow you to chain (stack) as much calendars as you may need. For + example to exclude weekends you may use WeeklyCalendar. In order to exclude + holidays as well you may define a WeeklyCalendar instance to be the base + calendar for HolidayCalendar instance. + + + Juergen Donnerstag + James House + Marko Lahma (.NET) + + + + An interface to be implemented by objects that define spaces of time during + which an associated may (not) fire. Calendars + do not define actual fire times, but rather are used to limit a + from firing on its normal schedule if necessary. Most + Calendars include all times by default and allow the user to specify times + to exclude. + + + As such, it is often useful to think of Calendars as being used to exclude a block + of time - as opposed to include a block of time. (i.e. the + schedule "fire every five minutes except on Sundays" could be + implemented with a and a + which excludes Sundays) + + Implementations MUST take care of being properly cloneable and Serializable. + + + James House + Juergen Donnerstag + Marko Lahma (.NET) + + + + Determine whether the given UTC time is 'included' by the + Calendar. + + + + + Determine the next UTC time that is 'included' by the + Calendar after the given UTC time. + + + + + Gets or sets a description for the instance - may be + useful for remembering/displaying the purpose of the calendar, though + the description has no meaning to Quartz. + + + + + Set a new base calendar or remove the existing one. + Get the base calendar. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The base calendar. + + + + Initializes a new instance of the class. + + The time zone. + + + + Initializes a new instance of the class. + + The base calendar. + The time zone. + + + + Serialization constructor. + + + + + + + checks whether two arrays have + the same length and + for any given place there are equal elements + in both arrays + + + + + + Get the base calendar. Will be null, if not set. + + + + + Check if date/time represented by timeStamp is included. If included + return true. The implementation of BaseCalendar simply calls the base + calendars IsTimeIncluded() method if base calendar is set. + + + + + + Determine the next UTC time (in milliseconds) that is 'included' by the + Calendar after the given time. Return the original value if timeStamp is + included. Return 0 if all days are excluded. + + + + + + Creates a new object that is a copy of the current instance. + + A new object that is a copy of this instance. + + + + Gets or sets the time zone. + + The time zone. + + + + Gets or sets the description given to the instance by + its creator (if any). + + + + + Set a new base calendar or remove the existing one + + + + + + Constructor + + + + + Constructor + + The base calendar. + + + + Serialization constructor. + + + + + + + Return true, if day is defined to be exluded. + + + + + Redefine a certain day to be excluded (true) or included (false). + + + + + Determine whether the given UTC time (in milliseconds) is 'included' by the + Calendar. + + Note that this Calendar is only has full-day precision. + + + + + + Determine the next UTC time (in milliseconds) that is 'included' by the + Calendar after the given time. Return the original value if timeStampUtc is + included. Return 0 if all days are excluded. + + Note that this Calendar is only has full-day precision. + + + + + + Get or the array which defines the exclude-value of each day of month. + Setting will redefine the array of days excluded. The array must of size greater or + equal 31. + + + + + This implementation of the Calendar excludes the set of times expressed by a + given CronExpression. + + + For example, you could use this calendar to exclude all but business hours (8AM - 5PM) every + day using the expression "* * 0-7,18-23 ? * *". + + It is important to remember that the cron expression here describes a set of + times to be excluded from firing. Whereas the cron expression in + CronTrigger describes a set of times that can + be included for firing. Thus, if a has a + given cron expression and is associated with a with + the same expression, the calendar will exclude all the times the + trigger includes, and they will cancel each other out. + + + Aaron Craven + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + a string representation of the desired cron expression + + + + Create a with the given cron expression and + . + + + the base calendar for this calendar instance + see BaseCalendar for more information on base + calendar functionality + + a string representation of the desired cron expression + + + + Create a with the given cron expression and + . + + + the base calendar for this calendar instance + see BaseCalendar for more information on base + calendar functionality + + a string representation of the desired cron expression + + + + + Serialization constructor. + + + + + + + Determine whether the given time is 'included' by the + Calendar. + + the time to test + a boolean indicating whether the specified time is 'included' by the CronCalendar + + + + Determine the next time that is 'included' by the + Calendar after the given time. Return the original value if timeStamp is + included. Return 0 if all days are excluded. + + + + + + + Creates a new object that is a copy of the current instance. + + A new object that is a copy of this instance. + + + + Returns a that represents the current . + + + A that represents the current . + + + + + Sets the cron expression for the calendar to a new value. + + The expression. + + + + Returns the object representation of the cron expression that defines the + dates and times this calendar excludes. + + + + + This implementation of the Calendar excludes (or includes - see below) a + specified time range each day. + + + For example, you could use this calendar to + exclude business hours (8AM - 5PM) every day. Each + only allows a single time range to be specified, and that time range may not + * cross daily boundaries (i.e. you cannot specify a time range from 8PM - 5AM). + If the property is (default), + the time range defines a range of times in which triggers are not allowed to + * fire. If is , the time range + is inverted: that is, all times outside the defined time range + are excluded. + + Note when using , it behaves on the same principals + as, for example, WeeklyCalendar defines a set of days that are + excluded every week. Likewise, defines a + set of times that are excluded every day. + + + Mike Funk + Aaron Craven + Marko Lahma (.NET) + + + + Create a with a time range defined by the + specified strings and no baseCalendar. + and + must be in the format "HH:MM[:SS[:mmm]]" where: +
    +
  • + HH is the hour of the specified time. The hour should be + specified using military (24-hour) time and must be in the range + 0 to 23. +
  • +
  • + MM is the minute of the specified time and must be in the range + 0 to 59. +
  • +
  • + SS is the second of the specified time and must be in the range + 0 to 59. +
  • +
  • + mmm is the millisecond of the specified time and must be in the + range 0 to 999. +
  • +
  • items enclosed in brackets ('[', ']') are optional.
  • +
  • + The time range starting time must be before the time range ending + time. Note this means that a time range may not cross daily + boundaries (10PM - 2AM) +
  • +
+
+
+ + + Create a with a time range defined by the + specified strings and the specified baseCalendar. + and + must be in the format "HH:MM[:SS[:mmm]]" where: +
    +
  • + HH is the hour of the specified time. The hour should be + specified using military (24-hour) time and must be in the range + 0 to 23. +
  • +
  • + MM is the minute of the specified time and must be in the range + 0 to 59. +
  • +
  • + SS is the second of the specified time and must be in the range + 0 to 59. +
  • +
  • + mmm is the millisecond of the specified time and must be in the + range 0 to 999. +
  • +
  • + items enclosed in brackets ('[', ']') are optional. +
  • +
  • + The time range starting time must be before the time range ending + time. Note this means that a time range may not cross daily + boundaries (10PM - 2AM) +
  • +
+
+ The base calendar for this calendar instance see BaseCalendar for more + information on base calendar functionality. +
+ + + Create a with a time range defined by the + specified values and no baseCalendar. Values are subject to + the following validations: +
    +
  • + Hours must be in the range 0-23 and are expressed using military + (24-hour) time. +
  • +
  • Minutes must be in the range 0-59
  • +
  • Seconds must be in the range 0-59
  • +
  • Milliseconds must be in the range 0-999
  • +
  • + The time range starting time must be before the time range ending + time. Note this means that a time range may not cross daily + boundaries (10PM - 2AM) +
  • +
+
+ The range starting hour of day. + The range starting minute. + The range starting second. + The range starting millis. + The range ending hour of day. + The range ending minute. + The range ending second. + The range ending millis. +
+ + + Create a with a time range defined by the + specified values and the specified . Values are + subject to the following validations: +
    +
  • + Hours must be in the range 0-23 and are expressed using military + (24-hour) time. +
  • +
  • Minutes must be in the range 0-59
  • +
  • Seconds must be in the range 0-59
  • +
  • Milliseconds must be in the range 0-999
  • +
  • + The time range starting time must be before the time range ending + time. Note this means that a time range may not cross daily + boundaries (10PM - 2AM) +
  • +
+
+ The range starting hour of day. + The range starting minute. + The range starting second. + The range starting millis. + The range ending hour of day. + The range ending minute. + The range ending second. + The range ending millis. +
+ + + Create a with a time range defined by the + specified s and no + baseCalendar. The Calendars are subject to the following + considerations: +
    +
  • + Only the time-of-day fields of the specified Calendars will be + used (the date fields will be ignored) +
  • +
  • + The starting time must be before the ending time of the defined + time range. Note this means that a time range may not cross + daily boundaries (10PM - 2AM). (because only time fields are + are used, it is possible for two Calendars to represent a valid + time range and + rangeStartingCalendar.after(rangeEndingCalendar) == true) + +
  • +
+
+ The range starting calendar. + The range ending calendar. +
+ + + Create a with a time range defined by the + specified s and the specified + . The Calendars are subject to the following + considerations: +
    +
  • + Only the time-of-day fields of the specified Calendars will be + used (the date fields will be ignored) +
  • +
  • + The starting time must be before the ending time of the defined + time range. Note this means that a time range may not cross + daily boundaries (10PM - 2AM). (because only time fields are + are used, it is possible for two Calendars to represent a valid + time range and + rangeStartingCalendarUtc > rangeEndingCalendarUtc == true) +
  • +
+
+ The range starting calendar. + The range ending calendar. +
+ + + Create a with a time range defined by the + specified values and no baseCalendar. The values are + subject to the following considerations: +
    +
  • + Only the time-of-day portion of the specified values will be + used +
  • +
  • + The starting time must be before the ending time of the defined + time range. Note this means that a time range may not cross + daily boundaries (10PM - 2AM). (because only time value are + are used, it is possible for the two values to represent a valid + time range and rangeStartingTime > rangeEndingTime) +
  • +
+
+ The range starting time in millis. + The range ending time in millis. +
+ + + Create a with a time range defined by the + specified values and the specified . The values + are subject to the following considerations: +
    +
  • + Only the time-of-day portion of the specified values will be + used +
  • +
  • + The starting time must be before the ending time of the defined + time range. Note this means that a time range may not cross + daily boundaries (10PM - 2AM). (because only time value are + are used, it is possible for the two values to represent a valid + time range and rangeStartingTime > rangeEndingTime) +
  • +
+
+ The range starting time in millis. + The range ending time in millis. +
+ + + Serialization constructor. + + + + + + + Determine whether the given time is 'included' by the + Calendar. + + + + + + + Determine the next time (in milliseconds) that is 'included' by the + Calendar after the given time. Return the original value if timeStamp is + included. Return 0 if all days are excluded. + + + + + + + + Returns the start time of the time range of the day + specified in . + + + a DateTime representing the start time of the + time range for the specified date. + + + + + Returns the end time of the time range of the day + specified in + + + A DateTime representing the end time of the + time range for the specified date. + + + + + Returns a that represents the current . + + + A that represents the current . + + + + + Sets the time range for the to the times + represented in the specified Strings. + + The range starting time string. + The range ending time string. + + + + Sets the time range for the to the times + represented in the specified values. + + The range starting hour of day. + The range starting minute. + The range starting second. + The range starting millis. + The range ending hour of day. + The range ending minute. + The range ending second. + The range ending millis. + + + + Sets the time range for the to the times + represented in the specified s. + + The range starting calendar. + The range ending calendar. + + + + Sets the time range for the to the times + represented in the specified values. + + The range starting time. + The range ending time. + + + + Gets the start of day, practically zeroes time part. + + The time. + + + + + Gets the end of day, pratically sets time parts to maximum allowed values. + + The time. + + + + + Checks the specified values for validity as a set of time values. + + The hour of day. + The minute. + The second. + The millis. + + + + Indicates whether the time range represents an inverted time range (see + class description). + + true if invert time range; otherwise, false. + + + + This implementation of the Calendar stores a list of holidays (full days + that are excluded from scheduling). + + + The implementation DOES take the year into consideration, so if you want to + exclude July 4th for the next 10 years, you need to add 10 entries to the + exclude list. + + Sharada Jambula + Juergen Donnerstag + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The base calendar. + + + + Serialization constructor. + + + + + + + Determine whether the given time (in milliseconds) is 'included' by the + Calendar. + + Note that this Calendar is only has full-day precision. + + + + + + Determine the next time (in milliseconds) that is 'included' by the + Calendar after the given time. + + Note that this Calendar is only has full-day precision. + + + + + + Creates a new object that is a copy of the current instance. + + A new object that is a copy of this instance. + + + + Add the given Date to the list of excluded days. Only the month, day and + year of the returned dates are significant. + + + + + Removes the excluded date. + + The date to remove. + + + + Returns a of Dates representing the excluded + days. Only the month, day and year of the returned dates are + significant. + + + + + This implementation of the Calendar excludes a set of days of the month. You + may use it to exclude every 1. of each month for example. But you may define + any day of a month. + + + + Juergen Donnerstag + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + + + + Constructor + + The base calendar. + + + + Serialization constructor. + + + + + + + Initialize internal variables + + + + + Return true, if mday is defined to be exluded. + + + + + Redefine a certain day of the month to be excluded (true) or included + (false). + + + + + Check if all days are excluded. That is no day is included. + + boolean + + + + + Determine whether the given time (in milliseconds) is 'included' by the + Calendar. + + Note that this Calendar is only has full-day precision. + + + + + + Determine the next time (in milliseconds) that is 'included' by the + Calendar after the given time. Return the original value if timeStamp is + included. Return DateTime.MinValue if all days are excluded. + + Note that this Calendar is only has full-day precision. + + + + + + Creates a new object that is a copy of the current instance. + + A new object that is a copy of this instance. + + + + Get or set the array which defines the exclude-value of each day of month + Setting will redefine the array of days excluded. The array must of size greater or + equal 31. + + + + + This implementation of the Calendar excludes a set of days of the week. You + may use it to exclude weekends for example. But you may define any day of + the week. + + + + Juergen Donnerstag + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The base calendar. + + + + Serialization constructor. + + + + + + + Initialize internal variables + + + + + Return true, if wday is defined to be exluded. E. g. + saturday and sunday. + + + + + Redefine a certain day of the week to be excluded (true) or included + (false). Use java.util.Calendar's constants like MONDAY to determine the + wday. + + + + + Check if all week ays are excluded. That is no day is included. + + + + + Determine whether the given time (in milliseconds) is 'included' by the + Calendar. + + Note that this Calendar is only has full-day precision. + + + + + + Determine the next time (in milliseconds) that is 'included' by the + Calendar after the given time. Return the original value if timeStamp is + included. Return DateTime.MinValue if all days are excluded. + + Note that this Calendar is only has full-day precision. + + + + + + Get the array with the week days. + Setting will redefine the array of days excluded. The array must of size greater or + equal 8. java.util.Calendar's constants like MONDAY should be used as + index. A value of true is regarded as: exclude it. + + + + + Matches using an AND operator on two Matcher operands. + + James House + Marko Lahma (.NET) + + + + Matchers can be used in various API methods to + select the entities that should be operated upon. + + James House + + + + + Create an AndMatcher that depends upon the result of both of the given matchers. + + + + + + + + + Matches on the complete key being equal (both name and group). + + + + jhouse + + + + Create an EverythingMatcher that matches all jobs. + + + + + + Create an EverythingMatcher that matches all triggers. + + + + + + Matches on group (ignores name) property of Keys. + + James House + Marko Lahma (.NET) + + + + An abstract base class for some types of matchers. + + James House + Marko Lahma (.NET) + + + + Create a GroupMatcher that matches groups equaling the given string. + + + + + + + Create a GroupMatcher that matches groups starting with the given string. + + + + + + + Create a GroupMatcher that matches groups ending with the given string. + + + + + + + Create a GroupMatcher that matches groups containing the given string. + + + + + + + Matches on the complete key being equal (both name and group). + + James House + Marko Lahma (.NET) + + + + Create a KeyMatcher that matches Keys that equal the given key. + + + + + + + + Matches on name (ignores group) property of Keys. + + James House + Marko Lahma (.NET) + + + + Create a NameMatcher that matches names equaling the given string. + + + + + + + Create a NameMatcher that matches names starting with the given string. + + + + + + + Create a NameMatcher that matches names ending with the given string. + + + + + + + Create a NameMatcher that matches names containing the given string. + + + + + + + Matches using an NOT operator on another Matcher. + + James House + Marko Lahma (.NET) + + + + Create a NotMatcher that reverses the result of the given matcher. + + + + + + + + Matches using an OR operator on two Matcher operands. + + James House + Marko Lahma (.NET) + + + + Create an OrMatcher that depends upon the result of at least one of the given matchers. + + + + + + + + + Operators available for comparing string values. + + + + + The base abstract class to be extended by all triggers. + + + + s have a name and group associated with them, which + should uniquely identify them within a single . + + + + s are the 'mechanism' by which s + are scheduled. Many s can point to the same , + but a single can only point to one . + + + + Triggers can 'send' parameters/data to s by placing contents + into the on the . + + + + + + + + James House + Sharada Jambula + Marko Lahma (.NET) + + + + Internal interface for managing triggers. This interface should not be used by the Quartz client. + + + + + Should not be used by end users. + + + + + The base interface with properties common to all s - + use to instantiate an actual Trigger. + + + + s have a associated with them, which + should uniquely identify them within a single . + + + + s are the 'mechanism' by which s + are scheduled. Many s can point to the same , + but a single can only point to one . + + + + Triggers can 'send' parameters/data to s by placing contents + into the on the . + + + + + + + + + + James House + Sharada Jambula + Marko Lahma (.NET) + + + + Get a that is configured to produce a + schedule identical to this trigger's schedule. + + + + + + Used by the to determine whether or not + it is possible for this to fire again. + + If the returned value is then the + may remove the from the . + + + + + + Returns the next time at which the is scheduled to fire. If + the trigger will not fire again, will be returned. Note that + the time returned can possibly be in the past, if the time that was computed + for the trigger to next fire has already arrived, but the scheduler has not yet + been able to fire the trigger (which would likely be due to lack of resources + e.g. threads). + + + The value returned is not guaranteed to be valid until after the + has been added to the scheduler. + + + + + + Returns the previous time at which the fired. + If the trigger has not yet fired, will be returned. + + + + + Returns the next time at which the will fire, + after the given time. If the trigger will not fire after the given time, + will be returned. + + + + + Get or set the description given to the instance by + its creator (if any). + + + + + Get or set the with the given name with + this Trigger. Use when setting to dis-associate a Calendar. + + + + + Get or set the that is associated with the + . + + Changes made to this map during job execution are not re-persisted, and + in fact typically result in an illegal state. + + + + + + Returns the last UTC time at which the will fire, if + the Trigger will repeat indefinitely, null will be returned. + + Note that the return time *may* be in the past. + + + + + + Get or set the instruction the should be given for + handling misfire situations for this - the + concrete type that you are using will have + defined a set of additional MISFIRE_INSTRUCTION_XXX + constants that may be set to this property. + + If not explicitly set, the default value is . + + + + + + + + + Gets and sets the date/time on which the trigger must stop firing. This + defines the final boundary for trigger firings 舒 the trigger will + not fire after to this date and time. If this value is null, no end time + boundary is assumed, and the trigger can continue indefinitely. + + + + + The time at which the trigger's scheduling should start. May or may not + be the first actual fire time of the trigger, depending upon the type of + trigger and the settings of the other properties of the trigger. However + the first actual first time will not be before this date. + + + Setting a value in the past may cause a new trigger to compute a first + fire time that is in the past, which may cause an immediate misfire + of the trigger. + + + + + The priority of a acts as a tie breaker such that if + two s have the same scheduled fire time, then Quartz + will do its best to give the one with the higher priority first access + to a worker thread. + + + If not explicitly set, the default value is 5. + + + + + + + Set a description for the instance - may be + useful for remembering/displaying the purpose of the trigger, though the + description has no meaning to Quartz. + + + + + Associate the with the given name with this Trigger. + + + + + Set the to be associated with the + . + + + + + The priority of a acts as a tie breaker such that if + two s have the same scheduled fire time, then Quartz + will do its best to give the one with the higher priority first access + to a worker thread. + + + If not explicitly set, the default value is 5. + + + + + + + The time at which the trigger's scheduling should start. May or may not + be the first actual fire time of the trigger, depending upon the type of + trigger and the settings of the other properties of the trigger. However + the first actual first time will not be before this date. + + + Setting a value in the past may cause a new trigger to compute a first + fire time that is in the past, which may cause an immediate misfire + of the trigger. + + ew DateTimeOffset StartTimeUtc { get; set; } + + + + + + Set the time at which the should quit repeating - + regardless of any remaining repeats (based on the trigger's particular + repeat settings). + + + + + + + + Set the instruction the should be given for + handling misfire situations for this - the + concrete type that you are using will have + defined a set of additional MisfireInstruction.XXX + constants that may be passed to this method. + + + If not explicitly set, the default value is . + + + + + + + + This method should not be used by the Quartz client. + + + Called when the has decided to 'fire' + the trigger (Execute the associated ), in order to + give the a chance to update itself for its next + triggering (if any). + + + + + + This method should not be used by the Quartz client. + + + + Called by the scheduler at the time a is first + added to the scheduler, in order to have the + compute its first fire time, based on any associated calendar. + + + + After this method has been called, + should return a valid answer. + + + + The first time at which the will be fired + by the scheduler, which is also the same value + will return (until after the first firing of the ). + + + + + This method should not be used by the Quartz client. + + + Called after the has executed the + associated with the + in order to get the final instruction code from the trigger. + + + is the that was used by the + 's method. + is the thrown by the + , if any (may be null). + + + One of the members. + + + + + + + + + + This method should not be used by the Quartz client. + + To be implemented by the concrete classes that extend this class. + + + The implementation should update the 's state + based on the MISFIRE_INSTRUCTION_XXX that was selected when the + was created. + + + + + + This method should not be used by the Quartz client. + + The implementation should update the 's state + based on the given new version of the associated + (the state should be updated so that it's next fire time is appropriate + given the Calendar's new settings). + + + + + + + + Validates whether the properties of the are + valid for submission into a . + + + + + This method should not be used by the Quartz client. + + + Usable by + implementations, in order to facilitate 'recognizing' instances of fired + s as their jobs complete execution. + + + + + Returns the previous time at which the fired. + If the trigger has not yet fired, will be returned. + + + + + Create a with no specified name, group, or . + + + Note that the , and + the and properties + must be set before the can be placed into a + . + + + + + Create a with the given name, and default group. + + + Note that the and + properties must be set before the + can be placed into a . + + The name. + + + + Create a with the given name, and group. + + + Note that the and + properties must be set before the + can be placed into a . + + The name. + if , Scheduler.DefaultGroup will be used. + + + + Create a with the given name, and group. + + The name. + if , Scheduler.DefaultGroup will be used. + Name of the job. + The job group. + ArgumentException + if name is null or empty, or the group is an empty string. + + + + + This method should not be used by the Quartz client. + + + Called when the has decided to 'fire' + the trigger (Execute the associated ), in order to + give the a chance to update itself for its next + triggering (if any). + + + + + + This method should not be used by the Quartz client. + + + + Called by the scheduler at the time a is first + added to the scheduler, in order to have the + compute its first fire time, based on any associated calendar. + + + + After this method has been called, + should return a valid answer. + + + + The first time at which the will be fired + by the scheduler, which is also the same value + will return (until after the first firing of the ). + + + + + This method should not be used by the Quartz client. + + + Called after the has executed the + associated with the + in order to get the final instruction code from the trigger. + + + is the that was used by the + 's method. + is the thrown by the + , if any (may be null). + + + One of the members. + + + + + + + Used by the to determine whether or not + it is possible for this to fire again. + + If the returned value is then the + may remove the from the . + + + + + + Returns the next time at which the is scheduled to fire. If + the trigger will not fire again, will be returned. Note that + the time returned can possibly be in the past, if the time that was computed + for the trigger to next fire has already arrived, but the scheduler has not yet + been able to fire the trigger (which would likely be due to lack of resources + e.g. threads). + + + The value returned is not guaranteed to be valid until after the + has been added to the scheduler. + + + + + + Returns the next time at which the will fire, + after the given time. If the trigger will not fire after the given time, + will be returned. + + + + + Validates the misfire instruction. + + The misfire instruction. + + + + + This method should not be used by the Quartz client. + + To be implemented by the concrete classes that extend this class. + + + The implementation should update the 's state + based on the MISFIRE_INSTRUCTION_XXX that was selected when the + was created. + + + + + + This method should not be used by the Quartz client. + + The implementation should update the 's state + based on the given new version of the associated + (the state should be updated so that it's next fire time is appropriate + given the Calendar's new settings). + + + + + + + + Validates whether the properties of the are + valid for submission into a . + + + + + Return a simple string representation of this object. + + + + + Compare the next fire time of this to that of + another by comparing their keys, or in other words, sorts them + according to the natural (i.e. alphabetical) order of their keys. + + + + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + + Trigger equality is based upon the equality of the TriggerKey. + + + true if the key of this Trigger equals that of the given Trigger + + + + Serves as a hash function for a particular type. is suitable for use in hashing algorithms and data structures like a hash table. + + + A hash code for the current . + + + + + Creates a new object that is a copy of the current instance. + + + A new object that is a copy of this instance. + + + + + Get or sets the name of this . + + If name is null or empty. + + + + Get the group of this . If , Scheduler.DefaultGroup will be used. + + + if group is an empty string. + + + + + Get or set the name of the associated . + + + if jobName is null or empty. + + + + + Gets or sets the name of the associated 's + group. If set with , Scheduler.DefaultGroup will be used. + + ArgumentException + if group is an empty string. + + + + + Returns the 'full name' of the in the format + "group.name". + + + + + Gets the key. + + The key. + + + + Returns the 'full name' of the that the + points to, in the format "group.name". + + + + + Get or set the description given to the instance by + its creator (if any). + + + + + Get or set the with the given name with + this Trigger. Use when setting to dis-associate a Calendar. + + + + + Get or set the that is associated with the + . + + Changes made to this map during job execution are not re-persisted, and + in fact typically result in an illegal state. + + + + + + Returns the last UTC time at which the will fire, if + the Trigger will repeat indefinitely, null will be returned. + + Note that the return time *may* be in the past. + + + + + + Get or set the instruction the should be given for + handling misfire situations for this - the + concrete type that you are using will have + defined a set of additional MISFIRE_INSTRUCTION_XXX + constants that may be passed to this method. + + If not explicitly set, the default value is . + + + + + + + + + + This method should not be used by the Quartz client. + + + Usable by + implementations, in order to facilitate 'recognizing' instances of fired + s as their jobs complete execution. + + + + + Gets and sets the date/time on which the trigger must stop firing. This + defines the final boundary for trigger firings 舒 the trigger will + not fire after to this date and time. If this value is null, no end time + boundary is assumed, and the trigger can continue indefinitely. + + + + + The time at which the trigger's scheduling should start. May or may not + be the first actual fire time of the trigger, depending upon the type of + trigger and the settings of the other properties of the trigger. However + the first actual first time will not be before this date. + + + Setting a value in the past may cause a new trigger to compute a first + fire time that is in the past, which may cause an immediate misfire + of the trigger. + + + + + Tells whether this Trigger instance can handle events + in millisecond precision. + + + + + The priority of a acts as a tie breaker such that if + two s have the same scheduled fire time, then Quartz + will do its best to give the one with the higher priority first access + to a worker thread. + + + If not explicitly set, the default value is 5. + + + + + + + Gets a value indicating whether this instance has additional properties + that should be considered when for example saving to database. + + + If trigger implementation has additional properties that need to be saved + with base properties you need to make your class override this property with value true. + Returning true will effectively mean that ADOJobStore needs to serialize + this trigger instance to make sure additional properties are also saved. + + + true if this instance has additional properties; otherwise, false. + + + + + A concrete that is used to fire a + based upon repeating calendar time intervals. + + + The trigger will fire every N (see ) units of calendar time + (see ) as specified in the trigger's definition. + This trigger can achieve schedules that are not possible with (e.g + because months are not a fixed number of seconds) or (e.g. because + "every 5 months" is not an even divisor of 12). + + If you use an interval unit of then care should be taken when setting + a value that is on a day near the end of the month. For example, + if you choose a start time that occurs on January 31st, and have a trigger with unit + and interval 1, then the next fire time will be February 28th, + and the next time after that will be March 28th - and essentially each subsequent firing will + occur on the 28th of the month, even if a 31st day exists. If you want a trigger that always + fires on the last day of the month - regardless of the number of days in the month, + you should use . + + + + + + + 2.0 + James House + Marko Lahma (.NET) + + + + A that is used to fire a + based upon repeating calendar time intervals. + + + + + Get or set the interval unit - the time unit on with the interval applies. + + + + + Get the the time interval that will be added to the 's + fire time (in the set repeat interval unit) in order to calculate the time of the + next trigger repeat. + + + + + Get the number of times the has already fired. + + + + + Create a with no settings. + + + + + Create a that will occur immediately, and + repeat at the the given interval. + + Name for the trigger instance. + The repeat interval unit (minutes, days, months, etc). + The number of milliseconds to pause between the repeat firing. + + + + Create a that will occur immediately, and + repeat at the the given interval + + Name for the trigger instance. + Group for the trigger instance. + The repeat interval unit (minutes, days, months, etc). + The number of milliseconds to pause between the repeat firing. + + + + Create a that will occur at the given time, + and repeat at the the given interval until the given end time. + + Name for the trigger instance. + A set to the time for the to fire. + A set to the time for the to quit repeat firing. + The repeat interval unit (minutes, days, months, etc). + The number of milliseconds to pause between the repeat firing. + + + + Create a that will occur at the given time, + and repeat at the the given interval until the given end time. + + Name for the trigger instance. + Group for the trigger instance. + A set to the time for the to fire. + A set to the time for the to quit repeat firing. + The repeat interval unit (minutes, days, months, etc). + The number of milliseconds to pause between the repeat firing. + + + + Create a that will occur at the given time, + and repeat at the the given interval until the given end time. + + Name for the trigger instance. + Group for the trigger instance. + Name of the associated job. + Group of the associated job. + A set to the time for the to fire. + A set to the time for the to quit repeat firing. + The repeat interval unit (minutes, days, months, etc). + The number of milliseconds to pause between the repeat firing. + + + + Validates the misfire instruction. + + The misfire instruction. + + + + + Updates the 's state based on the + MisfireInstruction.XXX that was selected when the + was created. + + + If the misfire instruction is set to , + then the following scheme will be used: +
    +
  • The instruction will be interpreted as
  • +
+
+
+ + + This method should not be used by the Quartz client. + + Called when the has decided to 'fire' + the trigger (Execute the associated ), in order to + give the a chance to update itself for its next + triggering (if any). + + + + + + + This method should not be used by the Quartz client. + + The implementation should update the 's state + based on the given new version of the associated + (the state should be updated so that it's next fire time is appropriate + given the Calendar's new settings). + + + + + + + + This method should not be used by the Quartz client. + + + + Called by the scheduler at the time a is first + added to the scheduler, in order to have the + compute its first fire time, based on any associated calendar. + + + + After this method has been called, + should return a valid answer. + + + + The first time at which the will be fired + by the scheduler, which is also the same value + will return (until after the first firing of the ). + + + + + Returns the next time at which the is scheduled to fire. If + the trigger will not fire again, will be returned. Note that + the time returned can possibly be in the past, if the time that was computed + for the trigger to next fire has already arrived, but the scheduler has not yet + been able to fire the trigger (which would likely be due to lack of resources + e.g. threads). + + + The value returned is not guaranteed to be valid until after the + has been added to the scheduler. + + + + + + Returns the previous time at which the fired. + If the trigger has not yet fired, will be returned. + + + + + Returns the next time at which the will fire, + after the given time. If the trigger will not fire after the given time, + will be returned. + + + + + Determines whether or not the will occur + again. + + + + + + Validates whether the properties of the are + valid for submission into a . + + + + + Get a that is configured to produce a + schedule identical to this trigger's schedule. + + + + + + + + Get the time at which the should occur. + + + + + Tells whether this Trigger instance can handle events + in millisecond precision. + + + + + Get the time at which the should quit + repeating. + + + + + Get or set the interval unit - the time unit on with the interval applies. + + + + + Get the the time interval that will be added to the 's + fire time (in the set repeat interval unit) in order to calculate the time of the + next trigger repeat. + + + + + Get the number of times the has already fired. + + + + + Returns the final time at which the will + fire, if there is no end time set, null will be returned. + + + Note that the return time may be in the past. + + + + A concrete that is used to fire a + at given moments in time, defined with Unix 'cron-like' definitions. + + + + For those unfamiliar with "cron", this means being able to create a firing + schedule such as: "At 8:00am every Monday through Friday" or "At 1:30am + every last Friday of the month". + + + + The format of a "Cron-Expression" string is documented on the + class. + + + + Here are some full examples:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Expression Meaning
"0 0 12 * * ?"" /> Fire at 12pm (noon) every day" />
"0 15 10 ? * *"" /> Fire at 10:15am every day" />
"0 15 10 * * ?"" /> Fire at 10:15am every day" />
"0 15 10 * * ? *"" /> Fire at 10:15am every day" />
"0 15 10 * * ? 2005"" /> Fire at 10:15am every day during the year 2005" /> +
"0 * 14 * * ?"" /> Fire every minute starting at 2pm and ending at 2:59pm, every day" /> +
"0 0/5 14 * * ?"" /> Fire every 5 minutes starting at 2pm and ending at 2:55pm, every day" /> +
"0 0/5 14,18 * * ?"" /> Fire every 5 minutes starting at 2pm and ending at 2:55pm, AND fire every 5 minutes starting at 6pm and ending at 6:55pm, every day" /> +
"0 0-5 14 * * ?"" /> Fire every minute starting at 2pm and ending at 2:05pm, every day" /> +
"0 10,44 14 ? 3 WED"" /> Fire at 2:10pm and at 2:44pm every Wednesday in the month of March." /> +
"0 15 10 ? * MON-FRI"" /> Fire at 10:15am every Monday, Tuesday, Wednesday, Thursday and Friday" /> +
"0 15 10 15 * ?"" /> Fire at 10:15am on the 15th day of every month" /> +
"0 15 10 L * ?"" /> Fire at 10:15am on the last day of every month" /> +
"0 15 10 ? * 6L"" /> Fire at 10:15am on the last Friday of every month" /> +
"0 15 10 ? * 6L"" /> Fire at 10:15am on the last Friday of every month" /> +
"0 15 10 ? * 6L 2002-2005"" /> Fire at 10:15am on every last Friday of every month during the years 2002, 2003, 2004 and 2005" /> +
"0 15 10 ? * 6#3"" /> Fire at 10:15am on the third Friday of every month" /> +
+
+ + + Pay attention to the effects of '?' and '*' in the day-of-week and + day-of-month fields! + + + + NOTES: +
    +
  • Support for specifying both a day-of-week and a day-of-month value is + not complete (you'll need to use the '?' character in on of these fields). +
  • +
  • Be careful when setting fire times between mid-night and 1:00 AM - + "daylight savings" can cause a skip or a repeat depending on whether the + time moves back or jumps forward.
  • +
+
+
+ + + Sharada Jambula + James House + Contributions from Mads Henderson + Marko Lahma (.NET) +
+ + + The public interface for inspecting settings specific to a CronTrigger, + which is used to fire a + at given moments in time, defined with Unix 'cron-like' schedule definitions. + + + + For those unfamiliar with "cron", this means being able to create a firing + schedule such as: "At 8:00am every Monday through Friday" or "At 1:30am + every last Friday of the month". + + + + The format of a "Cron-Expression" string is documented on the + class. + + + + Here are some full examples:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Expression Meaning
"0 0 12 * * ?"" /> Fire at 12pm (noon) every day" />
"0 15 10 ? * *"" /> Fire at 10:15am every day" />
"0 15 10 * * ?"" /> Fire at 10:15am every day" />
"0 15 10 * * ? *"" /> Fire at 10:15am every day" />
"0 15 10 * * ? 2005"" /> Fire at 10:15am every day during the year 2005" /> +
"0 * 14 * * ?"" /> Fire every minute starting at 2pm and ending at 2:59pm, every day" /> +
"0 0/5 14 * * ?"" /> Fire every 5 minutes starting at 2pm and ending at 2:55pm, every day" /> +
"0 0/5 14,18 * * ?"" /> Fire every 5 minutes starting at 2pm and ending at 2:55pm, AND fire every 5 minutes starting at 6pm and ending at 6:55pm, every day" /> +
"0 0-5 14 * * ?"" /> Fire every minute starting at 2pm and ending at 2:05pm, every day" /> +
"0 10,44 14 ? 3 WED"" /> Fire at 2:10pm and at 2:44pm every Wednesday in the month of March." /> +
"0 15 10 ? * MON-FRI"" /> Fire at 10:15am every Monday, Tuesday, Wednesday, Thursday and Friday" /> +
"0 15 10 15 * ?"" /> Fire at 10:15am on the 15th day of every month" /> +
"0 15 10 L * ?"" /> Fire at 10:15am on the last day of every month" /> +
"0 15 10 ? * 6L"" /> Fire at 10:15am on the last Friday of every month" /> +
"0 15 10 ? * 6L"" /> Fire at 10:15am on the last Friday of every month" /> +
"0 15 10 ? * 6L 2002-2005"" /> Fire at 10:15am on every last Friday of every month during the years 2002, 2003, 2004 and 2005" /> +
"0 15 10 ? * 6#3"" /> Fire at 10:15am on the third Friday of every month" /> +
+
+ + + Pay attention to the effects of '?' and '*' in the day-of-week and + day-of-month fields! + + + + NOTES: +
    +
  • Support for specifying both a day-of-week and a day-of-month value is + not complete (you'll need to use the '?' character in on of these fields). +
  • +
  • Be careful when setting fire times between mid-night and 1:00 AM - + "daylight savings" can cause a skip or a repeat depending on whether the + time moves back or jumps forward.
  • +
+
+
+ + + Sharada Jambula + James House + Contributions from Mads Henderson + Marko Lahma (.NET) +
+ + + Gets the expression summary. + + + + + + Gets or sets the cron expression string. + + The cron expression string. + + + + Sets the time zone for which the of this + will be resolved. + + + If is set after this + property, the TimeZone setting on the CronExpression will "win". However + if is set after this property, the + time zone applied by this method will remain in effect, since the + string cron expression does not carry a time zone! + + The time zone. + + + + Create a with no settings. + + + The start-time will also be set to the current time, and the time zone + will be set the the system's default time zone. + + + + + Create a with the given name and default group. + + + The start-time will also be set to the current time, and the time zone + will be set the the system's default time zone. + + The name of the + + + + Create a with the given name and group. + + + The start-time will also be set to the current time, and the time zone + will be set the the system's default time zone. + + The name of the + The group of the + + + + Create a with the given name, group and + expression. + + + The start-time will also be set to the current time, and the time zone + will be set the the system's default time zone. + + The name of the + The group of the + A cron expression dictating the firing sequence of the + + + + Create a with the given name and group, and + associated with the identified . + + + The start-time will also be set to the current time, and the time zone + will be set the the system's default time zone. + + The name of the . + The group of the + name of the executed on firetime + Group of the executed on firetime + + + + Create a with the given name and group, + associated with the identified , + and with the given "cron" expression. + + + The start-time will also be set to the current time, and the time zone + will be set the the system's default time zone. + + The name of the + The group of the + name of the executed on firetime + Group of the executed on firetime + A cron expression dictating the firing sequence of the + + + + Create a with the given name and group, + associated with the identified , + and with the given "cron" expression resolved with respect to the . + + The name of the + The group of the + name of the executed on firetime + Group of the executed on firetime + A cron expression dictating the firing sequence of the + + Specifies for which time zone the cronExpression should be interpreted, + i.e. the expression 0 0 10 * * ?, is resolved to 10:00 am in this time zone. + + + + + Create a that will occur at the given time, + until the given end time. + + If null, the start-time will also be set to the current time, the time + zone will be set the the system's default. + + + The name of the + The group of the + name of the executed on firetime + Group of the executed on firetime + A set to the earliest time for the to start firing. + A set to the time for the to quit repeat firing. + A cron expression dictating the firing sequence of the + + + + Create a with fire time dictated by the + resolved with respect to the specified + occurring from the until + the given . + + The name of the + The group of the + name of the executed on firetime + Group of the executed on firetime + A set to the earliest time for the to start firing. + A set to the time for the to quit repeat firing. + + + + Clones this instance. + + + + + + Returns the next time at which the is scheduled to fire. If + the trigger will not fire again, will be returned. Note that + the time returned can possibly be in the past, if the time that was computed + for the trigger to next fire has already arrived, but the scheduler has not yet + been able to fire the trigger (which would likely be due to lack of resources + e.g. threads). + + + The value returned is not guaranteed to be valid until after the + has been added to the scheduler. + + + + + + Returns the previous time at which the fired. + If the trigger has not yet fired, will be returned. + + + + + + Sets the next fire time. + + This method should not be invoked by client code. + + + The fire time. + + + + Sets the previous fire time. + + This method should not be invoked by client code. + + + The fire time. + + + + Returns the next time at which the will fire, + after the given time. If the trigger will not fire after the given time, + will be returned. + + + + + + + Used by the to determine whether or not + it is possible for this to fire again. + + If the returned value is then the + may remove the from the . + + + + + + + Validates the misfire instruction. + + The misfire instruction. + + + + + This method should not be used by the Quartz client. + + To be implemented by the concrete classes that extend this class. + + + The implementation should update the 's state + based on the MISFIRE_INSTRUCTION_XXX that was selected when the + was created. + + + + + + + + Determines whether the date and (optionally) time of the given Calendar + instance falls on a scheduled fire-time of this trigger. + + + + Equivalent to calling . + + + The date to compare. + + + + + Determines whether the date and (optionally) time of the given Calendar + instance falls on a scheduled fire-time of this trigger. + + Note that the value returned is NOT validated against the related + ICalendar (if any). + + + The date to compare + If set to true, the method will only determine if the + trigger will fire during the day represented by the given Calendar + (hours, minutes and seconds will be ignored). + + + + + Called when the has decided to 'fire' + the trigger (Execute the associated ), in order to + give the a chance to update itself for its next + triggering (if any). + + + + + + + Updates the trigger with new calendar. + + The calendar to update with. + The misfire threshold. + + + + Called by the scheduler at the time a is first + added to the scheduler, in order to have the + compute its first fire time, based on any associated calendar. + + After this method has been called, + should return a valid answer. + + + + + the first time at which the will be fired + by the scheduler, which is also the same value + will return (until after the first firing of the ). + + + + + Gets the expression summary. + + + + + + Gets the next time to fire after the given time. + + The time to compute from. + + + + + NOT YET IMPLEMENTED: Returns the time before the given time + that this will fire. + + The date. + + + + + Gets or sets the cron expression string. + + The cron expression string. + + + + Set the CronExpression to the given one. The TimeZone on the passed-in + CronExpression over-rides any that was already set on the Trigger. + + The cron expression. + + + + Returns the date/time on which the trigger may begin firing. This + defines the initial boundary for trigger firings the trigger + will not fire prior to this date and time. + + + + + + Get or sets the time at which the CronTrigger should quit + repeating - even if repeastCount isn't yet satisfied. + + + + + Sets the time zone for which the of this + will be resolved. + + + If is set after this + property, the TimeZone setting on the CronExpression will "win". However + if is set after this property, the + time zone applied by this method will remain in effect, since the + string cron expression does not carry a time zone! + + The time zone. + + + + Returns the last UTC time at which the will fire, if + the Trigger will repeat indefinitely, null will be returned. + + Note that the return time *may* be in the past. + + + + + + Tells whether this Trigger instance can handle events + in millisecond precision. + + + + + + A concrete implementation of DailyTimeIntervalTrigger that is used to fire a + based upon daily repeating time intervals. + + + + The trigger will fire every N ( ) seconds, minutes or hours + (see ) during a given time window on specified days of the week. + + + For example#1, a trigger can be set to fire every 72 minutes between 8:00 and 11:00 everyday. It's fire times would + be 8:00, 9:12, 10:24, then next day would repeat: 8:00, 9:12, 10:24 again. + + + For example#2, a trigger can be set to fire every 23 minutes between 9:20 and 16:47 Monday through Friday. + + + On each day, the starting fire time is reset to startTimeOfDay value, and then it will add repeatInterval value to it until + the endTimeOfDay is reached. If you set daysOfWeek values, then fire time will only occur during those week days period. Again, + remember this trigger will reset fire time each day with startTimeOfDay, regardless of your interval or endTimeOfDay! + + + The default values for fields if not set are: startTimeOfDay defaults to 00:00:00, the endTimeOfDay default to 23:59:59, + and daysOfWeek is default to every day. The startTime default to current time-stamp now, while endTime has not value. + + + If startTime is before startTimeOfDay, then startTimeOfDay will be used and startTime has no affect. Else if startTime is + after startTimeOfDay, then the first fire time for that day will be the next interval after the startTime. For example, if + you set startingTimeOfDay=9am, endingTimeOfDay=11am, interval=15 mins, and startTime=9:33am, then the next fire time will + be 9:45pm. Note also that if you do not set startTime value, the trigger builder will default to current time, and current time + maybe before or after the startTimeOfDay! So be aware how you set your startTime. + + + This trigger also supports "repeatCount" feature to end the trigger fire time after + a certain number of count is reached. Just as the SimpleTrigger, setting repeatCount=0 + means trigger will fire once only! Setting any positive count then the trigger will repeat + count + 1 times. Unlike SimpleTrigger, the default value of repeatCount of this trigger + is set to REPEAT_INDEFINITELY instead of 0 though. + + + + + 2.0 + James House + Zemian Deng saltnlight5@gmail.com + Nuno Maia (.NET) + + + + A that is used to fire a + based upon daily repeating time intervals. + + + The trigger will fire every N (see ) seconds, minutes or hours + (see during a given time window on specified days of the week. + + For example#1, a trigger can be set to fire every 72 minutes between 8:00 and 11:00 everyday. It's fire times + be 8:00, 9:12, 10:24, then next day would repeat: 8:00, 9:12, 10:24 again. + + For example#2, a trigger can be set to fire every 23 minutes between 9:20 and 16:47 Monday through Friday. + + On each day, the starting fire time is reset to startTimeOfDay value, and then it will add repeatInterval value to it until + the endTimeOfDay is reached. If you set daysOfWeek values, then fire time will only occur during those week days period. + + The default values for fields if not set are: startTimeOfDay defaults to 00:00:00, the endTimeOfDay default to 23:59:59, + and daysOfWeek is default to every day. The startTime default to current time-stamp now, while endTime has not value. + + If startTime is before startTimeOfDay, then it has no affect. Else if startTime after startTimeOfDay, then the first fire time + for that day will be normal startTimeOfDay incremental values after startTime value. Same reversal logic is applied to endTime + with endTimeOfDay. + + + + James House + Zemian Deng saltnlight5@gmail.com + Nuno Maia (.NET) + + + + + + + + + Get the the number of times for interval this trigger should repeat, + after which it will be automatically deleted. + + + + + Get the interval unit - the time unit on with the interval applies. + The only intervals that are valid for this type of trigger are , + , and + + + + + Get the the time interval that will be added to the 's + fire time (in the set repeat interval unit) in order to calculate the time of the + next trigger repeat. + + + + + The time of day to start firing at the given interval. + + + + + The time of day to complete firing at the given interval. + + + + + The days of the week upon which to fire. + + + A Set containing the integers representing the days of the week, per the values 0-6 as defined by + DayOfWees.Sunday - DayOfWeek.Saturday. + + + + + Get the number of times the has already fired. + + + + + Used to indicate the 'repeat count' of the trigger is indefinite. Or in + other words, the trigger should repeat continually until the trigger's + ending timestamp. + + + + + Create a with no settings. + + + + + Create a that will occur immediately, and + repeat at the the given interval. + + + The that the repeating should begin occurring. + The that the repeating should stop occurring. + The repeat interval unit. The only intervals that are valid for this type of trigger are + , , and . + + + + + Create a that will occur immediately, and + repeat at the the given interval. + + + + The that the repeating should begin occurring. + The that the repeating should stop occurring. + The repeat interval unit. The only intervals that are valid for this type of trigger are + , , and . + + + + + Create a that will occur at the given time, + and repeat at the the given interval until the given end time. + + + A set to the time for the to fire. + A set to the time for the to quit repeat firing. + The that the repeating should begin occurring. + The that the repeating should stop occurring. + The repeat interval unit. The only intervals that are valid for this type of trigger are + , , and . + The number of milliseconds to pause between the repeat firing. + + + + Create a that will occur at the given time, + and repeat at the the given interval until the given end time. + + + + A set to the time for the to fire. + A set to the time for the to quit repeat firing. + The that the repeating should begin occurring. + The that the repeating should stop occurring. + The repeat interval unit. The only intervals that are valid for this type of trigger are + , , and . + The number of milliseconds to pause between the repeat firing. + + + + Create a that will occur at the given time, + fire the identified job and repeat at the the given + interval until the given end time. + + + + + + A set to the time for the to fire. + A set to the time for the to quit repeat firing. + The that the repeating should begin occurring. + The that the repeating should stop occurring. + The repeat interval unit. The only intervals that are valid for this type of trigger are + , , and . + The number of milliseconds to pause between the repeat firing. + + + + Updates the 's state based on the + MisfireInstruction.XXX that was selected when the + was created. + + + If the misfire instruction is set to , + then the following scheme will be used: +
    +
  • The instruction will be interpreted as
  • +
+
+
+ + + Called when the scheduler has decided to 'fire' + the trigger (execute the associated job), in order to + give the trigger a chance to update itself for its next + triggering (if any). + + + + + + + + + + + + + + + This method should not be used by the Quartz client. + + + + Called by the scheduler at the time a is first + added to the scheduler, in order to have the + compute its first fire time, based on any associated calendar. + + + + After this method has been called, + should return a valid answer. + + + + The first time at which the will be fired + by the scheduler, which is also the same value + will return (until after the first firing of the ). + + + + + Returns the next time at which the is scheduled to fire. If + the trigger will not fire again, will be returned. Note that + the time returned can possibly be in the past, if the time that was computed + for the trigger to next fire has already arrived, but the scheduler has not yet + been able to fire the trigger (which would likely be due to lack of resources + e.g. threads). + + + The value returned is not guaranteed to be valid until after the + has been added to the scheduler. + + + + + + Returns the previous time at which the fired. + If the trigger has not yet fired, will be returned. + + + + + Set the next time at which the should fire. + + + This method should not be invoked by client code. + + + + + + Set the previous time at which the fired. + + + This method should not be invoked by client code. + + + + + + Returns the next time at which the will + fire, after the given time. If the trigger will not fire after the given + time, will be returned. + + + + + + + Given fireTime time, we need to advance/calculate and return a time of next available week day. + + given next fireTime. + flag to whether to advance day without check existing week day. This scenario + can happen when a caller determine fireTime has passed the endTimeOfDay that fireTime should move to next day anyway. + + a next day fireTime. + + + + Determines whether or not the will occur + again. + + + + + + Validates whether the properties of the are + valid for submission into a . + + + + + Get a that is configured to produce a + schedule identical to this trigger's schedule. + + + + + + + The time at which the should occur. + + + + + the time at which the should quit repeating. + + + + + + Get the the number of times for interval this trigger should repeat, + after which it will be automatically deleted. + + + + + the interval unit - the time unit on with the interval applies. + + + The repeat interval unit. The only intervals that are valid for this type of trigger are + , , and . + + + + + the the time interval that will be added to the 's + fire time (in the set repeat interval unit) in order to calculate the time of the + next trigger repeat. + + + + + the number of times the has already + fired. + + + + + Returns the final time at which the will + fire, if there is no end time set, null will be returned. + + Note that the return time may be in the past. + + + + + The days of the week upon which to fire. + + + A Set containing the integers representing the days of the week, per the values 0-6 as defined by + DayOfWees.Sunday - DayOfWeek.Saturday. + + + + + The time of day to start firing at the given interval. + + + + + The time of day to complete firing at the given interval. + + + + + This trigger has no additional properties besides what's defined in this class. + + + + + + Tells whether this Trigger instance can handle events + in millisecond precision. + + + + + A concrete that is used to fire a + at a given moment in time, and optionally repeated at a specified interval. + + + + James House + Contributions by Lieven Govaerts of Ebitec Nv, Belgium. + Marko Lahma (.NET) + + + + A that is used to fire a + at a given moment in time, and optionally repeated at a specified interval. + + + + James House + Contributions by Lieven Govaerts of Ebitec Nv, Belgium. + Marko Lahma (.NET) + + + + Get or set thhe number of times the should + repeat, after which it will be automatically deleted. + + + + + + Get or set the the time interval at which the should repeat. + + + + + Get or set the number of times the has already + fired. + + + + + Used to indicate the 'repeat count' of the trigger is indefinite. Or in + other words, the trigger should repeat continually until the trigger's + ending timestamp. + + + + + Create a with no settings. + + + + + Create a that will occur immediately, and + not repeat. + + + + + Create a that will occur immediately, and + not repeat. + + + + + Create a that will occur immediately, and + repeat at the the given interval the given number of times. + + + + + Create a that will occur immediately, and + repeat at the the given interval the given number of times. + + + + + Create a that will occur at the given time, + and not repeat. + + + + + Create a that will occur at the given time, + and not repeat. + + + + + Create a that will occur at the given time, + and repeat at the the given interval the given number of times, or until + the given end time. + + The name. + A UTC set to the time for the to fire. + A UTC set to the time for the + to quit repeat firing. + The number of times for the to repeat + firing, use for unlimited times. + The time span to pause between the repeat firing. + + + + Create a that will occur at the given time, + and repeat at the the given interval the given number of times, or until + the given end time. + + The name. + The group. + A UTC set to the time for the to fire. + A UTC set to the time for the + to quit repeat firing. + The number of times for the to repeat + firing, use for unlimited times. + The time span to pause between the repeat firing. + + + + Create a that will occur at the given time, + fire the identified and repeat at the the given + interval the given number of times, or until the given end time. + + The name. + The group. + Name of the job. + The job group. + A set to the time for the + to fire. + A set to the time for the + to quit repeat firing. + The number of times for the to repeat + firing, use RepeatIndefinitely for unlimited times. + The time span to pause between the repeat firing. + + + + Validates the misfire instruction. + + The misfire instruction. + + + + + Updates the 's state based on the + MisfireInstruction value that was selected when the + was created. + + + If MisfireSmartPolicyEnabled is set to true, + then the following scheme will be used:
+
    +
  • If the Repeat Count is 0, then the instruction will + be interpreted as .
  • +
  • If the Repeat Count is , then + the instruction will be interpreted as . + WARNING: using MisfirePolicy.SimpleTrigger.RescheduleNowWithRemainingRepeatCount + with a trigger that has a non-null end-time may cause the trigger to + never fire again if the end-time arrived during the misfire time span. +
  • +
  • If the Repeat Count is > 0, then the instruction + will be interpreted as . +
  • +
+
+
+ + + Called when the has decided to 'fire' + the trigger (Execute the associated ), in order to + give the a chance to update itself for its next + triggering (if any). + + + + + + Updates the instance with new calendar. + + The calendar. + The misfire threshold. + + + + Called by the scheduler at the time a is first + added to the scheduler, in order to have the + compute its first fire time, based on any associated calendar. + + After this method has been called, + should return a valid answer. + + + + The first time at which the will be fired + by the scheduler, which is also the same value + will return (until after the first firing of the ). + + + + + Returns the next time at which the will + fire. If the trigger will not fire again, will be + returned. The value returned is not guaranteed to be valid until after + the has been added to the scheduler. + + + + + Returns the previous time at which the fired. + If the trigger has not yet fired, will be + returned. + + + + + Returns the next UTC time at which the will + fire, after the given UTC time. If the trigger will not fire after the given + time, will be returned. + + + + + Returns the last UTC time at which the will + fire, before the given time. If the trigger will not fire before the + given time, will be returned. + + + + + Computes the number of times fired between the two UTC date times. + + The UTC start date and time. + The UTC end date and time. + + + + + Determines whether or not the will occur + again. + + + + + Validates whether the properties of the are + valid for submission into a . + + + + + Get or set thhe number of times the should + repeat, after which it will be automatically deleted. + + + + + + Get or set the the time interval at which the should repeat. + + + + + Get or set the number of times the has already + fired. + + + + + Returns the final UTC time at which the will + fire, if repeatCount is RepeatIndefinitely, null will be returned. + + Note that the return time may be in the past. + + + + + + Tells whether this Trigger instance can handle events + in millisecond precision. + + + + + + Schedules work on a newly spawned thread. This is the default Quartz behavior. + + matt.accola + + + + Allows different strategies for scheduling threads. The + method is required to be called before the first call to + . The Thread containing the work to be performed is + passed to execute and the work is scheduled by the underlying implementation. + + matt.accola + + + + Submit a task for execution. + + Thread to execute. + + + + Initialize any state prior to calling . + + + + + A singleton implementation of . + + + Here are some examples of using this class: + + To create a scheduler that does not write anything to the database (is not + persistent), you can call : + + + DirectSchedulerFactory.Instance.CreateVolatileScheduler(10); // 10 threads + // don't forget to start the scheduler: + DirectSchedulerFactory.Instance.GetScheduler().Start(); + + + Several create methods are provided for convenience. All create methods + eventually end up calling the create method with all the parameters: + + + public void CreateScheduler(string schedulerName, string schedulerInstanceId, IThreadPool threadPool, IJobStore jobStore) + + + Here is an example of using this method: + + + // create the thread pool + SimpleThreadPool threadPool = new SimpleThreadPool(maxThreads, ThreadPriority.Normal); + threadPool.Initialize(); + // create the job store + JobStore jobStore = new RAMJobStore(); + + DirectSchedulerFactory.Instance.CreateScheduler("My Quartz Scheduler", "My Instance", threadPool, jobStore); + // don't forget to start the scheduler: + DirectSchedulerFactory.Instance.GetScheduler("My Quartz Scheduler", "My Instance").Start(); + + > + Mohammad Rezaei + James House + Marko Lahma (.NET) + + + + + + Provides a mechanism for obtaining client-usable handles to + instances. + + + + James House + Marko Lahma (.NET) + + + + Returns a client-usable handle to a . + + + + + Returns a handle to the Scheduler with the given name, if it exists. + + + + + Returns handles to all known Schedulers (made by any SchedulerFactory + within this app domain.). + + + + + Initializes a new instance of the class. + + + + + Creates an in memory job store () + The thread priority is set to Thread.NORM_PRIORITY + + The number of threads in the thread pool + + + + Creates a proxy to a remote scheduler. This scheduler can be retrieved + via . + + SchedulerException + + + + Same as , + with the addition of specifying the scheduler name and instance ID. This + scheduler can only be retrieved via . + + The name for the scheduler. + The instance ID for the scheduler. + + SchedulerException + + + + Creates a scheduler using the specified thread pool and job store. This + scheduler can be retrieved via DirectSchedulerFactory#GetScheduler() + + + The thread pool for executing jobs + + + The type of job store + + SchedulerException + if initialization failed + + + + + Same as DirectSchedulerFactory#createScheduler(ThreadPool threadPool, JobStore jobStore), + with the addition of specifying the scheduler name and instance ID. This + scheduler can only be retrieved via DirectSchedulerFactory#getScheduler(String) + + The name for the scheduler. + The instance ID for the scheduler. + The thread pool for executing jobs + The type of job store + + + + Creates a scheduler using the specified thread pool and job store and + binds it for remote access. + + The name for the scheduler. + The instance ID for the scheduler. + The thread pool for executing jobs + The type of job store + The idle wait time. You can specify "-1" for + the default value, which is currently 30000 ms. + The db failure retry interval. + + + + Creates a scheduler using the specified thread pool and job store and + binds it for remote access. + + The name for the scheduler. + The instance ID for the scheduler. + The thread pool for executing jobs + The type of job store + + The idle wait time. You can specify TimeSpan.Zero for + the default value, which is currently 30000 ms. + The db failure retry interval. + + + + Creates a scheduler using the specified thread pool and job store and + binds it for remote access. + + The name for the scheduler. + The instance ID for the scheduler. + The thread pool for executing jobs + Thread executor. + The type of job store + + The idle wait time. You can specify TimeSpan.Zero for + the default value, which is currently 30000 ms. + The db failure retry interval. + + + + Creates a scheduler using the specified thread pool and job store and + binds it for remote access. + + The name for the scheduler. + The instance ID for the scheduler. + The thread pool for executing jobs + Thread executor. + The type of job store + + The idle wait time. You can specify TimeSpan.Zero for + the default value, which is currently 30000 ms. + The db failure retry interval. + The maximum batch size of triggers, when acquiring them + The time window for which it is allowed to "pre-acquire" triggers to fire + + + + Returns a handle to the Scheduler produced by this factory. + + you must call createRemoteScheduler or createScheduler methods before + calling getScheduler() + + + + SchedulerException + + + + Returns a handle to the Scheduler with the given name, if it exists. + + + + + Gets the log. + + The log. + + + + Gets the instance. + + The instance. + + + + Returns a handle to all known Schedulers (made by any + StdSchedulerFactory instance.). + + + + + + Conveys the detail properties of a given job instance. + + + Quartz does not store an actual instance of a type, but + instead allows you to define an instance of one, through the use of a . + + s have a name and group associated with them, which + should uniquely identify them within a single . + + + s are the 'mechanism' by which s + are scheduled. Many s can point to the same , + but a single can only point to one . + + + + + + + + James House + Marko Lahma (.NET) + + + + Conveys the detail properties of a given job instance. + JobDetails are to be created/defined with . + + + Quartz does not store an actual instance of a type, but + instead allows you to define an instance of one, through the use of a . + + s have a name and group associated with them, which + should uniquely identify them within a single . + + + s are the 'mechanism' by which s + are scheduled. Many s can point to the same , + but a single can only point to one . + + + + + + + + James House + Marko Lahma (.NET) + + + + Get a that is configured to produce a + identical to this one. + + + + + The key that identifies this jobs uniquely. + + + + + Get or set the description given to the instance by its + creator (if any). + + + + + Get or sets the instance of that will be executed. + + + + + Get or set the that is associated with the . + + + + + Whether or not the should remain stored after it is + orphaned (no s point to it). + + + If not explicitly set, the default value is . + + + if the Job should remain persisted after being orphaned. + + + + + Whether the associated Job class carries the . + + + + + + Whether the associated Job class carries the . + + + + + + Set whether or not the the should re-Execute + the if a 'recovery' or 'fail-over' situation is + encountered. + + + If not explicitly set, the default value is . + + + + + + Create a with no specified name or group, and + the default settings of all the other properties. + + Note that the , and + properties must be set before the job can be + placed into a . + + + + + + Create a with the given name, default group, and + the default settings of all the other properties. + If , Scheduler.DefaultGroup will be used. + + + If name is null or empty, or the group is an empty string. + + + + + Create a with the given name, and group, and + the default settings of all the other properties. + If , Scheduler.DefaultGroup will be used. + + + If name is null or empty, or the group is an empty string. + + + + + Create a with the given name, and group, and + the given settings of all the other properties. + + The name. + if , Scheduler.DefaultGroup will be used. + Type of the job. + if set to true, job will be durable. + if set to true, job will request recovery. + + ArgumentException if name is null or empty, or the group is an empty string. + + + + + Validates whether the properties of the are + valid for submission into a . + + + + + Return a simple string representation of this object. + + + + + Creates a new object that is a copy of the current instance. + + + A new object that is a copy of this instance. + + + + + Determines whether the specified detail is equal to this instance. + + The detail to examine. + + true if the specified detail is equal; otherwise, false. + + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + if the specified is equal to the + current ; otherwise, . + + + + + Checks equality between given job detail and this instance. + + The detail to compare this instance with. + + + + + Serves as a hash function for a particular type, suitable + for use in hashing algorithms and data structures like a hash table. + + + A hash code for the current . + + + + + Get or sets the name of this . + + + if name is null or empty. + + + + + Get or sets the group of this . + If , will be used. + + + If the group is an empty string. + + + + + Returns the 'full name' of the in the format + "group.name". + + + + + Gets the key. + + The key. + + + + Get or set the description given to the instance by its + creator (if any). + + + May be useful for remembering/displaying the purpose of the job, though the + description has no meaning to Quartz. + + + + + Get or sets the instance of that will be executed. + + + if jobType is null or the class is not a . + + + + + Get or set the that is associated with the . + + + + + Set whether or not the the should re-Execute + the if a 'recovery' or 'fail-over' situation is + encountered. + + If not explicitly set, the default value is . + + + + + + + Whether or not the should remain stored after it is + orphaned (no s point to it). + + If not explicitly set, the default value is . + + + + if the Job should remain persisted after + being orphaned. + + + + + Whether the associated Job class carries the attribute. + + + + + Whether the associated Job class carries the attribute. + + + + + A context bundle containing handles to various environment information, that + is given to a instance as it is + executed, and to a instance after the + execution completes. + + + + The found on this object (via the + method) serves as a convenience - + it is a merge of the found on the + and the one found on the , with + the value in the latter overriding any same-named values in the former. + It is thus considered a 'best practice' that the Execute code of a Job + retrieve data from the JobDataMap found on this object + + + NOTE: Do not + expect value 'set' into this JobDataMap to somehow be set back onto a + job's own JobDataMap. + + + + s are also returned from the + + method. These are the same instances as those past into the jobs that are + currently executing within the scheduler. The exception to this is when your + application is using Quartz remotely (i.e. via remoting or WCF) - in which case you get + a clone of the s, and their references to + the and instances have been lost (a + clone of the is still available - just not a handle + to the job instance that is running). + + + + + + + + James House + Marko Lahma (.NET) + + + + A context bundle containing handles to various environment information, that + is given to a instance as it is + executed, and to a instance after the + execution completes. + + + + + Put the specified value into the context's data map with the given key. + Possibly useful for sharing data between listeners and jobs. + + NOTE: this data is volatile - it is lost after the job execution + completes, and all TriggerListeners and JobListeners have been + notified. + + + + + + + + + + Get the value with the given key from the context's data map. + + + + + + + Get a handle to the instance that fired the + . + + + + + Get a handle to the instance that fired the + . + + + + + Get a handle to the referenced by the + instance that fired the . + + + + + If the is being re-executed because of a 'recovery' + situation, this method will return . + + + + + Gets the refire count. + + The refire count. + + + + Get the convenience of this execution context. + + + + The found on this object serves as a convenience - + it is a merge of the found on the + and the one found on the , with + the value in the latter overriding any same-named values in the former. + It is thus considered a 'best practice' that the Execute code of a Job + retrieve data from the JobDataMap found on this object. + + + NOTE: Do not expect value 'set' into this JobDataMap to somehow be + set back onto a job's own JobDataMap. + + + Attempts to change the contents of this map typically result in an + illegal state. + + + + + + Get the associated with the . + + + + + Get the instance of the that was created for this + execution. + + Note: The Job instance is not available through remote scheduler + interfaces. + + + + + + The actual time the trigger fired. For instance the scheduled time may + have been 10:00:00 but the actual fire time may have been 10:00:03 if + the scheduler was too busy. + + Returns the fireTimeUtc. + + + + + The scheduled time the trigger fired for. For instance the scheduled + time may have been 10:00:00 but the actual fire time may have been + 10:00:03 if the scheduler was too busy. + + Returns the scheduledFireTimeUtc. + + + + + Gets the previous fire time. + + The previous fire time. + + + + Gets the next fire time. + + The next fire time. + + + + Get the unique Id that identifies this particular firing instance of the + trigger that triggered this job execution. It is unique to this + JobExecutionContext instance as well. + + the unique fire instance id + + + + + Returns the result (if any) that the set before its + execution completed (the type of object set as the result is entirely up + to the particular job). + + + + The result itself is meaningless to Quartz, but may be informative + to s or + s that are watching the job's + execution. + + + Set the result (if any) of the 's execution (the type of + object set as the result is entirely up to the particular job). + + + The result itself is meaningless to Quartz, but may be informative + to s or + s that are watching the job's + execution. + + + + + + The amount of time the job ran for. The returned + value will be until the job has actually completed (or thrown an + exception), and is therefore generally only useful to + s and s. + + + + + Create a JobExcecutionContext with the given context data. + + + + + Increments the refire count. + + + + + Returns a that represents the current . + + + A that represents the current . + + + + + Put the specified value into the context's data map with the given key. + Possibly useful for sharing data between listeners and jobs. + + NOTE: this data is volatile - it is lost after the job execution + completes, and all TriggerListeners and JobListeners have been + notified. + + + + + + + + + + Get the value with the given key from the context's data map. + + + + + + + Get a handle to the instance that fired the + . + + + + + Get a handle to the instance that fired the + . + + + + + Get a handle to the referenced by the + instance that fired the . + + + + + If the is being re-executed because of a 'recovery' + situation, this method will return . + + + + + Gets the refire count. + + The refire count. + + + + Get the convenience of this execution context. + + + + The found on this object serves as a convenience - + it is a merge of the found on the + and the one found on the , with + the value in the latter overriding any same-named values in the former. + It is thus considered a 'best practice' that the Execute code of a Job + retrieve data from the JobDataMap found on this object. + + + NOTE: Do not expect value 'set' into this JobDataMap to somehow be + set back onto a job's own JobDataMap. + + + Attempts to change the contents of this map typically result in an + illegal state. + + + + + + Get the associated with the . + + + + + Get the instance of the that was created for this + execution. + + Note: The Job instance is not available through remote scheduler + interfaces. + + + + + + The actual time the trigger fired. For instance the scheduled time may + have been 10:00:00 but the actual fire time may have been 10:00:03 if + the scheduler was too busy. + + Returns the fireTimeUtc. + + + + + The scheduled time the trigger fired for. For instance the scheduled + time may have been 10:00:00 but the actual fire time may have been + 10:00:03 if the scheduler was too busy. + + Returns the scheduledFireTimeUtc. + + + + + Gets the previous fire time. + + The previous fire time. + + + + Gets the next fire time. + + The next fire time. + + + + Returns the result (if any) that the set before its + execution completed (the type of object set as the result is entirely up + to the particular job). + + + + The result itself is meaningless to Quartz, but may be informative + to s or + s that are watching the job's + execution. + + + Set the result (if any) of the 's execution (the type of + object set as the result is entirely up to the particular job). + + + The result itself is meaningless to Quartz, but may be informative + to s or + s that are watching the job's + execution. + + + + + + The amount of time the job ran for. The returned + value will be until the job has actually completed (or thrown an + exception), and is therefore generally only useful to + s and s. + + + + + Returns the fire instace id. + + + + + An implementation of the interface that remotely + proxies all method calls to the equivalent call on a given + instance, via remoting or similar technology. + + + + James House + Marko Lahma (.NET) + + + + This is the main interface of a Quartz Scheduler. + + + + A maintains a registry of + s and s. Once + registered, the is responsible for executing + s when their associated s + fire (when their scheduled time arrives). + + + instances are produced by a + . A scheduler that has already been + created/initialized can be found and used through the same factory that + produced it. After a has been created, it is in + "stand-by" mode, and must have its method + called before it will fire any s. + + + s are to be created by the 'client program', by + defining a class that implements the interface. + objects are then created (also by the client) to + define a individual instances of the . + instances can then be registered with the + via the %IScheduler.ScheduleJob(JobDetail, + Trigger)% or %IScheduler.AddJob(JobDetail, bool)% method. + + + s can then be defined to fire individual + instances based on given schedules. + s are most useful for one-time firings, or + firing at an exact moment in time, with N repeats with a given delay between + them. s allow scheduling based on time of day, + day of week, day of month, and month of year. + + + s and s have a name and + group associated with them, which should uniquely identify them within a single + . The 'group' feature may be useful for creating + logical groupings or categorizations of s and + s. If you don't have need for assigning a group to a + given s of s, then you can use + the constant defined on + this interface. + + + Stored s can also be 'manually' triggered through the + use of the %IScheduler.TriggerJob(string, string)% function. + + + Client programs may also be interested in the 'listener' interfaces that are + available from Quartz. The interface provides + notifications of executions. The + interface provides notifications of + firings. The + interface provides notifications of events and + errors. Listeners can be associated with local schedulers through the + interface. + + + The setup/configuration of a instance is very + customizable. Please consult the documentation distributed with Quartz. + + + + + + + + + Marko Lahma (.NET) + + + + returns true if the given JobGroup + is paused + + + + + + + returns true if the given TriggerGroup + is paused + + + + + + + Get a object describing the settings + and capabilities of the scheduler instance. + + + Note that the data returned is an 'instantaneous' snap-shot, and that as + soon as it's returned, the meta data values may be different. + + + + + Return a list of objects that + represent all currently executing Jobs in this Scheduler instance. + + + + This method is not cluster aware. That is, it will only return Jobs + currently executing in this Scheduler instance, not across the entire + cluster. + + + Note that the list returned is an 'instantaneous' snap-shot, and that as + soon as it's returned, the true list of executing jobs may be different. + Also please read the doc associated with - + especially if you're using remoting. + + + + + + + Get the names of all known groups. + + + + + Get the names of all known groups. + + + + + Get the names of all groups that are paused. + + + + + Starts the 's threads that fire s. + When a scheduler is first created it is in "stand-by" mode, and will not + fire triggers. The scheduler can also be put into stand-by mode by + calling the method. + + + The misfire/recovery process will be started, if it is the initial call + to this method on this scheduler instance. + + + + + + + + Calls after the indicated delay. + (This call does not block). This can be useful within applications that + have initializers that create the scheduler immediately, before the + resources needed by the executing jobs have been fully initialized. + + + + + + + + Temporarily halts the 's firing of s. + + + + When is called (to bring the scheduler out of + stand-by mode), trigger misfire instructions will NOT be applied + during the execution of the method - any misfires + will be detected immediately afterward (by the 's + normal process). + + + The scheduler is not destroyed, and can be re-started at any time. + + + + + + + + Halts the 's firing of s, + and cleans up all resources associated with the Scheduler. Equivalent to + . + + + The scheduler cannot be re-started. + + + + + + Halts the 's firing of s, + and cleans up all resources associated with the Scheduler. + + + The scheduler cannot be re-started. + + + if the scheduler will not allow this method + to return until all currently executing jobs have completed. + + + + + + Add the given to the + Scheduler, and associate the given with + it. + + + If the given Trigger does not reference any , then it + will be set to reference the Job passed with it into this method. + + + + + Schedule the given with the + identified by the 's settings. + + + + + Schedule all of the given jobs with the related set of triggers. + + + If any of the given jobs or triggers already exist (or more + specifically, if the keys are not unique) and the replace + parameter is not set to true then an exception will be thrown. + + + + + Remove the indicated from the scheduler. + If the related job does not have any other triggers, and the job is + not durable, then the job will also be deleted. + + + + + Remove all of the indicated s from the scheduler. + + + If the related job does not have any other triggers, and the job is + not durable, then the job will also be deleted. + Note that while this bulk operation is likely more efficient than + invoking several + times, it may have the adverse affect of holding data locks for a + single long duration of time (rather than lots of small durations + of time). + + + + + Remove (delete) the with the + given key, and store the new given one - which must be associated + with the same job (the new trigger must have the job name & group specified) + - however, the new trigger need not have the same name as the old trigger. + + The to be replaced. + + The new to be stored. + + + if a with the given + name and group was not found and removed from the store (and the + new trigger is therefore not stored), otherwise + the first fire time of the newly scheduled trigger. + + + + + Add the given to the Scheduler - with no associated + . The will be 'dormant' until + it is scheduled with a , or + is called for it. + + + The must by definition be 'durable', if it is not, + SchedulerException will be thrown. + + + + + Delete the identified from the Scheduler - and any + associated s. + + true if the Job was found and deleted. + + + + Delete the identified jobs from the Scheduler - and any + associated s. + + + Note that while this bulk operation is likely more efficient than + invoking several + times, it may have the adverse affect of holding data locks for a + single long duration of time (rather than lots of small durations + of time). + + + true if all of the Jobs were found and deleted, false if + one or more were not deleted. + + + + + Trigger the identified + (Execute it now). + + + + + Trigger the identified (Execute it now). + + + the (possibly ) JobDataMap to be + associated with the trigger that fires the job immediately. + + + The of the to be executed. + + + + + Pause the with the given + key - by pausing all of its current s. + + + + + Pause all of the s in the + matching groups - by pausing all of their s. + + + + The Scheduler will "remember" that the groups are paused, and impose the + pause on any new jobs that are added to any of those groups until it is resumed. + + NOTE: There is a limitation that only exactly matched groups + can be remembered as paused. For example, if there are pre-existing + job in groups "aaa" and "bbb" and a matcher is given to pause + groups that start with "a" then the group "aaa" will be remembered + as paused and any subsequently added jobs in group "aaa" will be paused, + however if a job is added to group "axx" it will not be paused, + as "axx" wasn't known at the time the "group starts with a" matcher + was applied. HOWEVER, if there are pre-existing groups "aaa" and + "bbb" and a matcher is given to pause the group "axx" (with a + group equals matcher) then no jobs will be paused, but it will be + remembered that group "axx" is paused and later when a job is added + in that group, it will become paused. + + + + + + Pause the with the given key. + + + + + Pause all of the s in the groups matching. + + + + The Scheduler will "remember" all the groups paused, and impose the + pause on any new triggers that are added to any of those groups until it is resumed. + + NOTE: There is a limitation that only exactly matched groups + can be remembered as paused. For example, if there are pre-existing + triggers in groups "aaa" and "bbb" and a matcher is given to pause + groups that start with "a" then the group "aaa" will be remembered as + paused and any subsequently added triggers in that group be paused, + however if a trigger is added to group "axx" it will not be paused, + as "axx" wasn't known at the time the "group starts with a" matcher + was applied. HOWEVER, if there are pre-existing groups "aaa" and + "bbb" and a matcher is given to pause the group "axx" (with a + group equals matcher) then no triggers will be paused, but it will be + remembered that group "axx" is paused and later when a trigger is added + in that group, it will become paused. + + + + + + Resume (un-pause) the with + the given key. + + + If any of the 's s missed one + or more fire-times, then the 's misfire + instruction will be applied. + + + + + Resume (un-pause) all of the s + in matching groups. + + + If any of the s had s that + missed one or more fire-times, then the 's + misfire instruction will be applied. + + + + + + Resume (un-pause) the with the given + key. + + + If the missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + Resume (un-pause) all of the s in matching groups. + + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Pause all triggers - similar to calling + on every group, however, after using this method + must be called to clear the scheduler's state of 'remembering' that all + new triggers will be paused as they are added. + + + When is called (to un-pause), trigger misfire + instructions WILL be applied. + + + + + + + + Resume (un-pause) all triggers - similar to calling + on every group. + + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Get the keys of all the s in the matching groups. + + + + + Get all s that are associated with the + identified . + + + The returned Trigger objects will be snap-shots of the actual stored + triggers. If you wish to modify a trigger, you must re-store the + trigger afterward (e.g. see ). + + + + + Get the names of all the s in the given + groups. + + + + + Get the for the + instance with the given key . + + + The returned JobDetail object will be a snap-shot of the actual stored + JobDetail. If you wish to modify the JobDetail, you must re-store the + JobDetail afterward (e.g. see ). + + + + + Get the instance with the given key. + + + The returned Trigger object will be a snap-shot of the actual stored + trigger. If you wish to modify the trigger, you must re-store the + trigger afterward (e.g. see ). + + + + + Get the current state of the identified . + + + + + + + + + + + Add (register) the given to the Scheduler. + + Name of the calendar. + The calendar. + if set to true [replace]. + whether or not to update existing triggers that + referenced the already existing calendar so that they are 'correct' + based on the new trigger. + + + + Delete the identified from the Scheduler. + + Name of the calendar. + + true if the Calendar was found and deleted. + + + + + Get the instance with the given name. + + + + + Get the names of all registered . + + + + + Request the interruption, within this Scheduler instance, of all + currently executing instances of the identified , which + must be an implementor of the interface. + + + + If more than one instance of the identified job is currently executing, + the method will be called on + each instance. However, there is a limitation that in the case that + on one instances throws an exception, all + remaining instances (that have not yet been interrupted) will not have + their method called. + + + + If you wish to interrupt a specific instance of a job (when more than + one is executing) you can do so by calling + to obtain a handle + to the job instance, and then invoke on it + yourself. + + + This method is not cluster aware. That is, it will only interrupt + instances of the identified InterruptableJob currently executing in this + Scheduler instance, not across the entire cluster. + + + + true is at least one instance of the identified job was found and interrupted. + + + + + + + Request the interruption, within this Scheduler instance, of the + identified executing job instance, which + must be an implementor of the interface. + + + This method is not cluster aware. That is, it will only interrupt + instances of the identified InterruptableJob currently executing in this + Scheduler instance, not across the entire cluster. + + + + + + + the unique identifier of the job instance to be interrupted (see + + true if the identified job instance was found and interrupted. + + + + Determine whether a with the given identifier already + exists within the scheduler. + + the identifier to check for + true if a Job exists with the given identifier + + + + Determine whether a with the given identifier already + exists within the scheduler. + + the identifier to check for + true if a Trigger exists with the given identifier + + + + Clears (deletes!) all scheduling data - all s, s + s. + + + + + Returns the name of the . + + + + + Returns the instance Id of the . + + + + + Returns the of the . + + + + + Reports whether the is in stand-by mode. + + + + + + + Reports whether the has been Shutdown. + + + + + Set the that will be responsible for producing + instances of classes. + + + JobFactories may be of use to those wishing to have their application + produce instances via some special mechanism, such as to + give the opportunity for dependency injection. + + + + + + Get a reference to the scheduler's , + through which listeners may be registered. + + the scheduler's + + + + + + + + Whether the scheduler has been started. + + + Note: This only reflects whether has ever + been called on this Scheduler, so it will return even + if the is currently in standby mode or has been + since shutdown. + + + + + + + + Construct a instance to proxy the given + RemoteableQuartzScheduler instance. + + + + + returns true if the given JobGroup + is paused + + + + + + + returns true if the given TriggerGroup + is paused + + + + + + + Get a object describiing the settings + and capabilities of the scheduler instance. + + Note that the data returned is an 'instantaneous' snap-shot, and that as + soon as it's returned, the meta data values may be different. + + + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Get the names of all groups that are paused. + + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Get the names of all registered . + + + + + + Calls the equivalent method on the 'proxied' . + + + + + Returns the name of the . + + + + + Returns the instance Id of the . + + + + + Returns the of the . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Set the that will be responsible for producing + instances of classes. + + JobFactories may be of use to those wishing to have their application + produce instances via some special mechanism, such as to + give the opertunity for dependency injection. + + + + + SchedulerException + + + + Whether the scheduler has been started. + + + + Note: This only reflects whether has ever + been called on this Scheduler, so it will return even + if the is currently in standby mode or has been + since shutdown. + + + + + + + + This utility calls methods reflectively on the given objects even though the + methods are likely on a proper interface (ThreadPool, JobStore, etc). The + motivation is to be tolerant of older implementations that have not been + updated for the changes in the interfaces (eg. LocalTaskExecutorThreadPool in + spring quartz helpers) + + teck + Marko Lahma (.NET) + + + + Holds references to Scheduler instances - ensuring uniqueness, and + preventing garbage collection, and allowing 'global' lookups. + + James House + Marko Lahma (.NET) + + + + Binds the specified sched. + + The sched. + + + + Removes the specified sched name. + + Name of the sched. + + + + + Lookups the specified sched name. + + Name of the sched. + + + + + Lookups all. + + + + + + Gets the singleton instance. + + The instance. + + + + Responsible for creating the instances of + to be used within the instance. + + James House + Marko Lahma (.NET) + + + + Initialize the factory, providing a handle to the + that should be made available within the and + the s within it. + + + + + Called by the to obtain instances of + . + + + + + An implementation of the interface that directly + proxies all method calls to the equivalent call on a given + instance. + + + + James House + Marko Lahma (.NET) + + + + returns true if the given JobGroup + is paused + + + + + + + returns true if the given TriggerGroup + is paused + + + + + + + Get a object describiing the settings + and capabilities of the scheduler instance. + + Note that the data returned is an 'instantaneous' snap-shot, and that as + soon as it's returned, the meta data values may be different. + + + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Construct a instance to proxy the given + instance. + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Get the names of all registered . + + + + + + Request the interruption, within this Scheduler instance, of all + currently executing instances of the identified , which + must be an implementor of the interface. + + + + If more than one instance of the identified job is currently executing, + the method will be called on + each instance. However, there is a limitation that in the case that + on one instances throws an exception, all + remaining instances (that have not yet been interrupted) will not have + their method called. + + + If you wish to interrupt a specific instance of a job (when more than + one is executing) you can do so by calling + to obtain a handle + to the job instance, and then invoke on it + yourself. + + + This method is not cluster aware. That is, it will only interrupt + instances of the identified InterruptableJob currently executing in this + Scheduler instance, not across the entire cluster. + + + true is at least one instance of the identified job was found and interrupted. + UnableToInterruptJobException if the job does not implement + + + + + + Returns the name of the . + + + + + Returns the instance Id of the . + + + + + Returns the of the . + + + + + Whether the scheduler has been started. + + + + Note: This only reflects whether has ever + been called on this Scheduler, so it will return even + if the is currently in standby mode or has been + since shutdown. + + + + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + Calls the equivalent method on the 'proxied' . + + + + + + + + + An implementation of that + does all of it's work of creating a instance + based on the contents of a properties file. + + + + By default a properties are loaded from App.config's quartz section. + If that fails, then the file is loaded "quartz.properties". If file does not exist, + default configration located (as a embedded resource) in Quartz.dll is loaded. If you + wish to use a file other than these defaults, you must define the system + property 'quartz.properties' to point to the file you want. + + + See the sample properties that are distributed with Quartz for + information about the various settings available within the file. + + + Alternativly, you can explicitly Initialize the factory by calling one of + the methods before calling . + + + Instances of the specified , + , classes will be created + by name, and then any additional properties specified for them in the config + file will be set on the instance by calling an equivalent 'set' method. For + example if the properties file contains the property 'quartz.jobStore. + myProp = 10' then after the JobStore class has been instantiated, the property + 'MyProp' will be set with the value. Type conversion to primitive CLR types + (int, long, float, double, boolean, enum and string) are performed before calling + the property's setter method. + + + James House + Anthony Eden + Mohammad Rezaei + Marko Lahma (.NET) + + + + Returns a handle to the default Scheduler, creating it if it does not + yet exist. + + + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The props. + + + + Initialize the . + + + By default a properties file named "quartz.properties" is loaded from + the 'current working directory'. If that fails, then the + "quartz.properties" file located (as an embedded resource) in the Quartz.NET + assembly is loaded. If you wish to use a file other than these defaults, + you must define the system property 'quartz.properties' to point to + the file you want. + + + + + Creates a new name value collection and overrides its values + with system values (environment variables). + + The base properties to override. + A new NameValueCollection instance. + + + + Initialize the with + the contents of the given key value collection object. + + + + + + + + Needed while loadhelper is not constructed. + + + + + + + Returns a handle to the Scheduler produced by this factory. + + + If one of the methods has not be previously + called, then the default (no-arg) method + will be called by this method. + + + + + Returns a handle to the Scheduler with the given name, if it exists (if + it has already been instantiated). + + + + + + Returns a handle to all known Schedulers (made by any + StdSchedulerFactory instance.). + + + + + + Inspects a directory and compares whether any files' "last modified dates" + have changed since the last time it was inspected. If one or more files + have been updated (or created), the job invokes a "call-back" method on an + identified that can be found in the + . + + pl47ypus + James House + Marko Lahma (.NET) + + + + + The interface to be implemented by classes which represent a 'job' to be + performed. + + + Instances of this interface must have a + no-argument constructor. provides a mechanism for 'instance member data' + that may be required by some implementations of this interface. + + + + + + + + James House + Marko Lahma (.NET) + + + + Called by the when a + fires that is associated with the . + + + The implementation may wish to set a result object on the + JobExecutionContext before this method exits. The result itself + is meaningless to Quartz, but may be informative to + s or + s that are watching the job's + execution. + + The execution context. + + + key with which to specify the directory to be + monitored - an absolute path is recommended. + + + key with which to specify the + to be + notified when the directory contents change. + + + key with which to specify a + value that represents the minimum number of milliseconds that must have + passed since the file's last modified time in order to consider the file + new/altered. This is necessary because another process may still be + in the middle of writing to the file when the scan occurs, and the + file may therefore not yet be ready for processing. + If this parameter is not specified, a default value of 5000 (five seconds) will be used. + + + + This is the main entry point for job execution. The scheduler will call this method on the + job once it is triggered. + + The that + the job will use during execution. + + + + Inspects a file and compares whether it's "last modified date" has changed + since the last time it was inspected. If the file has been updated, the + job invokes a "call-back" method on an identified + that can be found in the + . + + James House + Marko Lahma (.NET) + + + + + JobDataMap key with which to specify the name of the file to monitor. + + + + + JobDataMap key with which to specify the + to be notified when the file contents change. + + + + + key with which to specify a long + value that represents the minimum number of milliseconds that must have + past since the file's last modified time in order to consider the file + new/altered. This is necessary because another process may still be + in the middle of writing to the file when the scan occurs, and the + file may therefore not yet be ready for processing. + + If this parameter is not specified, a default value of + 5000 (five seconds) will be used. + + + + + Initializes a new instance of the class. + + + + + Called by the when a + fires that is associated with the . + + The implementation may wish to set a result object on the + JobExecutionContext before this method exits. The result itself + is meaningless to Quartz, but may be informative to + s or + s that are watching the job's + execution. + + + The execution context. + + + + + + Gets the last modified date. + + Name of the file. + + + + + Gets the log. + + The log. + + + Interface for objects wishing to receive a 'call-back' from a + Instances should be stored in the such that the + can find it. + James House + Marko Lahma (.NET) + + + An array of objects that were updated/added + since the last scan of the directory + + + + Interface for objects wishing to receive a 'call-back' from a + . + + James House + Marko Lahma (.NET) + + + + + Ãnforms that certain file has been updated. + + Name of the file. + + + + Built in job for executing native executables in a separate process. + + + + JobDetail job = new JobDetail("dumbJob", null, typeof(Quartz.Jobs.NativeJob)); + job.JobDataMap.Put(Quartz.Jobs.NativeJob.PropertyCommand, "echo \"hi\" >> foobar.txt"); + Trigger trigger = TriggerUtils.MakeSecondlyTrigger(5); + trigger.Name = "dumbTrigger"; + sched.ScheduleJob(job, trigger); + + If PropertyWaitForProcess is true, then the integer exit value of the process + will be saved as the job execution result in the JobExecutionContext. + + Matthew Payne + James House + Steinar Overbeck Cook + Marko Lahma (.NET) + + + + Required parameter that specifies the name of the command (executable) + to be ran. + + + + + Optional parameter that specifies the parameters to be passed to the + executed command. + + + + + Optional parameter (value should be 'true' or 'false') that specifies + whether the job should wait for the execution of the native process to + complete before it completes. + + Defaults to . + + + + + Optional parameter (value should be 'true' or 'false') that specifies + whether the spawned process's stdout and stderr streams should be + consumed. If the process creates output, it is possible that it might + 'hang' if the streams are not consumed. + + Defaults to . + + + + + Optional parameter that specifies the workling directory to be used by + the executed command. + + + + + Initializes a new instance of the class. + + + + + Called by the when a + fires that is associated with the . + + The implementation may wish to set a result object on the + JobExecutionContext before this method exits. The result itself + is meaningless to Quartz, but may be informative to + s or + s that are watching the job's + execution. + + + + + + + Gets the log. + + The log. + + + + Consumes data from the given input stream until EOF and prints the data to stdout + + cooste + James House + + + + Initializes a new instance of the class. + + The enclosing instance. + The input stream. + The type. + + + + Runs this object as a separate thread, printing the contents of the input stream + supplied during instantiation, to either Console. or stderr + + + + + An implementation of Job, that does absolutely nothing - useful for system + which only wish to use s + and s, rather than writing + Jobs that perform work. + + James House + Marko Lahma (.NET) + + + + Do nothing. + + + + + A Job which sends an e-mail with the configured content to the configured + recipient. + + James House + Marko Lahma (.NET) + + + The host name of the smtp server. REQUIRED. + + + The e-mail address to send the mail to. REQUIRED. + + + The e-mail address to cc the mail to. Optional. + + + The e-mail address to claim the mail is from. REQUIRED. + + + The e-mail address the message should say to reply to. Optional. + + + The subject to place on the e-mail. REQUIRED. + + + The e-mail message body. REQUIRED. + + + + Executes the job. + + The job execution context. + + + + Holds a List of references to JobListener instances and broadcasts all + events to them (in order). + + + The broadcasting behavior of this listener to delegate listeners may be + more convenient than registering all of the listeners directly with the + Scheduler, and provides the flexibility of easily changing which listeners + get notified. + + + + + James House (jhouse AT revolition DOT net) + + + + Construct an instance with the given name. + + + (Remember to add some delegate listeners!) + + the name of this instance + + + + Construct an instance with the given name, and List of listeners. + + + + the name of this instance + the initial List of JobListeners to broadcast to. + + + + Holds a List of references to SchedulerListener instances and broadcasts all + events to them (in order). + + + This may be more convenient than registering all of the listeners + directly with the Scheduler, and provides the flexibility of easily changing + which listeners get notified. + + + + James House + Marko Lahma (.NET) + + + + Construct an instance with the given List of listeners. + + The initial List of SchedulerListeners to broadcast to. + + + + Holds a List of references to TriggerListener instances and broadcasts all + events to them (in order). + + + The broadcasting behavior of this listener to delegate listeners may be + more convenient than registering all of the listeners directly with the + Scheduler, and provides the flexibility of easily changing which listeners + get notified. + + + + + James House (jhouse AT revolition DOT net) + + + + The interface to be implemented by classes that want to be informed when a + fires. In general, applications that use a + will not have use for this mechanism. + + + + + + + James House + Marko Lahma (.NET) + + + + Called by the when a + has fired, and it's associated + is about to be executed. + + It is called before the method of this + interface. + + + The that has fired. + + The that will be passed to the 's method. + + + + + Called by the when a + has fired, and it's associated + is about to be executed. + + It is called after the method of this + interface. If the implementation vetos the execution (via + returning ), the job's execute method will not be called. + + + The that has fired. + The that will be passed to + the 's method. + Returns true if job execution should be vetoed, false otherwise. + + + + Called by the when a + has misfired. + + Consideration should be given to how much time is spent in this method, + as it will affect all triggers that are misfiring. If you have lots + of triggers misfiring at once, it could be an issue it this method + does a lot. + + + The that has misfired. + + + + Called by the when a + has fired, it's associated + has been executed, and it's method has been + called. + + The that was fired. + + The that was passed to the + 's method. + + + The result of the call on the 's method. + + + + + Get the name of the . + + + + + Construct an instance with the given name. + + + (Remember to add some delegate listeners!) + + the name of this instance + + + + Construct an instance with the given name, and List of listeners. + + + + the name of this instance + the initial List of TriggerListeners to broadcast to. + + + + Keeps a collection of mappings of which Job to trigger after the completion + of a given job. If this listener is notified of a job completing that has a + mapping, then it will then attempt to trigger the follow-up job. This + achieves "job chaining", or a "poor man's workflow". + + + + Generally an instance of this listener would be registered as a global + job listener, rather than being registered directly to a given job. + + + If for some reason there is a failure creating the trigger for the + follow-up job (which would generally only be caused by a rare serious + failure in the system, or the non-existence of the follow-up job), an error + messsage is logged, but no other action is taken. If you need more rigorous + handling of the error, consider scheduling the triggering of the flow-up + job within your job itself. + + + James House + Marko Lahma (.NET) + + + + A helpful abstract base class for implementors of . + + + + The methods in this class are empty so you only need to override the + subset for the events you care about. + + + + You are required to implement + to return the unique name of your . + + + Marko Lahma (.NET) + + + + + Initializes a new instance of the class. + + + + + Called by the when a + is about to be executed (an associated + has occured). + + This method will not be invoked if the execution of the Job was vetoed + by a . + + + + + + + + Called by the when a + was about to be executed (an associated + has occured), but a vetoed it's + execution. + + + + + + + Called by the after a + has been executed, and be for the associated 's + method has been called. + + + + + + + Get the for this class's category. + This should be used by subclasses for logging. + + + + + Get the name of the . + + + + + + Construct an instance with the given name. + + The name of this instance. + + + + Add a chain mapping - when the Job identified by the first key completes + the job identified by the second key will be triggered. + + a JobKey with the name and group of the first job + a JobKey with the name and group of the follow-up job + + + + A helpful abstract base class for implementors of + . + + + + The methods in this class are empty so you only need to override the + subset for the events + you care about. + + + + You are required to implement + to return the unique name of your . + + + Marko Lahma (.NET) + + + + + Get the for this + class's category. This should be used by subclasses for logging. + + + + + Get the name of the . + + + + + + Logs a history of all job executions (and execution vetos) via common + logging. + + + + The logged message is customizable by setting one of the following message + properties to a string that conforms to the syntax of . + + + JobToBeFiredMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Job's Name.
1StringThe Job's Group.
2DateThe current time.
3StringThe Trigger's name.
4StringThe Triggers's group.
5DateThe scheduled fire time.
6DateThe next scheduled fire time.
7IntegerThe re-fire count from the JobExecutionContext.
+ The default message text is "Job {1}.{0} fired (by trigger {4}.{3}) at: + {2, date, HH:mm:ss MM/dd/yyyy" +
+ + JobSuccessMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Job's Name.
1StringThe Job's Group.
2DateThe current time.
3StringThe Trigger's name.
4StringThe Triggers's group.
5DateThe scheduled fire time.
6DateThe next scheduled fire time.
7IntegerThe re-fire count from the JobExecutionContext.
8ObjectThe string value (toString() having been called) of the result (if any) + that the Job set on the JobExecutionContext, with on it. "NULL" if no + result was set.
+ The default message text is "Job {1}.{0} execution complete at {2, date, + HH:mm:ss MM/dd/yyyy} and reports: {8" +
+ + JobFailedMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Job's Name.
1StringThe Job's Group.
2DateThe current time.
3StringThe Trigger's name.
4StringThe Triggers's group.
5DateThe scheduled fire time.
6DateThe next scheduled fire time.
7IntegerThe re-fire count from the JobExecutionContext.
8StringThe message from the thrown JobExecution Exception. +
+ The default message text is "Job {1}.{0} execution failed at {2, date, + HH:mm:ss MM/dd/yyyy} and reports: {8" +
+ + JobWasVetoedMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Job's Name.
1StringThe Job's Group.
2DateThe current time.
3StringThe Trigger's name.
4StringThe Triggers's group.
5DateThe scheduled fire time.
6DateThe next scheduled fire time.
7IntegerThe re-fire count from the JobExecutionContext.
+ The default message text is "Job {1}.{0} was vetoed. It was to be fired + (by trigger {4}.{3}) at: {2, date, HH:mm:ss MM/dd/yyyy" +
+
+ Marko Lahma (.NET) +
+ + + Provides an interface for a class to become a "plugin" to Quartz. + + + Plugins can do virtually anything you wish, though the most interesting ones + will obviously interact with the scheduler in some way - either actively: by + invoking actions on the scheduler, or passively: by being a , + , and/or . + + If you use to + Initialize your Scheduler, it can also create and Initialize your plugins - + look at the configuration docs for details. + + + If you need direct access your plugin, you can have it explicitly put a + reference to itself in the 's + as part of its + method. + + + James House + Marko Lahma (.NET) + + + + Called during creation of the in order to give + the a chance to Initialize. + + + At this point, the Scheduler's is not yet + + If you need direct access your plugin, you can have it explicitly put a + reference to itself in the 's + as part of its + method. + + + + The name by which the plugin is identified. + + + The scheduler to which the plugin is registered. + + + + + Called when the associated is started, in order + to let the plug-in know it can now make calls into the scheduler if it + needs to. + + + + + Called in order to inform the that it + should free up all of it's resources because the scheduler is shutting + down. + + + + + Called during creation of the in order to give + the a chance to Initialize. + + + + + Called when the associated is started, in order + to let the plug-in know it can now make calls into the scheduler if it + needs to. + + + + + Called in order to inform the that it + should free up all of it's resources because the scheduler is shutting + down. + + + + + Called by the when a is + about to be executed (an associated has occurred). + + This method will not be invoked if the execution of the Job was vetoed by a + . + + + + + + + Called by the after a + has been executed, and be for the associated 's + method has been called. + + + + + + + Called by the when a + was about to be executed (an associated + has occured), but a vetoed it's + execution. + + + + + + + Logger instance to use. Defaults to common logging. + + + + + Get or sets the message that is logged when a Job successfully completes its + execution. + + + + + Get or sets the message that is logged when a Job fails its + execution. + + + + + Gets or sets the message that is logged when a Job is about to Execute. + + + + + Gets or sets the message that is logged when a Job execution is vetoed by a + trigger listener. + + + + + Get the name of the . + + + + + + Logs a history of all trigger firings via the Jakarta Commons-Logging + framework. + + + + The logged message is customizable by setting one of the following message + properties to a string that conforms to the syntax of . + + + + TriggerFiredMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Trigger's Name.
1StringThe Trigger's Group.
2DateThe scheduled fire time.
3DateThe next scheduled fire time.
4DateThe actual fire time.
5StringThe Job's name.
6StringThe Job's group.
7IntegerThe re-fire count from the JobExecutionContext.
+ + The default message text is "Trigger {1}.{0} fired job {6}.{5} at: {4, + date, HH:mm:ss MM/dd/yyyy" +
+ + + TriggerMisfiredMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Trigger's Name.
1StringThe Trigger's Group.
2DateThe scheduled fire time.
3DateThe next scheduled fire time.
4DateThe actual fire time. (the time the misfire was detected/handled)
5StringThe Job's name.
6StringThe Job's group.
+ + The default message text is "Trigger {1}.{0} misfired job {6}.{5} at: + {4, date, HH:mm:ss MM/dd/yyyy}. Should have fired at: {3, date, HH:mm:ss + MM/dd/yyyy" +
+ + + TriggerCompleteMessage - available message data are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementData TypeDescription
0StringThe Trigger's Name.
1StringThe Trigger's Group.
2DateThe scheduled fire time.
3DateThe next scheduled fire time.
4DateThe job completion time.
5StringThe Job's name.
6StringThe Job's group.
7IntegerThe re-fire count from the JobExecutionContext.
8IntegerThe trigger's resulting instruction code.
9StringA human-readable translation of the trigger's resulting instruction + code.
+ + The default message text is "Trigger {1}.{0} completed firing job + {6}.{5} at {4, date, HH:mm:ss MM/dd/yyyy} with resulting trigger instruction + code: {9" +
+
+ James House + Marko Lahma (.NET) +
+ + + Called during creation of the in order to give + the a chance to Initialize. + + + + + Called when the associated is started, in order + to let the plug-in know it can now make calls into the scheduler if it + needs to. + + + + + Called in order to inform the that it + should free up all of it's resources because the scheduler is shutting + down. + + + + + Called by the when a + has fired, and it's associated + is about to be executed. + + It is called before the method of this + interface. + + + The that has fired. + The that will be passed to the 's method. + + + + Called by the when a + has misfired. + + Consideration should be given to how much time is spent in this method, + as it will affect all triggers that are misfiring. If you have lots + of triggers misfiring at once, it could be an issue it this method + does a lot. + + + The that has misfired. + + + + Called by the when a + has fired, it's associated + has been executed, and it's method has been + called. + + The that was fired. + The that was passed to the + 's method. + The result of the call on the 's method. + + + + Called by the when a + has fired, and it's associated + is about to be executed. + + It is called after the method of this + interface. + + + The that has fired. + The that will be passed to + the 's method. + + + + + Logger instance to use. Defaults to common logging. + + + + + Get or set the message that is printed upon the completion of a trigger's + firing. + + + + + Get or set the message that is printed upon a trigger's firing. + + + + + Get or set the message that is printed upon a trigger's mis-firing. + + + + + Get the name of the . + + + + + + This plugin catches the event of the VM terminating (such as upon a CRTL-C) + and tells the scheuler to Shutdown. + + + James House + Marko Lahma (.NET) + + + + Called during creation of the in order to give + the a chance to Initialize. + + + + + Called when the associated is started, in order + to let the plug-in know it can now make calls into the scheduler if it + needs to. + + + + + Called in order to inform the that it + should free up all of it's resources because the scheduler is shutting + down. + + + + + Determine whether or not the plug-in is configured to cause a clean + Shutdown of the scheduler. + + The default value is . + + + + + + + This plugin loads XML file(s) to add jobs and schedule them with triggers + as the scheduler is initialized, and can optionally periodically scan the + file for changes. + + + The periodically scanning of files for changes is not currently supported in a + clustered environment. + + James House + Pierre Awaragi + + + + Initializes a new instance of the class. + + + + + + + + + + + Called during creation of the in order to give + the a chance to initialize. + + The name. + The scheduler. + SchedulerConfigException + + + + Called when the associated is started, in order + to let the plug-in know it can now make calls into the scheduler if it + needs to. + + + + + Helper method for generating unique job/trigger name for the + file scanning jobs (one per FileJob). The unique names are saved + in jobTriggerNameSet. + + + + + + + Called in order to inform the that it + should free up all of it's resources because the scheduler is shutting + down. + + + + + Gets the log. + + The log. + + + + Comma separated list of file names (with paths) to the XML files that should be read. + + + + + The interval at which to scan for changes to the file. + If the file has been changed, it is re-loaded and parsed. The default + value for the interval is 0, which disables scanning. + + + + + Whether or not initialization of the plugin should fail (throw an + exception) if the file cannot be found. Default is . + + + + + Information about a file that should be processed by . + + + + + Default object serialization strategy that uses + under the hood. + + Marko Lahma + + + + Interface for object serializers. + + Marko Lahma + + + + + Serializes given object as bytes + that can be stored to permanent stores. + + Object to serialize, always non-null. + + + + Deserializes object from byte array presentation. + + Data to deserialize object from, always non-null and non-empty. + + + + Serializes given object as bytes + that can be stored to permanent stores. + + Object to serialize. + + + + Deserializes object from byte array presentation. + + Data to deserialize object from. + + + + that names the scheduler instance using + just the machine hostname. + + + This class is useful when you know that your scheduler instance will be the + only one running on a particular machine. Each time the scheduler is + restarted, it will get the same instance id as long as the machine is not + renamed. + + Marko Lahma (.NET) + + + + + + An IInstanceIdGenerator is responsible for generating the clusterwide unique + instance id for a node. + + + This interface may be of use to those wishing to have specific control over + the mechanism by which the instances in their + application are named. + + + Marko Lahma (.NET) + + + + Generate the instance id for a + + The clusterwide unique instance id. + + + + + Generate the instance id for a + + The clusterwide unique instance id. + + + + A JobFactory that instantiates the Job instance (using the default no-arg + constructor, or more specifically: ), and + then attempts to set all values from the and + the 's merged onto + properties of the job. + + + Set the WarnIfPropertyNotFound property to true if you'd like noisy logging in + the case of values in the not mapping to properties on your job + class. This may be useful for troubleshooting typos of property names, etc. + but very noisy if you regularly (and purposely) have extra things in your + . + Also of possible interest is the ThrowIfPropertyNotFound property which + will throw exceptions on unmatched JobDataMap keys. + + + + + + + + James Houser + Marko Lahma (.NET) + + + + The default JobFactory used by Quartz - simply calls + on the job class. + + + + James House + Marko Lahma (.NET) + + + + A JobFactory is responsible for producing instances of + classes. + + + This interface may be of use to those wishing to have their application + produce instances via some special mechanism, such as to + give the opertunity for dependency injection. + + + + + James House + Marko Lahma (.NET) + + + + Called by the scheduler at the time of the trigger firing, in order to + produce a instance on which to call Execute. + + + It should be extremely rare for this method to throw an exception - + basically only the the case where there is no way at all to instantiate + and prepare the Job for execution. When the exception is thrown, the + Scheduler will move all triggers associated with the Job into the + state, which will require human + intervention (e.g. an application restart after fixing whatever + configuration problem led to the issue wih instantiating the Job. + + + The TriggerFiredBundle from which the + and other info relating to the trigger firing can be obtained. + + a handle to the scheduler that is about to execute the job + SchedulerException if there is a problem instantiating the Job. + the newly instantiated Job + + + + + Called by the scheduler at the time of the trigger firing, in order to + produce a instance on which to call Execute. + + + It should be extremely rare for this method to throw an exception - + basically only the the case where there is no way at all to instantiate + and prepare the Job for execution. When the exception is thrown, the + Scheduler will move all triggers associated with the Job into the + state, which will require human + intervention (e.g. an application restart after fixing whatever + configuration problem led to the issue wih instantiating the Job. + + The TriggerFiredBundle from which the + and other info relating to the trigger firing can be obtained. + + the newly instantiated Job + SchedulerException if there is a problem instantiating the Job. + + + + Called by the scheduler at the time of the trigger firing, in order to + produce a instance on which to call Execute. + + + + It should be extremely rare for this method to throw an exception - + basically only the the case where there is no way at all to instantiate + and prepare the Job for execution. When the exception is thrown, the + Scheduler will move all triggers associated with the Job into the + state, which will require human + intervention (e.g. an application restart after fixing whatever + configuration problem led to the issue wih instantiating the Job. + + + The TriggerFiredBundle from which the + and other info relating to the trigger firing can be obtained. + + the newly instantiated Job + SchedulerException if there is a problem instantiating the Job. + + + + Sets the object properties. + + The object to set properties to. + The data to set. + + + + Whether the JobInstantiation should fail and throw and exception if + a key (name) and value (type) found in the JobDataMap does not + correspond to a proptery setter on the Job class. + + + + + Get or set whether a warning should be logged if + a key (name) and value (type) found in the JobDataMap does not + correspond to a proptery setter on the Job class. + + + + + This class implements a that + utilizes RAM as its storage device. + + As you should know, the ramification of this is that access is extrememly + fast, but the data is completely volatile - therefore this + should not be used if true persistence between program shutdowns is + required. + + + James House + Sharada Jambula + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + + + + Gets the fired trigger record id. + + The fired trigger record id. + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + Called by the QuartzScheduler to inform the that + the scheduler has started. + + + + + Called by the QuartzScheduler to inform the JobStore that + the scheduler has been paused. + + + + + Called by the QuartzScheduler to inform the JobStore that + the scheduler has resumed after being paused. + + + + + Called by the QuartzScheduler to inform the that + it should free up all of it's resources because the scheduler is + shutting down. + + + + + Clears (deletes!) all scheduling data - all s, s + s. + + + + + Store the given and . + + The to be stored. + The to be stored. + + + + Returns true if the given job group is paused. + + Job group name + + + + + returns true if the given TriggerGroup is paused. + + + + + + + Store the given . + + The to be stored. + If , any existing in the + with the same name and group should be + over-written. + + + + Remove (delete) the with the given + name, and any s that reference + it. + + + if a with the given name and + group was found and removed from the store. + + + + + Remove (delete) the with the + given name. + + + if a with the given + name and group was found and removed from the store. + + + + + Store the given . + + The to be stored. + If , any existing in + the with the same name and group should + be over-written. + + + + Remove (delete) the with the + given name. + + + + if a with the given + name and group was found and removed from the store. + + The to be removed. + Whether to delete orpahaned job details from scheduler if job becomes orphaned from removing the trigger. + + + + Replaces the trigger. + + The of the to be replaced. + The new trigger. + + + + + Retrieve the for the given + . + + + The desired , or null if there is no match. + + + + + Retrieve the given . + + + The desired , or null if there is no match. + + + + + Determine whether a with the given identifier already + exists within the scheduler. + + the identifier to check for + true if a Job exists with the given identifier + + + + Determine whether a with the given identifier already + exists within the scheduler. + + triggerKey the identifier to check for + true if a Trigger exists with the given identifier + + + + Get the current state of the identified . + + + + + + + + + + + Store the given . + + The name. + The to be stored. + If , any existing + in the with the same name and group + should be over-written. + If , any s existing + in the that reference an existing + Calendar with the same name with have their next fire time + re-computed with the new . + + + + Remove (delete) the with the + given name. + + If removal of the would result in + s pointing to non-existent calendars, then a + will be thrown. + + The name of the to be removed. + + if a with the given name + was found and removed from the store. + + + + + Retrieve the given . + + The name of the to be retrieved. + + The desired , or null if there is no match. + + + + + Get the number of s that are + stored in the . + + + + + Get the number of s that are + stored in the . + + + + + Get the number of s that are + stored in the . + + + + + Get the names of all of the s that + match the given group matcher. + + + + + Get the names of all of the s + in the . + + If there are no ICalendars in the given group name, the result should be + a zero-length array (not ). + + + + + + Get the names of all of the s + that have the given group name. + + + + + Get the names of all of the + groups. + + + + + Get the names of all of the groups. + + + + + Get all of the Triggers that are associated to the given Job. + + If there are no matches, a zero-length array should be returned. + + + + + + Gets the trigger wrappers for job. + + + + + + Gets the trigger wrappers for calendar. + + Name of the cal. + + + + + Pause the with the given name. + + + + + Pause all of the s in the given group. + + The JobStore should "remember" that the group is paused, and impose the + pause on any new triggers that are added to the group while the group is + paused. + + + + + + Pause the with the given + name - by pausing all of its current s. + + + + + Pause all of the s in the + given group - by pausing all of their s. + + The JobStore should "remember" that the group is paused, and impose the + pause on any new jobs that are added to the group while the group is + paused. + + + + + + Resume (un-pause) the with the given key. + + + If the missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + Resume (un-pause) all of the s in the + given group. + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + Resume (un-pause) the with + the given name. + + If any of the 's s missed one + or more fire-times, then the 's misfire + instruction will be applied. + + + + + + Resume (un-pause) all of the s + in the given group. + + If any of the s had s that + missed one or more fire-times, then the 's + misfire instruction will be applied. + + + + + + Pause all triggers - equivalent of calling + on every group. + + When is called (to un-pause), trigger misfire + instructions WILL be applied. + + + + + + + Resume (un-pause) all triggers - equivalent of calling + on every trigger group and setting all job groups unpaused />. + + If any missed one or more fire-times, then the + 's misfire instruction will be applied. + + + + + + + Applies the misfire. + + The trigger wrapper. + + + + + Get a handle to the next trigger to be fired, and mark it as 'reserved' + by the calling scheduler. + + + + + + Inform the that the scheduler no longer plans to + fire the given , that it had previously acquired + (reserved). + + + + + Inform the that the scheduler is now firing the + given (executing its associated ), + that it had previously acquired (reserved). + + + + + Inform the that the scheduler has completed the + firing of the given (and the execution its + associated ), and that the + in the given should be updated if the + is stateful. + + + + + Sets the state of all triggers of job to specified state. + + + + + Peeks the triggers. + + + + + + + + + The time span by which a trigger must have missed its + next-fire-time, in order for it to be considered "misfired" and thus + have its misfire instruction applied. + + + + + Returns whether this instance supports persistence. + + + + + + + Inform the of the Scheduler instance's Id, + prior to initialize being invoked. + + + + + Inform the of the Scheduler instance's name, + prior to initialize being invoked. + + + + + Comparer for trigger wrappers. + + + + + Indicates whether the current object is equal to another object of the same type. + + + true if the current object is equal to the parameter; otherwise, false. + + An object to compare with this object. + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + 2 + + + + Possible internal trigger states + in RAMJobStore + + + + + Waiting + + + + + Acquired + + + + + Executing + + + + + Complete + + + + + Paused + + + + + Blocked + + + + + Paused and Blocked + + + + + Error + + + + + Helper wrapper class + + + + + The key used + + + + + Job's key + + + + + The trigger + + + + + Current state + + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + + Serves as a hash function for a particular type. is suitable for use in hashing algorithms and data structures like a hash table. + + + A hash code for the current . + + + + + Scheduler exporter that exports scheduler to remoting context. + + Marko Lahma + + + + Service interface for scheduler exporters. + + Marko Lahma + + + + Binds (exports) scheduler to external context. + + + + + + Unbinds scheduler from external context. + + + + + + Registers remoting channel if needed. This is determined + by checking whether there is a positive value for port. + + + + + Gets or sets the port used for remoting. + + + + + Gets or sets the name to use when exporting + scheduler to remoting context. + + + + + Gets or sets the name to use when binding to + tcp channel. + + + + + Sets the channel type when registering remoting. + + + + + + Sets the used when + exporting to remoting context. Defaults to + . + + + + + A implementation that creates + connection to remote scheduler using remoting. + + + + + Client Proxy to a IRemotableQuartzScheduler + + + + + Returns a client proxy to a remote . + + + + + Returns a client proxy to a remote . + + + + + Gets or sets the remote scheduler address. + + The remote scheduler address. + + + + The default InstanceIdGenerator used by Quartz when instance id is to be + automatically generated. Instance id is of the form HOSTNAME + CURRENT_TIME. + + Marko Lahma (.NET) + + + + + + Generate the instance id for a + + The clusterwide unique instance id. + + + + This is class is a simple implementation of a thread pool, based on the + interface. + + + objects are sent to the pool with the + method, which blocks until a becomes available. + + The pool has a fixed number of s, and does not grow or + shrink based on demand. + + James House + Juergen Donnerstag + Marko Lahma (.NET) + + + + The interface to be implemented by classes that want to provide a thread + pool for the 's use. + + + implementation instances should ideally be made + for the sole use of Quartz. Most importantly, when the method + returns a value of 1 or greater, + there must still be at least one available thread in the pool when the + method is called a few moments (or + many moments) later. If this assumption does not hold true, it may + result in extra JobStore queries and updates, and if clustering features + are being used, it may result in greater imballance of load. + + + James House + Marko Lahma (.NET) + + + + Execute the given in the next + available . + + + The implementation of this interface should not throw exceptions unless + there is a serious problem (i.e. a serious misconfiguration). If there + are no available threads, rather it should either queue the Runnable, or + block until a thread is available, depending on the desired strategy. + + + + + Determines the number of threads that are currently available in in + the pool. Useful for determining the number of times + can be called before returning + false. + + + The implementation of this method should block until there is at + least one available thread. + + the number of currently available threads + + + + Must be called before the is + used, in order to give the it a chance to Initialize. + + + Typically called by the . + + + + + Called by the QuartzScheduler to inform the + that it should free up all of it's resources because the scheduler is + shutting down. + + + + + Get the current number of threads in the . + + + + + Inform the of the Scheduler instance's Id, + prior to initialize being invoked. + + + + + Inform the of the Scheduler instance's name, + prior to initialize being invoked. + + + + + Create a new (unconfigured) . + + + + + Create a new with the specified number + of s that have the given priority. + + + the number of worker s in the pool, must + be > 0. + + + the thread priority for the worker threads. + + + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + Terminate any worker threads in this thread group. + Jobs currently in progress will complete. + + + + + Run the given object in the next available + . If while waiting the thread pool is asked to + shut down, the Runnable is executed immediately within a new additional + thread. + + The to be added. + + + + Creates the worker threads. + + The thread count. + + + + + Terminate any worker threads in this thread group. + Jobs currently in progress will complete. + + + + + Gets or sets the number of worker threads in the pool. + Set has no effect after has been called. + + + + + Get or set the thread priority of worker threads in the pool. + Set operation has no effect after has been called. + + + + + Gets or sets the thread name prefix. + + The thread name prefix. + + + + Gets or sets the value of makeThreadsDaemons. + + + + + Gets the size of the pool. + + The size of the pool. + + + + Inform the of the Scheduler instance's Id, + prior to initialize being invoked. + + + + + Inform the of the Scheduler instance's name, + prior to initialize being invoked. + + + + + A Worker loops, waiting to Execute tasks. + + + + + Create a worker thread and start it. Waiting for the next Runnable, + executing it, and waiting for the next Runnable, until the Shutdown + flag is set. + + + + + Create a worker thread, start it, Execute the runnable and terminate + the thread (one time execution). + + + + + Signal the thread that it should terminate. + + + + + Loop, executing targets as they are received. + + + + + A that simply calls . + + + James House + Marko Lahma (.NET) + + + + Called to give the ClassLoadHelper a chance to Initialize itself, + including the oportunity to "steal" the class loader off of the calling + thread, which is the thread that is initializing Quartz. + + + + Return the class with the given name. + + + + Finds a resource with a given name. This method returns null if no + resource with this name is found. + + name of the desired resource + + a Uri object + + + + Finds a resource with a given name. This method returns null if no + resource with this name is found. + + name of the desired resource + + a Stream object + + + + + InstanceIdGenerator that will use a to configure the scheduler. + If no value set for the property, a is thrown. + Alex Snaps + + + + + System property to read the instanceId from. + + + + + Returns the cluster wide value for this scheduler instance's id, based on a system property. + + + + + This is class is a simple implementation of a zero size thread pool, based on the + interface. + + + The pool has zero s and does not grow or shrink based on demand. + Which means it is obviously not useful for most scenarios. When it may be useful + is to prevent creating any worker threads at all - which may be desirable for + the sole purpose of preserving system resources in the case where the scheduler + instance only exists in order to schedule jobs, but which will never execute + jobs (e.g. will never have Start() called on it). + + Wayne Fay + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + + + + Called by the QuartzScheduler before the is + used, in order to give the it a chance to Initialize. + + + + + Shutdowns this instance. + + + + + Called by the QuartzScheduler to inform the + that it should free up all of it's resources because the scheduler is + shutting down. + + + + + + Execute the given in the next + available . + + + + + The implementation of this interface should not throw exceptions unless + there is a serious problem (i.e. a serious misconfiguration). If there + are no available threads, rather it should either queue the Runnable, or + block until a thread is available, depending on the desired strategy. + + + + + Determines the number of threads that are currently available in in + the pool. Useful for determining the number of times + can be called before returning + false. + + + the number of currently available threads + + + The implementation of this method should block until there is at + least one available thread. + + + + + Gets the log. + + The log. + + + + Gets the size of the pool. + + The size of the pool. + + + + Inform the of the Scheduler instance's Id, + prior to initialize being invoked. + + + + + Inform the of the Scheduler instance's name, + prior to initialize being invoked. + + + + + A simple class (structure) used for returning execution-time data from the + JobStore to the . + + + James House + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + The job. + The trigger. + The calendar. + if set to true [job is recovering]. + The fire time. + The scheduled fire time. + The previous fire time. + The next fire time. + + + + Gets the job detail. + + The job detail. + + + + Gets the trigger. + + The trigger. + + + + Gets the calendar. + + The calendar. + + + + Gets a value indicating whether this is recovering. + + true if recovering; otherwise, false. + + + + Returns the UTC fire time. + + + + + Gets the next UTC fire time. + + The next fire time. + Returns the nextFireTimeUtc. + + + + Gets the previous UTC fire time. + + The previous fire time. + Returns the previous fire time. + + + + Returns the scheduled UTC fire time. + + + + + Result holder for trigger firing event. + + + + + Constructor. + + + + + + Constructor. + + + + + Bundle. + + + + + Possible exception. + + + + + Extension methods for . + + + + + Tries to read value and returns the value if successfully read. Otherwise return default value + for value's type. + + + + + + + + + + Extension methods for simplified access. + + + + + Returns string from given column name, or null if DbNull. + + + + + Returns int from given column name. + + + + + Returns long from given column name. + + + + + Returns long from given column name, or null if DbNull. + + + + + Returns decimal from given column name. + + + + + Manages a collection of IDbProviders, and provides transparent access + to their database. + + + James House + Sharada Jambula + Mohammad Rezaei + Marko Lahma (.NET) + + + + Private constructor + + + + + Adds the connection provider. + + Name of the data source. + The provider. + + + + Get a database connection from the DataSource with the given name. + + a database connection + + + + Shuts down database connections from the DataSource with the given name, + if applicable for the underlying provider. + + a database connection + + + + Gets the db provider. + + Name of the ds. + + + + + Get the class instance. + + an instance of this class + + + + + An implementation of that wraps another + and flags itself 'dirty' when it is modified. + + James House + Marko Lahma (.NET) + + + + Create a DirtyFlagMap that 'wraps' a . + + + + + Create a DirtyFlagMap that 'wraps' a that has the + given initial capacity. + + + + + Serialization constructor. + + + + + + + Creates a new object that is a copy of the current instance. + + + A new object that is a copy of this instance. + + + + + When implemented by a class, removes all elements from the . + + + The is read-only. + + + + + When implemented by a class, determines whether the contains an element with the specified key. + + The key to locate in the . + + if the contains an element with the key; otherwise, . + + + is . + + + + When implemented by a class, removes the element with the + specified key from the . + + The key of the element to remove. + + is . + + The is read-only. + -or- + The has a fixed size. + + + + + When implemented by a class, returns an + for the . + + + An for the . + + + + + When implemented by a class, adds an element with the provided key and value to the . + + The to use as the key of the element to add. + The to use as the value of the element to add. + is . + + An element with the same key already exists in the . + + + The is read-only. + -or- + The has a fixed size. + + + + + When implemented by a class, copies the elements of + the to an , starting at a particular index. + + The one-dimensional that is the destination of the elements copied from . The must have zero-based indexing. + The zero-based index in at which copying begins. + + is . + + is less than zero. + + + is multidimensional. + -or- + + is equal to or greater than the length of . + -or- + The number of elements in the source is greater than the available space from to the end of the destination . + + The type of the source cannot be cast automatically to the type of the destination . + + + + Clear the 'dirty' flag (set dirty flag to ). + + + + + Determines whether the specified obj contains value. + + The obj. + + true if the specified obj contains value; otherwise, false. + + + + + Gets the entries as a set. + + + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + if the specified is equal to the + current ; otherwise, . + + + + + Serves as a hash function for a particular type, suitable + for use in hashing algorithms and data structures like a hash table. + + + A hash code for the current . + + + + + Gets keyset for this map. + + + + + + Puts the value behind a specified key. + + The key. + The val. + + + + + Puts all. + + The t. + + + + Determine whether the is flagged dirty. + + + + + Get a direct handle to the underlying Map. + + + + + Gets a value indicating whether this instance is empty. + + true if this instance is empty; otherwise, false. + + + + Gets or sets the with the specified key. + + + + + + When implemented by a class, gets the number of + elements contained in the . + + + + + + When implemented by a class, gets an containing the values in the . + + + + + + When implemented by a class, gets an containing the keys of the . + + + + + + When implemented by a class, gets a value indicating whether the + is read-only. + + + + + + When implemented by a class, gets a value indicating whether the + has a fixed size. + + + + + + When implemented by a class, gets an object that + can be used to synchronize access to the . + + + + + + When implemented by a class, gets a value + indicating whether access to the is synchronized + (thread-safe). + + + + + + Utility class for file handling related things. + + Marko Lahma + + + + Resolves file to actual file if for example relative '~' used. + + File name to check + Expanded file name or actual no resolving was done. + + + + Object representing a job or trigger key. + + Jeffrey Wescott + Marko Lahma (.NET) + + + + The default group for scheduling entities, with the value "DEFAULT". + + + + + Construct a new key with the given name and group. + + the name + the group + + + + Return the string representation of the key. The format will be: + <group>.<name>. + + + + the string representation of the key + + + + + Get the name portion of the key. + + the name + + + + + Get the group portion of the key. + + + + the group + + + + + Wrapper class to access thread local data. + Data is either accessed from thread or HTTP Context's + data if HTTP Context is avaiable. + + Marko Lahma .NET + + + + Retrieves an object with the specified name. + + The name of the item. + The object in the call context associated with the specified name or null if no object has been stored previously + + + + Stores a given object and associates it with the specified name. + + The name with which to associate the new item. + The object to store in the call context. + + + + Empties a data slot with the specified name. + + The name of the data slot to empty. + + + + Generic extension methods for objects. + + + + + Creates a deep copy of object by serializing to memory stream. + + + + + + Utility methods that are used to convert objects from one type into another. + + Aleksandar Seovic + Marko Lahma + + + + Convert the value to the required (if necessary from a string). + + The proposed change value. + + The we must convert to. + + The new value, possibly the result of type conversion. + + + + Determines whether value is assignable to required type. + + The value to check. + Type of the required. + + true if value can be assigned as given type; otherwise, false. + + + + + Instantiates an instance of the type specified. + + + + + + Sets the object properties using reflection. + + + + + Sets the object properties using reflection. + + The object to set values to. + The properties to set to object. + + + + This is an utility class used to parse the properties. + + James House + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + The props. + + + + Gets the string property. + + The name. + + + + + Gets the string property. + + The name. + The default value. + + + + + Gets the string array property. + + The name. + + + + + Gets the string array property. + + The name. + The default value. + + + + + Gets the boolean property. + + The name. + + + + + Gets the boolean property. + + The name. + if set to true [defaultValue]. + + + + + Gets the byte property. + + The name. + + + + + Gets the byte property. + + The name. + The default value. + + + + + Gets the char property. + + The name. + + + + + Gets the char property. + + The name. + The default value. + + + + + Gets the double property. + + The name. + + + + + Gets the double property. + + The name. + The default value. + + + + + Gets the float property. + + The name. + + + + + Gets the float property. + + The name. + The default value. + + + + + Gets the int property. + + The name. + + + + + Gets the int property. + + The name. + The default value. + + + + + Gets the int array property. + + The name. + + + + + Gets the int array property. + + The name. + The default value. + + + + + Gets the long property. + + The name. + + + + + Gets the long property. + + The name. + The def. + + + + + Gets the TimeSpan property. + + The name. + The def. + + + + + Gets the short property. + + The name. + + + + + Gets the short property. + + The name. + The default value. + + + + + Gets the property groups. + + The prefix. + + + + + Gets the property group. + + The prefix. + + + + + Gets the property group. + + The prefix. + if set to true [strip prefix]. + + + + + Get all properties that start with the given prefix. + + The prefix for which to search. If it does not end in a "." then one will be added to it for search purposes. + Whether to strip off the given in the result's keys. + Optional array of fully qualified prefixes to exclude. For example if is "a.b.c", then might be "a.b.c.ignore". + Group of that start with the given prefix, optionally have that prefix removed, and do not include properties that start with one of the given excluded prefixes. + + + + Reads the properties from assembly (embedded resource). + + The file name to read resources from. + + + + + Reads the properties from file system. + + The file name to read resources from. + + + + + Gets the underlying properties. + + The underlying properties. + + + + Extension methods for . + + + + + Allows null-safe trimming of string. + + + + + + + Trims string and if resulting string is empty, null is returned. + + + + + + + An implementation of that wraps another + and flags itself 'dirty' when it is modified, enforces that all keys are + strings. + + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The initial capacity. + + + + Serialization constructor. + + + + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + if the specified is equal to the + current ; otherwise, . + + + + + Serves as a hash function for a particular type, suitable + for use in hashing algorithms and data structures like a hash table. + + + A hash code for the current . + + + + + Gets the keys. + + + + + + Adds the name-value pairs in the given to the . + + All keys must be s, and all values must be serializable. + + + + + + Adds the given value to the 's + data map. + + + + + Adds the given value to the 's + data map. + + + + + Adds the given value to the 's + data map. + + + + + Adds the given value to the 's + data map. + + + + + Adds the given value to the 's + data map. + + + + + Adds the given value to the 's + data map. + + + + + Adds the given value to the 's + data map. + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Reports JobSchedulingDataProcessor validation exceptions. + + Chris Bonham + Marko Lahma (.NET) + + + + Constructor for ValidationException. + + + + + Constructor for ValidationException. + + exception message. + + + + Constructor for ValidationException. + + collection of validation exceptions. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + Gets the validation exceptions. + + The validation exceptions. + + + + Returns the detail message string. + + + + + Parses an XML file that declares Jobs and their schedules (Triggers). + + + + The xml document must conform to the format defined in "job_scheduling_data_2_0.xsd" + + + + After creating an instance of this class, you should call one of the + functions, after which you may call the ScheduledJobs() + function to get a handle to the defined Jobs and Triggers, which can then be + scheduled with the . Alternatively, you could call + the function to do all of this + in one step. + + + + The same instance can be used again and again, with the list of defined Jobs + being cleared each time you call a method, + however a single instance is not thread-safe. + + + Chris Bonham + James House + Marko Lahma (.NET) + + + + Constructor for XMLSchedulingDataProcessor. + + + + + Process the xml file in the default location (a file named + "quartz_jobs.xml" in the current working directory). + + + + + Process the xml file named . + + meta data file name. + + + + Process the xmlfile named with the given system + ID. + + Name of the file. + The system id. + + + + Process the xmlfile named with the given system + ID. + + The stream. + The system id. + + + + Process the xml file in the default location, and schedule all of the jobs defined within it. + + Note that we will set overWriteExistingJobs after the default xml is parsed. + + + + + + Process the xml file in the default location, and schedule all of the + jobs defined within it. + + + + + Process the xml file in the given location, and schedule all of the + jobs defined within it. + + meta data file name. + The scheduler. + + + + Process the xml file in the given location, and schedule all of the + jobs defined within it. + + Name of the file. + The system id. + The sched. + + + + Schedules the given sets of jobs and triggers. + + The sched. + + + + Adds a detected validation exception. + + The exception. + + + + Resets the the number of detected validation exceptions. + + + + + Throws a ValidationException if the number of validationExceptions + detected is greater than zero. + + + DTD validation exception. + + + + + Whether the existing scheduling data (with same identifiers) will be + overwritten. + + + If false, and is not false, and jobs or + triggers with the same names already exist as those in the file, an + error will occur. + + + + + + If true (and is false) then any + job/triggers encountered in this file that have names that already exist + in the scheduler will be ignored, and no error will be produced. + + + + + + Gets the log. + + The log. + + + + Helper class to map constant names to their values. + + + + + CalendarIntervalScheduleBuilder is a + that defines calendar time (day, week, month, year) interval-based + schedules for Triggers. + + + + Quartz provides a builder-style API for constructing scheduling-related + entities via a Domain-Specific Language (DSL). The DSL can best be + utilized through the usage of static imports of the methods on the classes + , , + , , + and the various implementations. + + Client code can then use the DSL to write code such as this: + + JobDetail job = JobBuilder.Create<MyJob>() + .WithIdentity("myJob") + .Build(); + Trigger trigger = TriggerBuilder.Create() + .WithIdentity("myTrigger", "myTriggerGroup") + .WithSimpleSchedule(x => x + .WithIntervalInHours(1) + .RepeatForever()) + .StartAt(DateBuilder.FutureDate(10, IntervalUnit.Minute)) + .Build(); + scheduler.scheduleJob(job, trigger); + + + + + + + + + + + Base class for implementors. + + + + + + Schedule builders offer fluent interface and are responsible for creating schedules. + + + + + + + + + Build the actual Trigger -- NOT intended to be invoked by end users, + but will rather be invoked by a TriggerBuilder which this + ScheduleBuilder is given to. + + + + + + Build the actual Trigger -- NOT intended to be invoked by end users, + but will rather be invoked by a TriggerBuilder which this + ScheduleBuilder is given to. + + + + + + Create a CalendarIntervalScheduleBuilder. + + + + + + Build the actual Trigger -- NOT intended to be invoked by end users, + but will rather be invoked by a TriggerBuilder which this + ScheduleBuilder is given to. + + + + + + Specify the time unit and interval for the Trigger to be produced. + + + + the interval at which the trigger should repeat. + the time unit (IntervalUnit) of the interval. + the updated CalendarIntervalScheduleBuilder + + + + + + Specify an interval in the IntervalUnit.SECOND that the produced + Trigger will repeat at. + + + + the number of seconds at which the trigger should repeat. + the updated CalendarIntervalScheduleBuilder + + + + + + Specify an interval in the IntervalUnit.MINUTE that the produced + Trigger will repeat at. + + + + the number of minutes at which the trigger should repeat. + the updated CalendarIntervalScheduleBuilder + + + + + + Specify an interval in the IntervalUnit.HOUR that the produced + Trigger will repeat at. + + + + the number of hours at which the trigger should repeat. + the updated CalendarIntervalScheduleBuilder + + + + + + Specify an interval in the IntervalUnit.DAY that the produced + Trigger will repeat at. + + + + the number of days at which the trigger should repeat. + the updated CalendarIntervalScheduleBuilder + + + + + + Specify an interval in the IntervalUnit.WEEK that the produced + Trigger will repeat at. + + + + the number of weeks at which the trigger should repeat. + the updated CalendarIntervalScheduleBuilder + + + + + + Specify an interval in the IntervalUnit.MONTH that the produced + Trigger will repeat at. + + + + the number of months at which the trigger should repeat. + the updated CalendarIntervalScheduleBuilder + + + + + + Specify an interval in the IntervalUnit.YEAR that the produced + Trigger will repeat at. + + + + the number of years at which the trigger should repeat. + the updated CalendarIntervalScheduleBuilder + + + + + + If the Trigger misfires, use the + instruction. + + + + the updated CronScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + + + the updated CalendarIntervalScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + + + the updated CalendarIntervalScheduleBuilder + + + + + Extension methods that attach to . + + + + + Provides a parser and evaluator for unix-like cron expressions. Cron + expressions provide the ability to specify complex time combinations such as + "At 8:00am every Monday through Friday" or "At 1:30am every + last Friday of the month". + + + + Cron expressions are comprised of 6 required fields and one optional field + separated by white space. The fields respectively are described as follows: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Name Allowed Values Allowed Special Characters
Seconds 0-59 , - /// /
Minutes 0-59 , - /// /
Hours 0-23 , - /// /
Day-of-month 1-31 , - /// ? / L W C
Month 1-12 or JAN-DEC , - /// /
Day-of-Week 1-7 or SUN-SAT , - /// ? / L #
Year (Optional) empty, 1970-2199 , - /// /
+ + The '*' character is used to specify all values. For example, "*" + in the minute field means "every minute". + + + The '?' character is allowed for the day-of-month and day-of-week fields. It + is used to specify 'no specific value'. This is useful when you need to + specify something in one of the two fields, but not the other. + + + The '-' character is used to specify ranges For example "10-12" in + the hour field means "the hours 10, 11 and 12". + + + The ',' character is used to specify additional values. For example + "MON,WED,FRI" in the day-of-week field means "the days Monday, + Wednesday, and Friday". + + + The '/' character is used to specify increments. For example "0/15" + in the seconds field means "the seconds 0, 15, 30, and 45". And + "5/15" in the seconds field means "the seconds 5, 20, 35, and + 50". Specifying '*' before the '/' is equivalent to specifying 0 is + the value to start with. Essentially, for each field in the expression, there + is a set of numbers that can be turned on or off. For seconds and minutes, + the numbers range from 0 to 59. For hours 0 to 23, for days of the month 0 to + 31, and for months 1 to 12. The "/" character simply helps you turn + on every "nth" value in the given set. Thus "7/6" in the + month field only turns on month "7", it does NOT mean every 6th + month, please note that subtlety. + + + The 'L' character is allowed for the day-of-month and day-of-week fields. + This character is short-hand for "last", but it has different + meaning in each of the two fields. For example, the value "L" in + the day-of-month field means "the last day of the month" - day 31 + for January, day 28 for February on non-leap years. If used in the + day-of-week field by itself, it simply means "7" or + "SAT". But if used in the day-of-week field after another value, it + means "the last xxx day of the month" - for example "6L" + means "the last friday of the month". You can also specify an offset + from the last day of the month, such as "L-3" which would mean the third-to-last + day of the calendar month. When using the 'L' option, it is important not to + specify lists, or ranges of values, as you'll get confusing/unexpected results. + + + The 'W' character is allowed for the day-of-month field. This character + is used to specify the weekday (Monday-Friday) nearest the given day. As an + example, if you were to specify "15W" as the value for the + day-of-month field, the meaning is: "the nearest weekday to the 15th of + the month". So if the 15th is a Saturday, the trigger will fire on + Friday the 14th. If the 15th is a Sunday, the trigger will fire on Monday the + 16th. If the 15th is a Tuesday, then it will fire on Tuesday the 15th. + However if you specify "1W" as the value for day-of-month, and the + 1st is a Saturday, the trigger will fire on Monday the 3rd, as it will not + 'jump' over the boundary of a month's days. The 'W' character can only be + specified when the day-of-month is a single day, not a range or list of days. + + + The 'L' and 'W' characters can also be combined for the day-of-month + expression to yield 'LW', which translates to "last weekday of the + month". + + + The '#' character is allowed for the day-of-week field. This character is + used to specify "the nth" XXX day of the month. For example, the + value of "6#3" in the day-of-week field means the third Friday of + the month (day 6 = Friday and "#3" = the 3rd one in the month). + Other examples: "2#1" = the first Monday of the month and + "4#5" = the fifth Wednesday of the month. Note that if you specify + "#5" and there is not 5 of the given day-of-week in the month, then + no firing will occur that month. If the '#' character is used, there can + only be one expression in the day-of-week field ("3#1,6#3" is + not valid, since there are two expressions). + + + + + + The legal characters and the names of months and days of the week are not + case sensitive. + + + NOTES: +
    +
  • Support for specifying both a day-of-week and a day-of-month value is + not complete (you'll need to use the '?' character in one of these fields). +
  • +
  • Overflowing ranges is supported - that is, having a larger number on + the left hand side than the right. You might do 22-2 to catch 10 o'clock + at night until 2 o'clock in the morning, or you might have NOV-FEB. It is + very important to note that overuse of overflowing ranges creates ranges + that don't make sense and no effort has been made to determine which + interpretation CronExpression chooses. An example would be + "0 0 14-6 ? * FRI-MON".
  • +
+
+
+ Sharada Jambula + James House + Contributions from Mads Henderson + Refactoring from CronTrigger to CronExpression by Aaron Craven + Marko Lahma (.NET) +
+ + + Field specification for second. + + + + + Field specification for minute. + + + + + Field specification for hour. + + + + + Field specification for day of month. + + + + + Field specification for month. + + + + + Field specification for day of week. + + + + + Field specification for year. + + + + + Field specification for all wildcard value '*'. + + + + + Field specification for not specified value '?'. + + + + + Field specification for wildcard '*'. + + + + + Field specification for no specification at all '?'. + + + + + Seconds. + + + + + minutes. + + + + + Hours. + + + + + Days of month. + + + + + Months. + + + + + Days of week. + + + + + Years. + + + + + Last day of week. + + + + + Nth day of week. + + + + + Last day of month. + + + + + Nearest weekday. + + + + + Calendar day of week. + + + + + Calendar day of month. + + + + + Expression parsed. + + + + + Constructs a new based on the specified + parameter. + + + String representation of the cron expression the new object should represent + + + + + + Indicates whether the given date satisfies the cron expression. + + + Note that milliseconds are ignored, so two Dates falling on different milliseconds + of the same second will always have the same result here. + + The date to evaluate. + a boolean indicating whether the given date satisfies the cron expression + + + + Returns the next date/time after the given date/time which + satisfies the cron expression. + + the date/time at which to begin the search for the next valid date/time + the next valid date/time + + + + Returns the next date/time after the given date/time which does + not satisfy the expression. + + the date/time at which to begin the search for the next invalid date/time + the next valid date/time + + + + Returns the string representation of the + + The string representation of the + + + + Indicates whether the specified cron expression can be parsed into a + valid cron expression + + the expression to evaluate + a boolean indicating whether the given expression is a valid cron + expression + + + + Builds the expression. + + The expression. + + + + Stores the expression values. + + The position. + The string to traverse. + The type of value. + + + + + Checks the next value. + + The position. + The string to check. + The value. + The type to search. + + + + + Gets the expression summary. + + + + + + Gets the expression set summary. + + The data. + + + + + Skips the white space. + + The i. + The s. + + + + + Finds the next white space. + + The i. + The s. + + + + + Adds to set. + + The val. + The end. + The incr. + The type. + + + + Gets the set of given type. + + The type of set to get. + + + + + Gets the value. + + The v. + The s. + The i. + + + + + Gets the numeric value from string. + + The string to parse from. + The i. + + + + + Gets the month number. + + The string to map with. + + + + + Gets the day of week number. + + The s. + + + + + Gets the time from given time parts. + + The seconds. + The minutes. + The hours. + The day of month. + The month. + + + + + Gets the next fire time after the given time. + + The UTC time to start searching from. + + + + + Creates the date time without milliseconds. + + The time. + + + + + Advance the calendar to the particular hour paying particular attention + to daylight saving problems. + + The date. + The hour. + + + + + Gets the time before. + + The end time. + + + + + NOT YET IMPLEMENTED: Returns the final time that the + will match. + + + + + + Determines whether given year is a leap year. + + The year. + + true if the specified year is a leap year; otherwise, false. + + + + + Gets the last day of month. + + The month num. + The year. + + + + + Creates a new object that is a copy of the current instance. + + + A new object that is a copy of this instance. + + + + + Determines whether the specified is equal to the current . + + + true if the specified is equal to the current ; otherwise, false. + + The to compare with the current . + + + + Determines whether the specified is equal to the current . + + + true if the specified is equal to the current ; otherwise, false. + + The to compare with the current . + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + 2 + + + + Sets or gets the time zone for which the of this + will be resolved. + + + + + Gets the cron expression string. + + The cron expression string. + + + + Helper class for cron expression handling. + + + + + The value. + + + + + The position. + + + + + CronScheduleBuilder is a that defines + -based schedules for s. + + + + Quartz provides a builder-style API for constructing scheduling-related + entities via a Domain-Specific Language (DSL). The DSL can best be + utilized through the usage of static imports of the methods on the classes + , , + , , + and the various implementations. + + + Client code can then use the DSL to write code such as this: + + + IJobDetail job = JobBuilder.Create<MyJob>() + .WithIdentity("myJob") + .Build(); + ITrigger trigger = newTrigger() + .WithIdentity(triggerKey("myTrigger", "myTriggerGroup")) + .WithSimpleSchedule(x => x.WithIntervalInHours(1).RepeatForever()) + .StartAt(DateBuilder.FutureDate(10, IntervalUnit.Minute)) + .Build(); + scheduler.scheduleJob(job, trigger); + + + + + + + + + + + + Build the actual Trigger -- NOT intended to be invoked by end users, + but will rather be invoked by a TriggerBuilder which this + ScheduleBuilder is given to. + + + + + + Create a CronScheduleBuilder with the given cron-expression - which + is presumed to b e valid cron expression (and hence only a RuntimeException + will be thrown if it is not). + + + + the cron expression to base the schedule on. + the new CronScheduleBuilder + + + + + Create a CronScheduleBuilder with the given cron-expression string - which + may not be a valid cron expression (and hence a ParseException will be thrown + f it is not). + + the cron expression string to base the schedule on + the new CronScheduleBuilder + + + + + Create a CronScheduleBuilder with the given cron-expression. + + the cron expression to base the schedule on. + the new CronScheduleBuilder + + + + + Create a CronScheduleBuilder with a cron-expression that sets the + schedule to fire every day at the given time (hour and minute). + + + + the hour of day to fire + the minute of the given hour to fire + the new CronScheduleBuilder + + + + + Create a CronScheduleBuilder with a cron-expression that sets the + schedule to fire at the given day at the given time (hour and minute) on the given days of the week. + + the hour of day to fire + the minute of the given hour to fire + the days of the week to fire + the new CronScheduleBuilder + + + + + Create a CronScheduleBuilder with a cron-expression that sets the + schedule to fire one per week on the given day at the given time + (hour and minute). + + + + the day of the week to fire + the hour of day to fire + the minute of the given hour to fire + the new CronScheduleBuilder + + + + + Create a CronScheduleBuilder with a cron-expression that sets the + schedule to fire one per month on the given day of month at the given + time (hour and minute). + + + + the day of the month to fire + the hour of day to fire + the minute of the given hour to fire + the new CronScheduleBuilder + + + + + The in which to base the schedule. + + + + the time-zone for the schedule. + the updated CronScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + + + the updated CronScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + + + the updated CronScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + + + the updated CronScheduleBuilder + + + + + Extension methods that attach to . + + + + + A implementation that build schedule for DailyTimeIntervalTrigger. + + + + This builder provide an extra convenient method for you to set the trigger's EndTimeOfDay. You may + use either endingDailyAt() or EndingDailyAfterCount() to set the value. The later will auto calculate + your EndTimeOfDay by using the interval, IntervalUnit and StartTimeOfDay to perform the calculation. + + + When using EndingDailyAfterCount(), you should note that it is used to calculating EndTimeOfDay. So + if your startTime on the first day is already pass by a time that would not add up to the count you + expected, until the next day comes. Remember that DailyTimeIntervalTrigger will use StartTimeOfDay + and endTimeOfDay as fresh per each day! + + + Quartz provides a builder-style API for constructing scheduling-related + entities via a Domain-Specific Language (DSL). The DSL can best be + utilized through the usage of static imports of the methods on the classes + , , + , , + and the various implementations. + + Client code can then use the DSL to write code such as this: + + IJobDetail job = JobBuilder.Create<MyJob>() + .WithIdentity("myJob") + .Build(); + + ITrigger trigger = TriggerBuilder.Create() + .WithIdentity(triggerKey("myTrigger", "myTriggerGroup")) + .WithDailyTimeIntervalSchedule(x => + x.WithIntervalInMinutes(15) + .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(8, 0)) + .Build(); + + scheduler.scheduleJob(job, trigger); + + + James House + Zemian Deng saltnlight5@gmail.com + Nuno Maia (.NET) + + + + A set of all days of the week. + + + The set contains all values between and + + + + + A set of the business days of the week (for locales similar to the USA). + + + The set contains all values between and + + + + + A set of the weekend days of the week (for locales similar to the USA). + + + The set contains and + + + + + Create a DailyTimeIntervalScheduleBuilder + + The new DailyTimeIntervalScheduleBuilder + + + + Build the actual Trigger -- NOT intended to be invoked by end users, + but will rather be invoked by a TriggerBuilder which this + ScheduleBuilder is given to. + + + + + + Specify the time unit and interval for the Trigger to be produced. + + + + the interval at which the trigger should repeat. + the time unit (IntervalUnit) of the interval. + the updated CalendarIntervalScheduleBuilder + + + + + + Specify an interval in the IntervalUnit.Second that the produced + Trigger will repeat at. + + The number of seconds at which the trigger should repeat. + the updated DailyTimeIntervalScheduleBuilder> + + + + + + Specify an interval in the IntervalUnit.Minute that the produced + Trigger will repeat at. + + The number of minutes at which the trigger should repeat. + the updated DailyTimeIntervalScheduleBuilder> + + + + + + Specify an interval in the IntervalUnit.Hour that the produced + Trigger will repeat at. + + The number of hours at which the trigger should repeat. + the updated DailyTimeIntervalScheduleBuilder> + + + + + + Set the trigger to fire on the given days of the week. + + a Set containing the integers representing the days of the week, defined by - . + + the updated DailyTimeIntervalScheduleBuilder + + + + Set the trigger to fire on the given days of the week. + + a variable length list of week days representing the days of the week + the updated DailyTimeIntervalScheduleBuilder + + + + Set the trigger to fire on the days from Monday through Friday. + + the updated DailyTimeIntervalScheduleBuilder + + + + Set the trigger to fire on the days Saturday and Sunday. + + the updated DailyTimeIntervalScheduleBuilder + + + + Set the trigger to fire on all days of the week. + + the updated DailyTimeIntervalScheduleBuilder + + + + Set the trigger to begin firing each day at the given time. + + + the updated DailyTimeIntervalScheduleBuilder + + + + Set the startTimeOfDay for this trigger to end firing each day at the given time. + + + the updated DailyTimeIntervalScheduleBuilder + + + + Calculate and set the EndTimeOfDay using count, interval and StarTimeOfDay. This means + that these must be set before this method is call. + + + the updated DailyTimeIntervalScheduleBuilder + + + + If the Trigger misfires, use the + instruction. + + the updated DailyTimeIntervalScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + the updated DailyTimeIntervalScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + the updated DailyTimeIntervalScheduleBuilder + + + + + Set number of times for interval to repeat. + + + Note: if you want total count = 1 (at start time) + repeatCount + + + + + + + Extension methods that attach to . + + + + + DateBuilder is used to conveniently create + instances that meet particular criteria. + + + + Quartz provides a builder-style API for constructing scheduling-related + entities via a Domain-Specific Language (DSL). The DSL can best be + utilized through the usage of static imports of the methods on the classes + , , + , , + and the various implementations. + + Client code can then use the DSL to write code such as this: + + IJobDetail job = JobBuilder.Create<MyJob>() + .WithIdentity("myJob") + .Build(); + ITrigger trigger = newTrigger() + .WithIdentity(triggerKey("myTrigger", "myTriggerGroup")) + .WithSimpleSchedule(x => x + .WithIntervalInHours(1) + .RepeatForever()) + .StartAt(DateBuilder.FutureDate(10, IntervalUnit.Minutes)) + .Build(); + scheduler.scheduleJob(job, trigger); + + + + + + + + Create a DateBuilder, with initial settings for the current date + and time in the system default timezone. + + + + + Create a DateBuilder, with initial settings for the current date and time in the given timezone. + + + + + + Create a DateBuilder, with initial settings for the current date and time in the system default timezone. + + + + + + Create a DateBuilder, with initial settings for the current date and time in the given timezone. + + Time zone to use. + + + + + Build the defined by this builder instance. + + New date time based on builder parameters. + + + + Set the hour (0-23) for the Date that will be built by this builder. + + + + + + + Set the minute (0-59) for the Date that will be built by this builder. + + + + + + + Set the second (0-59) for the Date that will be built by this builder, and truncate the milliseconds to 000. + + + + + + + Set the day of month (1-31) for the Date that will be built by this builder. + + + + + + + Set the month (1-12) for the Date that will be built by this builder. + + + + + + + Set the year for the Date that will be built by this builder. + + + + + + + Set the TimeZoneInfo for the Date that will be built by this builder (if "null", system default will be used) + + + + + + + Get a object that represents the given time, on + tomorrow's date. + + + + + + + + + Get a object that represents the given time, on + today's date (equivalent to . + + + + + + + + + Get a object that represents the given time, on today's date. + + The value (0-59) to give the seconds field of the date + The value (0-59) to give the minutes field of the date + The value (0-23) to give the hours field of the date + the new date + + + + Get a object that represents the given time, on the + given date. + + The value (0-59) to give the seconds field of the date + The value (0-59) to give the minutes field of the date + The value (0-23) to give the hours field of the date + The value (1-31) to give the day of month field of the date + The value (1-12) to give the month field of the date + the new date + + + + Get a object that represents the given time, on the + given date. + + + + The value (0-59) to give the seconds field of the date + The value (0-59) to give the minutes field of the date + The value (0-23) to give the hours field of the date + The value (1-31) to give the day of month field of the date + The value (1-12) to give the month field of the date + The value (1970-2099) to give the year field of the date + the new date + + + + Returns a date that is rounded to the next even hour after the current time. + + + For example a current time of 08:13:54 would result in a date + with the time of 09:00:00. If the date's time is in the 23rd hour, the + date's 'day' will be promoted, and the time will be set to 00:00:00. + + the new rounded date + + + + Returns a date that is rounded to the next even hour above the given date. + + + For example an input date with a time of 08:13:54 would result in a date + with the time of 09:00:00. If the date's time is in the 23rd hour, the + date's 'day' will be promoted, and the time will be set to 00:00:00. + + the Date to round, if the current time will + be used + the new rounded date + + + + Returns a date that is rounded to the previous even hour below the given date. + + + For example an input date with a time of 08:13:54 would result in a date + with the time of 08:00:00. + + the Date to round, if the current time will + be used + the new rounded date + + + + + Returns a date that is rounded to the next even minute after the current time. + + + + For example a current time of 08:13:54 would result in a date + with the time of 08:14:00. If the date's time is in the 59th minute, + then the hour (and possibly the day) will be promoted. + + the new rounded date + + + + Returns a date that is rounded to the next even minute above the given date. + + + For example an input date with a time of 08:13:54 would result in a date + with the time of 08:14:00. If the date's time is in the 59th minute, + then the hour (and possibly the day) will be promoted. + + The Date to round, if the current time will be used + The new rounded date + + + + Returns a date that is rounded to the previous even minute below the given date. + + + For example an input date with a time of 08:13:54 would result in a date + with the time of 08:13:00. + + the Date to round, if the current time will + be used + the new rounded date + + + + Returns a date that is rounded to the next even second after the current time. + + the new rounded date + + + + Returns a date that is rounded to the next even second above the given date. + + + the Date to round, if the current time will + be used + the new rounded date + + + + Returns a date that is rounded to the previous even second below the + given date. + + + + For example an input date with a time of 08:13:54.341 would result in a + date with the time of 08:13:00.000. + + + + the Date to round, if the current time will + be used + the new rounded date + + + + Returns a date that is rounded to the next even multiple of the given + minute. + + + + For example an input date with a time of 08:13:54, and an input + minute-base of 5 would result in a date with the time of 08:15:00. The + same input date with an input minute-base of 10 would result in a date + with the time of 08:20:00. But a date with the time 08:53:31 and an + input minute-base of 45 would result in 09:00:00, because the even-hour + is the next 'base' for 45-minute intervals. + + + More examples: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Input TimeMinute-BaseResult Time
11:16:412011:20:00
11:36:412011:40:00
11:46:412012:00:00
11:26:413011:30:00
11:36:413012:00:00
11:16:411711:17:00
11:17:411711:34:00
11:52:411712:00:00
11:52:41511:55:00
11:57:41512:00:00
11:17:41012:00:00
11:17:41111:08:00
+
+
+ + the Date to round, if the current time will + be used + + the base-minute to set the time on + the new rounded date + +
+ + + + Returns a date that is rounded to the next even multiple of the given + minute. + + + + The rules for calculating the second are the same as those for + calculating the minute in the method . + + the Date to round, if the current time will + be used + the base-second to set the time on + the new rounded date + + + + + An attribute that marks a class as one that must not have multiple + instances executed concurrently (where instance is based-upon a + definition - or in other words based upon a . + + + This can be used in lieu of implementing the StatefulJob marker interface that + was used prior to Quartz 2.0 + + + James House + Marko Lahma (.NET) + + + + The interface to be implemented by s that provide a + mechanism for having their execution interrupted. It is NOT a requirement + for jobs to implement this interface - in fact, for most people, none of + their jobs will. + + + + The means of actually interrupting the Job must be implemented within the + itself (the method of this + interface is simply a means for the scheduler to inform the + that a request has been made for it to be interrupted). The mechanism that + your jobs use to interrupt themselves might vary between implementations. + However the principle idea in any implementation should be to have the + body of the job's periodically check some flag to + see if an interruption has been requested, and if the flag is set, somehow + abort the performance of the rest of the job's work. An example of + interrupting a job can be found in the java source for the class + . It is legal to use + some combination of and + synchronization within and + in order to have the method block until the + signals that it has noticed the set flag. + + + + If the Job performs some form of blocking I/O or similar functions, you may + want to consider having the method store a + reference to the calling as a member variable. Then the + implementation of this interfaces method can call + on that Thread. Before attempting this, make + sure that you fully understand what + does and doesn't do. Also make sure that you clear the Job's member + reference to the Thread when the Execute(..) method exits (preferably in a + block. + + + + + + James House + Marko Lahma (.NET) + + + + Called by the when a user + interrupts the . + + void (nothing) if job interrupt is successful. + + + + Supported interval units used by . + + + + + A marker interface for s that + wish to have their state maintained between executions. + + + instances follow slightly different rules from + regular instances. The key difference is that their + associated is re-persisted after every + execution of the job, thus preserving state for the next execution. The + other difference is that stateful jobs are not allowed to Execute + concurrently, which means new triggers that occur before the completion of + the method will be delayed. + + + + + + + + James House + Marko Lahma (.NET) + + + + JobBuilder is used to instantiate s. + + + + The builder will always try to keep itself in a valid state, with + reasonable defaults set for calling Build() at any point. For instance + if you do not invoke WithIdentity(..) a job name will be generated + for you. + + + Quartz provides a builder-style API for constructing scheduling-related + entities via a Domain-Specific Language (DSL). The DSL can best be + utilized through the usage of static imports of the methods on the classes + , , + , , + and the various implementations. + + + Client code can then use the DSL to write code such as this: + + + IJobDetail job = JobBuilder.Create<MyJob>() + .WithIdentity("myJob") + .Build(); + + ITrigger trigger = TriggerBuilder.Create() + .WithIdentity("myTrigger", "myTriggerGroup") + .WithSimpleSchedule(x => x.WithIntervalInHours(1).RepeatForever()) + .StartAt(DateBuilder.FutureDate(10, IntervalUnit.Minute)) + .Build(); + + scheduler.scheduleJob(job, trigger); + + + + + + + + + Create a JobBuilder with which to define a . + + a new JobBuilder + + + + Create a JobBuilder with which to define a , + and set the class name of the job to be executed. + + a new JobBuilder + + + + Create a JobBuilder with which to define a , + and set the class name of the job to be executed. + + a new JobBuilder + + + + Produce the instance defined by this JobBuilder. + + the defined JobDetail. + + + + Use a with the given name and default group to + identify the JobDetail. + + + If none of the 'withIdentity' methods are set on the JobBuilder, + then a random, unique JobKey will be generated. + + the name element for the Job's JobKey + the updated JobBuilder + + + + + + Use a with the given name and group to + identify the JobDetail. + + + If none of the 'withIdentity' methods are set on the JobBuilder, + then a random, unique JobKey will be generated. + + the name element for the Job's JobKey + the group element for the Job's JobKey + the updated JobBuilder + + + + + + Use a to identify the JobDetail. + + + If none of the 'withIdentity' methods are set on the JobBuilder, + then a random, unique JobKey will be generated. + + the Job's JobKey + the updated JobBuilder + + + + + + Set the given (human-meaningful) description of the Job. + + the description for the Job + the updated JobBuilder + + + + + Set the class which will be instantiated and executed when a + Trigger fires that is associated with this JobDetail. + + the updated JobBuilder + + + + + Set the class which will be instantiated and executed when a + Trigger fires that is associated with this JobDetail. + + the updated JobBuilder + + + + + Instructs the whether or not the job + should be re-executed if a 'recovery' or 'fail-over' situation is + encountered. + + + If not explicitly set, the default value is . + + the updated JobBuilder + + + + + Instructs the whether or not the job + should be re-executed if a 'recovery' or 'fail-over' situation is + encountered. + + + If not explicitly set, the default value is . + + + the updated JobBuilder + + + + Whether or not the job should remain stored after it is + orphaned (no s point to it). + + + If not explicitly set, the default value is . + + the updated JobBuilder + + + + + Whether or not the job should remain stored after it is + orphaned (no s point to it). + + + If not explicitly set, the default value is . + + the value to set for the durability property. + the updated JobBuilder + + + + + Add the given key-value pair to the JobDetail's . + + the updated JobBuilder + + + + + Add the given key-value pair to the JobDetail's . + + the updated JobBuilder + + + + + Add the given key-value pair to the JobDetail's . + + the updated JobBuilder + + + + + Add the given key-value pair to the JobDetail's . + + the updated JobBuilder + + + + + Add the given key-value pair to the JobDetail's . + + the updated JobBuilder + + + + + Add the given key-value pair to the JobDetail's . + + the updated JobBuilder + + + + + Set the JobDetail's , adding any values to it + that were already set on this JobBuilder using any of the + other 'usingJobData' methods. + + the updated JobBuilder + + + + + Holds state information for instances. + + + instances are stored once when the + is added to a scheduler. They are also re-persisted after every execution of + instances that have present. + + instances can also be stored with a + . This can be useful in the case where you have a Job + that is stored in the scheduler for regular/repeated use by multiple + Triggers, yet with each independent triggering, you want to supply the + Job with different data inputs. + + + The passed to a Job at execution time + also contains a convenience that is the result + of merging the contents of the trigger's JobDataMap (if any) over the + Job's JobDataMap (if any). + + + + + + + James House + Marko Lahma (.NET) + + + + Create an empty . + + + + + Create a with the given data. + + + + + Create a with the given data. + + + + + Serialization constructor. + + + + + + + Adds the given value as a string version to the + 's data map. + + + + + Adds the given value as a string version to the + 's data map. + + + + + Adds the given value as a string version to the + 's data map. + + + + + Adds the given value as a string version to the + 's data map. + + + + + Adds the given value as a string version to the + 's data map. + + + + + Adds the given value as a string version to the + 's data map. + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the + . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Retrieve the identified value from the . + + + + + Gets the date time. + + The key. + + + + + Gets the value behind the specified key. + + The key. + + + + + An exception that can be thrown by a + to indicate to the Quartz that an error + occurred while executing, and whether or not the requests + to be re-fired immediately (using the same , + or whether it wants to be unscheduled. + + + Note that if the flag for 'refire immediately' is set, the flags for + unscheduling the Job are ignored. + + + + + James House + Marko Lahma (.NET) + + + + Create a JobExcecutionException, with the 're-fire immediately' flag set + to . + + + + + Create a JobExcecutionException, with the given cause. + + The cause. + + + + Create a JobExcecutionException, with the given message. + + + + + Initializes a new instance of the class. + + The message. + The original cause. + + + + Create a JobExcecutionException with the 're-fire immediately' flag set + to the given value. + + + + + Create a JobExcecutionException with the given underlying exception, and + the 're-fire immediately' flag set to the given value. + + + + + Create a JobExcecutionException with the given message, and underlying + exception, and the 're-fire immediately' flag set to the given value. + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + Creates and returns a string representation of the current exception. + + + A string representation of the current exception. + + + + + + Gets or sets a value indicating whether to unschedule firing trigger. + + + true if firing trigger should be unscheduled; otherwise, false. + + + + + Gets or sets a value indicating whether to unschedule all triggers. + + + true if all triggers should be unscheduled; otherwise, false. + + + + + Gets or sets a value indicating whether to refire immediately. + + true if to refire immediately; otherwise, false. + + + + Uniquely identifies a . + + + Keys are composed of both a name and group, and the name must be unique + within the group. If only a group is specified then the default group + name will be used. + + Quartz provides a builder-style API for constructing scheduling-related + entities via a Domain-Specific Language (DSL). The DSL can best be + utilized through the usage of static imports of the methods on the classes + , , + , , + and the various implementations. + + Client code can then use the DSL to write code such as this: + + IJobDetail job = JobBuilder.Create<MyJob>() + .WithIdentity("myJob") + .Build(); + ITrigger trigger = TriggerBuilder.Create() + .WithIdentity("myTrigger", "myTriggerGroup") + .WithSimpleSchedule(x => x + .WithIntervalInHours(1) + .RepeatForever()) + .StartAt(DateBuilder.FutureDate(10, IntervalUnit.Minute)) + .Build(); + scheduler.scheduleJob(job, trigger); + + + + + + + + Misfire instructions. + + Marko Lahma (.NET) + + + + Instruction not set (yet). + + + + + Use smart policy. + + + + + Instructs the that the + will never be evaluated for a misfire situation, + and that the scheduler will simply try to fire it as soon as it can, + and then update the Trigger as if it had fired at the proper time. + + + NOTE: if a trigger uses this instruction, and it has missed + several of its scheduled firings, then several rapid firings may occur + as the trigger attempt to catch back up to where it would have been. + For example, a SimpleTrigger that fires every 15 seconds which has + misfired for 5 minutes will fire 20 times once it gets the chance to + fire. + + + + + Misfire policy settings for SimpleTrigger. + + + + + Instructs the that upon a mis-fire + situation, the wants to be fired + now by . + + NOTE: This instruction should typically only be used for + 'one-shot' (non-repeating) Triggers. If it is used on a trigger with a + repeat count > 0 then it is equivalent to the instruction + . + + + + + + Instructs the that upon a mis-fire + situation, the wants to be + re-scheduled to 'now' (even if the associated + excludes 'now') with the repeat count left as-is. This does obey the + end-time however, so if 'now' is after the + end-time the will not fire again. + + + + NOTE: Use of this instruction causes the trigger to 'forget' + the start-time and repeat-count that it was originally setup with (this + is only an issue if you for some reason wanted to be able to tell what + the original values were at some later time). + + + + + + Instructs the that upon a mis-fire + situation, the wants to be + re-scheduled to 'now' (even if the associated + excludes 'now') with the repeat count set to what it would be, if it had + not missed any firings. This does obey the end-time + however, so if 'now' is after the end-time the will + not fire again. + + + NOTE: Use of this instruction causes the trigger to 'forget' + the start-time and repeat-count that it was originally setup with. + Instead, the repeat count on the trigger will be changed to whatever + the remaining repeat count is (this is only an issue if you for some + reason wanted to be able to tell what the original values were at some + later time). + + + + NOTE: This instruction could cause the + to go to the 'COMPLETE' state after firing 'now', if all the + repeat-fire-times where missed. + + + + + + Instructs the that upon a mis-fire + situation, the wants to be + re-scheduled to the next scheduled time after 'now' - taking into + account any associated , and with the + repeat count set to what it would be, if it had not missed any firings. + + + NOTE/WARNING: This instruction could cause the + to go directly to the 'COMPLETE' state if all fire-times where missed. + + + + + Instructs the that upon a mis-fire + situation, the wants to be + re-scheduled to the next scheduled time after 'now' - taking into + account any associated , and with the + repeat count left unchanged. + + + + NOTE/WARNING: This instruction could cause the + to go directly to the 'COMPLETE' state if all the end-time of the trigger + has arrived. + + + + + + misfire instructions for CronTrigger + + + + + Instructs the that upon a mis-fire + situation, the wants to be fired now + by . + + + + + Instructs the that upon a mis-fire + situation, the wants to have it's + next-fire-time updated to the next time in the schedule after the + current time (taking into account any associated , + but it does not want to be fired now. + + + + + misfire instructions for NthIncludedDayTrigger + + + + + Instructs the that upon a mis-fire situation, the + wants to be fired now by the + + + + + + Instructs the that upon a mis-fire situation, the + wants to have + nextFireTime updated to the next time in the schedule after + the current time, but it does not want to be fired now. + + + + + Misfire instructions for DateIntervalTrigger + + + + + Instructs the that upon a mis-fire + situation, the wants to be + fired now by . + + + + + Instructs the that upon a mis-fire + situation, the wants to have it's + next-fire-time updated to the next time in the schedule after the + current time (taking into account any associated , + but it does not want to be fired now. + + + + + Misfire instructions for DailyTimeIntervalTrigger + + + + + Instructs the that upon a mis-fire + situation, the wants to be + fired now by . + + + + + Instructs the that upon a mis-fire + situation, the wants to have it's + next-fire-time updated to the next time in the schedule after the + current time (taking into account any associated , + but it does not want to be fired now. + + + + + A trigger which fires on the Nth day of every interval type + , or + that is not excluded by the associated + calendar. + + + When determining what the Nth day of the month or year + is, will skip excluded days on the + associated calendar. This would commonly be used in an Nth + business day situation, in which the user wishes to fire a particular job on + the Nth business day (i.e. the 5th business day of + every month). Each also has an associated + which indicates at what time of day the trigger is + to fire. + + All s default to a monthly interval type + (fires on the Nth day of every month) with N = 1 (first + non-excluded day) and set to 12:00 PM (noon). These + values can be changed using the , , and + methods. Users may also want to note the + and + methods. + + + Take, for example, the following calendar: + + + July August September + Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa + 1 W 1 2 3 4 5 W 1 2 W + W H 5 6 7 8 W W 8 9 10 11 12 W W H 6 7 8 9 W + W 11 12 13 14 15 W W 15 16 17 18 19 W W 12 13 14 15 16 W + W 18 19 20 21 22 W W 22 23 24 25 26 W W 19 20 21 22 23 W + W 25 26 27 28 29 W W 29 30 31 W 26 27 28 29 30 + W + + Where W's represent weekend days, and H's represent holidays, all of which + are excluded on a calendar associated with an + with n=5 and + intervalType=IntervalTypeMonthly. In this case, the trigger + would fire on the 8th of July (because of the July 4 holiday), + the 5th of August, and the 8th of September (because + of Labor Day). + + Aaron Craven + Marko Lahma (.NET) + + + + Indicates a monthly trigger type (fires on the Nth included + day of every month). + + + + indicates a yearly trigger type (fires on the Nth included + day of every year). + + + + + Indicates a weekly trigger type (fires on the Nth included + day of every week). When using this interval type, care must be taken + not to think of the value of as an analog to + . Such a comparison can only + be drawn when there are no calendars associated with the trigger. To + illustrate, consider an with + n = 3 which is associated with a Calendar excluding + non-weekdays. The trigger would fire on the 3rd + included day of the week, which would be 4th + actual day of the week. + + + + + Create an with no specified name, + group, or . This will result initially in a + default monthly trigger that fires on the first day of every month at + 12:00 PM (n = 1, + intervalType=, + fireAtTime="12:00"). + + + Note that and , must be + called before the can be placed into + a . + + + + + Create an with the given name and + default group but no specified . This will result + initially in a default monthly trigger that fires on the first day of + every month at 12:00 PM (=1, + intervalType=, + fireAtTime=12:00"). + + Note that must + be called before the can be placed + into a . + + + the name for the + + + + + Create an with the given name and + group but no specified . This will result + initially in a default monthly trigger that fires on the first day of + every month at 12:00 PM (=1, + intervalType=, + fireAtTime=12:00"). + + Note that must + be called before the can be placed + into a . + + + the name for the + + the group for the + + + + + Create an with the given name and + group and the specified . This will result + initially in a default monthly trigger that fires on the first day of + every month at 12:00 PM (=1, + intervalType=, + fireAtTime="12:00"). + + The name for the . + The group for the . + The name of the job to associate with the . + The group containing the job to associate with the . + + + + Returns the next UTC time at which the + will fire. If the trigger will not fire again, will be + returned. + + + + Because of the conceptual design of , + it is not always possible to decide with certainty that the trigger + will never fire again. Therefore, it will search for the next + fire time up to a given cutoff. These cutoffs can be changed by using the + property. The default cutoff is 12 + of the intervals specified by intervalType. + + + The returned value is not guaranteed to be valid until after + the trigger has been added to the scheduler. + + + the next fire time for the trigger + + + + + Returns the previous UTC time at which the + fired. If the trigger has not yet + fired, will be returned. + + the previous fire time for the trigger + + + + Returns the first time the will fire + after the specified date. + + + + Because of the conceptual design of , + it is not always possible to decide with certainty that the trigger + will never fire again. Therefore, it will search for the next + fire time up to a given cutoff. These cutoffs can be changed by using the + property. The default cutoff is 12 + of the intervals specified by intervalType. + + + Therefore, for triggers with intervalType = + , if the trigger + will not fire within 12 + weeks after the given date/time, will be returned. For + triggers with intervalType = + + , if the trigger will not fire within 12 + months after the given date/time, will be returned. + For triggers with intervalType = + + , if the trigger will not fire within 12 + years after the given date/time, will be returned. In + all cases, if the trigger will not fire before , + will be returned. + + + The time after which to find the nearest fire time. + This argument is treated as exclusive 舒 that is, + if afterTime is a valid fire time for the trigger, it + will not be returned as the next fire time. + + + the first time the trigger will fire following the specified date + + + + + Called when the has decided to 'fire' the trigger + (Execute the associated ), in order to give the + a chance to update itself for its next triggering + (if any). + + + + + Called by the scheduler at the time a is first + added to the scheduler, in order to have the + compute its first fire time, based on any associated calendar. + + After this method has been called, + should return a valid answer. + + + + the first time at which the will be fired + by the scheduler, which is also the same value + will return (until after the first + firing of the ). + + + + + Called after the has executed the + associated with the in order + to get the final instruction code from the trigger. + + + The that was used by the + 's method. + + + The thrown by the + , if any (may be ) + + one of the Trigger.INSTRUCTION_XXX constants. + + + + + Used by the to determine whether or not it is + possible for this to fire again. + ' + + + If the returned value is then the + may remove the from the + + + + + A boolean indicator of whether the trigger could potentially fire + again. + + + + + Indicates whether is a valid misfire + instruction for this . + + Whether is valid. + + + Updates the 's state based on the + MisfireInstruction that was selected when the + was created +

+ If the misfire instruction is set to MISFIRE_INSTRUCTION_SMART_POLICY, + then the instruction will be interpreted as + . +

+
+ a new or updated calendar to use for the trigger + +
+ + + Updates the 's state based on the + given new version of the associated . + + A new or updated calendar to use for the trigger + the amount of time that must + be between "now" and the time the next + firing of the trigger is supposed to occur. + + + + + Calculates the first time an with + intervalType = IntervalTypeWeekly will fire + after the specified date. See for more + information. + + The time after which to find the nearest fire time. + This argument is treated as exclusive 舒 that is, + if afterTime is a valid fire time for the trigger, it + will not be returned as the next fire time. + + the first time the trigger will fire following the specified + date + + + + + Calculates the first UTC time an with + intervalType = will fire + after the specified date. See for more + information. + + + The UTC time after which to find the nearest fire time. + This argument is treated as exclusive 舒 that is, + if afterTime is a valid fire time for the trigger, it + will not be returned as the next fire time. + + the first time the trigger will fire following the specified date + + + + Calculates the first time an with + intervalType = will fire + after the specified date. See for more + information. + + + The UTC time after which to find the nearest fire time. + This argument is treated as exclusive 舒 that is, + if afterTime is a valid fire time for the trigger, it + will not be returned as the next fire time. + + the first time the trigger will fire following the specified + date + + + + + Get a that is configured to produce a + schedule identical to this trigger's schedule. + + + + + + + Gets or sets the day of the interval on which the + should fire. If the Nth + day of the interval does not exist (i.e. the 32nd of a + month), the trigger simply will never fire. N may not be less than 1. + + + + + Returns the interval type for the . + + + Sets the interval type for the . If + , the trigger will fire on the + Nth included day of every month. If + , the trigger will fire on the + Nth included day of every year. If + , the trigger will fire on the + Nth included day of every week. + + + + + + + + Returns the fire time for the as a + string with the format "HH:MM[:SS]", with HH representing the + 24-hour clock hour of the fire time. Seconds are optional and their + inclusion depends on whether or not they were provided to + . + + + + + Returns the for the + . + + + + Because of the conceptual design of , + it is not always possible to decide with certainty that the trigger + will never fire again. Therefore, it will search for the next + fire time up to a given cutoff. These cutoffs can be changed by using the + property. The default cutoff is 12 + of the intervals specified by intervalType" />. + + + Because of the conceptual design of , + it is not always possible to decide with certainty that the trigger + will never fire again. Therefore, it will search for the next + fire time up to a given cutoff. These cutoffs can be changed by using the + method. The default cutoff is 12 + of the intervals specified by intervalType". + + + In most cases, the default value of this setting (12) is sufficient (it + is highly unlikely, for example, that you will need to look at more than + 12 months of dates to ensure that your trigger will never fire again). + However, this setting is included to allow for the rare exceptions where + this might not be true. + + + For example, if your trigger is associated with a calendar that excludes + a great many dates in the next 12 months, and hardly any following that, + it is possible (if is large enough) that you could run + into this situation. + + + + + + Returns the last UTC time the will fire. + If the trigger will not fire at any point between + and , will be returned. + + the last time the trigger will fire. + + + + Tells whether this Trigger instance can handle events + in millisecond precision. + + + + + + Sets or gets the time zone in which the will be resolved. + If no time zone is provided, then the default time zone will be used. + + + + + + + Gets or sets the trigger's calendar week rule. + + The trigger calendar week rule. + + + + Gets or sets the trigger's calendar first day of week rule. + + The trigger calendar first day of week. + + + + An exception that is thrown to indicate that an attempt to store a new + object (i.e. , + or ) in a + failed, because one with the same name and group already exists. + + James House + Marko Lahma (.NET) + + + + Create a with the given + message. + + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + Create a and auto-generate a + message using the name/group from the given . + + + + The message will read:
"Unable to store Job with name: '__' and + group: '__', because one already exists with this identification." +
+
+
+ + + Create a and auto-generate a + message using the name/group from the given . + + + + The message will read:
"Unable to store Trigger with name: '__' and + group: '__', because one already exists with this identification." +
+
+
+ + + An attribute that marks a class as one that makes updates to its + during execution, and wishes the scheduler to re-store the + when execution completes. + + + + Jobs that are marked with this annotation should also seriously consider + using the attribute, to avoid data + storage race conditions with concurrently executing job instances. + + + This can be used in lieu of implementing the StatefulJob marker interface that + was used prior to Quartz 2.0 + + + + James House + Marko Lahma (.NET) + + + + An exception that is thrown to indicate that there is a misconfiguration of + the - or one of the components it + configures. + + James House + Marko Lahma (.NET) + + + + Create a with the given message. + + + + + Create a with the given message + and cause. + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + + Scheduler constants. + + Marko Lahma (.NET) + + + + A (possibly) useful constant that can be used for specifying the group + that and instances belong to. + + + + + A constant group name used internally by the + scheduler - clients should not use the value of this constant + ("RECOVERING_JOBS") for thename of a 's group. + + + + + A constant group name used internally by the + scheduler - clients should not use the value of this constant + ("FAILED_OVER_JOBS") for thename of a 's group. + + + + + A constant key that can be used to retrieve the + name of the original from a recovery trigger's + data map in the case of a job recovering after a failed scheduler + instance. + + + + + + A constant key that can be used to retrieve the + group of the original from a recovery trigger's + data map in the case of a job recovering after a failed scheduler + instance. + + + + + + A constant key that can be used to retrieve the + scheduled fire time of the original from a recovery + trigger's data map in the case of a job recovering after a failed scheduler + instance. + + + + + + Holds context/environment data that can be made available to Jobs as they + are executed. + + + Future versions of Quartz may make distinctions on how it propagates + data in between instances of proxies to a + single scheduler instance - i.e. if Quartz is being used via WCF of Remoting. + + + James House + Marko Lahma (.NET) + + + + Create an empty . + + + + + Create a with the given data. + + + + + Serialization constructor. + + + + + + + Instructs Scheduler what to do with a trigger and job. + + Marko Lahma (.NET) + + + + Instructs the that the + has no further instructions. + + + + + Instructs the that the + wants the to re-Execute + immediately. If not in a 'RECOVERING' or 'FAILED_OVER' situation, the + execution context will be re-used (giving the the + ability to 'see' anything placed in the context by its last execution). + + + + + Instructs the that the + should be put in the state. + + + + + Instructs the that the + wants itself deleted. + + + + + Instructs the that all + s referencing the same as + this one should be put in the state. + + + + + Instructs the that all + s referencing the same as + this one should be put in the state. + + + + + Instructs the that the + should be put in the state. + + + + + Describes the settings and capabilities of a given + instance. + + James House + Marko Lahma (.NET) + + + + Initializes a new instance of the class. + + Name of the scheduler. + The scheduler instance. + The scheduler type. + if set to true, scheduler is a remote scheduler. + if set to true, scheduler is started. + if set to true, scheduler is in standby mode. + if set to true, scheduler is shutdown. + The start time. + The number of jobs executed. + The job store type. + if set to true, job store is persistent. + if set to true, the job store is clustered + The thread pool type. + Size of the thread pool. + The version string. + + + + Returns a formatted (human readable) string describing all the 's + meta-data values. + + + + The format of the string looks something like this: +
+            Quartz Scheduler 'SchedulerName' with instanceId 'SchedulerInstanceId' Scheduler class: 'Quartz.Impl.StdScheduler' - running locally. Running since: '11:33am on Jul 19, 2002' Not currently paused. Number of Triggers fired: '123' Using thread pool 'Quartz.Simpl.SimpleThreadPool' - with '8' threads Using job-store 'Quartz.Impl.JobStore' - which supports persistence.
+            
+
+
+
+ + + Return a simple string representation of this object. + + + + + Returns the name of the . + + + + + Returns the instance Id of the . + + + + + Returns the class-name of the instance. + + + + + Returns whether the is being used remotely (via remoting). + + + + + Returns whether the scheduler has been started. + + + Note: may return even if + returns . + + + + + Reports whether the is in standby mode. + + + Note: may return even if + returns . + + + + + Reports whether the has been Shutdown. + + + + + Returns the class-name of the instance that is + being used by the . + + + + + Returns the type name of the instance that is + being used by the . + + + + + Returns the number of threads currently in the 's + + + + + Returns the version of Quartz that is running. + + + + + Returns the at which the Scheduler started running. + + null if the scheduler has not been started. + + + + + Returns the number of jobs executed since the + started.. + + + + + Returns whether or not the 's + instance supports persistence. + + + + + Returns whether or not the 's + is clustered. + + + + + SimpleScheduleBuilder is a + that defines strict/literal interval-based schedules for + s. + + + + Quartz provides a builder-style API for constructing scheduling-related + entities via a Domain-Specific Language (DSL). The DSL can best be + utilized through the usage of static imports of the methods on the classes + , , + , , + and the various implementations. + + Client code can then use the DSL to write code such as this: + + JobDetail job = JobBuilder.Create<MyJob>() + .WithIdentity("myJob") + .Build(); + Trigger trigger = TriggerBuilder.Create() + .WithIdentity(triggerKey("myTrigger", "myTriggerGroup")) + .WithSimpleSchedule(x => x + .WithIntervalInHours(1) + .RepeatForever()) + .StartAt(DateBuilder.FutureDate(10, IntervalUnit.Minute)) + .Build(); + scheduler.scheduleJob(job, trigger); + + + + + + + + + + + Create a SimpleScheduleBuilder. + + + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat forever with a 1 minute interval. + + + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat forever with an interval + of the given number of minutes. + + + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat forever with a 1 second interval. + + + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat forever with an interval + of the given number of seconds. + + + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat forever with a 1 hour interval. + + + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat forever with an interval + of the given number of hours. + + + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat the given number + of times - 1 with a 1 minute interval. + + + Note: Total count = 1 (at start time) + repeat count + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat the given number + of times - 1 with an interval of the given number of minutes. + + + Note: Total count = 1 (at start time) + repeat count + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat the given number + of times - 1 with a 1 second interval. + + + Note: Total count = 1 (at start time) + repeat count + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat the given number + of times - 1 with an interval of the given number of seconds. + + + Note: Total count = 1 (at start time) + repeat count + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat the given number + of times - 1 with a 1 hour interval. + + + Note: Total count = 1 (at start time) + repeat count + + the new SimpleScheduleBuilder + + + + Create a SimpleScheduleBuilder set to repeat the given number + of times - 1 with an interval of the given number of hours. + + + Note: Total count = 1 (at start time) + repeat count + + the new SimpleScheduleBuilder + + + + Build the actual Trigger -- NOT intended to be invoked by end users, + but will rather be invoked by a TriggerBuilder which this + ScheduleBuilder is given to. + + + + + + + + Specify a repeat interval in milliseconds. + + + + the time span at which the trigger should repeat. + the updated SimpleScheduleBuilder + + + + + + Specify a repeat interval in seconds. + + + + the time span at which the trigger should repeat. + the updated SimpleScheduleBuilder + + + + + + Specify a the number of time the trigger will repeat - total number of + firings will be this number + 1. + + + + the number of seconds at which the trigger should repeat. + the updated SimpleScheduleBuilder + + + + + + Specify that the trigger will repeat indefinitely. + + + + the updated SimpleScheduleBuilder + + + + + + + If the Trigger misfires, use the + instruction. + + + + the updated CronScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + + + the updated SimpleScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + + + the updated SimpleScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + + + the updated SimpleScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + + + the updated SimpleScheduleBuilder + + + + + If the Trigger misfires, use the + instruction. + + + + the updated SimpleScheduleBuilder + + + + + Extension methods that attach to . + + + + + A time source for Quartz.NET that returns the current time. + Original idea by Ayende Rahien: + http://ayende.com/Blog/archive/2008/07/07/Dealing-with-time-in-tests.aspx + + + + + Return current UTC time via . Allows easier unit testing. + + + + + Return current time in current time zone via . Allows easier unit testing. + + + + + Represents a time in hour, minute and second of any given day. + + + The hour is in 24-hour convention, meaning values are from 0 to 23. + + + + + James House + Zemian Deng saltnlight5@gmail.com + Nuno Maia (.NET) + + + + Create a TimeOfDay instance for the given hour, minute and second. + + The hour of day, between 0 and 23. + The minute of the hour, between 0 and 59. + The second of the minute, between 0 and 59. + + + + Create a TimeOfDay instance for the given hour, minute (at the zero second of the minute). + + The hour of day, between 0 and 23. + The minute of the hour, between 0 and 59. + + + + Create a TimeOfDay instance for the given hour, minute and second. + + The hour of day, between 0 and 23. + The minute of the hour, between 0 and 59. + The second of the minute, between 0 and 59. + + + + + Create a TimeOfDay instance for the given hour, minute (at the zero second of the minute).. + + The hour of day, between 0 and 23. + The minute of the hour, between 0 and 59. + The newly instantiated TimeOfDay + + + + Determine with this time of day is before the given time of day. + + + True this time of day is before the given time of day. + + + + Return a date with time of day reset to this object values. The millisecond value will be zero. + + + + + + The hour of the day (between 0 and 23). + + + + + The minute of the hour (between 0 and 59). + + + + + The second of the minute (between 0 and 59). + + + + + Attribute to use with public properties that + can be set with Quartz configuration. Attribute can be used to advice + parsing to use correct type of time span (milliseconds, seconds, minutes, hours) + as it may depend on property. + + Marko Lahma (.NET) + + + + + Initializes a new instance of the class. + + The rule. + + + + Gets the rule. + + The rule. + + + + Possible parse rules for s. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TriggerBuilder is used to instantiate s. + + + + The builder will always try to keep itself in a valid state, with + reasonable defaults set for calling build() at any point. For instance + if you do not invoke WithSchedule(..) method, a default schedule + of firing once immediately will be used. As another example, if you + do not invoked WithIdentity(..) a trigger name will be generated + for you. + + + Quartz provides a builder-style API for constructing scheduling-related + entities via a Domain-Specific Language (DSL). The DSL can best be + utilized through the usage of static imports of the methods on the classes + , , + , , + and the various implementations. + + + Client code can then use the DSL to write code such as this: + + + IJobDetail job = JobBuilder.Create<MyJob>() + .WithIdentity("myJob") + .Build(); + ITrigger trigger = TriggerBuilder.Create() + .WithIdentity("myTrigger", "myTriggerGroup") + .WithSimpleSchedule(x => x + .WithIntervalInHours(1) + .RepeatForever()) + .StartAt(DateBuilder.FutureDate(10, IntervalUnit.Minute)) + .Build(); + scheduler.scheduleJob(job, trigger); + + + + + + + + + + Create a new TriggerBuilder with which to define a + specification for a Trigger. + + + + the new TriggerBuilder + + + + Produce the . + + + + a Trigger that meets the specifications of the builder. + + + + Use a with the given name and default group to + identify the Trigger. + + + If none of the 'withIdentity' methods are set on the TriggerBuilder, + then a random, unique TriggerKey will be generated. + + the name element for the Trigger's TriggerKey + the updated TriggerBuilder + + + + + + Use a TriggerKey with the given name and group to + identify the Trigger. + + + If none of the 'withIdentity' methods are set on the TriggerBuilder, + then a random, unique TriggerKey will be generated. + + the name element for the Trigger's TriggerKey + the group element for the Trigger's TriggerKey + the updated TriggerBuilder + + + + + + Use the given TriggerKey to identify the Trigger. + + + If none of the 'withIdentity' methods are set on the TriggerBuilder, + then a random, unique TriggerKey will be generated. + + the TriggerKey for the Trigger to be built + the updated TriggerBuilder + + + + + + Set the given (human-meaningful) description of the Trigger. + + + + the description for the Trigger + the updated TriggerBuilder + + + + + Set the Trigger's priority. When more than one Trigger have the same + fire time, the scheduler will fire the one with the highest priority + first. + + + + the priority for the Trigger + the updated TriggerBuilder + + + + + + Set the name of the that should be applied to this + Trigger's schedule. + + + + the name of the Calendar to reference. + the updated TriggerBuilder + + + + + + Set the time the Trigger should start at - the trigger may or may + not fire at this time - depending upon the schedule configured for + the Trigger. However the Trigger will NOT fire before this time, + regardless of the Trigger's schedule. + + + + the start time for the Trigger. + the updated TriggerBuilder + + + + + + Set the time the Trigger should start at to the current moment - + the trigger may or may not fire at this time - depending upon the + schedule configured for the Trigger. + + + + the updated TriggerBuilder + + + + + Set the time at which the Trigger will no longer fire - even if it's + schedule has remaining repeats. + + + + the end time for the Trigger. If null, the end time is indefinite. + the updated TriggerBuilder + + + + + + Set the that will be used to define the + Trigger's schedule. + + + The particular used will dictate + the concrete type of Trigger that is produced by the TriggerBuilder. + + the SchedulerBuilder to use. + the updated TriggerBuilder + + + + + + + + Set the identity of the Job which should be fired by the produced + Trigger. + + + + the identity of the Job to fire. + the updated TriggerBuilder + + + + + Set the identity of the Job which should be fired by the produced + Trigger - a will be produced with the given + name and default group. + + + + the name of the job (in default group) to fire. + the updated TriggerBuilder + + + + + Set the identity of the Job which should be fired by the produced + Trigger - a will be produced with the given + name and group. + + + + the name of the job to fire. + the group of the job to fire. + the updated TriggerBuilder + + + + + Set the identity of the Job which should be fired by the produced + Trigger, by extracting the JobKey from the given job. + + + + the Job to fire. + the updated TriggerBuilder + + + + + Add the given key-value pair to the Trigger's . + + + + the updated TriggerBuilder + + + + + Add the given key-value pair to the Trigger's . + + + + the updated TriggerBuilder + + + + + Add the given key-value pair to the Trigger's . + + + + the updated TriggerBuilder + + + + + Add the given key-value pair to the Trigger's . + + + + the updated TriggerBuilder + + + + + Add the given key-value pair to the Trigger's . + + + + the updated TriggerBuilder + + + + + Add the given key-value pair to the Trigger's . + + + + the updated TriggerBuilder + + + + + Add the given key-value pair to the Trigger's . + + + + the updated TriggerBuilder + + + + + Add the given key-value pair to the Trigger's . + + + + the updated TriggerBuilder + + + + + Common constants for triggers. + + + + + The default value for priority. + + + + + Uniquely identifies a . + + + Keys are composed of both a name and group, and the name must be unique + within the group. If only a name is specified then the default group + name will be used. + + + Quartz provides a builder-style API for constructing scheduling-related + entities via a Domain-Specific Language (DSL). The DSL can best be + utilized through the usage of static imports of the methods on the classes + , , + , , + and the various implementations. + + + Client code can then use the DSL to write code such as this: + + + IJobDetail job = JobBuilder.Create<MyJob>() + .WithIdentity("myJob") + .Build(); + ITrigger trigger = TriggerBuilder.Create() + .WithIdentity("myTrigger", "myTriggerGroup") + .WithSimpleSchedule(x => x + .WithIntervalInHours(1) + .RepeatForever()) + .StartAt(DateBuilder.FutureDate(10, IntervalUnit.Minute)) + .Build(); + scheduler.scheduleJob(job, trigger); + + + + + + + + All trigger states known to Scheduler. + + Marko Lahma (.NET) + + + + Indicates that the is in the "normal" state. + + + + + Indicates that the is in the "paused" state. + + + + + Indicates that the is in the "complete" state. + + + "Complete" indicates that the trigger has not remaining fire-times in + its schedule. + + + + + Indicates that the is in the "error" state. + + + + A arrives at the error state when the scheduler + attempts to fire it, but cannot due to an error creating and executing + its related job. Often this is due to the 's + class not existing in the classpath. + + + + When the trigger is in the error state, the scheduler will make no + attempts to fire it. + + + + + + Indicates that the is in the "blocked" state. + + + A arrives at the blocked state when the job that + it is associated with has a and it is + currently executing. + + + + + + Indicates that the does not exist. + + + + + A Comparator that compares trigger's next fire times, or in other words, + sorts them according to earliest next fire time. If the fire times are + the same, then the triggers are sorted according to priority (highest + value first), if the priorities are the same, then they are sorted + by key. + + + + + Convenience and utility methods for simplifying the construction and + configuration of s and DateTimeOffsetOffsets. + + + + James House + Marko Lahma (.NET) + + + + Returns a list of Dates that are the next fire times of a + . + The input trigger will be cloned before any work is done, so you need + not worry about its state being altered by this method. + + The trigger upon which to do the work + The calendar to apply to the trigger's schedule + The number of next fire times to produce + List of java.util.Date objects + + + + Compute the that is 1 second after the Nth firing of + the given , taking the triger's associated + into consideration. + + + The input trigger will be cloned before any work is done, so you need + not worry about its state being altered by this method. + + The trigger upon which to do the work + The calendar to apply to the trigger's schedule + The number of next fire times to produce + the computed Date, or null if the trigger (as configured) will not fire that many times + + + + Returns a list of Dates that are the next fire times of a + that fall within the given date range. The input trigger will be cloned + before any work is done, so you need not worry about its state being + altered by this method. + + NOTE: if this is a trigger that has previously fired within the given + date range, then firings which have already occurred will not be listed + in the output List. + + + The trigger upon which to do the work + The calendar to apply to the trigger's schedule + The starting date at which to find fire times + The ending date at which to stop finding fire times + List of java.util.Date objects + + + + An exception that is thrown to indicate that a call to + failed without interrupting the Job. + + + James House + Marko Lahma (.NET) + + + + Create a with the given message. + + + + + Create a with the given cause. + + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The class name is null or is zero (0). + The info parameter is null. + + + diff --git a/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/AdaptableJobFactory.cs b/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/AdaptableJobFactory.cs index 07a53c00..d6827423 100644 --- a/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/AdaptableJobFactory.cs +++ b/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/AdaptableJobFactory.cs @@ -20,6 +20,12 @@ using Quartz; using Quartz.Spi; using Quartz.Util; +#if QUARTZ_2_0 +using JobDetail = Quartz.IJobDetail; +#else +using JobDetail = Quartz.JobDetail; +#endif + namespace Spring.Scheduling.Quartz { /// @@ -32,6 +38,27 @@ namespace Spring.Scheduling.Quartz /// public class AdaptableJobFactory : IJobFactory { +#if QUARTZ_2_0 + /// + /// Called by the scheduler at the time of the trigger firing, in order to + /// produce a instance on which to call Execute. + /// + /// + /// It should be extremely rare for this method to throw an exception - + /// basically only the the case where there is no way at all to instantiate + /// and prepare the Job for execution. When the exception is thrown, the + /// Scheduler will move all triggers associated with the Job into the + /// state, which will require human + /// intervention (e.g. an application restart after fixing whatever + /// configuration problem led to the issue wih instantiating the Job. + /// + /// The TriggerFiredBundle from which the + /// and other info relating to the trigger firing can be obtained. + /// The scheduler instance. + /// the newly instantiated Job + /// SchedulerException if there is a problem instantiating the Job. + public virtual IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler) +#else /// /// Called by the scheduler at the time of the trigger firing, in order to /// produce a instance on which to call Execute. @@ -49,7 +76,8 @@ namespace Spring.Scheduling.Quartz /// and other info relating to the trigger firing can be obtained. /// the newly instantiated Job /// SchedulerException if there is a problem instantiating the Job. - public virtual IJob NewJob(TriggerFiredBundle bundle) + public virtual IJob NewJob(TriggerFiredBundle bundle) +#endif { try { @@ -75,7 +103,11 @@ namespace Spring.Scheduling.Quartz /// The job instance. protected virtual object CreateJobInstance(TriggerFiredBundle bundle) { +#if QUARTZ_2_0 + return ObjectUtils.InstantiateType(bundle.JobDetail.JobType); +#else return ObjectUtils.InstantiateType(bundle.JobDetail.JobType); +#endif } /// @@ -92,24 +124,21 @@ namespace Spring.Scheduling.Quartz /// protected virtual IJob AdaptJob(object jobObject) { - if (jobObject is IJob) - { - return (IJob) jobObject; - } - else if (jobObject is ThreadStart) - { - return new DelegatingJob((ThreadStart)jobObject); - } - else if (jobObject is IThreadRunnable) + if (jobObject is IJob) { - return new DelegatingJob(new ThreadStart(((IThreadRunnable) jobObject).Run)); + return (IJob)jobObject; } - else - { - throw new ArgumentException( - string.Format("Unable to execute job class [{0}]: only [IJob] and [ThreadStart] supported.", - jobObject.GetType().FullName)); - } + if (jobObject is ThreadStart) + { + return new DelegatingJob((ThreadStart)jobObject); + } + if (jobObject is IThreadRunnable) + { + return new DelegatingJob(((IThreadRunnable)jobObject).Run); + } + + string message = string.Format("Unable to execute job class [{0}]: only [IJob] and [ThreadStart] supported.", jobObject.GetType().FullName); + throw new ArgumentException(message); } } } \ No newline at end of file diff --git a/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/DelegatingJob.cs b/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/DelegatingJob.cs index 14c5f7ad..c7956bb8 100644 --- a/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/DelegatingJob.cs +++ b/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/DelegatingJob.cs @@ -13,13 +13,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -using System; using System.Threading; using Quartz; using Spring.Util; +#if QUARTZ_2_0 +using JobExecutionContext = Quartz.IJobExecutionContext; +#else +using JobExecutionContext = Quartz.JobExecutionContext; +#endif + namespace Spring.Scheduling.Quartz { /// diff --git a/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/IJobDetailAwareTrigger.cs b/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/IJobDetailAwareTrigger.cs index 36abb551..080c77b9 100644 --- a/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/IJobDetailAwareTrigger.cs +++ b/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/IJobDetailAwareTrigger.cs @@ -13,7 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -using Quartz; + +#if QUARTZ_2_0 +using JobDetail = Quartz.IJobDetail; +#else +using JobDetail = Quartz.JobDetail; +#endif namespace Spring.Scheduling.Quartz { @@ -36,8 +41,6 @@ namespace Spring.Scheduling.Quartz /// Juergen Hoeller /// /// - /// - /// public interface IJobDetailAwareTrigger { /// diff --git a/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/ISchedulingTaskExecutor.cs b/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/ISchedulingTaskExecutor.cs index 6046502c..4230c395 100644 --- a/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/ISchedulingTaskExecutor.cs +++ b/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/ISchedulingTaskExecutor.cs @@ -16,21 +16,17 @@ namespace Spring.Scheduling { - /// - /// - /// - public interface ISchedulingTaskExecutor : ITaskExecutor - { - /// - /// Gets a value indicating whether´this instance prefers short lived tasks. - /// - /// - /// true if prefers short lived tasks; otherwise, false. - /// - bool PrefersShortLivedTasks - { - get; - } - - } -} + /// + /// + /// + public interface ISchedulingTaskExecutor : ITaskExecutor + { + /// + /// Gets a value indicating whether´this instance prefers short lived tasks. + /// + /// + /// true if prefers short lived tasks; otherwise, false. + /// + bool PrefersShortLivedTasks { get; } + } +} \ No newline at end of file diff --git a/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/LocalTaskExecutorThreadPool.cs b/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/LocalTaskExecutorThreadPool.cs index 3ec00d3f..7626cc5a 100644 --- a/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/LocalTaskExecutorThreadPool.cs +++ b/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/LocalTaskExecutorThreadPool.cs @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -using System.Threading; using Common.Logging; using Quartz; @@ -32,11 +31,11 @@ namespace Spring.Scheduling.Quartz /// /// Logger available to subclasses. /// - protected ILog logger; + private readonly ILog logger; private ITaskExecutor taskExecutor; - - /// + + /// /// Initializes a new instance of the class. /// public LocalTaskExecutorThreadPool() @@ -45,6 +44,14 @@ namespace Spring.Scheduling.Quartz } /// + /// Logger instance. + /// + protected ILog Logger + { + get { return logger; } + } + + /// /// Gets the size of the pool. /// /// The size of the pool. @@ -53,7 +60,25 @@ namespace Spring.Scheduling.Quartz get { return - 1; } } - /// + /// + /// Inform the of the Scheduler instance's Id, + /// prior to initialize being invoked. + /// + public string InstanceId + { + set { } + } + + /// + /// Inform the of the Scheduler instance's name, + /// prior to initialize being invoked. + /// + public string InstanceName + { + set { } + } + + /// /// Called by the QuartzScheduler before the is /// used, in order to give the it a chance to Initialize. /// @@ -99,7 +124,7 @@ namespace Spring.Scheduling.Quartz } try { - taskExecutor.Execute(new ThreadStart(runnable.Run)); + taskExecutor.Execute(runnable.Run); return true; } catch (TaskRejectedException ex) diff --git a/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/MethodInvokingJob.cs b/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/MethodInvokingJob.cs index 3aa8d9ae..71597d8c 100644 --- a/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/MethodInvokingJob.cs +++ b/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/MethodInvokingJob.cs @@ -23,6 +23,12 @@ using Quartz; using Spring.Objects.Support; +#if QUARTZ_2_0 +using JobExecutionContext = Quartz.IJobExecutionContext; +#else +using JobExecutionContext = Quartz.JobExecutionContext; +#endif + namespace Spring.Scheduling.Quartz { /// diff --git a/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/MethodInvokingRunnable.cs b/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/MethodInvokingRunnable.cs index a483a602..1296fd6d 100644 --- a/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/MethodInvokingRunnable.cs +++ b/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/MethodInvokingRunnable.cs @@ -56,7 +56,7 @@ namespace Spring.Scheduling.Quartz /// /// Logger instance shared by this instance and its sub-class instances. /// - protected ILog logger; + private readonly ILog logger; /// /// Initializes a new instance of the class. @@ -66,6 +66,13 @@ namespace Spring.Scheduling.Quartz logger = LogManager.GetLogger(GetType()); } + /// + /// Logger instance. + /// + protected ILog Logger + { + get { return logger; } + } /// /// Gets the invocation failure message. diff --git a/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/QuartzJobObject.cs b/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/QuartzJobObject.cs index 868db623..54b6753f 100644 --- a/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/QuartzJobObject.cs +++ b/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/QuartzJobObject.cs @@ -14,8 +14,15 @@ * limitations under the License. */ using Quartz; + using Spring.Objects; +#if QUARTZ_2_0 +using JobExecutionContext = Quartz.IJobExecutionContext; +#else +using JobExecutionContext = Quartz.JobExecutionContext; +#endif + namespace Spring.Scheduling.Quartz { /// diff --git a/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/SchedulerFactoryObject.cs b/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/SchedulerFactoryObject.cs index a7230f36..c4a17477 100644 --- a/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/SchedulerFactoryObject.cs +++ b/src/Spring/Spring.Scheduling.Quartz/Scheduling/Quartz/SchedulerFactoryObject.cs @@ -18,6 +18,9 @@ using System; using System.Collections; using System.Collections.Specialized; using System.IO; +#if QUARTZ_2_0 +using System.Linq; +#endif using Quartz; using Quartz.Impl; @@ -566,7 +569,11 @@ namespace Spring.Scheduling.Quartz public virtual void AfterPropertiesSet() { // Create SchedulerFactory instance. +#if QUARTZ_2_0 + ISchedulerFactory schedulerFactory = ObjectUtils.InstantiateType(schedulerFactoryType); +#else ISchedulerFactory schedulerFactory = (ISchedulerFactory) ObjectUtils.InstantiateType(schedulerFactoryType); +#endif InitSchedulerFactory(schedulerFactory); @@ -755,7 +762,12 @@ namespace Spring.Scheduling.Quartz // Put specified objects into Scheduler context. if (schedulerContextMap != null) { +#if QUARTZ_2_0 + var dictionary = schedulerContextMap.Cast().ToDictionary(entry => entry.Key.ToString(), entry => entry.Value); + scheduler.Context.PutAll(dictionary); +#else scheduler.Context.PutAll(schedulerContextMap); +#endif } // Register IApplicationContext in Scheduler context. @@ -837,9 +849,9 @@ namespace Spring.Scheduling.Quartz } } - /// - /// Handles the application context's refresh event and starts the scheduler. - /// + /// + /// Handles the application context's refresh event and starts the scheduler. + /// public void HandleApplicationEvent(object sender, ApplicationEventArgs e) { // auto-start Scheduler if demanded diff --git a/src/Spring/Spring.Scheduling.Quartz/Spring.Scheduling.Quartz.2008.csproj b/src/Spring/Spring.Scheduling.Quartz/Spring.Scheduling.Quartz.2008.csproj index e6f8e2ad..b3c1524e 100644 --- a/src/Spring/Spring.Scheduling.Quartz/Spring.Scheduling.Quartz.2008.csproj +++ b/src/Spring/Spring.Scheduling.Quartz/Spring.Scheduling.Quartz.2008.csproj @@ -31,13 +31,13 @@ 4 - + False - ..\..\..\lib\net\2.0\Common.Logging.dll + ..\..\..\lib\Net\2.0\Common.Logging.dll - + False - ..\..\..\lib\net\2.0\Quartz.dll + ..\..\..\lib\Quartz10\net\2.0\Quartz.dll diff --git a/src/Spring/Spring.Scheduling.Quartz/Spring.Scheduling.Quartz.2010.csproj b/src/Spring/Spring.Scheduling.Quartz/Spring.Scheduling.Quartz.2010.csproj index e04a2d97..0fe05a39 100644 --- a/src/Spring/Spring.Scheduling.Quartz/Spring.Scheduling.Quartz.2010.csproj +++ b/src/Spring/Spring.Scheduling.Quartz/Spring.Scheduling.Quartz.2010.csproj @@ -37,12 +37,13 @@ 4 - + False - ..\..\..\lib\net\2.0\Common.Logging.dll + ..\..\..\lib\Net\2.0\Common.Logging.dll - - ..\..\..\lib\Net\3.5\Quartz.dll + + False + ..\..\..\lib\Quartz10\net\3.5\Quartz.dll diff --git a/src/Spring/Spring.Scheduling.Quartz/Spring.Scheduling.Quartz.build b/src/Spring/Spring.Scheduling.Quartz/Spring.Scheduling.Quartz.build index a8829365..6d0899c0 100644 --- a/src/Spring/Spring.Scheduling.Quartz/Spring.Scheduling.Quartz.build +++ b/src/Spring/Spring.Scheduling.Quartz/Spring.Scheduling.Quartz.build @@ -7,6 +7,14 @@ * current.build.defines.csc - framework-specific build defines for C# compiler --> + + + + + + + + + /// Convenience subclass of Quartz's CronTrigger type, making property based + /// usage easier. + /// + /// + ///

+ /// CronTrigger itself is already property based but lacks sensible defaults. + /// This class uses the Spring object name as job name, the Quartz default group + /// ("DEFAULT") as job group, the current time as start time, and indefinite + /// repetition, if not specified. + ///

+ ///

+ /// This class will also register the trigger with the job name and group of + /// a given . This allows + /// to automatically register a trigger for the corresponding JobDetail, + /// instead of registering the JobDetail separately. + ///

+ ///
+ /// Juergen Hoeller + /// + /// + /// + /// + /// + /// + public class CronTriggerObject : CronTriggerImpl, IJobDetailAwareTrigger, IObjectNameAware, IInitializingObject + { + private readonly Constants constants = new Constants(typeof(MisfireInstruction.CronTrigger), typeof(MisfireInstruction)); + private IJobDetail jobDetail; + private string objectName; + private TimeSpan startDelay; + + /// + /// Register objects in the JobDataMap via a given Map. + /// + /// + /// These objects will be available to this Trigger only, + /// in contrast to objects in the JobDetail's data map. + /// + /// + public virtual IDictionary JobDataAsMap + { + set + { + foreach (DictionaryEntry entry in value) + { + JobDataMap.Put((string) entry.Key, entry.Value); + } + } + } + + /// + /// Set the misfire instruction via the name of the corresponding + /// constant in the CronTrigger class. + /// Default is . + /// + /// + /// + /// + public virtual string MisfireInstructionName + { + set { MisfireInstruction = constants.AsNumber(value); } + } + + /// + /// Set the name of the object in the object factory that created this object. + /// + /// The name of the object in the factory. + /// + ///

+ /// Invoked after population of normal object properties but before an init + /// callback like 's + /// + /// method or a custom init-method. + ///

+ ///
+ public virtual string ObjectName + { + set { objectName = value; } + } + + /// + /// Set the JobDetail that this trigger should be associated with. + /// + /// + /// This is typically used with a object reference if the JobDetail + /// is a Spring-managed object. Alternatively, the trigger can also + /// be associated with a job by name and group. + /// + /// + public virtual IJobDetail JobDetail + { + get { return jobDetail; } + 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. + /// + /// + ///

+ /// This method allows the object instance to perform the kind of + /// initialization only possible when all of it's dependencies have + /// been injected (set), and to throw an appropriate exception in the + /// event of misconfiguration. + ///

+ ///

+ /// Please do consult the class level documentation for the + /// interface for a + /// description of exactly when this method is invoked. In + /// particular, it is worth noting that the + /// + /// and + /// callbacks will have been invoked prior to this method being + /// called. + ///

+ ///
+ /// + /// In the event of misconfiguration (such as the failure to set a + /// required property) or if initialization fails. + /// + public virtual void AfterPropertiesSet() + { +#if QUARTZ_2_0 + if (StartTimeUtc == DateTimeOffset.MinValue) + { + StartTimeUtc = DateTimeOffset.UtcNow; + } +#else + if (StartTimeUtc == DateTime.MinValue) + { + StartTimeUtc = DateTime.UtcNow; + } +#endif + if (StartDelay > TimeSpan.Zero) + { + StartTimeUtc = DateTime.UtcNow.Add(startDelay); + } + if (Name == null) + { + Name = objectName; + } + if (Group == null) + { + Group = SchedulerConstants.DefaultGroup; + } + if (jobDetail != null) + { + JobName = jobDetail.Key.Name; + JobGroup = jobDetail.Key.Group; + } + } + } + + /// + /// Helper class to map constant names to their values. + /// + internal class Constants + { + private readonly Type[] types; + + public Constants(params Type[] reflectedTypes) + { + types = reflectedTypes; + } + + public int AsNumber(string field) + { + foreach (Type type in types) + { + FieldInfo fi = type.GetField(field); + if (fi != null) + { + return Convert.ToInt32(fi.GetValue(null)); + } + } + + // not found + throw new Exception(string.Format("Unknown field '{0}'", field)); + } + } +} \ No newline at end of file diff --git a/src/Spring/Spring.Scheduling.Quartz20/Scheduling/Quartz/JobDetailObject.cs b/src/Spring/Spring.Scheduling.Quartz20/Scheduling/Quartz/JobDetailObject.cs new file mode 100644 index 00000000..9ab40e6c --- /dev/null +++ b/src/Spring/Spring.Scheduling.Quartz20/Scheduling/Quartz/JobDetailObject.cs @@ -0,0 +1,220 @@ +/* +* Copyright 2002-2010 the original author or authors. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +using System; +using System.Collections; +using Quartz; +using Quartz.Impl; +using Spring.Context; +using Spring.Objects.Factory; + +namespace Spring.Scheduling.Quartz +{ + /// + /// Convenience subclass of Quartz' JobDetail class that eases properties based + /// usage. + /// + /// + /// itself is already a object but lacks + /// sensible defaults. This class uses the Spring object name as job name, + /// and the Quartz default group ("DEFAULT") as job group if not specified. + /// + /// Juergen Hoeller + /// + /// + public class JobDetailObject : JobDetailImpl, IObjectNameAware, IApplicationContextAware, IInitializingObject + { + private Type actualJobType; + private string objectName; + private IApplicationContext applicationContext; + private string applicationContextJobDataKey; + + /// + /// Overridden to support any job class, to allow a custom JobFactory + /// to adapt the given job class to the Quartz Job interface. + /// + /// + public override Type JobType + { + get { return (actualJobType ?? base.JobType); } + + set + { + if (value != null && !typeof (IJob).IsAssignableFrom(value)) + { + base.JobType = typeof (DelegatingJob); + actualJobType = value; + } + else + { + base.JobType = value; + } + } + } + + /// + /// Register objects in the JobDataMap via a given Map. + /// + /// + /// These objects will be available to this Job only, + /// in contrast to objects in the SchedulerContext. + ///

+ /// Note: When using persistent Jobs whose JobDetail will be kept in the + /// database, do not put Spring-managed objects or an ApplicationContext + /// reference into the JobDataMap but rather into the SchedulerContext. + ///

+ ///
+ /// + public virtual IDictionary JobDataAsMap + { + set + { + if (value == null) + { + throw new ArgumentException("Value cannot be null", "value"); + } + + foreach (DictionaryEntry entry in value) + { + JobDataMap.Put((string) entry.Key, entry.Value); + } + } + } + + /// + /// Set the name of the object in the object factory that created this object. + /// + /// The name of the object in the factory. + /// + /// Invoked after population of normal object properties but before an init + /// callback like 's + /// + /// method or a custom init-method. + /// + public virtual string ObjectName + { + set { objectName = value; } + } + + /// + /// Gets or sets the that this + /// object runs in. + /// + /// + /// + ///

+ /// Normally this call will be used to initialize the object. + ///

+ ///

+ /// Invoked after population of normal object properties but before an + /// init callback such as + /// 's + /// + /// or a custom init-method. Invoked after the setting of any + /// 's + /// + /// property. + ///

+ ///
+ /// + /// In the case of application context initialization errors. + /// + /// + /// If thrown by any application context methods. + /// + /// + public virtual IApplicationContext ApplicationContext + { + set { applicationContext = value; } + get { return applicationContext; } + } + + /// + /// Set the key of an IApplicationContext reference to expose in the JobDataMap, + /// for example "applicationContext". Default is none. + /// Only applicable when running in a Spring ApplicationContext. + /// + /// + ///

+ /// In case of a QuartzJobObject, the reference will be applied to the Job + /// instance as object property. An "applicationContext" attribute will correspond + /// to a "setApplicationContext" method in that scenario. + ///

+ ///

+ /// Note that ObjectFactory callback interfaces like IApplicationContextAware + /// are not automatically applied to Quartz Job instances, because Quartz + /// itself is responsible for the lifecycle of its Jobs. + ///

+ ///

+ /// Note: When using persistent job stores where JobDetail contents will + /// be kept in the database, do not put an IApplicationContext reference into + /// the JobDataMap but rather into the SchedulerContext. + ///

+ ///
+ /// + /// + public virtual string ApplicationContextJobDataKey + { + set { applicationContextJobDataKey = value; } + } + + /// + /// Invoked by an + /// after it has injected all of an object's dependencies. + /// + /// + ///

+ /// This method allows the object instance to perform the kind of + /// initialization only possible when all of it's dependencies have + /// been injected (set), and to throw an appropriate exception in the + /// event of misconfiguration. + ///

+ ///

+ /// Please do consult the class level documentation for the + /// interface for a + /// description of exactly when this method is invoked. In + /// particular, it is worth noting that the + /// + /// and + /// callbacks will have been invoked prior to this method being + /// called. + ///

+ ///
+ /// + /// In the event of misconfiguration (such as the failure to set a + /// required property) or if initialization fails. + /// + public virtual void AfterPropertiesSet() + { + if (Name == null) + { + Name = objectName; + } + if (Group == null) + { + Group = SchedulerConstants.DefaultGroup; + } + if (applicationContextJobDataKey != null) + { + if (applicationContext == null) + { + throw new ArgumentException("JobDetailObject needs to be set up in an IApplicationContext " + + "to be able to handle an 'applicationContextJobDataKey'"); + } + JobDataMap.Put(applicationContextJobDataKey, applicationContext); + } + } + } +} \ No newline at end of file diff --git a/src/Spring/Spring.Scheduling.Quartz20/Scheduling/Quartz/MethodInvokingJobDetailFactoryObject.cs b/src/Spring/Spring.Scheduling.Quartz20/Scheduling/Quartz/MethodInvokingJobDetailFactoryObject.cs new file mode 100644 index 00000000..e9cc7b4c --- /dev/null +++ b/src/Spring/Spring.Scheduling.Quartz20/Scheduling/Quartz/MethodInvokingJobDetailFactoryObject.cs @@ -0,0 +1,292 @@ +/* +* Copyright 2002-2010 the original author or authors. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +using System; + +using Quartz; +using Quartz.Impl; +using Spring.Objects.Factory; +using Spring.Objects.Factory.Config; +using Spring.Objects.Support; + +namespace Spring.Scheduling.Quartz +{ + /// + /// IFactoryObject that exposes a JobDetail object that delegates job execution + /// to a specified (static or non-static) method. Avoids the need to implement + /// a one-line Quartz Job that just invokes an existing service method. + /// + /// + ///

+ /// Derived from ArgumentConverting MethodInvoker to share common properties and behavior + /// with MethodInvokingFactoryObject. + ///

+ ///

+ /// Supports both concurrently running jobs and non-currently running + /// ones through the "concurrent" property. Jobs created by this + /// MethodInvokingJobDetailFactoryObject are by default volatile and durable + /// (according to Quartz terminology). + ///

+ ///

NOTE: JobDetails created via this FactoryObject are not + /// serializable and thus not suitable for persistent job stores. + /// You need to implement your own Quartz Job as a thin wrapper for each case + /// where you want a persistent job to delegate to a specific service method. + ///

+ ///
+ /// Juergen Hoeller + /// Alef Arendsen + /// + /// + public class MethodInvokingJobDetailFactoryObject : ArgumentConvertingMethodInvoker, + IObjectFactoryAware, + IFactoryObject, + IObjectNameAware, + IInitializingObject + { + private string name; + private string group; + private bool concurrent = true; + private string[] jobListenerNames; + private string targetObjectName; + private string objectName; + private JobDetailImpl jobDetail; + private IObjectFactory objectFactory; + + /// + /// Initializes a new instance of the class. + /// + public MethodInvokingJobDetailFactoryObject() + { + group = SchedulerConstants.DefaultGroup; + } + + + /// + /// Set the name of the job. + /// Default is the object name of this FactoryObject. + /// + /// + public virtual string Name + { + set { name = value; } + } + + /// + /// Set the group of the job. + /// Default is the default group of the Scheduler. + /// + /// + /// + public virtual string Group + { + set { group = value; } + } + + /// + /// Specify whether or not multiple jobs should be run in a concurrent + /// fashion. The behavior when one does not want concurrent jobs to be + /// executed is realized through adding the attribute. + /// More information on stateful versus stateless jobs can be found + /// here. + ///

+ /// The default setting is to run jobs concurrently. + ///

+ ///
+ public virtual bool Concurrent + { + set { concurrent = value; } + } + + /// + /// Gets the job detail. + /// + /// The job detail. + protected IJobDetail JobDetail + { + get { return jobDetail; } + } + + /// + /// Set a list of JobListener names for this job, referring to + /// non-global JobListeners registered with the Scheduler. + /// + /// + /// A JobListener name always refers to the name returned + /// by the JobListener implementation. + /// + /// + /// + public virtual string[] JobListenerNames + { + set { jobListenerNames = value; } + } + + /// + /// Set the name of the object in the object factory that created this object. + /// + /// The name of the object in the factory. + /// + /// Invoked after population of normal object properties but before an init + /// callback like 's + /// + /// method or a custom init-method. + /// + public virtual string ObjectName + { + set { objectName = value; } + } + + /// + /// Set the name of the target object in the Spring object factory. + /// + /// + /// This is an alternative to specifying TargetObject + /// allowing for non-singleton objects to be invoked. Note that specified + /// "TargetObject" and "TargetType" values will + /// override the corresponding effect of this "TargetObjectName" setting + ///(i.e. statically pre-define the object type or even the target object). + /// + public string TargetObjectName + { + set { targetObjectName = value; } + } + + /// + /// Sets the object factory. + /// + /// The object factory. + public IObjectFactory ObjectFactory + { + set { objectFactory = value; } + } + + /// + /// Return an instance (possibly shared or independent) of the object + /// managed by this factory. + /// + /// + /// An instance (possibly shared or independent) of the object managed by + /// this factory. + /// + /// + /// + /// If this method is being called in the context of an enclosing IoC container and + /// returns , the IoC container will consider this factory + /// object as not being fully initialized and throw a corresponding (and most + /// probably fatal) exception. + /// + /// + public virtual object GetObject() + { + return jobDetail; + } + + /// + /// Return the of object that this + /// creates, or + /// if not known in advance. + /// + /// + public virtual Type ObjectType + { + get + { + if (targetObjectName != null) + { + if (objectFactory == null) + { + throw new InvalidOperationException("ObjectFactory must be set when using 'TargetObjectName'"); + } + return objectFactory.GetType(targetObjectName); + } + return typeof(IJobDetail); + } + } + + /// + /// Is the object managed by this factory a singleton or a prototype? + /// + /// + public virtual bool IsSingleton + { + get { return true; } + } + + + /// + /// Invoked by an + /// after it has injected all of an object's dependencies. + /// + /// + ///

+ /// This method allows the object instance to perform the kind of + /// initialization only possible when all of it's dependencies have + /// been injected (set), and to throw an appropriate exception in the + /// event of misconfiguration. + ///

+ ///

+ /// Please do consult the class level documentation for the + /// interface for a + /// description of exactly when this method is invoked. In + /// particular, it is worth noting that the + /// + /// and + /// callbacks will have been invoked prior to this method being + /// called. + ///

+ ///
+ /// + /// In the event of misconfiguration (such as the failure to set a + /// required property) or if initialization fails. + /// + public virtual void AfterPropertiesSet() + { + Prepare(); + + // Use specific name if given, else fall back to object name. + string jobDetailName = name ?? objectName; + + // Consider the concurrent flag to choose between stateful and stateless job. + Type jobType = (concurrent ? typeof (MethodInvokingJob) : typeof (StatefulMethodInvokingJob)); + + // Build JobDetail instance. + jobDetail = new JobDetailImpl(jobDetailName, group, jobType); + jobDetail.JobDataMap.Put("methodInvoker", this); + jobDetail.Durable = true; + + // job listeners through configuration are no longer supported + if (jobListenerNames != null && jobListenerNames.Length > 0) + { + throw new InvalidOperationException("Non-global IJobListeners not supported on Quartz 2 - " + + "manually register a Matcher against the Quartz ListenerManager instead"); + } + + PostProcessJobDetail(jobDetail); + } + + /// + /// Callback for post-processing the JobDetail to be exposed by this FactoryObject. + ///

+ /// The default implementation is empty. Can be overridden in subclasses. + ///

+ ///
+ /// the JobDetail prepared by this FactoryObject + protected virtual void PostProcessJobDetail(IJobDetail detail) + { + } + + } +} \ No newline at end of file diff --git a/src/Spring/Spring.Scheduling.Quartz20/Scheduling/Quartz/SchedulerAccessor.cs b/src/Spring/Spring.Scheduling.Quartz20/Scheduling/Quartz/SchedulerAccessor.cs new file mode 100644 index 00000000..0cecc0f2 --- /dev/null +++ b/src/Spring/Spring.Scheduling.Quartz20/Scheduling/Quartz/SchedulerAccessor.cs @@ -0,0 +1,451 @@ +/* + * Copyright 2002-2010 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +using System; +using System.Collections; +using System.Collections.Generic; +using Common.Logging; + +using Quartz; +using Quartz.Simpl; +using Quartz.Xml; + +using Spring.Collections; +using Spring.Context; +using Spring.Core.IO; +using Spring.Transaction; +using Spring.Transaction.Support; + +namespace Spring.Scheduling.Quartz +{ + /// + /// Common base class for accessing a Quartz Scheduler, i.e. for registering jobs, + /// triggers and listeners on a instance. + /// + /// + /// For concrete usage, check out the and + /// classes. + /// + /// Juergen Hoeller + /// Marko Lahma (.NET) + public abstract class SchedulerAccessor : IResourceLoaderAware + { + /// + /// Logger instance. + /// + protected readonly ILog logger; + private bool overwriteExistingJobs; + + private string[] jobSchedulingDataLocations; + + private IList jobDetails; + private IDictionary calendars; + private IList triggers; + + private ISchedulerListener[] schedulerListeners; + private IJobListener[] globalJobListeners; + private IJobListener[] jobListeners; + private ITriggerListener[] globalTriggerListeners; + private ITriggerListener[] triggerListeners; + + private IPlatformTransactionManager transactionManager; + /// + /// Resource loader instance for sub-classes + /// + protected IResourceLoader resourceLoader; + + /// + /// Initializes a new instance of the class. + /// + protected SchedulerAccessor() + { + logger = LogManager.GetLogger(GetType()); + } + + /// + /// Set whether any jobs defined on this SchedulerFactoryObject should overwrite + /// existing job definitions. Default is "false", to not overwrite already + /// registered jobs that have been read in from a persistent job store. + /// + public virtual bool OverwriteExistingJobs + { + set { overwriteExistingJobs = value; } + } + + + /// + /// Set the locations of Quartz job definition XML files that follow the + /// "job_scheduling_data_1_5" XSD. Can be specified to automatically + /// register jobs that are defined in such files, possibly in addition + /// to jobs defined directly on this SchedulerFactoryObject. + /// + /// + public virtual string[] JobSchedulingDataLocations + { + set { jobSchedulingDataLocations = value; } + } + + /// + /// Set the location of a Quartz job definition XML file that follows the + /// "job_scheduling_data" XSD. Can be specified to automatically + /// register jobs that are defined in such a file, possibly in addition + /// to jobs defined directly on this SchedulerFactoryObject. + /// + /// + public virtual string JobSchedulingDataLocation + { + set { jobSchedulingDataLocations = new string[] {value}; } + } + + /// + /// Register a list of JobDetail objects with the Scheduler that + /// this FactoryObject creates, to be referenced by Triggers. + /// This is not necessary when a Trigger determines the JobDetail + /// itself: In this case, the JobDetail will be implicitly registered + /// in combination with the Trigger. + /// + /// + /// + /// + /// + /// + public virtual IJobDetail[] JobDetails + { + set + { + // Use modifiable ArrayList here, to allow for further adding of + // JobDetail objects during autodetection of JobDetailAwareTriggers. + jobDetails = new List(value); + } + } + + /// + /// Register a list of Quartz ICalendar objects with the Scheduler + /// that this FactoryObject creates, to be referenced by Triggers. + /// + /// Map with calendar names as keys as Calendar objects as values + /// + /// + public virtual IDictionary Calendars + { + set { calendars = value; } + } + + /// + /// Register a list of Trigger objects with the Scheduler that + /// this FactoryObject creates. + /// + /// + /// If the Trigger determines the corresponding JobDetail itself, + /// the job will be automatically registered with the Scheduler. + /// Else, the respective JobDetail needs to be registered via the + /// "jobDetails" property of this FactoryObject. + /// + /// + /// + /// + /// + /// + public virtual ITrigger[] Triggers + { + set { triggers = new ArrayList(value); } + } + + /// + /// Specify Quartz SchedulerListeners to be registered with the Scheduler. + /// + public virtual ISchedulerListener[] SchedulerListeners + { + set { schedulerListeners = value; } + } + + /// + /// Specify global Quartz JobListeners to be registered with the Scheduler. + /// Such JobListeners will apply to all Jobs in the Scheduler. + /// + public virtual IJobListener[] GlobalJobListeners + { + set { globalJobListeners = value; } + } + + /// + /// Specify named Quartz JobListeners to be registered with the Scheduler. + /// Such JobListeners will only apply to Jobs that explicitly activate + /// them via their name. + /// + /// + public virtual IJobListener[] JobListeners + { + set { jobListeners = value; } + } + + + /// + /// Specify global Quartz TriggerListeners to be registered with the Scheduler. + /// Such TriggerListeners will apply to all Triggers in the Scheduler. + /// + public virtual ITriggerListener[] GlobalTriggerListeners + { + set { globalTriggerListeners = value; } + } + + + /// + /// Specify named Quartz TriggerListeners to be registered with the Scheduler. + /// Such TriggerListeners will only apply to Triggers that explicitly activate + /// them via their name. + /// + /// + public virtual ITriggerListener[] TriggerListeners + { + set { triggerListeners = value; } + } + + + /// + /// Set the transaction manager to be used for registering jobs and triggers + /// that are defined by this SchedulerFactoryObject. Default is none; setting + /// this only makes sense when specifying a DataSource for the Scheduler. + /// + public virtual IPlatformTransactionManager TransactionManager + { + set { transactionManager = value; } + } + + /// + /// Sets the + /// that this object runs in. + /// + /// + /// + /// Invoked after population of normal objects properties but + /// before an init callback such as + /// 's + /// + /// or a custom init-method. Invoked before setting + /// 's + /// + /// property. + /// + public virtual IResourceLoader ResourceLoader + { + set { resourceLoader = value; } + } + + /// + /// Register jobs and triggers (within a transaction, if possible). + /// + protected virtual void RegisterJobsAndTriggers() + { + ITransactionStatus transactionStatus = null; + if (transactionManager != null) + { + transactionStatus = transactionManager.GetTransaction(new DefaultTransactionDefinition()); + } + try + { + if (jobSchedulingDataLocations != null) + { + XMLSchedulingDataProcessor dataProcessor = new XMLSchedulingDataProcessor(new SimpleTypeLoadHelper()); + dataProcessor.OverWriteExistingData = overwriteExistingJobs; + foreach (string location in jobSchedulingDataLocations) + { + dataProcessor.ProcessFileAndScheduleJobs(location, GetScheduler()); + } + } + + // Register JobDetails. + if (jobDetails != null) + { + foreach (IJobDetail jobDetail in jobDetails) + { + AddJobToScheduler(jobDetail); + } + } + else + { + // Create empty list for easier checks when registering triggers. + jobDetails = new LinkedList(); + } + + // Register Calendars. + if (calendars != null) + { + foreach (DictionaryEntry entry in calendars) + { + string calendarName = (string) entry.Key; + ICalendar calendar = (ICalendar) entry.Value; + GetScheduler().AddCalendar(calendarName, calendar, true, true); + } + } + + // Register Triggers. + if (triggers != null) + { + foreach (ITrigger trigger in triggers) + { + AddTriggerToScheduler(trigger); + } + } + } + + catch (Exception ex) + { + if (transactionStatus != null) + { + try + { + transactionManager.Rollback(transactionStatus); + } + catch (TransactionException) + { + logger.Error("Job registration exception overridden by rollback exception", ex); + throw; + } + } + if (ex is SchedulerException) + { + throw; + } + throw new SchedulerException("Registration of jobs and triggers failed: " + ex.Message); + } + + if (transactionStatus != null) + { + transactionManager.Commit(transactionStatus); + } + } + + /// + /// Add the given job to the Scheduler, if it doesn't already exist. + /// Overwrites the job in any case if "overwriteExistingJobs" is set. + /// + /// the job to add + /// true if the job was actually added, false if it already existed before + private bool AddJobToScheduler(IJobDetail jobDetail) + { + if (overwriteExistingJobs || GetScheduler().GetJobDetail(jobDetail.Key) == null) + { + GetScheduler().AddJob(jobDetail, true); + return true; + } + else + { + return false; + } + } + + /// + /// Add the given trigger to the Scheduler, if it doesn't already exist. + /// Overwrites the trigger in any case if "overwriteExistingJobs" is set. + /// + /// the trigger to add + /// true if the trigger was actually added, false if it already existed before + private bool AddTriggerToScheduler(ITrigger trigger) + { + bool triggerExists = (GetScheduler().GetTrigger(trigger.Key) != null); + if (!triggerExists || this.overwriteExistingJobs) + { + // Check if the Trigger is aware of an associated JobDetail. + if (trigger is IJobDetailAwareTrigger) + { + IJobDetail jobDetail = ((IJobDetailAwareTrigger) trigger).JobDetail; + // Automatically register the JobDetail too. + if (!jobDetails.Contains(jobDetail) && AddJobToScheduler(jobDetail)) + { + jobDetails.Add(jobDetail); + } + } + if (!triggerExists) + { + try + { + GetScheduler().ScheduleJob(trigger); + } + catch (ObjectAlreadyExistsException ex) + { + if (logger.IsDebugEnabled) + { + logger.Debug( + "Unexpectedly found existing trigger, assumably due to cluster race condition: " + + ex.Message + " - can safely be ignored"); + } + if (overwriteExistingJobs) + { + GetScheduler().RescheduleJob(trigger.Key, trigger); + } + } + } + else + { + GetScheduler().RescheduleJob(trigger.Key, trigger); + } + return true; + } + else + { + return false; + } + } + + + /// + /// Register all specified listeners with the Scheduler. + /// + protected virtual void RegisterListeners() + { + if (schedulerListeners != null) + { + for (int i = 0; i < schedulerListeners.Length; i++) + { + GetScheduler().ListenerManager.AddSchedulerListener(schedulerListeners[i]); + } + } + if (globalJobListeners != null) + { + foreach (IJobListener jobListener in globalJobListeners) + { + GetScheduler().ListenerManager.AddJobListener(jobListener); + } + } + if (jobListeners != null && jobListeners.Length > 0) + { + throw new InvalidOperationException("Non-global JobListeners not supported on Quartz 2 - " + + "manually register a Matcher against the Quartz ListenerManager instead"); + } + if (globalTriggerListeners != null) + { + foreach (ITriggerListener triggerListener in globalTriggerListeners) + { + GetScheduler().ListenerManager.AddTriggerListener(triggerListener); + } + } + if (triggerListeners != null && triggerListeners.Length > 0) + { + throw new InvalidOperationException("Non-global TriggerListeners not supported on Quartz 2 - " + + "manually register a Matcher against the Quartz ListenerManager instead"); + } + } + + /// + /// Template method that determines the Scheduler to operate on. + /// To be implemented by subclasses. + /// + /// + protected abstract IScheduler GetScheduler(); + } +} \ No newline at end of file diff --git a/src/Spring/Spring.Scheduling.Quartz20/Scheduling/Quartz/SimpleTriggerObject.cs b/src/Spring/Spring.Scheduling.Quartz20/Scheduling/Quartz/SimpleTriggerObject.cs new file mode 100644 index 00000000..cf171961 --- /dev/null +++ b/src/Spring/Spring.Scheduling.Quartz20/Scheduling/Quartz/SimpleTriggerObject.cs @@ -0,0 +1,215 @@ +/* +* Copyright 2002-2010 the original author or authors. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +using System; +using System.Collections; +using Quartz; +using Quartz.Impl.Triggers; +using Spring.Objects.Factory; +using Spring.Util; + +namespace Spring.Scheduling.Quartz +{ + /// + /// Convenience subclass of Quartz's + /// class, making properties based usage easier. + /// + /// + ///

+ /// SimpleTrigger itself is already a PONO but lacks sensible defaults. + /// This class uses the Spring object name as job name, the Quartz default group + /// ("DEFAULT") as job group, the current time as start time, and indefinite + /// repetition, if not specified. + ///

+ /// + ///

+ /// This class will also register the trigger with the job name and group of + /// a given . This allows + /// to automatically register a trigger for the corresponding JobDetail, + /// instead of registering the JobDetail separately. + ///

+ ///
+ /// Juergen Hoeller + /// + /// + /// + /// + /// + /// + /// + public class SimpleTriggerObject : SimpleTriggerImpl, IJobDetailAwareTrigger, IObjectNameAware, IInitializingObject + { + private TimeSpan startDelay = TimeSpan.Zero; + private IJobDetail jobDetail; + private string objectName; + private readonly Constants constants = new Constants(typeof(MisfireInstruction.SimpleTrigger), typeof(MisfireInstruction)); + + /// + /// Initializes a new instance of the class. + /// + public SimpleTriggerObject() + { + RepeatCount = RepeatIndefinitely; + } + + /// + /// Register objects in the JobDataMap via a given Map. + ///

+ /// These objects will be available to this Trigger only, + /// in contrast to objects in the JobDetail's data map. + ///

+ ///
+ /// + public virtual IDictionary JobDataAsMap + { + set + { + foreach (DictionaryEntry entry in value) + { + JobDataMap.Put((string) entry.Key, entry.Value); + } + } + } + + /// + /// Set the misfire instruction via the name of the corresponding + /// constant in the SimpleTrigger class. + /// Default is . + /// + /// + /// + /// + /// + /// + /// + public virtual string MisfireInstructionName + { + set { MisfireInstruction = constants.AsNumber(value); } + } + + /// + /// Set the delay before starting the job for the first time. + /// The given time span will be added to the current + /// time to calculate the start time. Default is . + /// + /// + /// This delay will just be applied if no custom start time was + /// specified. However, in typical usage within a Spring context, + /// the start time will be the container startup time anyway. + /// Specifying a relative delay is appropriate in that case. + /// + /// + public virtual TimeSpan StartDelay + { + set + { + AssertUtils.State(value > TimeSpan.Zero, "Start delay cannot be negative."); + startDelay = value; + } + get { return startDelay; } + } + + /// + /// Set the name of the object in the object factory that created this object. + /// + /// The name of the object in the factory. + /// + ///

+ /// Invoked after population of normal object properties but before an init + /// callback like 's + /// + /// method or a custom init-method. + ///

+ ///
+ public virtual string ObjectName + { + set { objectName = value; } + } + + /// + /// Set the JobDetail that this trigger should be associated with. + ///

+ /// This is typically used with a object reference if the JobDetail + /// is a Spring-managed object. Alternatively, the trigger can also + /// be associated with a job by name and group. + ///

+ ///
+ public virtual IJobDetail JobDetail + { + get { return jobDetail; } + set { jobDetail = value; } + } + + + /// + /// Invoked by an + /// after it has injected all of an object's dependencies. + /// + /// + ///

+ /// This method allows the object instance to perform the kind of + /// initialization only possible when all of it's dependencies have + /// been injected (set), and to throw an appropriate exception in the + /// event of misconfiguration. + ///

+ ///

+ /// Please do consult the class level documentation for the + /// interface for a + /// description of exactly when this method is invoked. In + /// particular, it is worth noting that the + /// + /// and + /// callbacks will have been invoked prior to this method being + /// called. + ///

+ ///
+ /// + /// In the event of misconfiguration (such as the failure to set a + /// required property) or if initialization fails. + /// + public virtual void AfterPropertiesSet() + { +#if QUARTZ_2_0 + if (StartTimeUtc == DateTimeOffset.MinValue) + { + StartTimeUtc = DateTimeOffset.UtcNow; + } +#else + if (StartTimeUtc == DateTime.MinValue) + { + StartTimeUtc = DateTime.UtcNow; + } +#endif + if (StartDelay > TimeSpan.Zero) + { + StartTimeUtc = DateTime.UtcNow.Add(startDelay); + } + + if (Name == null) + { + Name = objectName; + } + if (Group == null) + { + Group = SchedulerConstants.DefaultGroup; + } + if (jobDetail != null) + { + JobName = jobDetail.Key.Name; + JobGroup = jobDetail.Key.Group; + } + } + } +} \ No newline at end of file diff --git a/src/Spring/Spring.Scheduling.Quartz20/Scheduling/Quartz/StatefulMethodInvokingJob.cs b/src/Spring/Spring.Scheduling.Quartz20/Scheduling/Quartz/StatefulMethodInvokingJob.cs new file mode 100644 index 00000000..6885337f --- /dev/null +++ b/src/Spring/Spring.Scheduling.Quartz20/Scheduling/Quartz/StatefulMethodInvokingJob.cs @@ -0,0 +1,33 @@ +/* +* Copyright 2002-2010 the original author or authors. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +using Quartz; + +namespace Spring.Scheduling.Quartz +{ + /// + /// Extension of the MethodInvokingJob, implementing the StatefulJob interface. + /// Quartz checks whether or not jobs are stateful and if so, + /// won't let jobs interfere with each other. + /// + [DisallowConcurrentExecution] + [PersistJobDataAfterExecution] + public class StatefulMethodInvokingJob : MethodInvokingJob + { + // No implementation, just an addition of the tag interface StatefulJob + // in order to allow stateful method invoking jobs. + } +} diff --git a/src/Spring/Spring.Scheduling.Quartz20/Spring.Scheduling.Quartz20.2008.csproj b/src/Spring/Spring.Scheduling.Quartz20/Spring.Scheduling.Quartz20.2008.csproj new file mode 100644 index 00000000..b3c68544 --- /dev/null +++ b/src/Spring/Spring.Scheduling.Quartz20/Spring.Scheduling.Quartz20.2008.csproj @@ -0,0 +1,136 @@ + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {764C3A6A-8690-49DD-B9AF-99E7C09AE4F0} + Library + Properties + Spring + Spring.Scheduling.Quartz20 + v3.5 + + + true + full + false + ..\..\..\build\VS.NET.2008\Spring.Scheduling.Quartz20\Debug\ + TRACE;DEBUG;NET_2_0,QUARTZ_2_0 + prompt + 4 + ..\..\..\build\VS.NET.2008\Spring.Scheduling.Quartz\Debug\Spring.Scheduling.Quartz20.XML + true + + + pdbonly + true + ..\..\..\build\VS.NET.2008\Spring.Scheduling.Quartz20\Release\ + TRACE;NET_2_0 + prompt + 4 + + + + False + ..\..\..\lib\Quartz20\net\3.5\C5.dll + + + False + ..\..\..\lib\Net\2.0\Common.Logging.dll + + + False + ..\..\..\lib\Quartz20\net\3.5\Quartz.dll + + + + 3.5 + C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll + + + + + + JobMethodInvocationFailedException.cs + + + Scheduling\Quartz\AdaptableJobFactory.cs + + + Scheduling\Quartz\DelegatingJob.cs + + + Scheduling\Quartz\IJobDetailAwareTrigger.cs + + + Scheduling\Quartz\ISchedulerContextAware.cs + + + Scheduling\Quartz\ISchedulingTaskExecutor.cs + + + Scheduling\Quartz\ITaskExecutor.cs + + + Scheduling\Quartz\LocalDataSourceJobStore.cs + + + Scheduling\Quartz\LocalTaskExecutorThreadPool.cs + + + Scheduling\Quartz\MethodInvokingJob.cs + + + Scheduling\Quartz\MethodInvokingRunnable.cs + + + Scheduling\Quartz\QuartzJobObject.cs + + + Scheduling\Quartz\SchedulerAccessorObject.cs + + + Scheduling\Quartz\SchedulerFactoryObject.cs + + + Scheduling\Quartz\SchedulingException.cs + + + Scheduling\Quartz\SimpleThreadPoolTaskExecutor.cs + + + Scheduling\Quartz\SpringDbProviderAdapter.cs + + + Scheduling\Quartz\SpringObjectJobFactory.cs + + + Scheduling\Quartz\TaskRejectedException.cs + + + + + + + + + + + {710961A3-0DF4-49E4-A26E-F5B9C044AC84} + Spring.Core.2008 + + + {AE00E5AB-C39A-436F-86D2-33BFE33E2E40} + Spring.Data.2008 + + + + + \ No newline at end of file diff --git a/src/Spring/Spring.Scheduling.Quartz20/Spring.Scheduling.Quartz20.2010.csproj b/src/Spring/Spring.Scheduling.Quartz20/Spring.Scheduling.Quartz20.2010.csproj new file mode 100644 index 00000000..ee69946e --- /dev/null +++ b/src/Spring/Spring.Scheduling.Quartz20/Spring.Scheduling.Quartz20.2010.csproj @@ -0,0 +1,134 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {E823D54C-CE82-4868-929F-5F95A999F123} + Library + Properties + Spring + Spring.Scheduling.Quartz20 + v3.5 + + + 3.5 + + + + + true + full + false + ..\..\..\build\VS.NET.2010\Spring.Scheduling.Quartz20\Debug\ + TRACE;DEBUG;NET_2_0,QUARTZ_2_0 + prompt + 4 + ..\..\..\build\VS.NET.2010\Spring.Scheduling.Quartz20\Debug\Spring.Scheduling.Quartz20.XML + true + + + pdbonly + true + ..\..\..\build\VS.NET.2010\Spring.Scheduling.Quartz20\Release\ + TRACE;NET_2_0 + prompt + 4 + + + + ..\..\..\lib\Quartz20\net\3.5\C5.dll + + + False + ..\..\..\lib\net\2.0\Common.Logging.dll + + + ..\..\..\lib\Quartz20\net\3.5\Quartz.dll + + + + + + + Scheduling\Quartz\AdaptableJobFactory.cs + + + Scheduling\Quartz\DelegatingJob.cs + + + Scheduling\Quartz\IJobDetailAwareTrigger.cs + + + Scheduling\Quartz\ISchedulerContextAware.cs + + + Scheduling\Quartz\ISchedulingTaskExecutor.cs + + + Scheduling\Quartz\ITaskExecutor.cs + + + Scheduling\Quartz\LocalDataSourceJobStore.cs + + + Scheduling\Quartz\LocalTaskExecutorThreadPool.cs + + + Scheduling\Quartz\MethodInvokingJob.cs + + + Scheduling\Quartz\MethodInvokingRunnable.cs + + + Scheduling\Quartz\QuartzJobObject.cs + + + Scheduling\Quartz\SchedulerAccessorObject.cs + + + Scheduling\Quartz\SchedulerFactoryObject.cs + + + Scheduling\Quartz\SchedulingException.cs + + + Scheduling\Quartz\SimpleThreadPoolTaskExecutor.cs + + + Scheduling\Quartz\SpringDbProviderAdapter.cs + + + Scheduling\Quartz\SpringObjectJobFactory.cs + + + Scheduling\Quartz\TaskRejectedException.cs + + + + + + + + + + + + {710961A3-0DF4-49E4-A26E-F5B9C044AC84} + Spring.Core.2010 + + + {AE00E5AB-C39A-436F-86D2-33BFE33E2E40} + Spring.Data.2010 + + + + + \ No newline at end of file diff --git a/src/Spring/Spring.Scheduling.Quartz20/Spring.Scheduling.Quartz20.build b/src/Spring/Spring.Scheduling.Quartz20/Spring.Scheduling.Quartz20.build new file mode 100644 index 00000000..e8fed0d8 --- /dev/null +++ b/src/Spring/Spring.Scheduling.Quartz20/Spring.Scheduling.Quartz20.build @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Spring/Spring.Scheduling.Quartz20/Spring.Scheduling.Quartz20.nuspec b/src/Spring/Spring.Scheduling.Quartz20/Spring.Scheduling.Quartz20.nuspec new file mode 100644 index 00000000..de707030 --- /dev/null +++ b/src/Spring/Spring.Scheduling.Quartz20/Spring.Scheduling.Quartz20.nuspec @@ -0,0 +1,30 @@ + + + + Spring.Scheduling.Quartz20 + http://www.springframework.net/ + http://www.springframework.net/license.html + http://springframework.net/images/SpringSource_Leaves32x32.png + 0.0.0 + + SpringSource + Spring.NET Integration with the Quartz Scheduling Library 2.0 + + + en-US + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/Spring/Spring.Scheduling.Quartz.Integration.Tests/Spring.Scheduling.Quartz.Integration.Tests.2008.csproj b/test/Spring/Spring.Scheduling.Quartz.Integration.Tests/Spring.Scheduling.Quartz.Integration.Tests.2008.csproj index f5076ffe..1f8479c1 100644 --- a/test/Spring/Spring.Scheduling.Quartz.Integration.Tests/Spring.Scheduling.Quartz.Integration.Tests.2008.csproj +++ b/test/Spring/Spring.Scheduling.Quartz.Integration.Tests/Spring.Scheduling.Quartz.Integration.Tests.2008.csproj @@ -2,7 +2,7 @@ Debug AnyCPU - 9.0.21022 + 9.0.30729 2.0 {E4328F68-C3FC-43E2-9D63-30CEC55215B0} Library @@ -33,9 +33,9 @@ False ..\..\..\lib\net\2.0\nunit.framework.dll - + False - ..\..\..\lib\net\2.0\Quartz.dll + ..\..\..\lib\Quartz10\net\2.0\Quartz.dll False diff --git a/test/Spring/Spring.Scheduling.Quartz.Integration.Tests/Spring.Scheduling.Quartz.Integration.Tests.2010.csproj b/test/Spring/Spring.Scheduling.Quartz.Integration.Tests/Spring.Scheduling.Quartz.Integration.Tests.2010.csproj new file mode 100644 index 00000000..0f791206 --- /dev/null +++ b/test/Spring/Spring.Scheduling.Quartz.Integration.Tests/Spring.Scheduling.Quartz.Integration.Tests.2010.csproj @@ -0,0 +1,91 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {E4328F68-C3FC-43E2-9D63-30CEC55215B0} + Library + Properties + Spring + Spring.Scheduling.Quartz.Integration.Tests + v3.5 + + + 3.5 + + + + true + full + false + ..\..\..\build\VS.NET.2008\Spring.Scheduling.Quartz.Integration.Tests\Debug\ + TRACE;DEBUG;NET_2_0;NET_3_5 + prompt + 4 + + + pdbonly + true + ..\..\..\build\VS.NET.2008\Spring.Scheduling.Quartz.Integration.Tests\Release\ + TRACE;NET_2_0;NET_3_5 + prompt + 4 + + + + False + ..\..\..\lib\net\2.0\nunit.framework.dll + + + False + ..\..\..\lib\Quartz10\net\2.0\Quartz.dll + + + False + ..\..\..\lib\Net\2.0\Rhino.Mocks.dll + + + + 3.5 + + + + + + + PreserveNewest + Designer + + + + + + + + + + + + {710961A3-0DF4-49E4-A26E-F5B9C044AC84} + Spring.Core.2010 + + + {AE00E5AB-C39A-436F-86D2-33BFE33E2E40} + Spring.Data.2010 + + + {E823D54C-CE82-4868-929F-5F95A999F61E} + Spring.Scheduling.Quartz.2010 + + + + + \ No newline at end of file diff --git a/test/Spring/Spring.Scheduling.Quartz.Integration.Tests/Spring.Scheduling.Quartz.Integration.Tests.dll.config b/test/Spring/Spring.Scheduling.Quartz.Integration.Tests/Spring.Scheduling.Quartz.Integration.Tests.dll.config index bad5ea5e..1ad9b047 100644 --- a/test/Spring/Spring.Scheduling.Quartz.Integration.Tests/Spring.Scheduling.Quartz.Integration.Tests.dll.config +++ b/test/Spring/Spring.Scheduling.Quartz.Integration.Tests/Spring.Scheduling.Quartz.Integration.Tests.dll.config @@ -44,8 +44,8 @@ - + diff --git a/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/AdaptableJobFactoryTest.cs b/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/AdaptableJobFactoryTest.cs index f2e04eb9..b4012336 100644 --- a/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/AdaptableJobFactoryTest.cs +++ b/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/AdaptableJobFactoryTest.cs @@ -14,15 +14,11 @@ * limitations under the License. */ using System; - using NUnit.Framework; - using Quartz; using Quartz.Job; using Quartz.Spi; -using Spring.Scheduling.Quartz; - namespace Spring.Scheduling.Quartz { /// @@ -52,8 +48,12 @@ namespace Spring.Scheduling.Quartz try { // this actually fails already in Quartz level - TriggerFiredBundle bundle = TestUtil.CreateMinimalFiredBundleWithTypedJobDetail(typeof(object)); + TriggerFiredBundle bundle = TestUtil.CreateMinimalFiredBundleWithTypedJobDetail(typeof (object)); +#if QUARTZ_2_0 + jobFactory.NewJob(bundle, null); +#else jobFactory.NewJob(bundle); +#endif Assert.Fail("Created job which was not an IJob"); } catch (ArgumentException) @@ -85,14 +85,15 @@ namespace Spring.Scheduling.Quartz [Test] public void TestNewJob_NormalIJob() { - TriggerFiredBundle bundle = TestUtil.CreateMinimalFiredBundleWithTypedJobDetail(typeof(NoOpJob)); + TriggerFiredBundle bundle = TestUtil.CreateMinimalFiredBundleWithTypedJobDetail(typeof (NoOpJob)); +#if QUARTZ_2_0 + IJob job = jobFactory.NewJob(bundle, null); +#else IJob job = jobFactory.NewJob(bundle); +#endif + Assert.IsNotNull(job, "Returned job was null"); } - - - - } internal class NoOpThreadStartJob : NoOpJob 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 d3014939..bcb5e038 100644 --- a/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/CronTriggerObjectTest.cs +++ b/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/CronTriggerObjectTest.cs @@ -16,12 +16,16 @@ using System; using System.Collections; - +using System.Collections.Generic; using NUnit.Framework; using Quartz; using Quartz.Job; +#if QUARTZ_2_0 +using JobDetail = Quartz.Impl.JobDetailImpl; +#endif + namespace Spring.Scheduling.Quartz { /// @@ -79,7 +83,7 @@ namespace Spring.Scheduling.Quartz [Test] public void TestJobDataAsMap() { - Hashtable data = new Hashtable(); + IDictionary data = new Dictionary(); data["foo"] = "bar"; data["number"] = 123; cronTrigger.JobDataAsMap = data; diff --git a/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/MethodInvokingJobDetailFactoryObjectTest.cs b/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/MethodInvokingJobDetailFactoryObjectTest.cs index 277dde0f..4cafd967 100644 --- a/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/MethodInvokingJobDetailFactoryObjectTest.cs +++ b/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/MethodInvokingJobDetailFactoryObjectTest.cs @@ -18,6 +18,10 @@ using NUnit.Framework; using Quartz; +#if QUARTZ_2_0 +using JobDetail = Quartz.Impl.JobDetailImpl; +#endif + namespace Spring.Scheduling.Quartz { /// @@ -54,7 +58,9 @@ namespace Spring.Scheduling.Quartz Assert.AreEqual(FACTORY_NAME, jd.Name, "job name did not default to factory name"); Assert.AreEqual(jd.JobType, typeof(MethodInvokingJob), "factory did not create method invoking job"); Assert.IsTrue(jd.Durable, "job was not durable"); +#if !QUARTZ_2_0 Assert.IsTrue(jd.Volatile, "job was not volatile"); +#endif } /// @@ -70,6 +76,7 @@ namespace Spring.Scheduling.Quartz Assert.AreEqual(jd.JobType, typeof(StatefulMethodInvokingJob), "factory did not create stateful method invoking job"); } +#if !QUARTZ_2_0 /// /// Tests JobDetail retrieval and it's set properties. /// @@ -82,6 +89,7 @@ namespace Spring.Scheduling.Quartz JobDetail jd = (JobDetail)factory.GetObject(); CollectionAssert.AreEquivalent(LISTENER_NAMES, jd.JobListenerNames); } +#endif } } diff --git a/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/MethodInvokingJobTest.cs b/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/MethodInvokingJobTest.cs index 5212668f..8c56f6a1 100644 --- a/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/MethodInvokingJobTest.cs +++ b/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/MethodInvokingJobTest.cs @@ -27,6 +27,12 @@ using Rhino.Mocks; using Spring.Objects.Support; +#if QUARTZ_2_0 +using JobExecutionContext = Quartz.Impl.JobExecutionContextImpl; +using JobDetail = Quartz.Impl.JobDetailImpl; +using SimpleTrigger = Quartz.Impl.Triggers.SimpleTriggerImpl; +#endif + namespace Spring.Scheduling.Quartz { /// 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 85f42134..f7dda1f4 100644 --- a/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/QuartzSupportTests.cs +++ b/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/QuartzSupportTests.cs @@ -30,6 +30,14 @@ using Spring.Context.Support; using Spring.Objects; using Spring.Objects.Factory.Support; +#if QUARTZ_2_0 +using CronTrigger = Quartz.Impl.Triggers.CronTriggerImpl; +using JobExecutionContext = Quartz.IJobExecutionContext; +using JobDetail = Quartz.Impl.JobDetailImpl; +using SimpleTrigger = Quartz.Impl.Triggers.SimpleTriggerImpl; +using Trigger = Quartz.ITrigger; +#endif + namespace Spring.Scheduling.Quartz { /// @@ -41,17 +49,6 @@ namespace Spring.Scheduling.Quartz [TestFixture] public class QuartzSupportTests { - private MockRepository mockery; - - /// - /// Test setup. - /// - [SetUp] - public void SetUp() - { - mockery = new MockRepository(); - } - /// /// Executes parametrized test. /// @@ -123,28 +120,10 @@ namespace Spring.Scheduling.Quartz trigger1.RepeatInterval = TimeSpan.FromMilliseconds(20); trigger1.AfterPropertiesSet(); - IScheduler scheduler = (IScheduler) mockery.CreateMock(typeof (IScheduler)); + IScheduler scheduler = MockRepository.GenerateMock(); - Expect.Call(scheduler.Context).Return(new SchedulerContext()); - Expect.Call(scheduler.GetJobDetail("myJob0", SchedulerConstants.DefaultGroup)).Return(null); - Expect.Call(scheduler.GetJobDetail("myJob1", SchedulerConstants.DefaultGroup)).Return(null); - Expect.Call(scheduler.GetTrigger("myTrigger0", SchedulerConstants.DefaultGroup)).Return(null); - Expect.Call(scheduler.GetTrigger("myTrigger1", SchedulerConstants.DefaultGroup)).Return(null); + scheduler.Stub(x => x.Context).Return(new SchedulerContext()); - scheduler.AddJob(jobDetail0, true); - LastCall.IgnoreArguments(); - Expect.Call(scheduler.ScheduleJob(trigger0)).Return(DateTime.UtcNow); - scheduler.AddJob(jobDetail1, true); - LastCall.IgnoreArguments(); - Expect.Call(scheduler.ScheduleJob(trigger1)).Return(DateTime.UtcNow); - scheduler.Start(); - LastCall.IgnoreArguments(); - scheduler.Shutdown(false); - LastCall.IgnoreArguments(); - - - mockery.ReplayAll(); - SchedulerFactoryObject schedulerFactoryObject = new TestSchedulerFactoryObject(scheduler); schedulerFactoryObject.JobFactory = (null); IDictionary schedulerContext = new Hashtable(); @@ -165,7 +144,14 @@ namespace Spring.Scheduling.Quartz schedulerFactoryObject.Dispose(); } - mockery.VerifyAll(); + scheduler.AssertWasCalled(x => x.ScheduleJob(trigger0)); + scheduler.AssertWasCalled(x => x.ScheduleJob(trigger1)); + + scheduler.AssertWasCalled(x => x.AddJob(jobDetail0, true)); + scheduler.AssertWasCalled(x => x.AddJob(jobDetail1, true)); + + scheduler.AssertWasCalled(x => x.Start()); + scheduler.AssertWasCalled(x => x.Shutdown(false)); } /// @@ -219,28 +205,21 @@ namespace Spring.Scheduling.Quartz trigger1.RepeatInterval = TimeSpan.FromMilliseconds(20); trigger1.AfterPropertiesSet(); - IScheduler scheduler = (IScheduler) mockery.CreateMock(typeof (IScheduler)); - Expect.Call(scheduler.Context).Return(new SchedulerContext()); - Expect.Call(scheduler.GetTrigger("myTrigger0", SchedulerConstants.DefaultGroup)).Return(null); - Expect.Call(scheduler.GetTrigger("myTrigger1", SchedulerConstants.DefaultGroup)).Return(new SimpleTrigger()); + IScheduler scheduler = MockRepository.GenerateMock(); + scheduler.Stub(x => x.Context).Return(new SchedulerContext()); +#if QUARTZ_2_0 + scheduler.Stub(x => x.GetTrigger(new TriggerKey("myTrigger1", SchedulerConstants.DefaultGroup))).Return(new SimpleTrigger()); +#else + scheduler.Stub(x => x.GetTrigger("myTrigger1", SchedulerConstants.DefaultGroup)).Return(new SimpleTrigger()); +#endif if (overwrite) { - scheduler.AddJob(jobDetail1, true); - LastCall.IgnoreArguments(); - Expect.Call(scheduler.RescheduleJob("myTrigger1", SchedulerConstants.DefaultGroup, trigger1)).Return( - DateTime.UtcNow); +#if QUARTZ_2_0 + scheduler.Stub(x => x.RescheduleJob(new TriggerKey("myTrigger1", SchedulerConstants.DefaultGroup), trigger1)).Return(DateTime.UtcNow); +#else + scheduler.Stub(x => x.RescheduleJob("myTrigger1", SchedulerConstants.DefaultGroup, trigger1)).Return(DateTime.UtcNow); +#endif } - else - { - Expect.Call(scheduler.GetJobDetail("myJob0", SchedulerConstants.DefaultGroup)).Return(null); - } - scheduler.AddJob(jobDetail0, true); - LastCall.IgnoreArguments(); - Expect.Call(scheduler.ScheduleJob(trigger0)).Return(DateTime.UtcNow); - scheduler.Start(); - scheduler.Shutdown(false); - - mockery.ReplayAll(); SchedulerFactoryObject schedulerFactoryObject = new TestSchedulerFactoryObject(scheduler); schedulerFactoryObject.JobFactory = (null); @@ -262,7 +241,10 @@ namespace Spring.Scheduling.Quartz schedulerFactoryObject.Dispose(); } - mockery.VerifyAll(); + scheduler.AssertWasCalled(x => x.AddJob(jobDetail0, true)); + scheduler.AssertWasCalled(x => x.ScheduleJob(trigger0)); + scheduler.AssertWasCalled(x => x.Start()); + scheduler.AssertWasCalled(x => x.Shutdown(false)); } /// @@ -316,37 +298,37 @@ namespace Spring.Scheduling.Quartz trigger1.RepeatInterval = TimeSpan.FromMilliseconds(20); trigger1.AfterPropertiesSet(); - IScheduler scheduler = (IScheduler) mockery.CreateMock(typeof (IScheduler)); - Expect.Call(scheduler.Context).Return(new SchedulerContext()); - Expect.Call(scheduler.GetTrigger("myTrigger0", SchedulerConstants.DefaultGroup)).Return(null); - Expect.Call(scheduler.GetTrigger("myTrigger1", SchedulerConstants.DefaultGroup)).Return(new SimpleTrigger()); + IScheduler scheduler = MockRepository.GenerateMock(); + scheduler.Stub(x => x.Context).Return(new SchedulerContext()); +#if QUARTZ_2_0 + scheduler.Stub(x => x.GetTrigger(new TriggerKey("myTrigger1", SchedulerConstants.DefaultGroup))).Return(new SimpleTrigger()); +#else + scheduler.Stub(x => x.GetTrigger("myTrigger1", SchedulerConstants.DefaultGroup)).Return(new SimpleTrigger()); +#endif if (overwrite) { scheduler.AddJob(jobDetail1, true); - LastCall.IgnoreArguments(); - Expect.Call(scheduler.RescheduleJob("myTrigger1", SchedulerConstants.DefaultGroup, trigger1)).Return( - DateTime.UtcNow); - } - else - { - Expect.Call(scheduler.GetJobDetail("myJob0", SchedulerConstants.DefaultGroup)).Return(null); +#if QUARTZ_2_0 + scheduler.Stub(x => x.RescheduleJob(new TriggerKey("myTrigger1", SchedulerConstants.DefaultGroup), trigger1)).Return(DateTime.UtcNow); +#else + scheduler.Stub(x => x.RescheduleJob("myTrigger1", SchedulerConstants.DefaultGroup, trigger1)).Return(DateTime.UtcNow); +#endif } - scheduler.AddJob(jobDetail0, true); - LastCall.IgnoreArguments(); + scheduler.Stub(x => x.ScheduleJob(trigger0)).Throw(new ObjectAlreadyExistsException("")); - Expect.Call(scheduler.ScheduleJob(trigger0)).Throw(new ObjectAlreadyExistsException("")); if (overwrite) { - Expect.Call(scheduler.RescheduleJob("myTrigger0", SchedulerConstants.DefaultGroup, trigger0)).Return( - DateTime.UtcNow); +#if QUARTZ_2_0 + scheduler.Stub(x => x.RescheduleJob(new TriggerKey("myTrigger0", SchedulerConstants.DefaultGroup), trigger0)).Return(DateTime.UtcNow); +#else + scheduler.Stub(x => x.RescheduleJob("myTrigger0", SchedulerConstants.DefaultGroup, trigger0)).Return(DateTime.UtcNow); +#endif } scheduler.Start(); scheduler.Shutdown(false); - mockery.ReplayAll(); - SchedulerFactoryObject schedulerFactoryObject = new TestSchedulerFactoryObject(scheduler); schedulerFactoryObject.JobFactory = (null); @@ -368,9 +350,11 @@ namespace Spring.Scheduling.Quartz schedulerFactoryObject.Dispose(); } - mockery.VerifyAll(); + scheduler.AssertWasCalled(x => x.AddJob(jobDetail0, true)); + } +#if !QUARTZ_2_0 /// /// [Test] @@ -378,7 +362,7 @@ namespace Spring.Scheduling.Quartz { IJobFactory jobFactory = new AdaptableJobFactory(); - IScheduler scheduler = (IScheduler) mockery.CreateMock(typeof (IScheduler)); + IScheduler scheduler = MockRepository.GenerateMock(); ISchedulerListener schedulerListener = new TestSchedulerListener(); IJobListener globalJobListener = new TestJobListener(); @@ -395,8 +379,6 @@ namespace Spring.Scheduling.Quartz scheduler.Start(); scheduler.Shutdown(false); - mockery.ReplayAll(); - SchedulerFactoryObject schedulerFactoryObject = new TestSchedulerFactoryObject(scheduler); schedulerFactoryObject.JobFactory = (jobFactory); @@ -414,10 +396,9 @@ namespace Spring.Scheduling.Quartz { schedulerFactoryObject.Dispose(); } - - mockery.VerifyAll(); } +#endif /*public void TestMethodInvocationWithConcurrency() { methodInvokingConcurrency(true); }*/ @@ -549,23 +530,8 @@ namespace Spring.Scheduling.Quartz trigger1.RepeatCount = (SimpleTrigger.RepeatIndefinitely); trigger1.RepeatInterval = TimeSpan.FromMilliseconds(20); - IScheduler scheduler = (IScheduler) mockery.CreateMock(typeof (IScheduler)); - Expect.Call(scheduler.JobFactory = (jobFactory)); - Expect.Call(scheduler.GetJobDetail("myJob0", SchedulerConstants.DefaultGroup)).Return(null); - Expect.Call(scheduler.GetJobDetail("myJob1", SchedulerConstants.DefaultGroup)).Return(null); - Expect.Call(scheduler.GetTrigger("myTrigger0", SchedulerConstants.DefaultGroup)).Return(null); - Expect.Call(scheduler.GetTrigger("myTrigger1", SchedulerConstants.DefaultGroup)).Return(null); - scheduler.AddJob(jobDetail0, true); - LastCall.IgnoreArguments(); - scheduler.AddJob(jobDetail1, true); - LastCall.IgnoreArguments(); - Expect.Call(scheduler.ScheduleJob(trigger0)).Return(DateTime.UtcNow); - Expect.Call(scheduler.ScheduleJob(trigger1)).Return(DateTime.UtcNow); - scheduler.Start(); - scheduler.Shutdown(false); - - mockery.ReplayAll(); - + IScheduler scheduler = MockRepository.GenerateMock(); + SchedulerFactoryObject schedulerFactoryObject = new TestSchedulerFactoryObject(scheduler); schedulerFactoryObject.JobFactory = (jobFactory); @@ -581,7 +547,20 @@ namespace Spring.Scheduling.Quartz schedulerFactoryObject.Dispose(); } - mockery.VerifyAll(); + scheduler.AssertWasCalled(x => x.JobFactory = jobFactory); + scheduler.AssertWasCalled(x => x.AddJob(jobDetail0, true)); + scheduler.AssertWasCalled(x => x.AddJob(jobDetail1, true)); +#if QUARTZ_2_0 + scheduler.AssertWasCalled(x => x.GetJobDetail(new JobKey("myJob0", SchedulerConstants.DefaultGroup))); + scheduler.AssertWasCalled(x => x.GetJobDetail(new JobKey("myJob1", SchedulerConstants.DefaultGroup))); + scheduler.AssertWasCalled(x => x.GetTrigger(new TriggerKey("myTrigger0", SchedulerConstants.DefaultGroup))); + scheduler.AssertWasCalled(x => x.GetTrigger(new TriggerKey("myTrigger1", SchedulerConstants.DefaultGroup))); +#else + scheduler.AssertWasCalled(x => x.GetJobDetail("myJob0", SchedulerConstants.DefaultGroup)); + scheduler.AssertWasCalled(x => x.GetJobDetail("myJob1", SchedulerConstants.DefaultGroup)); + scheduler.AssertWasCalled(x => x.GetTrigger("myTrigger0", SchedulerConstants.DefaultGroup)); + scheduler.AssertWasCalled(x => x.GetTrigger("myTrigger1", SchedulerConstants.DefaultGroup)); +#endif } /// @@ -592,13 +571,9 @@ namespace Spring.Scheduling.Quartz TestObject tb = new TestObject("tb", 99); StaticApplicationContext ac = new StaticApplicationContext(); - IScheduler scheduler = (IScheduler) mockery.CreateMock(typeof (IScheduler)); + IScheduler scheduler = MockRepository.GenerateMock(); SchedulerContext schedulerContext = new SchedulerContext(); - Expect.Call(scheduler.Context).Return(schedulerContext).Repeat.Times(4); - scheduler.Start(); - scheduler.Shutdown(false); - - mockery.ReplayAll(); + scheduler.Stub(x => x.Context).Return(schedulerContext).Repeat.Times(4); SchedulerFactoryObject schedulerFactoryObject = new TestSchedulerFactoryObject(scheduler); schedulerFactoryObject.JobFactory = (null); @@ -619,8 +594,6 @@ namespace Spring.Scheduling.Quartz { schedulerFactoryObject.Dispose(); } - - mockery.VerifyAll(); } /// @@ -645,6 +618,7 @@ namespace Spring.Scheduling.Quartz Assert.AreEqual(ac, jobDetail.JobDataMap.Get("appCtx")); } +#if !QUARTZ_2_0 /// /// [Test] @@ -699,7 +673,7 @@ namespace Spring.Scheduling.Quartz ArrayList result = new ArrayList(trigger.TriggerListenerNames); Assert.AreEqual(names, result); } - +#endif /// /// [Test] @@ -744,23 +718,23 @@ namespace Spring.Scheduling.Quartz JobDetail jobDetail = new JobDetailObject(); jobDetail.JobType = typeof (DummyRunnable); - jobDetail.Name = ("myJob"); + jobDetail.Name = "myJob"; SimpleTriggerObject trigger = new SimpleTriggerObject(); - trigger.Name = ("myTrigger"); - trigger.JobDetail = (jobDetail); + trigger.Name = "myTrigger"; + trigger.JobDetail = jobDetail; trigger.StartDelay = TimeSpan.FromMilliseconds(1); trigger.RepeatInterval = TimeSpan.FromMilliseconds(500); - trigger.RepeatCount = (1); + trigger.RepeatCount = 1; trigger.AfterPropertiesSet(); SchedulerFactoryObject factoryObject = new SchedulerFactoryObject(); - factoryObject.Triggers = (new Trigger[] {trigger}); - factoryObject.JobDetails = (new JobDetail[] {jobDetail}); + factoryObject.Triggers = new Trigger[] {trigger}; + factoryObject.JobDetails = new JobDetail[] {jobDetail}; factoryObject.AfterPropertiesSet(); factoryObject.Start(); - Thread.Sleep(500); + DummyRunnable.runEvent.WaitOne(500); Assert.IsTrue(DummyRunnable.count > 0); factoryObject.Dispose(); @@ -901,7 +875,7 @@ namespace Spring.Scheduling.Quartz factoryObject.AfterPropertiesSet(); factoryObject.Start(); - Thread.Sleep(500); + DummyRunnable.runEvent.WaitOne(500); Assert.AreEqual(10, DummyRunnable.param); Assert.IsTrue(DummyRunnable.count > 0); @@ -953,8 +927,8 @@ namespace Spring.Scheduling.Quartz DummyJob.count = 0; SchedulerFactoryObject factoryObject = new SchedulerFactoryObject(); - factoryObject.JobFactory = (new SpringObjectJobFactory()); - factoryObject.JobSchedulingDataLocation = ("job-scheduling-data.xml"); + factoryObject.JobFactory = new SpringObjectJobFactory(); + factoryObject.JobSchedulingDataLocation = "job-scheduling-data.xml"; // TODO bean.ResourceLoader = (new FileSystemResourceLoader()); factoryObject.AfterPropertiesSet(); factoryObject.Start(); @@ -1091,6 +1065,87 @@ namespace Spring.Scheduling.Quartz } +#if QUARTZ_2_0 + private class TestSchedulerListener : ISchedulerListener + { + public void JobScheduled(ITrigger trigger) + { + } + + public void JobUnscheduled(TriggerKey triggerKey) + { + } + + public void TriggerFinalized(ITrigger trigger) + { + } + + public void TriggerPaused(TriggerKey triggerKey) + { + } + + public void TriggersPaused(string triggerGroup) + { + } + + public void TriggerResumed(TriggerKey triggerKey) + { + } + + public void TriggersResumed(string triggerGroup) + { + } + + public void JobAdded(IJobDetail jobDetail) + { + } + + public void JobDeleted(JobKey jobKey) + { + } + + public void JobPaused(JobKey jobKey) + { + } + + public void JobsPaused(string jobGroup) + { + } + + public void JobResumed(JobKey jobKey) + { + } + + public void JobsResumed(string jobGroup) + { + } + + public void SchedulerError(string msg, SchedulerException cause) + { + } + + public void SchedulerInStandbyMode() + { + } + + public void SchedulerStarted() + { + } + + public void SchedulerShutdown() + { + } + + public void SchedulerShuttingdown() + { + } + + public void SchedulingDataCleared() + { + } + } + +#else private class TestSchedulerListener : ISchedulerListener { public void JobScheduled(Trigger trigger) @@ -1129,7 +1184,7 @@ namespace Spring.Scheduling.Quartz { } } - +#endif private class TestJobListener : IJobListener { @@ -1236,19 +1291,7 @@ namespace Spring.Scheduling.Quartz { internal static int param; internal static int count; - - /// - /// Sets param value. - /// - /// - public void SetParam(int value) - { - if (param > 0) - { - throw new NotSupportedException("Param already set"); - } - param = value; - } + internal static readonly ManualResetEvent runEvent = new ManualResetEvent(false); /// /// Runs thread runnable. @@ -1256,6 +1299,7 @@ namespace Spring.Scheduling.Quartz public void Run() { count++; + runEvent.Set(); } } } diff --git a/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/SchedulerFactoryObjectTest.cs b/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/SchedulerFactoryObjectTest.cs index d0490184..80f74f0a 100644 --- a/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/SchedulerFactoryObjectTest.cs +++ b/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/SchedulerFactoryObjectTest.cs @@ -16,21 +16,27 @@ using System; using System.Collections; +using System.Collections.Generic; using System.Collections.Specialized; using System.IO; using System.Reflection; using System.Text; -using System.Threading; - using NUnit.Framework; using Quartz; using Quartz.Impl; - +using Quartz.Spi; using Rhino.Mocks; using Spring.Core.IO; +#if QUARTZ_2_0 +using Trigger = Quartz.ITrigger; +using JobExecutionContext = Quartz.IJobExecutionContext; +using JobDetail = Quartz.IJobDetail; +using SimpleTrigger = Quartz.Impl.Triggers.SimpleTriggerImpl; +#endif + namespace Spring.Scheduling.Quartz { /// @@ -42,7 +48,6 @@ namespace Spring.Scheduling.Quartz { private static readonly MethodInfo m_InitSchedulerFactory = typeof(SchedulerFactoryObject).GetMethod("InitSchedulerFactory", BindingFlags.Instance | BindingFlags.NonPublic); - private MockRepository mockery; private SchedulerFactoryObject factory; /// @@ -52,12 +57,9 @@ namespace Spring.Scheduling.Quartz public void SetUp() { factory = new SchedulerFactoryObject(); - TestSchedulerFactory.Mockery.BackToRecordAll(); - Expect - .Call(TestSchedulerFactory.MockScheduler.SchedulerName) - .Return("scheduler") - .Repeat.Any(); + TestSchedulerFactory.Initialize(); + TestSchedulerFactory.MockScheduler.Stub(x => x.SchedulerName).Return("scheduler").Repeat.Any(); } /// @@ -67,7 +69,6 @@ namespace Spring.Scheduling.Quartz public void TestAfterPropertiesSet_Defaults() { factory.AfterPropertiesSet(); - TestSchedulerFactory.Mockery.ReplayAll(); } /// @@ -78,7 +79,6 @@ namespace Spring.Scheduling.Quartz { factory.JobFactory = null; factory.AfterPropertiesSet(); - TestSchedulerFactory.Mockery.ReplayAll(); } /// @@ -89,67 +89,63 @@ namespace Spring.Scheduling.Quartz { // set expectations TestSchedulerFactory.MockScheduler.JobFactory = null; - LastCall.IgnoreArguments(); - TestSchedulerFactory.Mockery.ReplayAll(); factory.SchedulerFactoryType = typeof(TestSchedulerFactory); factory.AutoStartup = false; factory.AfterPropertiesSet(); + + TestSchedulerFactory.MockScheduler.AssertWasCalled(x => x.JobFactory = null); } +#if !QUARTZ_2_0 /// /// Tests AfterPropertiesSet behavior. /// [Test] public void TestAfterPropertiesSet_AddListeners() { - mockery = new MockRepository(); InitForAfterPropertiesSetTest(); - factory.SchedulerListeners = new ISchedulerListener[] { (ISchedulerListener)mockery.CreateMock(typeof(ISchedulerListener)) }; + factory.SchedulerListeners = new ISchedulerListener[] { MockRepository.GenerateMock() }; TestSchedulerFactory.MockScheduler.AddSchedulerListener(null); LastCall.IgnoreArguments(); - - factory.GlobalJobListeners = new IJobListener[] { (IJobListener)mockery.CreateMock(typeof(IJobListener)) }; + + factory.GlobalJobListeners = new IJobListener[] { MockRepository.GenerateMock() }; TestSchedulerFactory.MockScheduler.AddGlobalJobListener(null); LastCall.IgnoreArguments(); - factory.JobListeners = new IJobListener[] { (IJobListener)mockery.CreateMock(typeof(IJobListener)) }; + factory.JobListeners = new IJobListener[] { MockRepository.GenerateMock() }; TestSchedulerFactory.MockScheduler.AddJobListener(null); LastCall.IgnoreArguments(); - factory.GlobalTriggerListeners = new ITriggerListener[] { (ITriggerListener)mockery.CreateMock(typeof(ITriggerListener)) }; + factory.GlobalTriggerListeners = new ITriggerListener[] { MockRepository.GenerateMock() }; TestSchedulerFactory.MockScheduler.AddGlobalTriggerListener(null); LastCall.IgnoreArguments(); - - factory.TriggerListeners = new ITriggerListener[] { (ITriggerListener)mockery.CreateMock(typeof(ITriggerListener)) }; + + factory.TriggerListeners = new ITriggerListener[] { MockRepository.GenerateMock() }; TestSchedulerFactory.MockScheduler.AddTriggerListener(null); LastCall.IgnoreArguments(); - TestSchedulerFactory.Mockery.ReplayAll(); - mockery.ReplayAll(); factory.AfterPropertiesSet(); } - +#endif /// /// Tests AfterPropertiesSet behavior. /// [Test] public void TestAfterPropertiesSet_Calendars() { - mockery = new MockRepository(); InitForAfterPropertiesSetTest(); const string calendarName = "calendar"; - ICalendar cal = (ICalendar) mockery.CreateMock(typeof (ICalendar)); + ICalendar cal = MockRepository.GenerateMock(); Hashtable calTable = new Hashtable(); calTable[calendarName] = cal; factory.Calendars = calTable; - TestSchedulerFactory.MockScheduler.AddCalendar(calendarName, cal, true, true); - TestSchedulerFactory.Mockery.ReplayAll(); - mockery.ReplayAll(); factory.AfterPropertiesSet(); + + TestSchedulerFactory.MockScheduler.AssertWasCalled(x => x.AddCalendar(calendarName, cal, true, true)); } /// @@ -158,7 +154,6 @@ namespace Spring.Scheduling.Quartz [Test] public void TestAfterPropertiesSet_Trigger_TriggerExists() { - mockery = new MockRepository(); InitForAfterPropertiesSetTest(); const string TRIGGER_NAME = "trigName"; @@ -166,10 +161,12 @@ namespace Spring.Scheduling.Quartz SimpleTrigger trigger = new SimpleTrigger(TRIGGER_NAME, TRIGGER_GROUP); factory.Triggers = new Trigger[] { trigger }; - Expect.Call(TestSchedulerFactory.MockScheduler.GetTrigger(TRIGGER_NAME, TRIGGER_GROUP)).Return(trigger); +#if QUARTZ_2_0 + TestSchedulerFactory.MockScheduler.Stub(x => x.GetTrigger(new TriggerKey(TRIGGER_NAME, TRIGGER_GROUP))).Return(trigger); +#else + TestSchedulerFactory.MockScheduler.Stub(x => x.GetTrigger(TRIGGER_NAME, TRIGGER_GROUP)).Return(trigger); +#endif - TestSchedulerFactory.Mockery.ReplayAll(); - mockery.ReplayAll(); factory.AfterPropertiesSet(); } @@ -179,7 +176,6 @@ namespace Spring.Scheduling.Quartz [Test] public void TestAfterPropertiesSet_Trigger_TriggerDoesntExist() { - mockery = new MockRepository(); InitForAfterPropertiesSetTest(); const string TRIGGER_NAME = "trigName"; @@ -187,15 +183,9 @@ namespace Spring.Scheduling.Quartz SimpleTrigger trigger = new SimpleTrigger(TRIGGER_NAME, TRIGGER_GROUP); factory.Triggers = new Trigger[] { trigger }; - Expect.Call(TestSchedulerFactory.MockScheduler.GetTrigger(TRIGGER_NAME, TRIGGER_GROUP)).Return(null); - TestSchedulerFactory.MockScheduler.ScheduleJob(trigger); - LastCall.IgnoreArguments().Return(DateTime.UtcNow); - - - TestSchedulerFactory.Mockery.ReplayAll(); - mockery.ReplayAll(); factory.AfterPropertiesSet(); + TestSchedulerFactory.MockScheduler.AssertWasCalled(x => x.ScheduleJob(trigger)); } @@ -205,7 +195,6 @@ namespace Spring.Scheduling.Quartz // set expectations factory.SchedulerFactoryType = typeof(TestSchedulerFactory); TestSchedulerFactory.MockScheduler.JobFactory = null; - LastCall.IgnoreArguments(); } /// @@ -214,16 +203,13 @@ namespace Spring.Scheduling.Quartz [Test] public void TestStart() { - // set expectations - TestSchedulerFactory.MockScheduler.JobFactory = null; - LastCall.IgnoreArguments(); - TestSchedulerFactory.MockScheduler.Start(); - TestSchedulerFactory.Mockery.ReplayAll(); - factory.SchedulerFactoryType = typeof(TestSchedulerFactory); factory.AutoStartup = false; factory.AfterPropertiesSet(); factory.Start(); + + TestSchedulerFactory.MockScheduler.AssertWasCalled(x => x.JobFactory = Arg.Is.NotNull); + TestSchedulerFactory.MockScheduler.AssertWasCalled(x => x.Start()); } /// @@ -232,16 +218,13 @@ namespace Spring.Scheduling.Quartz [Test] public void TestStop() { - // set expectations - TestSchedulerFactory.MockScheduler.JobFactory = null; - LastCall.IgnoreArguments(); - TestSchedulerFactory.MockScheduler.Standby(); - TestSchedulerFactory.Mockery.ReplayAll(); - factory.SchedulerFactoryType = typeof(TestSchedulerFactory); factory.AutoStartup = false; factory.AfterPropertiesSet(); factory.Stop(); + + TestSchedulerFactory.MockScheduler.AssertWasCalled(x => x.JobFactory = Arg.Is.NotNull); + TestSchedulerFactory.MockScheduler.AssertWasCalled(x => x.Standby()); } /// @@ -251,7 +234,6 @@ namespace Spring.Scheduling.Quartz public void TestGetObject() { factory.AfterPropertiesSet(); - TestSchedulerFactory.Mockery.ReplayAll(); IScheduler sched = (IScheduler)factory.GetObject(); Assert.IsNotNull(sched, "scheduler was null"); } @@ -263,7 +245,6 @@ namespace Spring.Scheduling.Quartz [ExpectedException(typeof(ArgumentException))] public void TestSchedulerFactoryType_InvalidType() { - TestSchedulerFactory.Mockery.ReplayAll(); factory.SchedulerFactoryType = typeof(SchedulerFactoryObjectTest); } @@ -273,7 +254,6 @@ namespace Spring.Scheduling.Quartz [Test] public void TestSchedulerFactoryType_ValidType() { - TestSchedulerFactory.Mockery.ReplayAll(); factory.SchedulerFactoryType = typeof(StdSchedulerFactory); } @@ -283,8 +263,6 @@ namespace Spring.Scheduling.Quartz [Test] public void TestInitSchedulerFactory_MinimalDefaults() { - TestSchedulerFactory.Mockery.ReplayAll(); - factory.SchedulerName = "testFactoryObject"; StdSchedulerFactory factoryToPass = new StdSchedulerFactory(); m_InitSchedulerFactory.Invoke(factory, new object[] { factoryToPass }); @@ -315,8 +293,6 @@ ConnectionStringKey+ " = " + ConnectionStringValue + Environment.NewLine + // intercept call InterceptingStdSChedulerFactory factoryToPass = new InterceptingStdSChedulerFactory(); - TestSchedulerFactory.Mockery.ReplayAll(); - factory.ConfigLocation = new TestConfigLocation(ms, "description"); m_InitSchedulerFactory.Invoke(factory, new object[] { factoryToPass }); @@ -324,21 +300,6 @@ ConnectionStringKey+ " = " + ConnectionStringValue + Environment.NewLine + Assert.AreEqual(ConnectionStringValue, factoryToPass.Properties[ConnectionStringKey]); } - - /// - /// Cleans this test instance. - /// - [TearDown] - public void TearDown() - { - TestSchedulerFactory.Mockery.VerifyAll(); - if (mockery != null) - { - mockery.VerifyAll(); - } - } - - } internal class TestConfigLocation : InputStreamResource @@ -353,21 +314,7 @@ ConnectionStringKey+ " = " + ConnectionStringValue + Environment.NewLine + /// public class TestSchedulerFactory : ISchedulerFactory { - private static readonly MockRepository mockery = new MockRepository(); - private static readonly IScheduler mockScheduler; - - static TestSchedulerFactory() - { - mockScheduler = (IScheduler) mockery.CreateMock(typeof (IScheduler)); - } - - /// - /// MockRepository intance. - /// - public static MockRepository Mockery - { - get { return mockery; } - } + private static IScheduler mockScheduler; /// /// The mocked scheduler. @@ -394,12 +341,26 @@ ConnectionStringKey+ " = " + ConnectionStringValue + Environment.NewLine + return mockScheduler; } +#if QUARTZ_2_0 + /// + /// + public ICollection AllSchedulers + { + get { return new List(); } + } +#else /// /// public ICollection AllSchedulers { get { return new ArrayList(); } } +#endif + + public static void Initialize() + { + mockScheduler = MockRepository.GenerateMock(); + } } /// diff --git a/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/SimpleTriggerObjectTest.cs b/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/SimpleTriggerObjectTest.cs index 75728f53..28de1180 100644 --- a/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/SimpleTriggerObjectTest.cs +++ b/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/SimpleTriggerObjectTest.cs @@ -16,12 +16,17 @@ using System; using System.Collections; - +using System.Collections.Generic; using NUnit.Framework; using Quartz; using Quartz.Job; +#if QUARTZ_2_0 +using JobDetail = Quartz.Impl.JobDetailImpl; +#endif + + namespace Spring.Scheduling.Quartz { /// @@ -113,7 +118,7 @@ namespace Spring.Scheduling.Quartz [Test] public void TestJobDataAsMap() { - Hashtable data = new Hashtable(); + IDictionary data = new Dictionary(); data["foo"] = "bar"; data["number"] = 123; simpleTrigger.JobDataAsMap = data; diff --git a/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/SpringObjectJobFactoryTest.cs b/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/SpringObjectJobFactoryTest.cs index 5c6bb473..72208740 100644 --- a/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/SpringObjectJobFactoryTest.cs +++ b/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/SpringObjectJobFactoryTest.cs @@ -15,13 +15,20 @@ */ using System.Collections; - +using System.Collections.Generic; using NUnit.Framework; using Quartz; using Quartz.Job; using Quartz.Spi; +#if QUARTZ_2_0 +using Trigger = Quartz.Spi.IOperableTrigger; +using JobExecutionContext = Quartz.IJobExecutionContext; +using JobDetail = Quartz.IJobDetail; +using SimpleTrigger = Quartz.Impl.Triggers.SimpleTriggerImpl; +#endif + namespace Spring.Scheduling.Quartz { /// @@ -51,7 +58,11 @@ namespace Spring.Scheduling.Quartz Trigger trigger = new SimpleTrigger(); TriggerFiredBundle bundle = TestUtil.CreateMinimalFiredBundleWithTypedJobDetail(typeof (NoOpJob), trigger); +#if QUARTZ_2_0 + IJob job = factory.NewJob(bundle, null); +#else IJob job = factory.NewJob(bundle); +#endif Assert.IsNotNull(job, "Created job was null"); } @@ -61,14 +72,23 @@ namespace Spring.Scheduling.Quartz [Test] public void TestCreateJobInstance_SchedulerContextGiven() { + Trigger trigger = new SimpleTrigger(); + TriggerFiredBundle bundle = TestUtil.CreateMinimalFiredBundleWithTypedJobDetail(typeof(InjectableJob), trigger); + +#if QUARTZ_2_0 + IDictionary items = new Dictionary(); + items["foo"] = "bar"; + items["number"] = 123; + factory.SchedulerContext = new SchedulerContext(items); + InjectableJob job = (InjectableJob)factory.NewJob(bundle, null); +#else IDictionary items = new Hashtable(); items["foo"] = "bar"; items["number"] = 123; factory.SchedulerContext = new SchedulerContext(items); - Trigger trigger = new SimpleTrigger(); - TriggerFiredBundle bundle = TestUtil.CreateMinimalFiredBundleWithTypedJobDetail(typeof(InjectableJob), trigger); - InjectableJob job = (InjectableJob) factory.NewJob(bundle); +#endif + Assert.IsNotNull(job, "Created job was null"); Assert.AreEqual("bar", job.Foo, "string injection failed"); Assert.AreEqual(123, job.Number, "integer injection failed"); @@ -86,7 +106,11 @@ namespace Spring.Scheduling.Quartz trigger.JobDataMap["number"] = 123; TriggerFiredBundle bundle = TestUtil.CreateMinimalFiredBundleWithTypedJobDetail(typeof(InjectableJob), trigger); +#if QUARTZ_2_0 + InjectableJob job = (InjectableJob)factory.NewJob(bundle, null); +#else InjectableJob job = (InjectableJob)factory.NewJob(bundle); +#endif Assert.IsNotNull(job, "Created job was null"); Assert.AreEqual(123, job.Number, "integer injection failed"); Assert.IsNull(job.Foo, "foo was injected when it was not supposed to "); diff --git a/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/TestUtil.cs b/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/TestUtil.cs index bb2be2d9..367b8bb2 100644 --- a/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/TestUtil.cs +++ b/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/TestUtil.cs @@ -19,6 +19,11 @@ using System; using Quartz; using Quartz.Spi; +#if QUARTZ_2_0 +using JobDetail = Quartz.Impl.JobDetailImpl; +using Trigger = Quartz.Spi.IOperableTrigger; +#endif + namespace Spring.Scheduling.Quartz { /// diff --git a/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/TriggerObjectTest.cs b/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/TriggerObjectTest.cs index 3223203f..516c9bf9 100644 --- a/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/TriggerObjectTest.cs +++ b/test/Spring/Spring.Scheduling.Quartz.Tests/Scheduling/Quartz/TriggerObjectTest.cs @@ -22,6 +22,10 @@ using Quartz; using Spring.Objects.Factory; +#if QUARTZ_2_0 +using Trigger = Quartz.Spi.IOperableTrigger; +#endif + namespace Spring.Scheduling.Quartz { /// @@ -31,6 +35,7 @@ namespace Spring.Scheduling.Quartz public abstract class TriggerObjectTest { private Trigger trigger; + /// /// Constant name for tested triggers. /// @@ -52,11 +57,17 @@ namespace Spring.Scheduling.Quartz { ((IInitializingObject) trigger).AfterPropertiesSet(); +#if QUARTZ_2_0 + Assert.AreEqual(TRIGGER_NAME, trigger.Key.Name, "trigger name mismatch"); + Assert.AreEqual(SchedulerConstants.DefaultGroup, trigger.Key.Group, "trigger group name mismatch"); + Assert.IsNull(trigger.JobKey, "trigger job name not null"); +#else Assert.AreEqual(TRIGGER_NAME, trigger.Name, "trigger name mismatch"); Assert.AreEqual(SchedulerConstants.DefaultGroup, trigger.Group, "trigger group name mismatch"); - AssertDateTimesEqualityWithAllowedDelta(DateTime.UtcNow, trigger.StartTimeUtc, 1000); Assert.IsNull(trigger.JobName, "trigger job name not null"); Assert.AreEqual(SchedulerConstants.DefaultGroup, trigger.JobGroup, "trigger job group was not default"); +#endif + AssertDateTimesEqualityWithAllowedDelta(DateTime.UtcNow, trigger.StartTimeUtc, 1000); } /// @@ -69,12 +80,18 @@ namespace Spring.Scheduling.Quartz const string NAME = "newName"; const string GROUP = "newGroup"; - DateTime START_TIME = new DateTime(10000000); + DateTime START_TIME = new DateTime(1982, 6, 28, 13, 10, 0); + trigger.StartTimeUtc = START_TIME; +#if QUARTZ_2_0 + trigger.Key = new TriggerKey(NAME, GROUP); + Assert.AreEqual(NAME, trigger.Key.Name, "trigger name mismatch"); + Assert.AreEqual(GROUP, trigger.Key.Group, "trigger group name mismatch"); +#else trigger.Name = NAME; trigger.Group = GROUP; - trigger.StartTimeUtc = START_TIME; Assert.AreEqual(NAME, trigger.Name, "trigger name mismatch"); Assert.AreEqual(GROUP, trigger.Group, "trigger group name mismatch"); +#endif AssertDateTimesEqualityWithAllowedDelta(START_TIME, trigger.StartTimeUtc, 1000); } @@ -88,10 +105,42 @@ namespace Spring.Scheduling.Quartz const string jobName = "jobName"; const string jobGroup = "jobGroup"; +#if QUARTZ_2_0 + Assert.AreEqual(jobName, trigger.JobKey.Name, "trigger job name was not from job detail"); + Assert.AreEqual(jobGroup, trigger.JobKey.Group, "trigger job group was not from job detail"); +#else Assert.AreEqual(jobName, trigger.JobName, "trigger job name was not from job detail"); Assert.AreEqual(jobGroup, trigger.JobGroup, "trigger job group was not from job detail"); +#endif } +#if QUARTZ_2_0 + /// + /// Tests whether two datetimes are close enough. + /// + /// + /// + /// + protected static void AssertDateTimesEqualityWithAllowedDelta(DateTimeOffset d1, DateTimeOffset d2, int allowedDeltaInMilliseconds) + { + int diffInMillis = (int) Math.Abs((d1 - d2).TotalMilliseconds); + Assert.LessOrEqual(diffInMillis, allowedDeltaInMilliseconds, "too much difference in times"); + } +#else + + /// + /// Tests whether two datetimes are close enough. + /// + /// + /// + /// + protected static void AssertDateTimesEqualityWithAllowedDelta(DateTime d1, DateTime d2, int allowedDeltaInMilliseconds) + { + int diffInMillis = (int)Math.Abs((d1 - d2).TotalMilliseconds); + Assert.LessOrEqual(diffInMillis, allowedDeltaInMilliseconds, "too much difference in times"); + } + + /// /// Tests that TriggerObject defaults values as expected in AfterPropertiesSet. /// @@ -104,18 +153,7 @@ namespace Spring.Scheduling.Quartz trigger.TriggerListenerNames = LISTENER_NAMES; CollectionAssert.AreEqual(LISTENER_NAMES, trigger.TriggerListenerNames, "Trigger listeners were not equal"); } - - /// - /// Tests whether two datetimes are close enough. - /// - /// - /// - /// - protected static void AssertDateTimesEqualityWithAllowedDelta(DateTime d1, DateTime d2, int allowedDeltaInMilliseconds) - { - int diffInMillis = (int) Math.Abs((d1 - d2).TotalMilliseconds); - Assert.LessOrEqual(diffInMillis, allowedDeltaInMilliseconds, "too much difference in times"); - } +#endif } } diff --git a/test/Spring/Spring.Scheduling.Quartz.Tests/Spring.Scheduling.Quartz.Tests.2008.csproj b/test/Spring/Spring.Scheduling.Quartz.Tests/Spring.Scheduling.Quartz.Tests.2008.csproj index b23cdfc6..52c7a11f 100644 --- a/test/Spring/Spring.Scheduling.Quartz.Tests/Spring.Scheduling.Quartz.Tests.2008.csproj +++ b/test/Spring/Spring.Scheduling.Quartz.Tests/Spring.Scheduling.Quartz.Tests.2008.csproj @@ -36,15 +36,19 @@ False ..\..\..\lib\net\2.0\nunit.framework.dll - + False - ..\..\..\lib\net\2.0\Quartz.dll + ..\..\..\lib\Quartz10\net\2.0\Quartz.dll False ..\..\..\lib\Net\2.0\Rhino.Mocks.dll + + 3.5 + C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll + diff --git a/test/Spring/Spring.Scheduling.Quartz.Tests/Spring.Scheduling.Quartz.Tests.2010.csproj b/test/Spring/Spring.Scheduling.Quartz.Tests/Spring.Scheduling.Quartz.Tests.2010.csproj index c3110ffa..453a3317 100644 --- a/test/Spring/Spring.Scheduling.Quartz.Tests/Spring.Scheduling.Quartz.Tests.2010.csproj +++ b/test/Spring/Spring.Scheduling.Quartz.Tests/Spring.Scheduling.Quartz.Tests.2010.csproj @@ -42,8 +42,9 @@ False ..\..\..\lib\net\2.0\nunit.framework.dll - - ..\..\..\lib\Net\3.5\Quartz.dll + + False + ..\..\..\lib\Quartz10\net\3.5\Quartz.dll False diff --git a/test/Spring/Spring.Scheduling.Quartz20.Integration.Tests/Scheduling/Quartz/LocalDataSourceJobStoreTest.cs b/test/Spring/Spring.Scheduling.Quartz20.Integration.Tests/Scheduling/Quartz/LocalDataSourceJobStoreTest.cs new file mode 100644 index 00000000..ed252cce --- /dev/null +++ b/test/Spring/Spring.Scheduling.Quartz20.Integration.Tests/Scheduling/Quartz/LocalDataSourceJobStoreTest.cs @@ -0,0 +1,51 @@ +#region License + +/* + * Copyright © 2002-2007 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#endregion + +#region Imports + +using System.Threading; + +using NUnit.Framework; +using Spring.Context; +using Spring.Context.Support; + +#endregion +namespace Spring.Scheduling.Quartz.Integration.Tests +{ + [TestFixture] + public class LocalDataSourceJobStoreTest + { + private IApplicationContext ctx; + + [SetUp] + public void SetUp() + { + ctx = new XmlApplicationContext("assembly://Spring.Scheduling.Quartz20.Integration.Tests/Spring.Scheduling.Quartz/LocalDataSourceJobStoreTest.xml"); + } + + [Test] + public void TestLocalDataSourceJobStore() + { + // sleep 20 seconds + Thread.Sleep(20000); + } + + } +} \ No newline at end of file diff --git a/test/Spring/Spring.Scheduling.Quartz20.Integration.Tests/Scheduling/Quartz/LocalDataSourceJobStoreTest.xml b/test/Spring/Spring.Scheduling.Quartz20.Integration.Tests/Scheduling/Quartz/LocalDataSourceJobStoreTest.xml new file mode 100644 index 00000000..0ed66382 --- /dev/null +++ b/test/Spring/Spring.Scheduling.Quartz20.Integration.Tests/Scheduling/Quartz/LocalDataSourceJobStoreTest.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/Spring/Spring.Scheduling.Quartz20.Integration.Tests/Scheduling/Quartz/TestJob.cs b/test/Spring/Spring.Scheduling.Quartz20.Integration.Tests/Scheduling/Quartz/TestJob.cs new file mode 100644 index 00000000..4e4c784b --- /dev/null +++ b/test/Spring/Spring.Scheduling.Quartz20.Integration.Tests/Scheduling/Quartz/TestJob.cs @@ -0,0 +1,20 @@ +using System; + +using Quartz; + +namespace Spring.Scheduling.Quartz.Integration.Tests +{ + public class TestJob : IJob + { + public void Execute(IJobExecutionContext context) + { + Console.WriteLine("Executing Execute!"); + } + + public void DoIt() + { + Console.WriteLine("Executing DoIt!"); + } + + } +} \ No newline at end of file diff --git a/test/Spring/Spring.Scheduling.Quartz20.Integration.Tests/Spring.Scheduling.Quartz20.Integration.Tests.2008.csproj b/test/Spring/Spring.Scheduling.Quartz20.Integration.Tests/Spring.Scheduling.Quartz20.Integration.Tests.2008.csproj new file mode 100644 index 00000000..51a816f6 --- /dev/null +++ b/test/Spring/Spring.Scheduling.Quartz20.Integration.Tests/Spring.Scheduling.Quartz20.Integration.Tests.2008.csproj @@ -0,0 +1,81 @@ + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {8CF0F34A-CC93-4D87-AE14-A2DEEF072F26} + Library + Properties + Spring + Spring.Scheduling.Quartz20.Integration.Tests + v3.5 + + + true + full + false + ..\..\..\build\VS.NET.2008\Spring.Scheduling.Quartz20.Integration.Tests\Debug\ + TRACE;DEBUG;NET_2_0;NET_3_5 + prompt + 4 + + + pdbonly + true + ..\..\..\build\VS.NET.2008\Spring.Scheduling.Quartz20.Integration.Tests\Release\ + TRACE;NET_2_0;NET_3_5 + prompt + 4 + + + + False + ..\..\..\lib\Quartz20\net\3.5\C5.dll + + + False + ..\..\..\lib\net\2.0\nunit.framework.dll + + + False + ..\..\..\lib\Quartz20\net\3.5\Quartz.dll + + + False + ..\..\..\lib\Net\2.0\Rhino.Mocks.dll + + + + 3.5 + + + + + + + PreserveNewest + + + + + + + + + + + + {710961A3-0DF4-49E4-A26E-F5B9C044AC84} + Spring.Core.2008 + + + + + \ No newline at end of file diff --git a/test/Spring/Spring.Scheduling.Quartz20.Integration.Tests/Spring.Scheduling.Quartz20.Integration.Tests.2010.csproj b/test/Spring/Spring.Scheduling.Quartz20.Integration.Tests/Spring.Scheduling.Quartz20.Integration.Tests.2010.csproj new file mode 100644 index 00000000..69770f2f --- /dev/null +++ b/test/Spring/Spring.Scheduling.Quartz20.Integration.Tests/Spring.Scheduling.Quartz20.Integration.Tests.2010.csproj @@ -0,0 +1,127 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {8CF0F34A-CC93-4D87-AE14-A2DEEF072F26} + Library + Properties + Spring + Spring.Scheduling.Quartz20.Integration.Tests + v4.0 + + + 3.5 + + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + + + + true + full + false + ..\..\..\build\VS.NET.2008\Spring.Scheduling.Quartz20.Integration.Tests\Debug\ + TRACE;DEBUG;NET_2_0;NET_3_5,QUARTZ_2_0 + prompt + 4 + + + pdbonly + true + ..\..\..\build\VS.NET.2008\Spring.Scheduling.Quartz20.Integration.Tests\Release\ + TRACE;NET_2_0;NET_3_5 + prompt + 4 + + + + False + ..\..\..\lib\Quartz20\net\3.5\C5.dll + + + False + ..\..\..\lib\net\2.0\nunit.framework.dll + + + False + ..\..\..\lib\Quartz20\net\3.5\Quartz.dll + + + False + ..\..\..\lib\Net\2.0\Rhino.Mocks.dll + + + + 3.5 + + + + + + + PreserveNewest + + + + + + + + + + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + true + + + False + Windows Installer 3.1 + true + + + + + {710961A3-0DF4-49E4-A26E-F5B9C044AC84} + Spring.Core.2010 + + + {AE00E5AB-C39A-436F-86D2-33BFE33E2E40} + Spring.Data.2010 + + + {E823D54C-CE82-4868-929F-5F95A999F123} + Spring.Scheduling.Quartz20.2010 + + + + + \ No newline at end of file diff --git a/test/Spring/Spring.Scheduling.Quartz20.Integration.Tests/Spring.Scheduling.Quartz20.Integration.Tests.build b/test/Spring/Spring.Scheduling.Quartz20.Integration.Tests/Spring.Scheduling.Quartz20.Integration.Tests.build new file mode 100644 index 00000000..aacf3c9f --- /dev/null +++ b/test/Spring/Spring.Scheduling.Quartz20.Integration.Tests/Spring.Scheduling.Quartz20.Integration.Tests.build @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/Spring/Spring.Scheduling.Quartz20.Integration.Tests/Spring.Scheduling.Quartz20.Integration.Tests.dll.config b/test/Spring/Spring.Scheduling.Quartz20.Integration.Tests/Spring.Scheduling.Quartz20.Integration.Tests.dll.config new file mode 100644 index 00000000..62e3d45e --- /dev/null +++ b/test/Spring/Spring.Scheduling.Quartz20.Integration.Tests/Spring.Scheduling.Quartz20.Integration.Tests.dll.config @@ -0,0 +1,41 @@ + + + + + +
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/Spring/Spring.Scheduling.Quartz20.Tests/Spring.Scheduling.Quartz20.Tests.2008.csproj b/test/Spring/Spring.Scheduling.Quartz20.Tests/Spring.Scheduling.Quartz20.Tests.2008.csproj new file mode 100644 index 00000000..a83dc9e2 --- /dev/null +++ b/test/Spring/Spring.Scheduling.Quartz20.Tests/Spring.Scheduling.Quartz20.Tests.2008.csproj @@ -0,0 +1,142 @@ + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {47E7DF97-2515-4F2F-BBFD-0A4C205800DE} + Library + Properties + Spring + Spring.Scheduling.Quartz20.Tests + v2.0 + + + true + full + false + ..\..\..\build\VS.NET.2008\Spring.Scheduling.Quartz20.Tests\Debug\ + TRACE;DEBUG;NET_2_0 + prompt + 4 + + + true + + + pdbonly + true + ..\..\..\build\VS.NET.2008\Spring.Scheduling.Quartz20.Tests\Release\ + TRACE;NET_2_0 + prompt + 4 + + + + False + ..\..\..\lib\Quartz20\net\3.5\C5.dll + + + False + ..\..\..\lib\net\2.0\nunit.framework.dll + + + False + ..\..\..\lib\Quartz20\net\3.5\Quartz.dll + + + False + ..\..\..\lib\Net\2.0\Rhino.Mocks.dll + + + + + + + + QuartzCompilerOptionsTests.cs + + + Scheduling\Quartz\AdaptableJobFactoryTest.cs + + + Scheduling\Quartz\CronTriggerObjectTest.cs + + + Scheduling\Quartz\JobDetailObjectTest.cs + + + Scheduling\Quartz\MethodInvokingJobDetailFactoryObjectTest.cs + + + Scheduling\Quartz\MethodInvokingJobTest.cs + + + Scheduling\Quartz\QuartzSupportTests.cs + + + Scheduling\Quartz\QuartzTestObject.cs + + + Scheduling\Quartz\SchedulerFactoryObjectTest.cs + + + Scheduling\Quartz\SimpleTriggerObjectTest.cs + + + Scheduling\Quartz\SpringObjectJobFactoryTest.cs + + + Scheduling\Quartz\TestMethodInvokingTask.cs + + + Scheduling\Quartz\TestUtil.cs + + + Scheduling\Quartz\TriggerObjectTest.cs + + + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + + + {710961A3-0DF4-49E4-A26E-F5B9C044AC84} + Spring.Core.2008 + + + {E823D54C-CE82-4868-929F-5F95A999F61E} + Spring.Scheduling.Quartz20.2008 + + + {44B16BAA-6DF8-447C-9D7F-3AD3D854D904} + Spring.Core.Tests.2008 + + + + + + + + + \ No newline at end of file diff --git a/test/Spring/Spring.Scheduling.Quartz20.Tests/Spring.Scheduling.Quartz20.Tests.2010.csproj b/test/Spring/Spring.Scheduling.Quartz20.Tests/Spring.Scheduling.Quartz20.Tests.2010.csproj new file mode 100644 index 00000000..1f89d57d --- /dev/null +++ b/test/Spring/Spring.Scheduling.Quartz20.Tests/Spring.Scheduling.Quartz20.Tests.2010.csproj @@ -0,0 +1,148 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {247787CF-ECE1-4675-8B42-7DF4329A4891} + Library + Properties + Spring + Spring.Scheduling.Quartz20.Tests + v4.0 + + + 3.5 + + + + + true + full + false + ..\..\..\build\VS.NET.2010\Spring.Scheduling.Quartz20.Tests\Debug\ + TRACE;DEBUG;NET_2_0,QUARTZ_2_0 + prompt + 4 + + + true + + + pdbonly + true + ..\..\..\build\VS.NET.2010\Spring.Scheduling.Quartz20.Tests\Release\ + TRACE;NET_2_0 + prompt + 4 + + + + False + ..\..\..\lib\Quartz20\net\3.5\C5.dll + + + False + ..\..\..\lib\net\2.0\nunit.framework.dll + + + ..\..\..\lib\Quartz20\net\3.5\Quartz.dll + + + False + ..\..\..\lib\Net\2.0\Rhino.Mocks.dll + + + + + + + + {710961A3-0DF4-49E4-A26E-F5B9C044AC84} + Spring.Core.2010 + + + {E823D54C-CE82-4868-929F-5F95A999F123} + Spring.Scheduling.Quartz20.2010 + + + {44B16BAA-6DF8-447C-9D7F-3AD3D854D904} + Spring.Core.Tests.2010 + + + + + QuartzCompilerOptionsTests.cs + + + Scheduling\Quartz\AdaptableJobFactoryTest.cs + + + Scheduling\Quartz\CronTriggerObjectTest.cs + + + Scheduling\Quartz\JobDetailObjectTest.cs + + + Scheduling\Quartz\MethodInvokingJobDetailFactoryObjectTest.cs + + + Scheduling\Quartz\MethodInvokingJobTest.cs + + + Scheduling\Quartz\QuartzSupportTests.cs + + + Scheduling\Quartz\QuartzTestObject.cs + + + Scheduling\Quartz\SchedulerFactoryObjectTest.cs + + + Scheduling\Quartz\SimpleTriggerObjectTest.cs + + + Scheduling\Quartz\SpringObjectJobFactoryTest.cs + + + Scheduling\Quartz\TestMethodInvokingTask.cs + + + Scheduling\Quartz\TestUtil.cs + + + Scheduling\Quartz\TriggerObjectTest.cs + + + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + + + PreserveNewest + + + + + \ No newline at end of file diff --git a/test/Spring/Spring.Scheduling.Quartz20.Tests/Spring.Scheduling.Quartz20.Tests.build b/test/Spring/Spring.Scheduling.Quartz20.Tests/Spring.Scheduling.Quartz20.Tests.build new file mode 100644 index 00000000..611ae2c6 --- /dev/null +++ b/test/Spring/Spring.Scheduling.Quartz20.Tests/Spring.Scheduling.Quartz20.Tests.build @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/Spring/Spring.Scheduling.Quartz20.Tests/Spring.Scheduling.Quartz20.Tests.dll.config b/test/Spring/Spring.Scheduling.Quartz20.Tests/Spring.Scheduling.Quartz20.Tests.dll.config new file mode 100644 index 00000000..c7be6526 --- /dev/null +++ b/test/Spring/Spring.Scheduling.Quartz20.Tests/Spring.Scheduling.Quartz20.Tests.dll.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/test/Spring/Spring.Scheduling.Quartz20.Tests/job-scheduling-data.xml b/test/Spring/Spring.Scheduling.Quartz20.Tests/job-scheduling-data.xml new file mode 100644 index 00000000..ae514ab9 --- /dev/null +++ b/test/Spring/Spring.Scheduling.Quartz20.Tests/job-scheduling-data.xml @@ -0,0 +1,39 @@ + + + + + + true + + + + + + myJob + myGroup + Spring.Scheduling.Quartz.DummyJob, Spring.Scheduling.Quartz20.Tests + true + false + + + param + 10 + + + + + + + myTrigger + myGroup + myJob + myGroup + 1 + 500 + + + + + diff --git a/test/Spring/Spring.Scheduling.Quartz20.Tests/multipleAnonymousMethodInvokingJobDetailFB.xml b/test/Spring/Spring.Scheduling.Quartz20.Tests/multipleAnonymousMethodInvokingJobDetailFB.xml new file mode 100644 index 00000000..f74e63f3 --- /dev/null +++ b/test/Spring/Spring.Scheduling.Quartz20.Tests/multipleAnonymousMethodInvokingJobDetailFB.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/Spring/Spring.Scheduling.Quartz20.Tests/multipleSchedulers.xml b/test/Spring/Spring.Scheduling.Quartz20.Tests/multipleSchedulers.xml new file mode 100644 index 00000000..964e0e03 --- /dev/null +++ b/test/Spring/Spring.Scheduling.Quartz20.Tests/multipleSchedulers.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + diff --git a/test/Spring/Spring.Scheduling.Quartz20.Tests/schedulerAccessorObject.xml b/test/Spring/Spring.Scheduling.Quartz20.Tests/schedulerAccessorObject.xml new file mode 100644 index 00000000..7f3d12e6 --- /dev/null +++ b/test/Spring/Spring.Scheduling.Quartz20.Tests/schedulerAccessorObject.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/Spring/Spring.Scheduling.Quartz20.Tests/schedulerRepositoryExposure.xml b/test/Spring/Spring.Scheduling.Quartz20.Tests/schedulerRepositoryExposure.xml new file mode 100644 index 00000000..a20599b5 --- /dev/null +++ b/test/Spring/Spring.Scheduling.Quartz20.Tests/schedulerRepositoryExposure.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +