Class JobStoreSupport
- java.lang.Object
-
- org.quartz.impl.jdbcjobstore.JobStoreSupport
-
- Direct Known Subclasses:
JobStoreCMT
,JobStoreTX
public abstract class JobStoreSupport extends java.lang.Object implements JobStore, Constants
Contains base functionality for JDBC-based JobStore implementations.
- Author:
- Jeffrey Wescott, James House
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description protected static class
JobStoreSupport.RecoverMisfiredJobsResult
Helper class for returning the composite result of trying to recover misfired jobs.protected static interface
JobStoreSupport.TransactionCallback<T>
Implement this interface to provide the code to execute within the a transaction template.protected static interface
JobStoreSupport.TransactionValidator<T>
protected class
JobStoreSupport.VoidTransactionCallback
Implement this interface to provide the code to execute within the a transaction template that has no return value.
-
Field Summary
Fields Modifier and Type Field Description protected java.util.HashMap<java.lang.String,Calendar>
calendarCache
protected java.lang.Class<? extends DriverDelegate>
delegateClass
protected java.lang.String
delegateClassName
protected java.lang.String
delegateInitString
protected java.lang.String
dsName
protected boolean
firstCheckIn
protected java.lang.String
instanceId
protected java.lang.String
instanceName
protected long
lastCheckin
protected static java.lang.String
LOCK_STATE_ACCESS
protected static java.lang.String
LOCK_TRIGGER_ACCESS
protected int
maxToRecoverAtATime
protected java.lang.ThreadLocal<java.lang.Long>
sigChangeForTxCompletion
protected java.lang.String
tablePrefix
protected boolean
useProperties
-
Fields inherited from interface org.quartz.impl.jdbcjobstore.Constants
ALIAS_COL_NEXT_FIRE_TIME, ALL_GROUPS_PAUSED, COL_BLOB, COL_CALENDAR, COL_CALENDAR_NAME, COL_CHECKIN_INTERVAL, COL_CRON_EXPRESSION, COL_DESCRIPTION, COL_END_TIME, COL_ENTRY_ID, COL_ENTRY_STATE, COL_FIRED_TIME, COL_INSTANCE_NAME, COL_IS_DURABLE, COL_IS_NONCONCURRENT, COL_IS_UPDATE_DATA, COL_IS_VOLATILE, COL_JOB_CLASS, COL_JOB_DATAMAP, COL_JOB_GROUP, COL_JOB_NAME, COL_LAST_CHECKIN_TIME, COL_LOCK_NAME, COL_MISFIRE_INSTRUCTION, COL_NEXT_FIRE_TIME, COL_PREV_FIRE_TIME, COL_PRIORITY, COL_REPEAT_COUNT, COL_REPEAT_INTERVAL, COL_REQUESTS_RECOVERY, COL_SCHED_TIME, COL_SCHEDULER_NAME, COL_START_TIME, COL_TIME_ZONE_ID, COL_TIMES_TRIGGERED, COL_TRIGGER_GROUP, COL_TRIGGER_NAME, COL_TRIGGER_STATE, COL_TRIGGER_TYPE, DEFAULT_TABLE_PREFIX, STATE_ACQUIRED, STATE_BLOCKED, STATE_COMPLETE, STATE_DELETED, STATE_ERROR, STATE_EXECUTING, STATE_MISFIRED, STATE_PAUSED, STATE_PAUSED_BLOCKED, STATE_WAITING, TABLE_BLOB_TRIGGERS, TABLE_CALENDARS, TABLE_CRON_TRIGGERS, TABLE_FIRED_TRIGGERS, TABLE_JOB_DETAILS, TABLE_LOCKS, TABLE_PAUSED_TRIGGERS, TABLE_SCHEDULER_STATE, TABLE_SIMPLE_TRIGGERS, TABLE_TRIGGERS, TTYPE_BLOB, TTYPE_CAL_INT, TTYPE_CRON, TTYPE_DAILY_TIME_INT, TTYPE_SIMPLE
-
-
Constructor Summary
Constructors Constructor Description JobStoreSupport()
-
Method Summary
All Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description protected java.util.List<OperableTrigger>
acquireNextTrigger(java.sql.Connection conn, long noLaterThan, int maxCount, long timeWindow)
java.util.List<OperableTrigger>
acquireNextTriggers(long noLaterThan, int maxCount, long timeWindow)
Get a handle to the next N triggers to be fired, and mark them as 'reserved' by the calling scheduler.protected long
calcFailedIfAfter(SchedulerStateRecord rec)
protected boolean
calendarExists(java.sql.Connection conn, java.lang.String calName)
boolean
canUseProperties()
Get whether String-only properties will be handled in JobDataMaps.protected java.lang.String
checkBlockedState(java.sql.Connection conn, JobKey jobKey, java.lang.String currentState)
Determines if a Trigger for the given job should be blocked.protected boolean
checkExists(java.sql.Connection conn, JobKey jobKey)
protected boolean
checkExists(java.sql.Connection conn, TriggerKey triggerKey)
boolean
checkExists(JobKey jobKey)
Determine whether aJob
with the given identifier already exists within the scheduler.boolean
checkExists(TriggerKey triggerKey)
Determine whether aTrigger
with the given identifier already exists within the scheduler.protected void
cleanupConnection(java.sql.Connection conn)
Cleanup the given database connection.void
clearAllSchedulingData()
protected void
clearAllSchedulingData(java.sql.Connection conn)
protected java.lang.Long
clearAndGetSignalSchedulingChangeOnTxCompletion()
protected void
closeConnection(java.sql.Connection conn)
Closes the suppliedConnection
.protected java.util.List<SchedulerStateRecord>
clusterCheckIn(java.sql.Connection conn)
protected void
clusterRecover(java.sql.Connection conn, java.util.List<SchedulerStateRecord> failedInstances)
protected void
commitConnection(java.sql.Connection conn)
Commit the supplied connectionprotected boolean
doCheckin()
protected JobStoreSupport.RecoverMisfiredJobsResult
doRecoverMisfires()
protected abstract <T> T
executeInLock(java.lang.String lockName, JobStoreSupport.TransactionCallback<T> txCallback)
Execute the given callback having acquired the given lock.protected <T> T
executeInNonManagedTXLock(java.lang.String lockName, JobStoreSupport.TransactionCallback<T> txCallback, JobStoreSupport.TransactionValidator<T> txValidator)
Execute the given callback having optionally acquired the given lock.<T> T
executeWithoutLock(JobStoreSupport.TransactionCallback<T> txCallback)
Execute the given callback in a transaction.protected java.util.List<SchedulerStateRecord>
findFailedInstances(java.sql.Connection conn)
Get a list of all scheduler instances in the cluster that may have failed.long
getAcquireRetryDelay(int failureCount)
Get the amount of time (in ms) to wait when accessing this job store repeatedly fails.protected java.sql.Connection
getAttributeRestoringConnection(java.sql.Connection conn)
Wrap the givenConnection
in a Proxy such that attributes that might be set will be restored before the connection is closed (and potentially restored to a pool).java.util.List<java.lang.String>
getCalendarNames()
Get the names of all of the
s in theCalendar
JobStore
.protected java.util.List<java.lang.String>
getCalendarNames(java.sql.Connection conn)
protected ClassLoadHelper
getClassLoadHelper()
long
getClusterCheckinInterval()
Get the frequency (in milliseconds) at which this instance "checks-in" with the other instances of the cluster.protected java.sql.Connection
getConnection()
java.lang.String
getDataSource()
Get the name of theDataSource
that should be used for performing database functions.long
getDbRetryInterval()
protected DriverDelegate
getDelegate()
Get the driver delegate for DB operations.boolean
getDoubleCheckLockMisfireHandler()
Get whether to check to see if there are Triggers that have misfired before actually acquiring the lock to recover them.java.lang.String
getDriverDelegateClass()
Get the JDBC driver delegate class name.java.lang.String
getDriverDelegateInitString()
Get the JDBC driver delegate's initialization string.long
getEstimatedTimeToReleaseAndAcquireTrigger()
How long (in milliseconds) theJobStore
implementation estimates that it will take to release a trigger and acquire a new one.protected java.lang.String
getFiredTriggerRecordId()
java.lang.String
getInstanceId()
Get the instance Id of the Scheduler (must be unique within a cluster).java.lang.String
getInstanceName()
Get the instance name of the Scheduler (must be unique within this server instance).java.util.List<java.lang.String>
getJobGroupNames()
Get the names of all of the
groups.Job
protected java.util.List<java.lang.String>
getJobGroupNames(java.sql.Connection conn)
java.util.Set<JobKey>
getJobKeys(GroupMatcher<JobKey> matcher)
Get the names of all of the
s that matcher the given groupMatcher.Job
protected java.util.Set<JobKey>
getJobNames(java.sql.Connection conn, GroupMatcher<JobKey> matcher)
protected Semaphore
getLockHandler()
protected org.slf4j.Logger
getLog()
boolean
getMakeThreadsDaemons()
Get whether the threads spawned by this JobStore should be marked as daemon.int
getMaxMisfiresToHandleAtATime()
Get the maximum number of misfired triggers that the misfire handling thread will try to recover at one time (within one transaction).long
getMisfireThreshold()
protected long
getMisfireTime()
protected abstract java.sql.Connection
getNonManagedTXConnection()
int
getNumberOfCalendars()
Get the number of
s that are stored in theCalendar
JobsStore
.protected int
getNumberOfCalendars(java.sql.Connection conn)
int
getNumberOfJobs()
Get the number of
s that are stored in theJob
JobStore
.protected int
getNumberOfJobs(java.sql.Connection conn)
int
getNumberOfTriggers()
Get the number of
s that are stored in theTrigger
JobsStore
.protected int
getNumberOfTriggers(java.sql.Connection conn)
java.util.Set<java.lang.String>
getPausedTriggerGroups()
java.util.Set<java.lang.String>
getPausedTriggerGroups(java.sql.Connection conn)
Pause all of the
in the given group.Trigger
sjava.lang.String
getSelectWithLockSQL()
java.lang.String
getTablePrefix()
Get the prefix that should be pre-pended to all table names.ThreadExecutor
getThreadExecutor()
java.util.List<java.lang.String>
getTriggerGroupNames()
Get the names of all of the
groups.Trigger
protected java.util.List<java.lang.String>
getTriggerGroupNames(java.sql.Connection conn)
java.util.Set<TriggerKey>
getTriggerKeys(GroupMatcher<TriggerKey> matcher)
Get the names of all of the
s that match the given group Matcher.Trigger
protected java.util.Set<TriggerKey>
getTriggerNames(java.sql.Connection conn, GroupMatcher<TriggerKey> matcher)
protected java.util.List<OperableTrigger>
getTriggersForJob(java.sql.Connection conn, JobKey key)
java.util.List<OperableTrigger>
getTriggersForJob(JobKey jobKey)
Get all of the Triggers that are associated to the given Job.Trigger.TriggerState
getTriggerState(java.sql.Connection conn, TriggerKey key)
Trigger.TriggerState
getTriggerState(TriggerKey triggerKey)
Get the current state of the identified
.Trigger
boolean
getUseDBLocks()
Get whether this instance should use database-based thread synchronization.void
initialize(ClassLoadHelper loadHelper, SchedulerSignaler signaler)
Called by the QuartzScheduler before theJobStore
is used, in order to give it a chance to initialize.boolean
isAcquireTriggersWithinLock()
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).boolean
isClustered()
Get whether this instance is part of a cluster.boolean
isDontSetAutoCommitFalse()
boolean
isLockOnInsert()
boolean
isThreadsInheritInitializersClassLoadContext()
Get whether to set the class load context of spawned threads to that of the initializing thread.boolean
isTxIsolationLevelSerializable()
protected boolean
jobExists(java.sql.Connection conn, JobKey jobKey)
Check existence of a given job.protected void
logWarnIfNonZero(int val, java.lang.String warning)
void
pauseAll()
Pause all triggers - equivalent of callingpauseTriggerGroup(group)
on every group.void
pauseAll(java.sql.Connection conn)
Pause all triggers - equivalent of callingpauseTriggerGroup(group)
on every group.void
pauseJob(JobKey jobKey)
Pause the
with the given name - by pausing all of its currentJob
Trigger
s.java.util.Set<java.lang.String>
pauseJobs(GroupMatcher<JobKey> matcher)
Pause all of the
matching the given groupMatcher - by pausing all of theirJob
sTrigger
s.void
pauseTrigger(java.sql.Connection conn, TriggerKey triggerKey)
Pause the
with the given name.Trigger
void
pauseTrigger(TriggerKey triggerKey)
Pause the
with the given name.Trigger
java.util.Set<java.lang.String>
pauseTriggerGroup(java.sql.Connection conn, GroupMatcher<TriggerKey> matcher)
Pause all of the
matching the given groupMatcher.Trigger
sjava.util.Set<java.lang.String>
pauseTriggers(GroupMatcher<TriggerKey> matcher)
Pause all of the
matching the given groupMatcher.Trigger
sprotected void
recoverJobs()
Recover any failed or misfired jobs and clean up the data store as appropriate.protected void
recoverJobs(java.sql.Connection conn)
Will recover any failed or misfired jobs and clean up the data store as appropriate.protected JobStoreSupport.RecoverMisfiredJobsResult
recoverMisfiredJobs(java.sql.Connection conn, boolean recovering)
protected void
releaseAcquiredTrigger(java.sql.Connection conn, OperableTrigger trigger)
void
releaseAcquiredTrigger(OperableTrigger trigger)
Inform theJobStore
that the scheduler no longer plans to fire the givenTrigger
, that it had previously acquired (reserved).protected void
releaseLock(java.lang.String lockName, boolean doIt)
boolean
removeCalendar(java.lang.String calName)
Remove (delete) the
with the given name.Calendar
protected boolean
removeCalendar(java.sql.Connection conn, java.lang.String calName)
protected boolean
removeJob(java.sql.Connection conn, JobKey jobKey)
boolean
removeJob(JobKey jobKey)
boolean
removeJobs(java.util.List<JobKey> jobKeys)
protected boolean
removeTrigger(java.sql.Connection conn, TriggerKey key)
boolean
removeTrigger(TriggerKey triggerKey)
Remove (delete) the
with the given name.Trigger
boolean
removeTriggers(java.util.List<TriggerKey> triggerKeys)
protected boolean
replaceTrigger(java.sql.Connection conn, TriggerKey key, OperableTrigger newTrigger)
boolean
replaceTrigger(TriggerKey triggerKey, OperableTrigger newTrigger)
Remove (delete) the
with the given key, and store the new given one - which must be associated with the same job.Trigger
void
resetTriggerFromErrorState(TriggerKey triggerKey)
Reset the current state of the identified
fromTrigger
Trigger.TriggerState.ERROR
toTrigger.TriggerState.NORMAL
orTrigger.TriggerState.PAUSED
as appropriate.void
resumeAll()
Resume (un-pause) all triggers - equivalent of callingresumeTriggerGroup(group)
on every group.void
resumeAll(java.sql.Connection conn)
protectedvoid
resumeJob(JobKey jobKey)
Resume (un-pause) the
with the given name.Job
java.util.Set<java.lang.String>
resumeJobs(GroupMatcher<JobKey> matcher)
Resume (un-pause) all of the
in the given group.Job
svoid
resumeTrigger(java.sql.Connection conn, TriggerKey key)
Resume (un-pause) the
with the given name.Trigger
void
resumeTrigger(TriggerKey triggerKey)
Resume (un-pause) the
with the given name.Trigger
java.util.Set<java.lang.String>
resumeTriggerGroup(java.sql.Connection conn, GroupMatcher<TriggerKey> matcher)
Resume (un-pause) all of the
matching the given groupMatcher.Trigger
sjava.util.Set<java.lang.String>
resumeTriggers(GroupMatcher<TriggerKey> matcher)
Resume (un-pause) all of the
matching the given groupMatcher.Trigger
sCalendar
retrieveCalendar(java.lang.String calName)
Retrieve the given
.Trigger
protected Calendar
retrieveCalendar(java.sql.Connection conn, java.lang.String calName)
protected JobDetail
retrieveJob(java.sql.Connection conn, JobKey key)
JobDetail
retrieveJob(JobKey jobKey)
protected OperableTrigger
retrieveTrigger(java.sql.Connection conn, TriggerKey key)
OperableTrigger
retrieveTrigger(TriggerKey triggerKey)
Retrieve the given
.Trigger
protected <T> T
retryExecuteInNonManagedTXLock(java.lang.String lockName, JobStoreSupport.TransactionCallback<T> txCallback)
protected void
rollbackConnection(java.sql.Connection conn)
Rollback the supplied connection.void
schedulerPaused()
Called by the QuartzScheduler to inform theJobStore
that the scheduler has been paused.void
schedulerResumed()
Called by the QuartzScheduler to inform theJobStore
that the scheduler has resumed after being paused.void
schedulerStarted()
Called by the QuartzScheduler to inform theJobStore
that the scheduler has started.void
setAcquireTriggersWithinLock(boolean acquireTriggersWithinLock)
Whether or not the query and update to acquire a Trigger for firing should be performed after obtaining an explicit DB lock.void
setClusterCheckinInterval(long l)
Set the frequency (in milliseconds) at which this instance "checks-in" with the other instances of the cluster.void
setDataSource(java.lang.String dsName)
Set the name of theDataSource
that should be used for performing database functions.void
setDbRetryInterval(long dbRetryInterval)
void
setDontSetAutoCommitFalse(boolean b)
Don't call set autocommit(false) on connections obtained from the DataSource.void
setDoubleCheckLockMisfireHandler(boolean doubleCheckLockMisfireHandler)
Set whether to check to see if there are Triggers that have misfired before actually acquiring the lock to recover them.void
setDriverDelegateClass(java.lang.String delegateClassName)
Set the JDBC driver delegate class.void
setDriverDelegateInitString(java.lang.String delegateInitString)
Set the JDBC driver delegate's initialization string.void
setInstanceId(java.lang.String instanceId)
Set the instance Id of the Scheduler (must be unique within a cluster).void
setInstanceName(java.lang.String instanceName)
Set the instance name of the Scheduler (must be unique within this server instance).void
setIsClustered(boolean isClustered)
Set whether this instance is part of a cluster.void
setLockHandler(Semaphore lockHandler)
void
setLockOnInsert(boolean lockOnInsert)
Whether or not to obtain locks when inserting new jobs/triggers.void
setMakeThreadsDaemons(boolean makeThreadsDaemons)
Set whether the threads spawned by this JobStore should be marked as daemon.void
setMaxMisfiresToHandleAtATime(int maxToRecoverAtATime)
Set the maximum number of misfired triggers that the misfire handling thread will try to recover at one time (within one transaction).void
setMisfireThreshold(long misfireThreshold)
The the number of milliseconds 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.void
setSelectWithLockSQL(java.lang.String string)
set the SQL statement to use to select and lock a row in the "locks" table.void
setTablePrefix(java.lang.String prefix)
Set the prefix that should be pre-pended to all table names.void
setThreadExecutor(ThreadExecutor threadExecutor)
void
setThreadPoolSize(int poolSize)
Tells the JobStore the pool size used to execute jobsvoid
setThreadsInheritInitializersClassLoadContext(boolean threadsInheritInitializersClassLoadContext)
Set whether to set the class load context of spawned threads to that of the initializing thread.void
setTxIsolationLevelSerializable(boolean b)
Set the transaction isolation level of DB connections to sequential.void
setUseDBLocks(boolean useDBLocks)
Set whether this instance should use database-based thread synchronization.void
setUseProperties(java.lang.String useProp)
Set whether String-only properties will be handled in JobDataMaps.void
shutdown()
Called by the QuartzScheduler to inform theJobStore
that it should free up all of it's resources because the scheduler is shutting down.protected void
signalSchedulingChangeImmediately(long candidateNewNextFireTime)
protected void
signalSchedulingChangeOnTxCompletion(long candidateNewNextFireTime)
void
storeCalendar(java.lang.String calName, Calendar calendar, boolean replaceExisting, boolean updateTriggers)
Store the given
.Calendar
protected void
storeCalendar(java.sql.Connection conn, java.lang.String calName, Calendar calendar, boolean replaceExisting, boolean updateTriggers)
protected void
storeJob(java.sql.Connection conn, JobDetail newJob, boolean replaceExisting)
Insert or update a job.void
storeJob(JobDetail newJob, boolean replaceExisting)
Store the given
.JobDetail
void
storeJobAndTrigger(JobDetail newJob, OperableTrigger newTrigger)
void
storeJobsAndTriggers(java.util.Map<JobDetail,java.util.Set<? extends Trigger>> triggersAndJobs, boolean replace)
protected void
storeTrigger(java.sql.Connection conn, OperableTrigger newTrigger, JobDetail job, boolean replaceExisting, java.lang.String state, boolean forceState, boolean recovering)
Insert or update a trigger.void
storeTrigger(OperableTrigger newTrigger, boolean replaceExisting)
Store the given
.Trigger
boolean
supportsPersistence()
protected void
triggeredJobComplete(java.sql.Connection conn, OperableTrigger trigger, JobDetail jobDetail, Trigger.CompletedExecutionInstruction triggerInstCode)
void
triggeredJobComplete(OperableTrigger trigger, JobDetail jobDetail, Trigger.CompletedExecutionInstruction triggerInstCode)
Inform theJobStore
that the scheduler has completed the firing of the givenTrigger
(and the execution its associatedJob
), and that the
in the givenJobDataMap
JobDetail
should be updated if theJob
is stateful.protected boolean
triggerExists(java.sql.Connection conn, TriggerKey key)
Check existence of a given trigger.protected TriggerFiredBundle
triggerFired(java.sql.Connection conn, OperableTrigger trigger)
java.util.List<TriggerFiredResult>
triggersFired(java.util.List<OperableTrigger> triggers)
Inform theJobStore
that the scheduler is now firing the givenTrigger
(executing its associatedJob
), that it had previously acquired (reserved).protected boolean
updateMisfiredTrigger(java.sql.Connection conn, TriggerKey triggerKey, java.lang.String newStateIfNotComplete, boolean forceState)
-
-
-
Field Detail
-
LOCK_TRIGGER_ACCESS
protected static final java.lang.String LOCK_TRIGGER_ACCESS
- See Also:
- Constant Field Values
-
LOCK_STATE_ACCESS
protected static final java.lang.String LOCK_STATE_ACCESS
- See Also:
- Constant Field Values
-
dsName
protected java.lang.String dsName
-
tablePrefix
protected java.lang.String tablePrefix
-
useProperties
protected boolean useProperties
-
instanceId
protected java.lang.String instanceId
-
instanceName
protected java.lang.String instanceName
-
delegateClassName
protected java.lang.String delegateClassName
-
delegateInitString
protected java.lang.String delegateInitString
-
delegateClass
protected java.lang.Class<? extends DriverDelegate> delegateClass
-
calendarCache
protected java.util.HashMap<java.lang.String,Calendar> calendarCache
-
maxToRecoverAtATime
protected int maxToRecoverAtATime
-
sigChangeForTxCompletion
protected java.lang.ThreadLocal<java.lang.Long> sigChangeForTxCompletion
-
firstCheckIn
protected boolean firstCheckIn
-
lastCheckin
protected long lastCheckin
-
-
Method Detail
-
setDataSource
public void setDataSource(java.lang.String dsName)
Set the name of the
DataSource
that should be used for performing database functions.
-
getDataSource
public java.lang.String getDataSource()
Get the name of the
DataSource
that should be used for performing database functions.
-
setTablePrefix
public void setTablePrefix(java.lang.String prefix)
Set the prefix that should be pre-pended to all table names.
-
getTablePrefix
public java.lang.String getTablePrefix()
Get the prefix that should be pre-pended to all table names.
-
setUseProperties
public void setUseProperties(java.lang.String useProp)
Set whether String-only properties will be handled in JobDataMaps.
-
canUseProperties
public boolean canUseProperties()
Get whether String-only properties will be handled in JobDataMaps.
-
setInstanceId
public void setInstanceId(java.lang.String instanceId)
Set the instance Id of the Scheduler (must be unique within a cluster).
- Specified by:
setInstanceId
in interfaceJobStore
-
getInstanceId
public java.lang.String getInstanceId()
Get the instance Id of the Scheduler (must be unique within a cluster).
-
setInstanceName
public void setInstanceName(java.lang.String instanceName)
Set the instance name of the Scheduler (must be unique within this server instance).- Specified by:
setInstanceName
in interfaceJobStore
-
setThreadPoolSize
public void setThreadPoolSize(int poolSize)
Description copied from interface:JobStore
Tells the JobStore the pool size used to execute jobs- Specified by:
setThreadPoolSize
in interfaceJobStore
- Parameters:
poolSize
- amount of threads allocated for job execution
-
setThreadExecutor
public void setThreadExecutor(ThreadExecutor threadExecutor)
-
getThreadExecutor
public ThreadExecutor getThreadExecutor()
-
getInstanceName
public java.lang.String getInstanceName()
Get the instance name of the Scheduler (must be unique within this server instance).
-
getEstimatedTimeToReleaseAndAcquireTrigger
public long getEstimatedTimeToReleaseAndAcquireTrigger()
Description copied from interface:JobStore
How long (in milliseconds) theJobStore
implementation estimates that it will take to release a trigger and acquire a new one.- Specified by:
getEstimatedTimeToReleaseAndAcquireTrigger
in interfaceJobStore
-
setIsClustered
public void setIsClustered(boolean isClustered)
Set whether this instance is part of a cluster.
-
isClustered
public boolean isClustered()
Get whether this instance is part of a cluster.
- Specified by:
isClustered
in interfaceJobStore
-
getClusterCheckinInterval
public long getClusterCheckinInterval()
Get the frequency (in milliseconds) at which this instance "checks-in" with the other instances of the cluster. -- Affects the rate of detecting failed instances.
-
setClusterCheckinInterval
public void setClusterCheckinInterval(long l)
Set the frequency (in milliseconds) at which this instance "checks-in" with the other instances of the cluster. -- Affects the rate of detecting failed instances.
-
getMaxMisfiresToHandleAtATime
public int getMaxMisfiresToHandleAtATime()
Get 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.
-
setMaxMisfiresToHandleAtATime
public void setMaxMisfiresToHandleAtATime(int maxToRecoverAtATime)
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.
-
getDbRetryInterval
public long getDbRetryInterval()
- Returns:
- Returns the dbRetryInterval.
-
setDbRetryInterval
public void setDbRetryInterval(long dbRetryInterval)
- Parameters:
dbRetryInterval
- The dbRetryInterval to set.
-
setUseDBLocks
public void setUseDBLocks(boolean useDBLocks)
Set whether this instance should use database-based thread synchronization.
-
getUseDBLocks
public boolean getUseDBLocks()
Get whether this instance should use database-based thread synchronization.
-
isLockOnInsert
public boolean isLockOnInsert()
-
setLockOnInsert
public void setLockOnInsert(boolean lockOnInsert)
Whether or not to obtain locks when inserting new jobs/triggers.Defaults to
true
, which is safest. Some databases (such as MS SQLServer) seem to require this to avoid deadlocks under high load, while others seem to do fine without. Settings this to false means isolation guarantees between job scheduling and trigger acquisition are entirely enforced by the database. Depending on the database and it's configuration this may cause unusual scheduling behaviors.Setting this property to
false
will provide a significant performance increase during the addition of new jobs and triggers.- Parameters:
lockOnInsert
- whether locking should be used when inserting new jobs/triggers
-
getMisfireThreshold
public long getMisfireThreshold()
-
setMisfireThreshold
public void setMisfireThreshold(long misfireThreshold)
The the number of milliseconds 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.- Parameters:
misfireThreshold
- the misfire threshold to use, in millis
-
isDontSetAutoCommitFalse
public boolean isDontSetAutoCommitFalse()
-
setDontSetAutoCommitFalse
public void setDontSetAutoCommitFalse(boolean b)
Don't call set autocommit(false) on connections obtained from the DataSource. This can be helpful in a few situations, such as if you have a driver that complains if it is called when it is already off.- Parameters:
b
- whether or not autocommit should be set to false on db connections
-
isTxIsolationLevelSerializable
public boolean isTxIsolationLevelSerializable()
-
setTxIsolationLevelSerializable
public void setTxIsolationLevelSerializable(boolean b)
Set the transaction isolation level of DB connections to sequential.- Parameters:
b
- whether isolation level should be set to sequential.
-
isAcquireTriggersWithinLock
public boolean isAcquireTriggersWithinLock()
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 the behavior prior to Quartz 1.6.3, but is considered unnecessary for most databases (due to the nature of the SQL update that is performed), and therefore a superfluous performance hit.
-
setAcquireTriggersWithinLock
public void setAcquireTriggersWithinLock(boolean acquireTriggersWithinLock)
Whether or not the query and update to acquire a Trigger for firing should be performed after obtaining an explicit DB lock. This is the behavior prior to Quartz 1.6.3, but is considered unnecessary for most databases, and therefore a superfluous performance hit. However, if batch acquisition is used, it is important for this behavior to be used for all dbs.
-
setDriverDelegateClass
public void setDriverDelegateClass(java.lang.String delegateClassName) throws InvalidConfigurationException
Set the JDBC driver delegate class.
- Parameters:
delegateClassName
- the delegate class name- Throws:
InvalidConfigurationException
-
getDriverDelegateClass
public java.lang.String getDriverDelegateClass()
Get the JDBC driver delegate class name.
- Returns:
- the delegate class name
-
setDriverDelegateInitString
public void setDriverDelegateInitString(java.lang.String delegateInitString) throws InvalidConfigurationException
Set the JDBC driver delegate's initialization string.
- Parameters:
delegateInitString
- the delegate init string- Throws:
InvalidConfigurationException
-
getDriverDelegateInitString
public java.lang.String getDriverDelegateInitString()
Get the JDBC driver delegate's initialization string.
- Returns:
- the delegate init string
-
getSelectWithLockSQL
public java.lang.String getSelectWithLockSQL()
-
setSelectWithLockSQL
public void setSelectWithLockSQL(java.lang.String string)
set the SQL statement to use to select and lock a row in the "locks" table.
- See Also:
StdRowLockSemaphore
-
getClassLoadHelper
protected ClassLoadHelper getClassLoadHelper()
-
getMakeThreadsDaemons
public boolean getMakeThreadsDaemons()
Get whether the threads spawned by this JobStore should be marked as daemon. Possible threads include theMisfireHandler
and theClusterManager
.- See Also:
Thread.setDaemon(boolean)
-
setMakeThreadsDaemons
public void setMakeThreadsDaemons(boolean makeThreadsDaemons)
Set whether the threads spawned by this JobStore should be marked as daemon. Possible threads include theMisfireHandler
and theClusterManager
.- See Also:
Thread.setDaemon(boolean)
-
isThreadsInheritInitializersClassLoadContext
public boolean isThreadsInheritInitializersClassLoadContext()
Get whether to set the class load context of spawned threads to that of the initializing thread.
-
setThreadsInheritInitializersClassLoadContext
public void setThreadsInheritInitializersClassLoadContext(boolean threadsInheritInitializersClassLoadContext)
Set whether to set the class load context of spawned threads to that of the initializing thread.
-
getDoubleCheckLockMisfireHandler
public boolean getDoubleCheckLockMisfireHandler()
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.
-
setDoubleCheckLockMisfireHandler
public void setDoubleCheckLockMisfireHandler(boolean doubleCheckLockMisfireHandler)
Set 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.
-
getAcquireRetryDelay
public long getAcquireRetryDelay(int failureCount)
Description copied from interface:JobStore
Get the amount of time (in ms) to wait when accessing this job store repeatedly fails. Called by the executor thread(s) when calls toJobStore.acquireNextTriggers(long, int, long)
fail more than once in succession, and the thread thus wants to wait a bit before trying again, to not consume 100% CPU, write huge amounts of errors into logs, etc. in cases like the DB being offline/restarting. The delay returned by implementations should be between 20 and 600000 milliseconds.- Specified by:
getAcquireRetryDelay
in interfaceJobStore
- Parameters:
failureCount
- the number of successive failures seen so far- Returns:
- the time (in milliseconds) to wait before trying again
-
getLog
protected org.slf4j.Logger getLog()
-
initialize
public void initialize(ClassLoadHelper loadHelper, SchedulerSignaler signaler) throws SchedulerConfigException
Called by the QuartzScheduler before the
JobStore
is used, in order to give it a chance to initialize.- Specified by:
initialize
in interfaceJobStore
- Throws:
SchedulerConfigException
-
schedulerStarted
public void schedulerStarted() throws SchedulerException
Description copied from interface:JobStore
Called by the QuartzScheduler to inform theJobStore
that the scheduler has started.- Specified by:
schedulerStarted
in interfaceJobStore
- Throws:
SchedulerException
- See Also:
JobStore.schedulerStarted()
-
schedulerPaused
public void schedulerPaused()
Description copied from interface:JobStore
Called by the QuartzScheduler to inform theJobStore
that the scheduler has been paused.- Specified by:
schedulerPaused
in interfaceJobStore
-
schedulerResumed
public void schedulerResumed()
Description copied from interface:JobStore
Called by the QuartzScheduler to inform theJobStore
that the scheduler has resumed after being paused.- Specified by:
schedulerResumed
in interfaceJobStore
-
shutdown
public void shutdown()
Called by the QuartzScheduler to inform the
JobStore
that it should free up all of it's resources because the scheduler is shutting down.
-
supportsPersistence
public boolean supportsPersistence()
- Specified by:
supportsPersistence
in interfaceJobStore
-
getNonManagedTXConnection
protected abstract java.sql.Connection getNonManagedTXConnection() throws JobPersistenceException
- Throws:
JobPersistenceException
-
getAttributeRestoringConnection
protected java.sql.Connection getAttributeRestoringConnection(java.sql.Connection conn)
Wrap the givenConnection
in a Proxy such that attributes that might be set will be restored before the connection is closed (and potentially restored to a pool).
-
getConnection
protected java.sql.Connection getConnection() throws JobPersistenceException
- Throws:
JobPersistenceException
-
releaseLock
protected void releaseLock(java.lang.String lockName, boolean doIt)
-
recoverJobs
protected void recoverJobs() throws JobPersistenceException
Recover any failed or misfired jobs and clean up the data store as appropriate.- Throws:
JobPersistenceException
- if jobs could not be recovered
-
recoverJobs
protected void recoverJobs(java.sql.Connection conn) throws JobPersistenceException
Will recover any failed or misfired jobs and clean up the data store as appropriate.
- Throws:
JobPersistenceException
- if jobs could not be recovered
-
getMisfireTime
protected long getMisfireTime()
-
recoverMisfiredJobs
protected JobStoreSupport.RecoverMisfiredJobsResult recoverMisfiredJobs(java.sql.Connection conn, boolean recovering) throws JobPersistenceException, java.sql.SQLException
- Throws:
JobPersistenceException
java.sql.SQLException
-
updateMisfiredTrigger
protected boolean updateMisfiredTrigger(java.sql.Connection conn, TriggerKey triggerKey, java.lang.String newStateIfNotComplete, boolean forceState) throws JobPersistenceException
- Throws:
JobPersistenceException
-
storeJobAndTrigger
public void storeJobAndTrigger(JobDetail newJob, OperableTrigger newTrigger) throws JobPersistenceException
- Specified by:
storeJobAndTrigger
in interfaceJobStore
- Parameters:
newJob
- TheJobDetail
to be stored.newTrigger
- TheTrigger
to be stored.- Throws:
ObjectAlreadyExistsException
- if aJob
with the same name/group already exists.ObjectAlreadyExistsException
- if aJob
with the same name/group already exists.JobPersistenceException
-
storeJob
public void storeJob(JobDetail newJob, boolean replaceExisting) throws JobPersistenceException
Store the given
.JobDetail
- Specified by:
storeJob
in interfaceJobStore
- Parameters:
newJob
- TheJobDetail
to be stored.replaceExisting
- Iftrue
, anyJob
existing in theJobStore
with the same name and group should be over-written.- Throws:
ObjectAlreadyExistsException
- if aJob
with the same name/group already exists, and replaceExisting is set to false.ObjectAlreadyExistsException
- if aJob
with the same name/group already exists, and replaceExisting is set to false.JobPersistenceException
-
storeJob
protected void storeJob(java.sql.Connection conn, JobDetail newJob, boolean replaceExisting) throws JobPersistenceException
Insert or update a job.
- Throws:
JobPersistenceException
-
jobExists
protected boolean jobExists(java.sql.Connection conn, JobKey jobKey) throws JobPersistenceException
Check existence of a given job.
- Throws:
JobPersistenceException
-
storeTrigger
public void storeTrigger(OperableTrigger newTrigger, boolean replaceExisting) throws JobPersistenceException
Store the given
.Trigger
- Specified by:
storeTrigger
in interfaceJobStore
- Parameters:
newTrigger
- TheTrigger
to be stored.replaceExisting
- Iftrue
, anyTrigger
existing in theJobStore
with the same name and group should be over-written.- Throws:
ObjectAlreadyExistsException
- if aTrigger
with the same name/group already exists, and replaceExisting is set to false.ObjectAlreadyExistsException
- if aTrigger
with the same name/group already exists, and replaceExisting is set to false.JobPersistenceException
- See Also:
JobStore.pauseTriggers(org.quartz.impl.matchers.GroupMatcher)
-
storeTrigger
protected void storeTrigger(java.sql.Connection conn, OperableTrigger newTrigger, JobDetail job, boolean replaceExisting, java.lang.String state, boolean forceState, boolean recovering) throws JobPersistenceException
Insert or update a trigger.
- Throws:
JobPersistenceException
-
triggerExists
protected boolean triggerExists(java.sql.Connection conn, TriggerKey key) throws JobPersistenceException
Check existence of a given trigger.
- Throws:
JobPersistenceException
-
removeJob
public boolean removeJob(JobKey jobKey) throws JobPersistenceException
Remove (delete) the
with the given name, and anyJob
s that reference it.Trigger
If removal of the
Job
results in an empty group, the group should be removed from theJobStore
's list of known group names.- Specified by:
removeJob
in interfaceJobStore
- Returns:
true
if aJob
with the given name and group was found and removed from the store.- Throws:
JobPersistenceException
-
removeJob
protected boolean removeJob(java.sql.Connection conn, JobKey jobKey) throws JobPersistenceException
- Throws:
JobPersistenceException
-
removeJobs
public boolean removeJobs(java.util.List<JobKey> jobKeys) throws JobPersistenceException
- Specified by:
removeJobs
in interfaceJobStore
- Throws:
JobPersistenceException
-
removeTriggers
public boolean removeTriggers(java.util.List<TriggerKey> triggerKeys) throws JobPersistenceException
- Specified by:
removeTriggers
in interfaceJobStore
- Throws:
JobPersistenceException
-
storeJobsAndTriggers
public void storeJobsAndTriggers(java.util.Map<JobDetail,java.util.Set<? extends Trigger>> triggersAndJobs, boolean replace) throws JobPersistenceException
- Specified by:
storeJobsAndTriggers
in interfaceJobStore
- Throws:
JobPersistenceException
-
retrieveJob
public JobDetail retrieveJob(JobKey jobKey) throws JobPersistenceException
- Specified by:
retrieveJob
in interfaceJobStore
- Returns:
- The desired
Job
, or null if there is no match. - Throws:
JobPersistenceException
-
retrieveJob
protected JobDetail retrieveJob(java.sql.Connection conn, JobKey key) throws JobPersistenceException
- Throws:
JobPersistenceException
-
removeTrigger
public boolean removeTrigger(TriggerKey triggerKey) throws JobPersistenceException
Remove (delete) the
with the given name.Trigger
If removal of the
Trigger
results in an empty group, the group should be removed from theJobStore
's list of known group names.If removal of the
Trigger
results in an 'orphaned'Job
that is not 'durable', then theJob
should be deleted also.- Specified by:
removeTrigger
in interfaceJobStore
- Returns:
true
if aTrigger
with the given name and group was found and removed from the store.- Throws:
JobPersistenceException
-
removeTrigger
protected boolean removeTrigger(java.sql.Connection conn, TriggerKey key) throws JobPersistenceException
- Throws:
JobPersistenceException
-
replaceTrigger
public boolean replaceTrigger(TriggerKey triggerKey, OperableTrigger newTrigger) throws JobPersistenceException
Description copied from interface:JobStore
Remove (delete) the
with the given key, and store the new given one - which must be associated with the same job.Trigger
- Specified by:
replaceTrigger
in interfaceJobStore
newTrigger
- The newTrigger
to be stored.- Returns:
true
if aTrigger
with the given name and group was found and removed from the store.- Throws:
JobPersistenceException
- See Also:
JobStore.replaceTrigger(TriggerKey, OperableTrigger)
-
replaceTrigger
protected boolean replaceTrigger(java.sql.Connection conn, TriggerKey key, OperableTrigger newTrigger) throws JobPersistenceException
- Throws:
JobPersistenceException
-
retrieveTrigger
public OperableTrigger retrieveTrigger(TriggerKey triggerKey) throws JobPersistenceException
Retrieve the given
.Trigger
- Specified by:
retrieveTrigger
in interfaceJobStore
- Returns:
- The desired
Trigger
, or null if there is no match. - Throws:
JobPersistenceException
-
retrieveTrigger
protected OperableTrigger retrieveTrigger(java.sql.Connection conn, TriggerKey key) throws JobPersistenceException
- Throws:
JobPersistenceException
-
getTriggerState
public Trigger.TriggerState getTriggerState(TriggerKey triggerKey) throws JobPersistenceException
Get the current state of the identified
.Trigger
- Specified by:
getTriggerState
in interfaceJobStore
- Throws:
JobPersistenceException
- See Also:
Trigger.TriggerState.NORMAL
,Trigger.TriggerState.PAUSED
,Trigger.TriggerState.COMPLETE
,Trigger.TriggerState.ERROR
,Trigger.TriggerState.NONE
-
getTriggerState
public Trigger.TriggerState getTriggerState(java.sql.Connection conn, TriggerKey key) throws JobPersistenceException
- Throws:
JobPersistenceException
-
resetTriggerFromErrorState
public void resetTriggerFromErrorState(TriggerKey triggerKey) throws JobPersistenceException
Reset the current state of the identified
fromTrigger
Trigger.TriggerState.ERROR
toTrigger.TriggerState.NORMAL
orTrigger.TriggerState.PAUSED
as appropriate.Only affects triggers that are in ERROR state - if identified trigger is not in that state then the result is a no-op.
The result will be the trigger returning to the normal, waiting to be fired state, unless the trigger's group has been paused, in which case it will go into the PAUSED state.
- Specified by:
resetTriggerFromErrorState
in interfaceJobStore
- Throws:
JobPersistenceException
-
storeCalendar
public void storeCalendar(java.lang.String calName, Calendar calendar, boolean replaceExisting, boolean updateTriggers) throws JobPersistenceException
Store the given
.Calendar
- Specified by:
storeCalendar
in interfaceJobStore
- Parameters:
calName
- The name of the calendar.calendar
- TheCalendar
to be stored.replaceExisting
- Iftrue
, anyCalendar
existing in theJobStore
with the same name and group should be over-written.updateTriggers
- Iftrue
, anyTrigger
s existing in theJobStore
that reference an existing Calendar with the same name with have their next fire time re-computed with the newCalendar
.- Throws:
ObjectAlreadyExistsException
- if aCalendar
with the same name already exists, and replaceExisting is set to false.JobPersistenceException
-
storeCalendar
protected void storeCalendar(java.sql.Connection conn, java.lang.String calName, Calendar calendar, boolean replaceExisting, boolean updateTriggers) throws JobPersistenceException
- Throws:
JobPersistenceException
-
calendarExists
protected boolean calendarExists(java.sql.Connection conn, java.lang.String calName) throws JobPersistenceException
- Throws:
JobPersistenceException
-
removeCalendar
public boolean removeCalendar(java.lang.String calName) throws JobPersistenceException
Remove (delete) the
with the given name.Calendar
If removal of the
*Calendar
would result inTrigger
s pointing to non-existent calendars, then aJobPersistenceException
will be thrown.- Specified by:
removeCalendar
in interfaceJobStore
- Parameters:
calName
- The name of theCalendar
to be removed.- Returns:
true
if aCalendar
with the given name was found and removed from the store.- Throws:
JobPersistenceException
-
removeCalendar
protected boolean removeCalendar(java.sql.Connection conn, java.lang.String calName) throws JobPersistenceException
- Throws:
JobPersistenceException
-
retrieveCalendar
public Calendar retrieveCalendar(java.lang.String calName) throws JobPersistenceException
Retrieve the given
.Trigger
- Specified by:
retrieveCalendar
in interfaceJobStore
- Parameters:
calName
- The name of theCalendar
to be retrieved.- Returns:
- The desired
Calendar
, or null if there is no match. - Throws:
JobPersistenceException
-
retrieveCalendar
protected Calendar retrieveCalendar(java.sql.Connection conn, java.lang.String calName) throws JobPersistenceException
- Throws:
JobPersistenceException
-
getNumberOfJobs
public int getNumberOfJobs() throws JobPersistenceException
Get the number of
s that are stored in theJob
JobStore
.- Specified by:
getNumberOfJobs
in interfaceJobStore
- Throws:
JobPersistenceException
-
getNumberOfJobs
protected int getNumberOfJobs(java.sql.Connection conn) throws JobPersistenceException
- Throws:
JobPersistenceException
-
getNumberOfTriggers
public int getNumberOfTriggers() throws JobPersistenceException
Get the number of
s that are stored in theTrigger
JobsStore
.- Specified by:
getNumberOfTriggers
in interfaceJobStore
- Throws:
JobPersistenceException
-
getNumberOfTriggers
protected int getNumberOfTriggers(java.sql.Connection conn) throws JobPersistenceException
- Throws:
JobPersistenceException
-
getNumberOfCalendars
public int getNumberOfCalendars() throws JobPersistenceException
Get the number of
s that are stored in theCalendar
JobsStore
.- Specified by:
getNumberOfCalendars
in interfaceJobStore
- Throws:
JobPersistenceException
-
getNumberOfCalendars
protected int getNumberOfCalendars(java.sql.Connection conn) throws JobPersistenceException
- Throws:
JobPersistenceException
-
getJobKeys
public java.util.Set<JobKey> getJobKeys(GroupMatcher<JobKey> matcher) throws JobPersistenceException
Get the names of all of the
s that matcher the given groupMatcher.Job
If there are no jobs in the given group name, the result should be an empty Set
- Specified by:
getJobKeys
in interfaceJobStore
- Throws:
JobPersistenceException
-
getJobNames
protected java.util.Set<JobKey> getJobNames(java.sql.Connection conn, GroupMatcher<JobKey> matcher) throws JobPersistenceException
- Throws:
JobPersistenceException
-
checkExists
public boolean checkExists(JobKey jobKey) throws JobPersistenceException
Determine whether aJob
with the given identifier already exists within the scheduler.- Specified by:
checkExists
in interfaceJobStore
- Parameters:
jobKey
- the identifier to check for- Returns:
- true if a Job exists with the given identifier
- Throws:
JobPersistenceException
-
checkExists
protected boolean checkExists(java.sql.Connection conn, JobKey jobKey) throws JobPersistenceException
- Throws:
JobPersistenceException
-
checkExists
public boolean checkExists(TriggerKey triggerKey) throws JobPersistenceException
Determine whether aTrigger
with the given identifier already exists within the scheduler.- Specified by:
checkExists
in interfaceJobStore
- Parameters:
triggerKey
- the identifier to check for- Returns:
- true if a Trigger exists with the given identifier
- Throws:
JobPersistenceException
-
checkExists
protected boolean checkExists(java.sql.Connection conn, TriggerKey triggerKey) throws JobPersistenceException
- Throws:
JobPersistenceException
-
clearAllSchedulingData
public void clearAllSchedulingData() throws JobPersistenceException
- Specified by:
clearAllSchedulingData
in interfaceJobStore
- Throws:
JobPersistenceException
-
clearAllSchedulingData
protected void clearAllSchedulingData(java.sql.Connection conn) throws JobPersistenceException
- Throws:
JobPersistenceException
-
getTriggerKeys
public java.util.Set<TriggerKey> getTriggerKeys(GroupMatcher<TriggerKey> matcher) throws JobPersistenceException
Get the names of all of the
s that match the given group Matcher.Trigger
If there are no triggers in the given group name, the result should be a an empty Set (not
null
).- Specified by:
getTriggerKeys
in interfaceJobStore
- Throws:
JobPersistenceException
-
getTriggerNames
protected java.util.Set<TriggerKey> getTriggerNames(java.sql.Connection conn, GroupMatcher<TriggerKey> matcher) throws JobPersistenceException
- Throws:
JobPersistenceException
-
getJobGroupNames
public java.util.List<java.lang.String> getJobGroupNames() throws JobPersistenceException
Get the names of all of the
groups.Job
If there are no known group names, the result should be a zero-length array (not
null
).- Specified by:
getJobGroupNames
in interfaceJobStore
- Throws:
JobPersistenceException
-
getJobGroupNames
protected java.util.List<java.lang.String> getJobGroupNames(java.sql.Connection conn) throws JobPersistenceException
- Throws:
JobPersistenceException
-
getTriggerGroupNames
public java.util.List<java.lang.String> getTriggerGroupNames() throws JobPersistenceException
Get the names of all of the
groups.Trigger
If there are no known group names, the result should be a zero-length array (not
null
).- Specified by:
getTriggerGroupNames
in interfaceJobStore
- Throws:
JobPersistenceException
-
getTriggerGroupNames
protected java.util.List<java.lang.String> getTriggerGroupNames(java.sql.Connection conn) throws JobPersistenceException
- Throws:
JobPersistenceException
-
getCalendarNames
public java.util.List<java.lang.String> getCalendarNames() throws JobPersistenceException
Get the names of all of the
s in theCalendar
JobStore
.If there are no Calendars in the given group name, the result should be a zero-length array (not
null
).- Specified by:
getCalendarNames
in interfaceJobStore
- Throws:
JobPersistenceException
-
getCalendarNames
protected java.util.List<java.lang.String> getCalendarNames(java.sql.Connection conn) throws JobPersistenceException
- Throws:
JobPersistenceException
-
getTriggersForJob
public java.util.List<OperableTrigger> getTriggersForJob(JobKey jobKey) throws JobPersistenceException
Get all of the Triggers that are associated to the given Job.
If there are no matches, a zero-length array should be returned.
- Specified by:
getTriggersForJob
in interfaceJobStore
- Throws:
JobPersistenceException
-
getTriggersForJob
protected java.util.List<OperableTrigger> getTriggersForJob(java.sql.Connection conn, JobKey key) throws JobPersistenceException
- Throws:
JobPersistenceException
-
pauseTrigger
public void pauseTrigger(TriggerKey triggerKey) throws JobPersistenceException
Pause the
with the given name.Trigger
- Specified by:
pauseTrigger
in interfaceJobStore
- Throws:
JobPersistenceException
- See Also:
resumeTrigger(TriggerKey)
-
pauseTrigger
public void pauseTrigger(java.sql.Connection conn, TriggerKey triggerKey) throws JobPersistenceException
Pause the
with the given name.Trigger
- Throws:
JobPersistenceException
- See Also:
resumeTrigger(Connection, TriggerKey)
-
pauseJob
public void pauseJob(JobKey jobKey) throws JobPersistenceException
Pause the
with the given name - by pausing all of its currentJob
Trigger
s.- Specified by:
pauseJob
in interfaceJobStore
- Throws:
JobPersistenceException
- See Also:
resumeJob(JobKey)
-
pauseJobs
public java.util.Set<java.lang.String> pauseJobs(GroupMatcher<JobKey> matcher) throws JobPersistenceException
Pause all of the
matching the given groupMatcher - by pausing all of theirJob
sTrigger
s.- Specified by:
pauseJobs
in interfaceJobStore
- Throws:
JobPersistenceException
- See Also:
resumeJobs(org.quartz.impl.matchers.GroupMatcher)
-
checkBlockedState
protected java.lang.String checkBlockedState(java.sql.Connection conn, JobKey jobKey, java.lang.String currentState) throws JobPersistenceException
Determines if a Trigger for the given job should be blocked. State can only transition to STATE_PAUSED_BLOCKED/BLOCKED from PAUSED/STATE_WAITING respectively.- Returns:
- STATE_PAUSED_BLOCKED, BLOCKED, or the currentState.
- Throws:
JobPersistenceException
-
resumeTrigger
public void resumeTrigger(TriggerKey triggerKey) throws JobPersistenceException
Resume (un-pause) the
with the given name.Trigger
If the
Trigger
missed one or more fire-times, then theTrigger
's misfire instruction will be applied.- Specified by:
resumeTrigger
in interfaceJobStore
- Throws:
JobPersistenceException
- See Also:
pauseTrigger(TriggerKey)
-
resumeTrigger
public void resumeTrigger(java.sql.Connection conn, TriggerKey key) throws JobPersistenceException
Resume (un-pause) the
with the given name.Trigger
If the
Trigger
missed one or more fire-times, then theTrigger
's misfire instruction will be applied.- Throws:
JobPersistenceException
- See Also:
pauseTrigger(Connection, TriggerKey)
-
resumeJob
public void resumeJob(JobKey jobKey) throws JobPersistenceException
Resume (un-pause) the
with the given name.Job
If any of the
Job
'sTrigger
s missed one or more fire-times, then theTrigger
's misfire instruction will be applied.- Specified by:
resumeJob
in interfaceJobStore
- Throws:
JobPersistenceException
- See Also:
pauseJob(JobKey)
-
resumeJobs
public java.util.Set<java.lang.String> resumeJobs(GroupMatcher<JobKey> matcher) throws JobPersistenceException
Resume (un-pause) all of the
in the given group.Job
sIf any of the
Job
s hadTrigger
s that missed one or more fire-times, then theTrigger
's misfire instruction will be applied.- Specified by:
resumeJobs
in interfaceJobStore
- Throws:
JobPersistenceException
- See Also:
pauseJobs(org.quartz.impl.matchers.GroupMatcher)
-
pauseTriggers
public java.util.Set<java.lang.String> pauseTriggers(GroupMatcher<TriggerKey> matcher) throws JobPersistenceException
Pause all of the
matching the given groupMatcher.Trigger
s- Specified by:
pauseTriggers
in interfaceJobStore
- Throws:
JobPersistenceException
- See Also:
resumeTriggerGroup(java.sql.Connection, org.quartz.impl.matchers.GroupMatcher)
-
pauseTriggerGroup
public java.util.Set<java.lang.String> pauseTriggerGroup(java.sql.Connection conn, GroupMatcher<TriggerKey> matcher) throws JobPersistenceException
Pause all of the
matching the given groupMatcher.Trigger
s
-
getPausedTriggerGroups
public java.util.Set<java.lang.String> getPausedTriggerGroups() throws JobPersistenceException
- Specified by:
getPausedTriggerGroups
in interfaceJobStore
- Throws:
JobPersistenceException
-
getPausedTriggerGroups
public java.util.Set<java.lang.String> getPausedTriggerGroups(java.sql.Connection conn) throws JobPersistenceException
Pause all of the
in the given group.Trigger
s- Throws:
JobPersistenceException
- See Also:
resumeTriggers(org.quartz.impl.matchers.GroupMatcher)
-
resumeTriggers
public java.util.Set<java.lang.String> resumeTriggers(GroupMatcher<TriggerKey> matcher) throws JobPersistenceException
Resume (un-pause) all of the
matching the given groupMatcher.Trigger
sIf any
Trigger
missed one or more fire-times, then theTrigger
's misfire instruction will be applied.- Specified by:
resumeTriggers
in interfaceJobStore
- Throws:
JobPersistenceException
- See Also:
pauseTriggers(org.quartz.impl.matchers.GroupMatcher)
-
resumeTriggerGroup
public java.util.Set<java.lang.String> resumeTriggerGroup(java.sql.Connection conn, GroupMatcher<TriggerKey> matcher) throws JobPersistenceException
Resume (un-pause) all of the
matching the given groupMatcher.Trigger
sIf any
Trigger
missed one or more fire-times, then theTrigger
's misfire instruction will be applied.- Throws:
JobPersistenceException
- See Also:
pauseTriggers(org.quartz.impl.matchers.GroupMatcher)
-
pauseAll
public void pauseAll() throws JobPersistenceException
Pause all triggers - equivalent of calling
pauseTriggerGroup(group)
on every group.When
resumeAll()
is called (to un-pause), trigger misfire instructions WILL be applied.- Specified by:
pauseAll
in interfaceJobStore
- Throws:
JobPersistenceException
- See Also:
resumeAll()
,pauseTriggerGroup(java.sql.Connection, org.quartz.impl.matchers.GroupMatcher)
-
pauseAll
public void pauseAll(java.sql.Connection conn) throws JobPersistenceException
Pause all triggers - equivalent of calling
pauseTriggerGroup(group)
on every group.When
resumeAll()
is called (to un-pause), trigger misfire instructions WILL be applied.
-
resumeAll
public void resumeAll() throws JobPersistenceException
Resume (un-pause) all triggers - equivalent of calling
resumeTriggerGroup(group)
on every group.If any
Trigger
missed one or more fire-times, then theTrigger
's misfire instruction will be applied.- Specified by:
resumeAll
in interfaceJobStore
- Throws:
JobPersistenceException
- See Also:
pauseAll()
-
resumeAll
public void resumeAll(java.sql.Connection conn) throws JobPersistenceException
protectedResume (un-pause) all triggers - equivalent of calling
resumeTriggerGroup(group)
on every group.If any
Trigger
missed one or more fire-times, then theTrigger
's misfire instruction will be applied.- Throws:
JobPersistenceException
- See Also:
pauseAll(Connection)
-
getFiredTriggerRecordId
protected java.lang.String getFiredTriggerRecordId()
-
acquireNextTriggers
public java.util.List<OperableTrigger> acquireNextTriggers(long noLaterThan, int maxCount, long timeWindow) throws JobPersistenceException
Get a handle to the next N triggers to be fired, and mark them as 'reserved' by the calling scheduler.
- Specified by:
acquireNextTriggers
in interfaceJobStore
- Parameters:
noLaterThan
- If > 0, the JobStore should only return a Trigger that will fire no later than the time represented in this value as milliseconds.- Throws:
JobPersistenceException
- See Also:
releaseAcquiredTrigger(OperableTrigger)
-
acquireNextTrigger
protected java.util.List<OperableTrigger> acquireNextTrigger(java.sql.Connection conn, long noLaterThan, int maxCount, long timeWindow) throws JobPersistenceException
- Throws:
JobPersistenceException
-
releaseAcquiredTrigger
public void releaseAcquiredTrigger(OperableTrigger trigger)
Inform the
JobStore
that the scheduler no longer plans to fire the givenTrigger
, that it had previously acquired (reserved).- Specified by:
releaseAcquiredTrigger
in interfaceJobStore
-
releaseAcquiredTrigger
protected void releaseAcquiredTrigger(java.sql.Connection conn, OperableTrigger trigger) throws JobPersistenceException
- Throws:
JobPersistenceException
-
triggersFired
public java.util.List<TriggerFiredResult> triggersFired(java.util.List<OperableTrigger> triggers) throws JobPersistenceException
Inform the
JobStore
that the scheduler is now firing the givenTrigger
(executing its associatedJob
), that it had previously acquired (reserved).- Specified by:
triggersFired
in interfaceJobStore
- Returns:
- null if the trigger or its job or calendar no longer exist, or if the trigger was not successfully put into the 'executing' state.
- Throws:
JobPersistenceException
-
triggerFired
protected TriggerFiredBundle triggerFired(java.sql.Connection conn, OperableTrigger trigger) throws JobPersistenceException
- Throws:
JobPersistenceException
-
triggeredJobComplete
public void triggeredJobComplete(OperableTrigger trigger, JobDetail jobDetail, Trigger.CompletedExecutionInstruction triggerInstCode)
Inform the
JobStore
that the scheduler has completed the firing of the givenTrigger
(and the execution its associatedJob
), and that the
in the givenJobDataMap
JobDetail
should be updated if theJob
is stateful.- Specified by:
triggeredJobComplete
in interfaceJobStore
-
triggeredJobComplete
protected void triggeredJobComplete(java.sql.Connection conn, OperableTrigger trigger, JobDetail jobDetail, Trigger.CompletedExecutionInstruction triggerInstCode) throws JobPersistenceException
- Throws:
JobPersistenceException
-
getDelegate
protected DriverDelegate getDelegate() throws NoSuchDelegateException
Get the driver delegate for DB operations.
- Throws:
NoSuchDelegateException
-
getLockHandler
protected Semaphore getLockHandler()
-
setLockHandler
public void setLockHandler(Semaphore lockHandler)
-
doRecoverMisfires
protected JobStoreSupport.RecoverMisfiredJobsResult doRecoverMisfires() throws JobPersistenceException
- Throws:
JobPersistenceException
-
signalSchedulingChangeOnTxCompletion
protected void signalSchedulingChangeOnTxCompletion(long candidateNewNextFireTime)
-
clearAndGetSignalSchedulingChangeOnTxCompletion
protected java.lang.Long clearAndGetSignalSchedulingChangeOnTxCompletion()
-
signalSchedulingChangeImmediately
protected void signalSchedulingChangeImmediately(long candidateNewNextFireTime)
-
doCheckin
protected boolean doCheckin() throws JobPersistenceException
- Throws:
JobPersistenceException
-
findFailedInstances
protected java.util.List<SchedulerStateRecord> findFailedInstances(java.sql.Connection conn) throws JobPersistenceException
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.- Throws:
JobPersistenceException
-
calcFailedIfAfter
protected long calcFailedIfAfter(SchedulerStateRecord rec)
-
clusterCheckIn
protected java.util.List<SchedulerStateRecord> clusterCheckIn(java.sql.Connection conn) throws JobPersistenceException
- Throws:
JobPersistenceException
-
clusterRecover
protected void clusterRecover(java.sql.Connection conn, java.util.List<SchedulerStateRecord> failedInstances) throws JobPersistenceException
- Throws:
JobPersistenceException
-
logWarnIfNonZero
protected void logWarnIfNonZero(int val, java.lang.String warning)
-
cleanupConnection
protected void cleanupConnection(java.sql.Connection conn)
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.
- See Also:
closeConnection(Connection)
-
closeConnection
protected void closeConnection(java.sql.Connection conn)
Closes the suppliedConnection
.Ignores a
null Connection
. Any exception thrown trying to close theConnection
is logged and ignored.- Parameters:
conn
- TheConnection
to close (Optional).
-
rollbackConnection
protected void rollbackConnection(java.sql.Connection conn)
Rollback the supplied connection.Logs any SQLException it gets trying to rollback, but will not propogate the exception lest it mask the exception that caused the caller to need to rollback in the first place.
- Parameters:
conn
- (Optional)
-
commitConnection
protected void commitConnection(java.sql.Connection conn) throws JobPersistenceException
Commit the supplied connection- Parameters:
conn
- (Optional)- Throws:
JobPersistenceException
- thrown if a SQLException occurs when the connection is committed
-
executeWithoutLock
public <T> T executeWithoutLock(JobStoreSupport.TransactionCallback<T> txCallback) throws JobPersistenceException
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.
- Throws:
JobPersistenceException
- See Also:
executeInLock(String, TransactionCallback)
-
executeInLock
protected abstract <T> T executeInLock(java.lang.String lockName, JobStoreSupport.TransactionCallback<T> txCallback) throws JobPersistenceException
Execute the given callback having acquired the given lock. Depending on the JobStore, the surrounding transaction may be assumed to be already present (managed).- Parameters:
lockName
- The name of the lock to acquire, for example "TRIGGER_ACCESS". If null, then no lock is acquired, but the lockCallback is still executed in a transaction.- Throws:
JobPersistenceException
-
retryExecuteInNonManagedTXLock
protected <T> T retryExecuteInNonManagedTXLock(java.lang.String lockName, JobStoreSupport.TransactionCallback<T> txCallback)
-
executeInNonManagedTXLock
protected <T> T executeInNonManagedTXLock(java.lang.String lockName, JobStoreSupport.TransactionCallback<T> txCallback, JobStoreSupport.TransactionValidator<T> txValidator) throws JobPersistenceException
Execute the given callback having optionally acquired the given lock. This uses the non-managed transaction connection.- Parameters:
lockName
- The name of the lock to acquire, for example "TRIGGER_ACCESS". If null, then no lock is acquired, but the lockCallback is still executed in a non-managed transaction.- Throws:
JobPersistenceException
-
-