package org.mobicents.timers.timer;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import java.util.UUID;
import javax.transaction.TransactionManager;
import org.mobicents.cluster.MobicentsCluster;
import org.mobicents.timers.FaultTolerantScheduler;
import org.mobicents.timers.PeriodicScheduleStrategy;
/**
* A fault tolerant implementation of a {@link Timer}, using the
* {@link FaultTolerantScheduler}.
*
* There is no guarantee that fail over recover works correctly with not serializable {@link TimerTask}s
*
* @author martins
*
*/
public class FaultTolerantTimer extends java.util.Timer {
/**
*
*/
private final FaultTolerantScheduler scheduler;
/**
*
*/
private final FaultTolerantTimerTimerTaskFactory timerTaskFactory;
/**
*
* @param cacheData
* @param txManager
*/
public FaultTolerantTimer(String name, MobicentsCluster cluster, byte priority, TransactionManager txManager) {
timerTaskFactory = new FaultTolerantTimerTimerTaskFactory();
scheduler = new FaultTolerantScheduler(name,16, cluster, priority, txManager, timerTaskFactory);
timerTaskFactory.setScheduler(scheduler);
}
/**
*
* @return the scheduler
*/
public FaultTolerantScheduler getScheduler() {
return scheduler;
}
@Override
public void cancel() {
scheduler.shutdownNow();
}
@Override
public int purge() {
int count = 0;
for (org.mobicents.timers.TimerTask timerTask : scheduler.getLocalRunningTasks()) {
FaultTolerantTimerTimerTask ftTimerTask = (FaultTolerantTimerTimerTask) timerTask;
if (ftTimerTask.isCanceled()) {
scheduler.cancel(ftTimerTask.getData().getTaskID());
count++;
}
}
return count;
}
@Override
public void schedule(TimerTask task, Date firstTime, long period) {
final org.mobicents.timers.TimerTask taskWrapper = timerTaskFactory.newTimerTask(new FaultTolerantTimerTimerTaskData(task, UUID.randomUUID(),firstTime.getTime() - System.currentTimeMillis(),period,PeriodicScheduleStrategy.withFixedDelay));
scheduler.schedule(taskWrapper);
}
@Override
public void schedule(TimerTask task, Date time) {
final org.mobicents.timers.TimerTask taskWrapper = timerTaskFactory.newTimerTask(new FaultTolerantTimerTimerTaskData(task, UUID.randomUUID(),time.getTime() - System.currentTimeMillis(),-1,null));
scheduler.schedule(taskWrapper);
}
@Override
public void schedule(TimerTask task, long delay) {
final org.mobicents.timers.TimerTask taskWrapper = timerTaskFactory.newTimerTask(new FaultTolerantTimerTimerTaskData(task, UUID.randomUUID(),System.currentTimeMillis()+delay,-1,null));
scheduler.schedule(taskWrapper);
}
@Override
public void schedule(TimerTask task, long delay, long period) {
final org.mobicents.timers.TimerTask taskWrapper = timerTaskFactory.newTimerTask(new FaultTolerantTimerTimerTaskData(task, UUID.randomUUID(),System.currentTimeMillis()+delay,period,PeriodicScheduleStrategy.withFixedDelay));
scheduler.schedule(taskWrapper);
}
@Override
public void scheduleAtFixedRate(TimerTask task, Date firstTime, long period) {
final org.mobicents.timers.TimerTask taskWrapper = timerTaskFactory.newTimerTask(new FaultTolerantTimerTimerTaskData(task, UUID.randomUUID(),firstTime.getTime() - System.currentTimeMillis(),period,PeriodicScheduleStrategy.atFixedRate));
scheduler.schedule(taskWrapper);
}
@Override
public void scheduleAtFixedRate(TimerTask task, long delay, long period) {
final org.mobicents.timers.TimerTask taskWrapper = timerTaskFactory.newTimerTask(new FaultTolerantTimerTimerTaskData(task, UUID.randomUUID(),System.currentTimeMillis()+delay,period,PeriodicScheduleStrategy.atFixedRate));
scheduler.schedule(taskWrapper);
}
}