/** * PeriodicAction.java * * @author Created by Omnicore CodeGuide */ package edu.sc.seis.sod.status; import java.util.Timer; import java.util.TimerTask; import edu.iris.Fissures.model.MicroSecondDate; import edu.iris.Fissures.model.TimeInterval; import edu.iris.Fissures.model.UnitImpl; import edu.sc.seis.fissuresUtil.chooser.ClockUtil; import edu.sc.seis.fissuresUtil.exceptionHandler.GlobalExceptionHandler; public abstract class PeriodicAction{ public abstract void act(); public void actIfPeriodElapsed(){ synchronized(schedulingLock) { if(ClockUtil.now().subtract(lastAct).greaterThan(ACTION_INTERVAL)){ actNow(); }else if(!scheduled){ t.schedule(new ScheduledActor(), ACTION_INTERVAL_MILLIS); scheduled = true; } } } private class ScheduledActor extends TimerTask{ public void run() { actNow(); } } private void actNow(){ synchronized(schedulingLock){ lastAct = ClockUtil.now(); scheduled = false; } try{ act(); }catch(Throwable t){ GlobalExceptionHandler.handle("Trouble running periodic action", t); } } private boolean scheduled = false; private static final TimeInterval ACTION_INTERVAL = new TimeInterval(2, UnitImpl.MINUTE); private static final long ACTION_INTERVAL_MILLIS = (long)ACTION_INTERVAL.convertTo(UnitImpl.MILLISECOND).get_value(); private MicroSecondDate lastAct = ClockUtil.now().subtract(ACTION_INTERVAL); private Object schedulingLock = new Object(); private static Timer t = new Timer(); }