org.quartz.impl.jdbcjobstore
Class JobStoreSupport

java.lang.Object
  extended by org.quartz.impl.jdbcjobstore.JobStoreSupport
All Implemented Interfaces:
Constants, JobStore
Direct Known Subclasses:
JobStoreCMT, JobStoreTX

public abstract class JobStoreSupport
extends Object
implements JobStore, Constants

Contains base functionality for JDBC-based JobStore implementations.

Author:
Jeffrey Wescott, James House

Nested Class Summary
protected static class JobStoreSupport.RecoverMisfiredJobsResult
          Helper class for returning the composite result of trying to recover misfired jobs.
protected static interface JobStoreSupport.TransactionCallback
          Implement this interface to provide the code to execute within the a transaction template.
protected static interface JobStoreSupport.VoidTransactionCallback
          Implement this interface to provide the code to execute within the a transaction template that has no return value.
 
Field Summary
protected  HashMap calendarCache
           
protected  Class delegateClass
           
protected  String delegateClassName
           
protected  String dsName
           
protected  boolean firstCheckIn
           
protected  String instanceId
           
protected  String instanceName
           
protected  long lastCheckin
           
protected static String LOCK_CALENDAR_ACCESS
           
protected static String LOCK_JOB_ACCESS
           
protected static String LOCK_MISFIRE_ACCESS
           
protected static String LOCK_STATE_ACCESS
           
protected static String LOCK_TRIGGER_ACCESS
           
protected  int maxToRecoverAtATime
           
protected  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_STATEFUL, COL_IS_VOLATILE, COL_JOB_CLASS, COL_JOB_DATAMAP, COL_JOB_GROUP, COL_JOB_LISTENER, 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_START_TIME, COL_TIME_ZONE_ID, COL_TIMES_TRIGGERED, COL_TRIGGER_GROUP, COL_TRIGGER_LISTENER, 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_JOB_LISTENERS, TABLE_LOCKS, TABLE_PAUSED_TRIGGERS, TABLE_SCHEDULER_STATE, TABLE_SIMPLE_TRIGGERS, TABLE_TRIGGER_LISTENERS, TABLE_TRIGGERS, TTYPE_BLOB, TTYPE_CRON, TTYPE_SIMPLE
 
Constructor Summary
JobStoreSupport()
           
 
Method Summary
protected  Trigger acquireNextTrigger(Connection conn, SchedulingContext ctxt, long noLaterThan)
           
 Trigger acquireNextTrigger(SchedulingContext ctxt, long noLaterThan)
           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(Connection conn, String calName)
           
 boolean canUseProperties()
           Get whether String-only properties will be handled in JobDataMaps.
protected  String checkBlockedState(Connection conn, SchedulingContext ctxt, String jobName, String jobGroupName, String currentState)
          Determines if a Trigger for the given job should be blocked.
protected  void cleanupConnection(Connection conn)
           Cleanup the given database connection.
protected  void cleanVolatileTriggerAndJobs()
          Removes all volatile data.
protected  void cleanVolatileTriggerAndJobs(Connection conn)
           Removes all volatile data.
protected  void closeConnection(Connection conn)
          Closes the supplied Connection.
protected  List clusterCheckIn(Connection conn)
           
protected  void clusterRecover(Connection conn, List failedInstances)
           
protected  void commitConnection(Connection conn)
          Commit the supplied connection
protected  boolean doCheckin()
           
protected  JobStoreSupport.RecoverMisfiredJobsResult doRecoverMisfires()
           
protected abstract  Object executeInLock(String lockName, JobStoreSupport.TransactionCallback txCallback)
          Execute the given callback having aquired the given lock.
protected  void executeInLock(String lockName, JobStoreSupport.VoidTransactionCallback txCallback)
          Execute the given callback having aquired the given lock.
protected  Object executeInNonManagedTXLock(String lockName, JobStoreSupport.TransactionCallback txCallback)
          Execute the given callback having optionally aquired the given lock.
protected  void executeInNonManagedTXLock(String lockName, JobStoreSupport.VoidTransactionCallback txCallback)
          Execute the given callback having optionally aquired the given lock.
 Object executeWithoutLock(JobStoreSupport.TransactionCallback txCallback)
          Execute the given callback in a transaction.
protected  List findFailedInstances(Connection conn)
          Get a list of all scheduler instances in the cluster that may have failed.
protected  Connection getAttributeRestoringConnection(Connection conn)
          Wrap the given Connection in a Proxy such that attributes that might be set will be restored before the connection is closed (and potentially restored to a pool).
protected  String[] getCalendarNames(Connection conn, SchedulingContext ctxt)
           
 String[] getCalendarNames(SchedulingContext ctxt)
           Get the names of all of the Calendar s in the JobStore.
protected  ClassLoadHelper getClassLoadHelper()
           
 long getClusterCheckinInterval()
           Get the frequency (in milliseconds) at which this instance "checks-in" with the other instances of the cluster.
protected  Connection getConnection()
           
 String getDataSource()
           Get the name of the DataSource that should be used for performing database functions.
 long getDbRetryInterval()
           
protected  org.quartz.impl.jdbcjobstore.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.
 String getDriverDelegateClass()
           Get the JDBC driver delegate class name.
protected  String getFiredTriggerRecordId()
           
 String getInstanceId()
           Get the instance Id of the Scheduler (must be unique within a cluster).
 String getInstanceName()
          Get the instance name of the Scheduler (must be unique within this server instance).
protected  String[] getJobGroupNames(Connection conn, SchedulingContext ctxt)
           
 String[] getJobGroupNames(SchedulingContext ctxt)
           Get the names of all of the Job groups.
protected  String[] getJobNames(Connection conn, SchedulingContext ctxt, String groupName)
           
 String[] getJobNames(SchedulingContext ctxt, String groupName)
           Get the names of all of the Job s that have the given group name.
protected  Semaphore getLockHandler()
           
protected  org.apache.commons.logging.Log 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  Connection getNonManagedTXConnection()
           
protected  int getNumberOfCalendars(Connection conn, SchedulingContext ctxt)
           
 int getNumberOfCalendars(SchedulingContext ctxt)
           Get the number of Calendar s that are stored in the JobsStore.
protected  int getNumberOfJobs(Connection conn, SchedulingContext ctxt)
           
 int getNumberOfJobs(SchedulingContext ctxt)
           Get the number of Job s that are stored in the JobStore.
protected  int getNumberOfTriggers(Connection conn, SchedulingContext ctxt)
           
 int getNumberOfTriggers(SchedulingContext ctxt)
           Get the number of Trigger s that are stored in the JobsStore.
 Set getPausedTriggerGroups(Connection conn, SchedulingContext ctxt)
           Pause all of the Triggers in the given group.
 Set getPausedTriggerGroups(SchedulingContext ctxt)
           
 String getSelectWithLockSQL()
           
 String getTablePrefix()
           Get the prefix that should be pre-pended to all table names.
protected  String[] getTriggerGroupNames(Connection conn, SchedulingContext ctxt)
           
 String[] getTriggerGroupNames(SchedulingContext ctxt)
           Get the names of all of the Trigger groups.
protected  String[] getTriggerNames(Connection conn, SchedulingContext ctxt, String groupName)
           
 String[] getTriggerNames(SchedulingContext ctxt, String groupName)
           Get the names of all of the Trigger s that have the given group name.
protected  Trigger[] getTriggersForJob(Connection conn, SchedulingContext ctxt, String jobName, String groupName)
           
 Trigger[] getTriggersForJob(SchedulingContext ctxt, String jobName, String groupName)
           Get all of the Triggers that are associated to the given Job.
 int getTriggerState(Connection conn, SchedulingContext ctxt, String triggerName, String groupName)
           
 int getTriggerState(SchedulingContext ctxt, String triggerName, String groupName)
           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 the JobStore 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(Connection conn, String jobName, String groupName)
           Check existence of a given job.
protected  void logWarnIfNonZero(int val, String warning)
           
 void pauseAll(Connection conn, SchedulingContext ctxt)
           Pause all triggers - equivalent of calling pauseTriggerGroup(group) on every group.
 void pauseAll(SchedulingContext ctxt)
           Pause all triggers - equivalent of calling pauseTriggerGroup(group) on every group.
 void pauseJob(SchedulingContext ctxt, String jobName, String groupName)
           Pause the Job with the given name - by pausing all of its current Triggers.
 void pauseJobGroup(SchedulingContext ctxt, String groupName)
           Pause all of the Jobs in the given group - by pausing all of their Triggers.
 void pauseTrigger(Connection conn, SchedulingContext ctxt, String triggerName, String groupName)
           Pause the Trigger with the given name.
 void pauseTrigger(SchedulingContext ctxt, String triggerName, String groupName)
           Pause the Trigger with the given name.
 void pauseTriggerGroup(Connection conn, SchedulingContext ctxt, String groupName)
           Pause all of the Triggers in the given group.
 void pauseTriggerGroup(SchedulingContext ctxt, String groupName)
           Pause all of the Triggers in the given group.
protected  void recoverJobs()
          Recover any failed or misfired jobs and clean up the data store as appropriate.
protected  void recoverJobs(Connection conn)
           Will recover any failed or misfired jobs and clean up the data store as appropriate.
protected  JobStoreSupport.RecoverMisfiredJobsResult recoverMisfiredJobs(Connection conn, boolean recovering)
           
protected  void releaseAcquiredTrigger(Connection conn, SchedulingContext ctxt, Trigger trigger)
           
 void releaseAcquiredTrigger(SchedulingContext ctxt, Trigger trigger)
           Inform the JobStore that the scheduler no longer plans to fire the given Trigger, that it had previously acquired (reserved).
protected  void releaseLock(Connection conn, String lockName, boolean doIt)
           
protected  boolean removeCalendar(Connection conn, SchedulingContext ctxt, String calName)
           
 boolean removeCalendar(SchedulingContext ctxt, String calName)
           Remove (delete) the Calendar with the given name.
protected  boolean removeJob(Connection conn, SchedulingContext ctxt, String jobName, String groupName, boolean activeDeleteSafe)
           
 boolean removeJob(SchedulingContext ctxt, String jobName, String groupName)
           Remove (delete) the Job with the given name, and any Trigger s that reference it.
protected  boolean removeTrigger(Connection conn, SchedulingContext ctxt, String triggerName, String groupName)
           
 boolean removeTrigger(SchedulingContext ctxt, String triggerName, String groupName)
           Remove (delete) the Trigger with the given name.
protected  boolean replaceTrigger(Connection conn, SchedulingContext ctxt, String triggerName, String groupName, Trigger newTrigger)
           
 boolean replaceTrigger(SchedulingContext ctxt, String triggerName, String groupName, Trigger newTrigger)
           Remove (delete) the Trigger with the given name, and store the new given one - which must be associated with the same job.
 void resumeAll(Connection conn, SchedulingContext ctxt)
          protected
 void resumeAll(SchedulingContext ctxt)
           Resume (un-pause) all triggers - equivalent of calling resumeTriggerGroup(group) on every group.
 void resumeJob(SchedulingContext ctxt, String jobName, String groupName)
           Resume (un-pause) the Job with the given name.
 void resumeJobGroup(SchedulingContext ctxt, String groupName)
           Resume (un-pause) all of the Jobs in the given group.
 void resumeTrigger(Connection conn, SchedulingContext ctxt, String triggerName, String groupName)
           Resume (un-pause) the Trigger with the given name.
 void resumeTrigger(SchedulingContext ctxt, String triggerName, String groupName)
           Resume (un-pause) the Trigger with the given name.
 void resumeTriggerGroup(Connection conn, SchedulingContext ctxt, String groupName)
           Resume (un-pause) all of the Triggers in the given group.
 void resumeTriggerGroup(SchedulingContext ctxt, String groupName)
           Resume (un-pause) all of the Triggers in the given group.
protected  Calendar retrieveCalendar(Connection conn, SchedulingContext ctxt, String calName)
           
 Calendar retrieveCalendar(SchedulingContext ctxt, String calName)
           Retrieve the given Trigger.
protected  JobDetail retrieveJob(Connection conn, SchedulingContext ctxt, String jobName, String groupName)
           
 JobDetail retrieveJob(SchedulingContext ctxt, String jobName, String groupName)
           Retrieve the JobDetail for the given Job.
protected  Trigger retrieveTrigger(Connection conn, SchedulingContext ctxt, String triggerName, String groupName)
           
protected  Trigger retrieveTrigger(Connection conn, String triggerName, String groupName)
           
 Trigger retrieveTrigger(SchedulingContext ctxt, String triggerName, String groupName)
           Retrieve the given Trigger.
protected  void rollbackConnection(Connection conn)
          Rollback the supplied connection.
 void schedulerStarted()
           Called by the QuartzScheduler to inform the JobStore 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(String dsName)
           Set the name of the DataSource 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(String delegateClassName)
           Set the JDBC driver delegate class.
 void setInstanceId(String instanceId)
           Set the instance Id of the Scheduler (must be unique within a cluster).
 void setInstanceName(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(String string)
           set the SQL statement to use to select and lock a row in the "locks" table.
 void setTablePrefix(String prefix)
           Set the prefix that should be pre-pended to all table names.
 void 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(String useProp)
           Set whether String-only properties will be handled in JobDataMaps.
 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.
protected  void signalSchedulingChange(long candidateNewNextFireTime)
           
protected  void storeCalendar(Connection conn, SchedulingContext ctxt, String calName, Calendar calendar, boolean replaceExisting, boolean updateTriggers)
           
 void storeCalendar(SchedulingContext ctxt, String calName, Calendar calendar, boolean replaceExisting, boolean updateTriggers)
           Store the given Calendar.
protected  void storeJob(Connection conn, SchedulingContext ctxt, JobDetail newJob, boolean replaceExisting)
           Insert or update a job.
 void storeJob(SchedulingContext ctxt, JobDetail newJob, boolean replaceExisting)
           Store the given JobDetail.
 void storeJobAndTrigger(SchedulingContext ctxt, JobDetail newJob, Trigger newTrigger)
           Store the given JobDetail and Trigger.
protected  void storeTrigger(Connection conn, SchedulingContext ctxt, Trigger newTrigger, JobDetail job, boolean replaceExisting, String state, boolean forceState, boolean recovering)
           Insert or update a trigger.
 void storeTrigger(SchedulingContext ctxt, Trigger newTrigger, boolean replaceExisting)
           Store the given Trigger.
 boolean supportsPersistence()
           
protected  void triggeredJobComplete(Connection conn, SchedulingContext ctxt, Trigger trigger, JobDetail jobDetail, int triggerInstCode)
           
 void triggeredJobComplete(SchedulingContext ctxt, Trigger trigger, JobDetail&n