我有一個計時器線程,需要在一天的特定時刻運行以執行數據庫的增量複製。現在它的運行時間爲每小時15分鐘,每小時30分鐘和每小時45分鐘。這是代碼我有一個好的工作:如何使運行在x:00 x:15 x:30和x:45的線程在2:00執行不同的操作
public class TimerRunner implements Runnable {
private static final Semaphore lock = new Semaphore(1);
private static final ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
public static void initialize() {
long delay = getDelay();
executor.schedule(new TimerRunner(), delay, TimeUnit.SECONDS);
}
public static void destroy() {
executor.shutdownNow();
}
private static long getDelay() {
Calendar now = Calendar.getInstance();
long p = 15 * 60; // run at 00, 15, 30 and 45 minutes past the hour
long second = now.get(Calendar.MINUTE) * 60 + now.get(Calendar.SECOND);
return p - (second % p);
}
public static void replicate() {
if (lock.tryAcquire()) {
try {
Thread t = new Thread(new Runnable() {
public void run() {
try {
// here is where the magic happens
} finally {
lock.release();
}
}
});
t.start();
} catch (Exception e) {
lock.release();
}
} else {
throw new IllegalStateException("already running a replicator");
}
}
public void run() {
try {
TimerRunner.replicate();
} finally {
long delay = getDelay();
executor.schedule(new TimerRunner(), delay, TimeUnit.SECONDS);
}
}
}
這個過程是通過調用TimerRunner.initialize()
當服務器啓動並調用TimerRunner.destroy()
開始。
我已經創建了一個完整的複製過程(而不是增量式),我想在一天中的某個時刻運行,比如凌晨2點。如何改變上面的代碼來做到這一點?我認爲它應該非常簡單,就好像現在是凌晨2點左右一樣,而且我已經完成了完整的複製並且現在已經完成了很長一段時間,但是我無法獲得該權利。
請注意,有時複製過程需要更長的時間才能完成。有時超過15分鐘,在凌晨2點左右運行時出現問題。
這兩個調度程序的一個問題是,在凌晨2點,我將不得不運行增量和完整的,但我只需要全部。如何檢查兩個預定過程之間的競賽狀況? – rmarimon 2010-05-27 21:37:47
@rmarimon。我已更新我的答案以解決您的意見。 – 2010-05-28 11:29:24