/** * If possible, submit the event right away, otherwise try again later. * @param event the event to submit */ private void scheduleWriteOutcome(final DesiredRateEvent event) { if (!isEventProcessing()) { sendDesiredRateEvent(event); } else { getScannerExecutor().submit(new Runnable() { @Override public void run() { scheduleWriteOutcome(event); } }); } }
@Override void onStart() { // When starting, send an event in case the expressions // are constants newEvent(DesiredRateEvent.Type.READ_CONNECTION); }
@Override void onResume() { onDesiredEventProcessed(); }
if (!scanActive && !isPaused()) { submit = true; Instant currentInstant = Instant.now(); Instant nextTimeSlot = lastSubmission.plus(getMaxDuration()); if (currentInstant.compareTo(nextTimeSlot) < 0) { delay = Duration.between(currentInstant, nextTimeSlot); scheduleNext(delay);
@Override void onDesiredEventProcessed() { Duration delay = null; synchronized (lock) { // If an event is pending submit it if (queuedEvent != null) { Instant nextSubmission = lastSubmission.plus(getMaxDuration()); delay = Duration.between(Instant.now(), nextSubmission); if (!delay.isNegative() || !delay.isZero()) { lastSubmission = nextSubmission; if (log.isLoggable(logLevel)) { log.log(logLevel, "Schedule next {0}", Instant.now()); } } else { lastSubmission = Instant.now(); if (log.isLoggable(logLevel)) { log.log(logLevel, "Schedule now {0}", Instant.now()); } } } else { scanActive = false; if (log.isLoggable(logLevel)) { log.log(logLevel, "Do not schedule next {0}", Instant.now()); } } } if (delay != null) { scheduleNext(delay); } }
@Override public void run() { DesiredRateEvent nextEvent; synchronized(lock) { nextEvent = queuedEvent; queuedEvent = null; if (log.isLoggable(logLevel)) { log.log(logLevel, "Submitted {0}", Instant.now()); } } // If stopped, the event may be null. Skip the event. if (nextEvent != null) { sendDesiredRateEvent(nextEvent); } else { log.log(logLevel, "Skipping null event {0}", Instant.now()); } } };
private void scheduleNext(Duration delay) { if (delay == null || delay.isNegative()) { getScannerExecutor().submit(notificationTask); } else { getScannerExecutor().schedule(notificationTask, delay.toNanos(), TimeUnit.NANOSECONDS); } }
public PassiveScanDecoupler(ScheduledExecutorService scannerExecutor, Duration maxDuration, DesiredRateEventListener listener) { super(scannerExecutor, maxDuration, listener); synchronized(lock) { lastSubmission = Instant.now().minus(getMaxDuration()); } }
public SourceDesiredRateDecoupler build() { if (type == Type.ACTIVE) { if (scannerExecutor == null) { throw new NullPointerException("Active scanner requires a scannerExecutor"); } if (listener == null) { throw new NullPointerException("Active scanner requires a director"); } if (maxDuration == null) { throw new NullPointerException("Active scanner requires a maxDuration"); } return new ActiveScanDecoupler(scannerExecutor, maxDuration, listener); } if (type == Type.PASSIVE) { if (scannerExecutor == null) { throw new NullPointerException("Passive scanner requires a scannerExecutor"); } if (listener == null) { throw new NullPointerException("Passive scanner requires a director"); } if (maxDuration == null) { throw new NullPointerException("Passive scanner requires a maxDuration"); } return new PassiveScanDecoupler(scannerExecutor, maxDuration, listener); } throw new IllegalStateException("Can't create suitable scanner"); }
@Override void newWriteSuccededEvent() { DesiredRateEvent event = new DesiredRateEvent(); event.addType(DesiredRateEvent.Type.WRITE_SUCCEEDED); scheduleWriteOutcome(event); }
@Override void newWriteFailedEvent(Exception ex) { DesiredRateEvent event = new DesiredRateEvent(); event.addWriteFailed(new RuntimeException()); sendDesiredRateEvent(event); }
@Override void newReadConnectionEvent() { newEvent(DesiredRateEvent.Type.READ_CONNECTION); }
@Override void newWriteConnectionEvent() { newEvent(DesiredRateEvent.Type.WRITE_CONNECTION); }
@Override void newValueEvent() { newEvent(DesiredRateEvent.Type.VALUE); }
@Override void newWriteExceptionEvent() { newEvent(DesiredRateEvent.Type.WRITE_EXCEPTION); }
@Override void newReadExceptionEvent() { newEvent(DesiredRateEvent.Type.READ_EXCEPTION); }