📄 trigger.java
字号:
public void setCalendarName(String calendarName) {
this.calendarName = calendarName;
}
/**
* <p>
* Get the name of the <code>{@link Calendar}</code> associated with this
* Trigger.
* </p>
*
* @return <code>null</code> if there is no associated Calendar.
*/
public String getCalendarName() {
return calendarName;
}
/**
* <p>
* Get the <code>JobDataMap</code> that is associated with the
* <code>Trigger</code>.
* </p>
*
* <p>
* Changes made to this map during job execution are not re-persisted, and
* in fact typically result in an <code>IllegalStateException</code>.
* </p>
*/
public JobDataMap getJobDataMap() {
if (jobDataMap == null) {
jobDataMap = new JobDataMap();
}
return jobDataMap;
}
/**
* <p>
* Set the <code>JobDataMap</code> to be associated with the
* <code>Trigger</code>.
* </p>
*/
public void setJobDataMap(JobDataMap jobDataMap) {
this.jobDataMap = jobDataMap;
}
/**
* <p>
* Whether or not the <code>Trigger</code> should be persisted in the
* <code>{@link org.quartz.spi.JobStore}</code> for re-use after program
* restarts.
* </p>
*
* <p>
* If not explicitly set, the default value is <code>false</code>.
* </p>
*
* @return <code>true</code> if the <code>Trigger</code> should be
* garbage collected along with the <code>{@link Scheduler}</code>.
*/
public boolean isVolatile() {
return volatility;
}
/**
* The priority of a <code>Trigger</code> acts as a tiebreaker such that if
* two <code>Trigger</code>s have the same scheduled fire time, then the
* one with the higher priority will get first access to a worker
* thread.
*
* <p>
* If not explicitly set, the default value is <code>5</code>.
* </p>
*
* @see #DEFAULT_PRIORITY
*/
public int getPriority() {
return priority;
}
/**
* The priority of a <code>Trigger</code> acts as a tiebreaker such that if
* two <code>Trigger</code>s have the same scheduled fire time, then the
* one with the higher priority will get first access to a worker
* thread.
*
* <p>
* If not explicitly set, the default value is <code>5</code>.
* </p>
*
* @see #DEFAULT_PRIORITY
*/
public void setPriority(int priority) {
this.priority = priority;
}
/**
* <p>
* Add the specified name of a <code>{@link TriggerListener}</code> to
* the end of the <code>Trigger</code>'s list of listeners.
* </p>
*/
public void addTriggerListener(String name) {
if (triggerListeners.contains(name)) {
throw new IllegalArgumentException(
"Trigger listener '" + name + "' is already registered for trigger: " + getFullName());
}
triggerListeners.add(name);
}
/**
* <p>
* Remove the specified name of a <code>{@link TriggerListener}</code>
* from the <code>Trigger</code>'s list of listeners.
* </p>
*
* @return true if the given name was found in the list, and removed
*/
public boolean removeTriggerListener(String name) {
return triggerListeners.remove(name);
}
/**
* <p>
* Returns an array of <code>String</code> containing the names of all
* <code>{@link TriggerListener}</code>s assigned to the <code>Trigger</code>,
* in the order in which they should be notified.
* </p>
*/
public String[] getTriggerListenerNames() {
return (String[])triggerListeners.toArray(new String[triggerListeners.size()]);
}
/**
* Remove all <code>{@link TriggerListener}</code>s from the <code>Trigger</code>.
*/
public void clearAllTriggerListeners() {
triggerListeners.clear();
}
/**
* <p>
* This method should not be used by the Quartz client.
* </p>
*
* <p>
* Called when the <code>{@link Scheduler}</code> has decided to 'fire'
* the trigger (execute the associated <code>Job</code>), in order to
* give the <code>Trigger</code> a chance to update itself for its next
* triggering (if any).
* </p>
*
* @see #executionComplete(JobExecutionContext, JobExecutionException)
*/
public abstract void triggered(Calendar calendar);
/**
* <p>
* This method should not be used by the Quartz client.
* </p>
*
* <p>
* Called by the scheduler at the time a <code>Trigger</code> is first
* added to the scheduler, in order to have the <code>Trigger</code>
* compute its first fire time, based on any associated calendar.
* </p>
*
* <p>
* After this method has been called, <code>getNextFireTime()</code>
* should return a valid answer.
* </p>
*
* @return the first time at which the <code>Trigger</code> will be fired
* by the scheduler, which is also the same value <code>getNextFireTime()</code>
* will return (until after the first firing of the <code>Trigger</code>).
* </p>
*/
public abstract Date computeFirstFireTime(Calendar calendar);
/**
* <p>
* This method should not be used by the Quartz client.
* </p>
*
* <p>
* Called after the <code>{@link Scheduler}</code> has executed the
* <code>{@link org.quartz.JobDetail}</code> associated with the <code>Trigger</code>
* in order to get the final instruction code from the trigger.
* </p>
*
* @param context
* is the <code>JobExecutionContext</code> that was used by the
* <code>Job</code>'s<code>execute(xx)</code> method.
* @param result
* is the <code>JobExecutionException</code> thrown by the
* <code>Job</code>, if any (may be null).
* @return one of the Trigger.INSTRUCTION_XXX constants.
*
* @see #INSTRUCTION_NOOP
* @see #INSTRUCTION_RE_EXECUTE_JOB
* @see #INSTRUCTION_DELETE_TRIGGER
* @see #INSTRUCTION_SET_TRIGGER_COMPLETE
* @see #triggered(Calendar)
*/
public abstract int executionComplete(JobExecutionContext context,
JobExecutionException result);
/**
* <p>
* Used by the <code>{@link Scheduler}</code> to determine whether or not
* it is possible for this <code>Trigger</code> to fire again.
* </p>
*
* <p>
* If the returned value is <code>false</code> then the <code>Scheduler</code>
* may remove the <code>Trigger</code> from the <code>{@link org.quartz.spi.JobStore}</code>.
* </p>
*/
public abstract boolean mayFireAgain();
/**
* <p>
* Get the time at which the <code>Trigger</code> should occur.
* </p>
*/
public abstract Date getStartTime();
public abstract void setStartTime(Date startTime);
public abstract void setEndTime(Date endTime);
/**
* <p>
* Get the time at which the <code>Trigger</code> should quit repeating -
* even if an assigned 'repeatCount' isn't yet satisfied.
* </p>
*
* @see #getFinalFireTime()
*/
public abstract Date getEndTime();
/**
* <p>
* Returns the next time at which the <code>Trigger</code> will fire. If
* the trigger will not fire again, <code>null</code> will be returned.
* The value returned is not guaranteed to be valid until after the <code>Trigger</code>
* has been added to the scheduler.
* </p>
*/
public abstract Date getNextFireTime();
/**
* <p>
* Returns the previous time at which the <code>Trigger</code> will fire.
* If the trigger has not yet fired, <code>null</code> will be returned.
*/
public abstract Date getPreviousFireTime();
/**
* <p>
* Returns the next time at which the <code>Trigger</code> will fire,
* after the given time. If the trigger will not fire after the given time,
* <code>null</code> will be returned.
* </p>
*/
public abstract Date getFireTimeAfter(Date afterTime);
/**
* <p>
* Returns the last time at which the <code>Trigger</code> will fire, if
* the Trigger will repeat indefinitely, null will be returned.
* </p>
*
* <p>
* Note that the return time *may* be in the past.
* </p>
*/
public abstract Date getFinalFireTime();
/**
* <p>
* Set the instruction the <code>Scheduler</code> should be given for
* handling misfire situations for this <code>Trigger</code>- the
* concrete <code>Trigger</code> type that you are using will have
* defined a set of additional <code>MISFIRE_INSTRUCTION_XXX</code>
* constants that may be passed to this method.
* </p>
*
* <p>
* If not explicitly set, the default value is <code>MISFIRE_INSTRUCTION_SMART_POLICY</code>.
* </p>
*
* @see #MISFIRE_INSTRUCTION_SMART_POLICY
* @see #updateAfterMisfire(Calendar)
* @see SimpleTrigger
* @see CronTrigger
*/
public void setMisfireInstruction(int misfireInstruction) {
if (!validateMisfireInstruction(misfireInstruction)) {
throw new IllegalArgumentException(
"The misfire instruction code is invalid for this type of trigger.");
}
this.misfireInstruction = misfireInstruction;
}
protected abstract boolean validateMisfireInstruction(int misfireInstruction);
/**
* <p>
* Get the instruction the <code>Scheduler</code> should be given for
* handling misfire situations for this <code>Trigger</code>- the
* concrete <code>Trigger</code> type that you are using will have
* defined a set of additional <code>MISFIRE_INSTRUCTION_XXX</code>
* constants that may be passed to this method.
* </p>
*
* <p>
* If not explicitly set, the default value is <code>MISFIRE_INSTRUCTION_SMART_POLICY</code>.
* </p>
*
* @see #MISFIRE_INSTRUCTION_SMART_POLICY
* @see #updateAfterMisfire(Calendar)
* @see SimpleTrigger
* @see CronTrigger
*/
public int getMisfireInstruction() {
return misfireInstruction;
}
/**
* <p>
* This method should not be used by the Quartz client.
* </p>
*
* <p>
* To be implemented by the concrete classes that extend this class.
* </p>
*
* <p>
* The implementation should update the <code>Trigger</code>'s state
* based on the MISFIRE_INSTRUCTION_XXX that was selected when the <code>Trigger</code>
* was created.
* </p>
*/
public abstract void updateAfterMisfire(Calendar cal);
/**
* <p>
* This method should not be used by the Quartz client.
* </p>
*
* <p>
* To be implemented by the concrete class.
* </p>
*
* <p>
* The implementation should update the <code>Trigger</code>'s state
* based on the given new version of the associated <code>Calendar</code>
* (the state should be updated so that it's next fire time is appropriate
* given the Calendar's new settings).
* </p>
*
* @param cal
*/
public abstract void updateWithNewCalendar(Calendar cal, long misfireThreshold);
/**
* <p>
* Validates whether the properties of the <code>JobDetail</code> are
* valid for submission into a <code>Scheduler</code>.
*
* @throws IllegalStateException
* if a required property (such as Name, Group, Class) is not
* set.
*/
public void validate() throws SchedulerException {
if (name == null) {
throw new SchedulerException("Trigger's name cannot be null",
SchedulerException.ERR_CLIENT_ERROR);
}
if (group == null) {
throw new SchedulerException("Trigger's group cannot be null",
SchedulerException.ERR_CLIENT_ERROR);
}
if (jobName == null) {
throw new SchedulerException(
"Trigger's related Job's name cannot be null",
SchedulerException.ERR_CLIENT_ERROR);
}
if (jobGroup == null) {
throw new SchedulerException(
"Trigger's related Job's group cannot be null",
SchedulerException.ERR_CLIENT_ERROR);
}
}
/**
* <p>
* This method should not be used by the Quartz client.
* </p>
*
* <p>
* Usable by <code>{@link org.quartz.spi.JobStore}</code>
* implementations, in order to facilitate 'recognizing' instances of fired
* <code>Trigger</code> s as their jobs complete execution.
* </p>
*
*
*/
public void setFireInstanceId(String id) {
this.fireInstanceId = id;
}
/**
* <p>
* This method should not be used by the Quartz client.
* </p>
*/
public String getFireInstanceId() {
return fireInstanceId;
}
/**
* <p>
* Return a simple string representation of this object.
* </p>
*/
public String toString() {
return "Trigger '" + getFullName() + "': triggerClass: '"
+ getClass().getName() + " isVolatile: " + isVolatile()
+ " calendar: '" + getCalendarName() + "' misfireInstruction: "
+ getMisfireInstruction() + " nextFireTime: " + getNextFireTime();
}
/**
* <p>
* Compare the next fire time of this <code>Trigger</code> to that of
* another.
* </p>
*/
public int compareTo(Object obj) {
Trigger other = (Trigger) obj;
Date myTime = getNextFireTime();
Date otherTime = other.getNextFireTime();
if (myTime == null && otherTime == null) {
return 0;
}
if (myTime == null) {
return 1;
}
if (otherTime == null) {
return -1;
}
if(myTime.before(otherTime)) {
return -1;
}
if(myTime.after(otherTime)) {
return 1;
}
return 0;
}
public boolean equals(Object obj) {
if (!(obj instanceof Trigger)) {
return false;
}
Trigger other = (Trigger) obj;
if (!other.getName().equals(getName())) {
return false;
}
if (!other.getGroup().equals(getGroup())) {
return false;
}
return true;
}
public int hashCode() {
return getFullName().hashCode();
}
public Object clone() {
Trigger copy;
try {
copy = (Trigger) super.clone();
copy.triggerListeners = (LinkedList)triggerListeners.clone();
// Shallow copy the jobDataMap. Note that this means that if a user
// modifies a value object in this map from the cloned Trigger
// they will also be modifying this Trigger.
if (jobDataMap != null) {
copy.jobDataMap = (JobDataMap)jobDataMap.clone();
}
} catch (CloneNotSupportedException ex) {
throw new IncompatibleClassChangeError("Not Cloneable.");
}
return copy;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -