From 7981bba417c4591786d11a35b8e99ce54bca3600 Mon Sep 17 00:00:00 2001 From: sbohlen Date: Tue, 7 Dec 2010 20:37:42 +0000 Subject: [PATCH] SPRNET-1327 --- lib/Net/3.5/Quartz.dll | Bin 0 -> 438272 bytes lib/Net/3.5/Quartz.xml | 17105 ++++++++++++++++ lib/Net/4.0/Quartz.dll | Bin 0 -> 438272 bytes lib/Net/4.0/Quartz.xml | 17105 ++++++++++++++++ .../Spring.Scheduling.Quartz.build | 9 +- .../Spring.Scheduling.Quartz.Tests.build | 16 +- 6 files changed, 34225 insertions(+), 10 deletions(-) create mode 100644 lib/Net/3.5/Quartz.dll create mode 100644 lib/Net/3.5/Quartz.xml create mode 100644 lib/Net/4.0/Quartz.dll create mode 100644 lib/Net/4.0/Quartz.xml diff --git a/lib/Net/3.5/Quartz.dll b/lib/Net/3.5/Quartz.dll new file mode 100644 index 0000000000000000000000000000000000000000..d0aeb95428897bc80f98d845f32747de8a2764a1 GIT binary patch literal 438272 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 z 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 I+&B#U|71)EEC2ui literal 0 HcmV?d00001 diff --git a/lib/Net/3.5/Quartz.xml b/lib/Net/3.5/Quartz.xml new file mode 100644 index 00000000..76eeeb5b --- /dev/null +++ b/lib/Net/3.5/Quartz.xml @@ -0,0 +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. + +
+
diff --git a/lib/Net/4.0/Quartz.dll b/lib/Net/4.0/Quartz.dll new file mode 100644 index 0000000000000000000000000000000000000000..d0aeb95428897bc80f98d845f32747de8a2764a1 GIT binary patch literal 438272 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 z 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 I+&B#U|71)EEC2ui literal 0 HcmV?d00001 diff --git a/lib/Net/4.0/Quartz.xml b/lib/Net/4.0/Quartz.xml new file mode 100644 index 00000000..76eeeb5b --- /dev/null +++ b/lib/Net/4.0/Quartz.xml @@ -0,0 +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. + +
+
diff --git a/src/Spring/Spring.Scheduling.Quartz/Spring.Scheduling.Quartz.build b/src/Spring/Spring.Scheduling.Quartz/Spring.Scheduling.Quartz.build index e37f0b60..a8829365 100644 --- a/src/Spring/Spring.Scheduling.Quartz/Spring.Scheduling.Quartz.build +++ b/src/Spring/Spring.Scheduling.Quartz/Spring.Scheduling.Quartz.build @@ -23,13 +23,16 @@ - - + + + + + - + diff --git a/test/Spring/Spring.Scheduling.Quartz.Tests/Spring.Scheduling.Quartz.Tests.build b/test/Spring/Spring.Scheduling.Quartz.Tests/Spring.Scheduling.Quartz.Tests.build index eb5cefde..a8a5f888 100644 --- a/test/Spring/Spring.Scheduling.Quartz.Tests/Spring.Scheduling.Quartz.Tests.build +++ b/test/Spring/Spring.Scheduling.Quartz.Tests/Spring.Scheduling.Quartz.Tests.build @@ -30,15 +30,17 @@ - - - - + + + + - - - + + + + +