Hi, I am forced to execute a periodic task using a timer that is invoked at a different interval as the period I'd like to execute this task.
Note that the timeout does not occur 100% accurately; i.e. timeout(javax.ejb.Timer timer) in the code below might be invoked at intervals 100, 98, 105ms etc.
So, I came up with this, which is sort of okay. But occasionally the task will be executed twice before the intended interval passes, or the interval becomes a little longer than I intend.
Do you have any better idea than this? (Code is simplified pseudo-code, will be used within a EJB container)
import javax.annotation.Resource;
import javax.ejb.Timeout;
import javax.ejb.Timer;
import javax.ejb.TimerService;
public class TimerBean {
private static final long TASK_INTERVAL = 1530;
private static final long TIMEOUT = 100;
@Resource
private TimerService timerService;
public void startTimer() {
timerService.createTimer(100, TIMEOUT, null);
}
@Timeout
public void timeout(javax.ejb.Timer timer) {
if(isApproxTime(timer, TASK_INTERVAL)){
//do stuff
}
}
private boolean isApproxTime(Timer timer, long targetInterval) {
long modulus = timer.getNextTimeout().getTime() % targetInterval;
return modulus < TIMEOUT;
}
}
EDIT: I'd like to avoid state other than ejb.Timer, so saving the time of last invocation is not an option.