import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Consumer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public Timer register(String timerName, Consumer<String> action) {
synchronized (lockit) {
- Timer timer = new Timer(timerName, action);
-
// always remove existing entry so that new entry goes at the end of the map
- name2timer.remove(timerName);
+ Timer timer = name2timer.remove(timerName);
+ if (timer != null) {
+ logger.info("{} timer replaced {}", name, timer);
+ }
+
+ timer = new Timer(timerName, action);
name2timer.put(timerName, timer);
logger.info("{} timer registered {}", name, timer);
// run the timer
try {
+ logger.info("{} timer firing {}", TimerManager.this.name, timer);
timer.runner.accept(timer.name);
} catch (RuntimeException e) {
logger.warn("{} timer threw an exception {}", TimerManager.this.name, timer, e);
private boolean cancel(String cancelMsg) {
synchronized (lockit) {
- AtomicBoolean wasPresent = new AtomicBoolean(false);
-
- name2timer.computeIfPresent(name, (key, val) -> {
-
- if (val == this) {
- wasPresent.set(true);
- return null;
-
- } else {
- // different timer is in the map - leave it
- return val;
- }
- });
-
- if (!wasPresent.get()) {
+ if (!name2timer.remove(name, this)) {
// have a new timer in the map - ignore "this" timer
- logger.info("{} timer replaced {}", TimerManager.this.name, this);
+ logger.info("{} timer discarded ({}) {}", TimerManager.this.name, cancelMsg, this);
return false;
}
- logger.debug("{} timer {} {}", TimerManager.this.name, cancelMsg, this);
-
+ logger.info("{} timer {} {}", TimerManager.this.name, cancelMsg, this);
return true;
}
}