티스토리 뷰
package org.quartz.impl.jdbcjobstore;
public abstract class JobStoreSupport implements JobStore, Constants {
class MisfireHandler extends Thread {
public void run() {
while (!shutdown) {
RecoverMisfiredJobsResult recoverMisfiredJobsResult = manage();
if (!shutdown) {
long timeToSleep = 50l; // At least a short pause to help balance threads
if (!recoverMisfiredJobsResult.hasMoreMisfiredTriggers()) {
timeToSleep = getMisfireThreshold() - (System.currentTimeMillis() - sTime);
if(numFails > 0) {
timeToSleep = Math.max(getDbRetryInterval(), timeToSleep);
}
}
Thread.sleep(timeToSleep);
}//while !shutdown
}
}
private RecoverMisfiredJobsResult manage() {
try {
RecoverMisfiredJobsResult res = doRecoverMisfires();
} catch (Exception e) {
}
return RecoverMisfiredJobsResult.NO_OP;
}
}
protected RecoverMisfiredJobsResult doRecoverMisfires() throws JobPersistenceException {
boolean transOwner = false;
Connection conn = getNonManagedTXConnection();
try {
RecoverMisfiredJobsResult result = RecoverMisfiredJobsResult.NO_OP;
// Before we make the potentially expensive call to acquire the
// trigger lock, peek ahead to see if it is likely we would find
// misfired triggers requiring recovery.
int misfireCount = (getDoubleCheckLockMisfireHandler()) ?
getDelegate().countMisfiredTriggersInStates(conn, STATE_MISFIRED, STATE_WAITING, getMisfireTime()) :
Integer.MAX_VALUE;
if (misfireCount == 0) {
getLog().debug("Found 0 triggers that missed their scheduled fire-time.");
} else {
transOwner = getLockHandler().obtainLock(conn, LOCK_TRIGGER_ACCESS);
result = recoverMisfiredJobs(conn, false);
}
commitConnection(conn);
return result;
} catch (JobPersistenceException e) {
}
}
protected RecoverMisfiredJobsResult recoverMisfiredJobs(Connection conn, boolean recovering)
throws JobPersistenceException, SQLException {
// If recovering, we want to handle all of the misfired
// triggers right away.
int maxMisfiresToHandleAtATime =
(recovering) ? -1 : getMaxMisfiresToHandleAtATime();
List misfiredTriggers = new ArrayList();
long earliestNewTime = Long.MAX_VALUE;
// We must still look for the MISFIRED state in case triggers were left
// in this state when upgrading to this version that does not support it.
boolean hasMoreMisfiredTriggers =
getDelegate().selectMisfiredTriggersInStates(
conn, STATE_MISFIRED, STATE_WAITING, getMisfireTime(),
maxMisfiresToHandleAtATime, misfiredTriggers);
for (Iterator misfiredTriggerIter = misfiredTriggers.iterator(); misfiredTriggerIter.hasNext();) {
Key triggerKey = (Key) misfiredTriggerIter.next();
Trigger trig = retrieveTrigger(conn, triggerKey.getName(), triggerKey.getGroup());
if (trig == null) {
continue;
}
doUpdateOfMisfiredTrigger(conn, null, trig, false, STATE_WAITING, recovering);
if(trig.getNextFireTime() != null && trig.getNextFireTime().getTime() < earliestNewTime)
earliestNewTime = trig.getNextFireTime().getTime();
}
return new RecoverMisfiredJobsResult(
hasMoreMisfiredTriggers, misfiredTriggers.size(), earliestNewTime);
}
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);
}
}
}
package org.quartz.impl.jdbcjobstore;
public class StdJDBCDelegate implements DriverDelegate, StdJDBCConstants {
public boolean selectMisfiredTriggersInStates(Connection conn, String state1, String state2,
String SELECT_MISFIRED_TRIGGERS_IN_STATES = "SELECT "
+ COL_TRIGGER_NAME + ", " + COL_TRIGGER_GROUP + " FROM "
+ TABLE_PREFIX_SUBST + TABLE_TRIGGERS + " WHERE "
+ COL_NEXT_FIRE_TIME + " < ? "
+ "AND ((" + COL_TRIGGER_STATE + " = ?) OR (" + COL_TRIGGER_STATE + " = ?)) "
+ "ORDER BY " + COL_NEXT_FIRE_TIME + " ASC";
}
public Trigger selectTrigger(Connection conn, String triggerName,
String groupName) throws SQLException, ClassNotFoundException,
IOException {
String SELECT_TRIGGER = "SELECT *" + " FROM "
+ TABLE_PREFIX_SUBST + TABLE_TRIGGERS + " WHERE "
+ COL_TRIGGER_NAME + " = ? AND " + COL_TRIGGER_GROUP + " = ?";
String SELECT_CRON_TRIGGER = "SELECT *" + " FROM "
+ TABLE_PREFIX_SUBST + TABLE_CRON_TRIGGERS + " WHERE "
+ COL_TRIGGER_NAME + " = ? AND " + COL_TRIGGER_GROUP + " = ?";
}
}
- Total
- Today
- Yesterday
- Xcode
- flex
- Mac
- oracle
- koba2010
- ubuntu
- 튜닝쇼 2008
- 레이싱모델 익스트림 포토 페스티벌
- MySQL
- KOBA
- ffmpeg
- Linux
- Java
- sas2009
- JavaScript
- 서울오토살롱
- 동경
- NDK
- android
- BPI-M4
- SAS
- Delphi
- 전예희
- 지스타2007
- Delphi Tip
- 송주경
- Spring MVC
- ble
- 일본여행
- Spring
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |