Reputation: 13
Need helps with timer:) I need to create a repated timer in vertx, with a delay that changes.
The parameter delay value - is saved in my DB. let's say we start with 10 seconds.
when I run the handler every 10 seconds I am checking my DataBase.
If the value - delay changes, I want to update the delay timer
Do you know how can I write a timer with changing delay?
public void initTimer() {
long delayFromDB = getDelayFromDB();
setPeriodicTimer(delayFromDB);
}
public long setPeriodicTimer(long delayFromDB) {
long timerID = vertx.setPeriodic(delayFromDB, new Handler<Long>() {
@Override
public void handle(Long timerID) {
long currDelayFromDB = getDelayFromDB();
doSomeOperation();
newDelayFromDB = getDelayFromDB();
if(currDelayFromDB != newDelayFromDB ) {
restartTimerWithNewDelay(newDelayFromDB , timerID);
}
}
});
return timerID;
}
public void restartRefreshTimerWithNewTtl(long newDelayFromDB , Long timerID) {
//cancel last timer: timerID and restart timer with the new delay
vertx.cancelTimer(timerID);
setPeriodicTimer(newDelayFromDB );
}
And is it ok to cancel timer and create another one right after, from the handle of the timer that will be canceled now. like here ? (in this function restartRefreshTimerWithNewTtl)
Upvotes: 0
Views: 924
Reputation: 3192
Your approach works. Another approach would be to not use setPeriodic
but just a regular timer and re-start a timer every time. So instead of :
if(currDelayFromDB != newDelayFromDB ) {
restartTimerWithNewDelay(newDelayFromDB , timerID);
}
You would do something like:
vertx.setTimer(newDelayFromDB , task);
Upvotes: 2