📄 jobstoresupport.java
字号:
* <p>
* Remove (delete) the <code>{@link org.quartz.Trigger}</code> with the
* given name.
* </p>
*
* <p>
* If removal of the <code>Trigger</code> results in an empty group, the
* group should be removed from the <code>JobStore</code>'s list of
* known group names.
* </p>
*
* <p>
* If removal of the <code>Trigger</code> results in an 'orphaned' <code>Job</code>
* that is not 'durable', then the <code>Job</code> should be deleted
* also.
* </p>
*
* @param triggerName
* The name of the <code>Trigger</code> to be removed.
* @param groupName
* The group name of the <code>Trigger</code> to be removed.
* @return <code>true</code> if a <code>Trigger</code> with the given
* name & group was found and removed from the store.
*/
public boolean removeTrigger(final SchedulingContext ctxt, final String triggerName,
final String groupName) throws JobPersistenceException {
return ((Boolean)executeInLock(
LOCK_TRIGGER_ACCESS,
new TransactionCallback() {
public Object execute(Connection conn) throws JobPersistenceException {
return removeTrigger(conn, ctxt, triggerName, groupName) ?
Boolean.TRUE : Boolean.FALSE;
}
})).booleanValue();
}
protected boolean removeTrigger(Connection conn, SchedulingContext ctxt,
String triggerName, String groupName)
throws JobPersistenceException {
boolean removedTrigger = false;
try {
// this must be called before we delete the trigger, obviously
JobDetail job = getDelegate().selectJobForTrigger(conn,
triggerName, groupName, getClassLoadHelper());
removedTrigger =
deleteTriggerAndChildren(conn, triggerName, groupName);
if (null != job && !job.isDurable()) {
int numTriggers = getDelegate().selectNumTriggersForJob(conn,
job.getName(), job.getGroup());
if (numTriggers == 0) {
// Don't call removeJob() because we don't want to check for
// triggers again.
deleteJobAndChildren(conn, ctxt, job.getName(), job.getGroup());
}
}
} catch (ClassNotFoundException e) {
throw new JobPersistenceException("Couldn't remove trigger: "
+ e.getMessage(), e);
} catch (SQLException e) {
throw new JobPersistenceException("Couldn't remove trigger: "
+ e.getMessage(), e);
}
return removedTrigger;
}
/**
* @see org.quartz.spi.JobStore#replaceTrigger(org.quartz.core.SchedulingContext, java.lang.String, java.lang.String, org.quartz.Trigger)
*/
public boolean replaceTrigger(final SchedulingContext ctxt, final String triggerName,
final String groupName, final Trigger newTrigger) throws JobPersistenceException {
return ((Boolean)executeInLock(
LOCK_TRIGGER_ACCESS,
new TransactionCallback() {
public Object execute(Connection conn) throws JobPersistenceException {
return replaceTrigger(conn, ctxt, triggerName, groupName, newTrigger) ?
Boolean.TRUE : Boolean.FALSE;
}
})).booleanValue();
}
protected boolean replaceTrigger(Connection conn, SchedulingContext ctxt,
String triggerName, String groupName, Trigger newTrigger)
throws JobPersistenceException {
try {
// this must be called before we delete the trigger, obviously
JobDetail job = getDelegate().selectJobForTrigger(conn,
triggerName, groupName, getClassLoadHelper());
if (job == null) {
return false;
}
if (!newTrigger.getJobName().equals(job.getName()) ||
!newTrigger.getJobGroup().equals(job.getGroup())) {
throw new JobPersistenceException("New trigger is not related to the same job as the old trigger.");
}
boolean removedTrigger =
deleteTriggerAndChildren(conn, triggerName, groupName);
storeTrigger(conn, ctxt, newTrigger, job, false, STATE_WAITING, false, false);
return removedTrigger;
} catch (ClassNotFoundException e) {
throw new JobPersistenceException("Couldn't remove trigger: "
+ e.getMessage(), e);
} catch (SQLException e) {
throw new JobPersistenceException("Couldn't remove trigger: "
+ e.getMessage(), e);
}
}
/**
* <p>
* Retrieve the given <code>{@link org.quartz.Trigger}</code>.
* </p>
*
* @param triggerName
* The name of the <code>Trigger</code> to be retrieved.
* @param groupName
* The group name of the <code>Trigger</code> to be retrieved.
* @return The desired <code>Trigger</code>, or null if there is no
* match.
*/
public Trigger retrieveTrigger(final SchedulingContext ctxt, final String triggerName,
final String groupName) throws JobPersistenceException {
return (Trigger)executeWithoutLock( // no locks necessary for read...
new TransactionCallback() {
public Object execute(Connection conn) throws JobPersistenceException {
return retrieveTrigger(conn, ctxt, triggerName, groupName);
}
});
}
protected Trigger retrieveTrigger(Connection conn, SchedulingContext ctxt,
String triggerName, String groupName)
throws JobPersistenceException {
return retrieveTrigger(conn, triggerName, groupName);
}
protected Trigger retrieveTrigger(Connection conn, String triggerName, String groupName)
throws JobPersistenceException {
try {
Trigger trigger = getDelegate().selectTrigger(conn, triggerName,
groupName);
if (trigger == null) {
return null;
}
// In case Trigger was BLOB, clear out any listeners that might
// have been serialized.
trigger.clearAllTriggerListeners();
String[] listeners = getDelegate().selectTriggerListeners(conn,
triggerName, groupName);
for (int i = 0; i < listeners.length; ++i) {
trigger.addTriggerListener(listeners[i]);
}
return trigger;
} catch (Exception e) {
throw new JobPersistenceException("Couldn't retrieve trigger: "
+ e.getMessage(), e);
}
}
/**
* <p>
* Get the current state of the identified <code>{@link Trigger}</code>.
* </p>
*
* @see Trigger#STATE_NORMAL
* @see Trigger#STATE_PAUSED
* @see Trigger#STATE_COMPLETE
* @see Trigger#STATE_ERROR
* @see Trigger#STATE_NONE
*/
public int getTriggerState(final SchedulingContext ctxt, final String triggerName,
final String groupName) throws JobPersistenceException {
return ((Integer)executeWithoutLock( // no locks necessary for read...
new TransactionCallback() {
public Object execute(Connection conn) throws JobPersistenceException {
return new Integer(getTriggerState(conn, ctxt, triggerName, groupName));
}
})).intValue();
}
public int getTriggerState(Connection conn, SchedulingContext ctxt,
String triggerName, String groupName)
throws JobPersistenceException {
try {
String ts = getDelegate().selectTriggerState(conn, triggerName,
groupName);
if (ts == null) {
return Trigger.STATE_NONE;
}
if (ts.equals(STATE_DELETED)) {
return Trigger.STATE_NONE;
}
if (ts.equals(STATE_COMPLETE)) {
return Trigger.STATE_COMPLETE;
}
if (ts.equals(STATE_PAUSED)) {
return Trigger.STATE_PAUSED;
}
if (ts.equals(STATE_PAUSED_BLOCKED)) {
return Trigger.STATE_PAUSED;
}
if (ts.equals(STATE_ERROR)) {
return Trigger.STATE_ERROR;
}
if (ts.equals(STATE_BLOCKED)) {
return Trigger.STATE_BLOCKED;
}
return Trigger.STATE_NORMAL;
} catch (SQLException e) {
throw new JobPersistenceException(
"Couldn't determine state of trigger (" + groupName + "."
+ triggerName + "): " + e.getMessage(), e);
}
}
/**
* <p>
* Store the given <code>{@link org.quartz.Calendar}</code>.
* </p>
*
* @param calName
* The name of the calendar.
* @param calendar
* The <code>Calendar</code> to be stored.
* @param replaceExisting
* If <code>true</code>, any <code>Calendar</code> existing
* in the <code>JobStore</code> with the same name & group
* should be over-written.
* @throws ObjectAlreadyExistsException
* if a <code>Calendar</code> with the same name already
* exists, and replaceExisting is set to false.
*/
public void storeCalendar(final SchedulingContext ctxt, final String calName,
final Calendar calendar, final boolean replaceExisting, final boolean updateTriggers)
throws ObjectAlreadyExistsException, JobPersistenceException {
executeInLock(
(isLockOnInsert() || updateTriggers) ? LOCK_TRIGGER_ACCESS : null,
new VoidTransactionCallback() {
public void execute(Connection conn) throws JobPersistenceException {
storeCalendar(conn, ctxt, calName, calendar, replaceExisting, updateTriggers);
}
});
}
protected void storeCalendar(Connection conn, SchedulingContext ctxt,
String calName, Calendar calendar, boolean replaceExisting, boolean updateTriggers)
throws ObjectAlreadyExistsException, JobPersistenceException {
try {
boolean existingCal = calendarExists(conn, calName);
if (existingCal && !replaceExisting) {
throw new ObjectAlreadyExistsException(
"Calendar with name '" + calName + "' already exists.");
}
if (existingCal) {
if (getDelegate().updateCalendar(conn, calName, calendar) < 1) {
throw new JobPersistenceException(
"Couldn't store calendar. Update failed.");
}
if(updateTriggers) {
Trigger[] trigs = getDelegate().selectTriggersForCalendar(conn, calName);
for(int i=0; i < trigs.length; i++) {
trigs[i].updateWithNewCalendar(calendar, getMisfireThreshold());
storeTrigger(conn, ctxt, trigs[i], null, true, STATE_WAITING, false, false);
}
}
} else {
if (getDelegate().insertCalendar(conn, calName, calendar) < 1) {
throw new JobPersistenceException(
"Couldn't store calendar. Insert failed.");
}
}
if (isClustered == false) {
calendarCache.put(calName, calendar); // lazy-cache
}
} catch (IOException e) {
throw new JobPersistenceException(
"Couldn't store calendar because the BLOB couldn't be serialized: "
+ e.getMessage(), e);
} catch (ClassNotFoundException e) {
throw new JobPersistenceException("Couldn't store calendar: "
+ e.getMessage(), e);
}catch (SQLException e) {
throw new JobPersistenceException("Couldn't store calendar: "
+ e.getMessage(), e);
}
}
protected boolean calendarExists(Connection conn, String calName)
throws JobPersistenceException {
try {
return getDelegate().calendarExists(conn, calName);
} catch (SQLException e) {
throw new JobPersistenceException(
"Couldn't determine calendar existence (" + calName + "): "
+ e.getMessage(), e);
}
}
/**
* <p>
* Remove (delete) the <code>{@link org.quartz.Calendar}</code> with the
* given name.
* </p>
*
* <p>
* If removal of the <code>Calendar</code> would result in
* <code.Trigger</code>s pointing to non-existent calendars, then a
* <code>JobPersistenceException</code> will be thrown.</p>
* *
* @param calName The name of the <code>Calendar</code> to be removed.
* @return <code>true</code> if a <code>Calendar</code> with the given name
* was found and removed from the store.
*/
public boolean removeCalendar(final SchedulingContext ctxt, final String calName)
throws JobPersistenceException {
return ((Boolean)executeInLock(
LOCK_TRIGGER_ACCESS,
new TransactionCallback() {
public Object execute(Connection conn) throws JobPersistenceException {
return removeCalendar(conn, ctxt, calName) ?
Boolean.TRUE : Boolean.FALSE;
}
})).booleanValue();
}
protected boolean removeCalendar(Connection conn, SchedulingContext ctxt,
Str
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -