Я вынужден выполнять периодическое задание, используя таймер, который вызывается с другим интервалом, в течение которого я хотел бы выполнить это задание.
Обратите внимание, что тайм-аут не происходит 100% точно; то есть тайм-аут (javax.ejb.Timer timer) в приведенном ниже коде может вызываться с интервалами 100, 98, 105 мс и т. д.
Итак, я придумал это, что-то вроде. Но иногда задание будет выполнено дважды до истечения заданного интервала, или интервал станет немного длиннее, чем я намереваюсь.
У тебя есть идея получше, чем эта?
(Код - это упрощенный псевдокод, будет использоваться в контейнере EJB)
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;
}
}
РЕДАКТИРОВАТЬ: Я хотел бы избежать состояния, отличного от ejb.Timer, поэтому сохранение времени последнего вызова не вариант.