in src/main/java/org/apache/sling/discovery/commons/InitDelayingTopologyEventListener.java [98:147]
public InitDelayingTopologyEventListener(final long startupDelay,
final TopologyEventListener delegate,
final Logger loggerOrNull) {
if ( delegate == null ) {
throw new IllegalArgumentException("delegate must not be null");
}
if ( startupDelay <= 0) {
throw new IllegalArgumentException("startupDelay must be greater than 0, not " + startupDelay);
}
this.delegate = delegate;
if ( loggerOrNull != null ) {
this.logger = loggerOrNull;
} else {
this.logger = LoggerFactory.getLogger(this.getClass());
}
final Runnable r = new Runnable() {
@Override
public void run() {
if (InitDelayingTopologyEventListener.this.active.get()) {
// only call afterStartupDelay if we're active
// (to avoid this call if disposed in the meantime)
// and since after disposing this listener is no longer
// used - ie it is a throw-away - you can create
// such a listener on each activate and dispose it on
// deactivate and you'll be fine.
// in any case - time for calling afterStartupDelay here:
afterStartupDelay();
}
}
};
// mark this listener as active
this.active.set(true);
// schedule me
final Timer timer = new Timer();
final TimerTask task = new TimerTask() {
@Override
public void run() {
r.run();
}
};
timer.schedule(task, startupDelay * 1000);
// SLING-5560 : at this point either r is invoked immediately or scheduled after the delay
}