Fixes #3534 - Don't use System.currentTimeMillis() in IdleTimeout.

Removed usages of System.currentTimeMillis() and cleaned up the code.

Signed-off-by: Simone Bordet <simone.bordet@gmail.com>
This commit is contained in:
Simone Bordet 2019-04-08 19:12:52 +02:00 committed by Greg Wilkins
parent 8ddcf3685b
commit de9cc312a4
1 changed files with 29 additions and 24 deletions

View File

@ -40,18 +40,7 @@ public abstract class IdleTimeout
private final Scheduler _scheduler; private final Scheduler _scheduler;
private final AtomicReference<Scheduler.Task> _timeout = new AtomicReference<>(); private final AtomicReference<Scheduler.Task> _timeout = new AtomicReference<>();
private volatile long _idleTimeout; private volatile long _idleTimeout;
private volatile long _idleTimestamp = System.currentTimeMillis(); private volatile long _idleTimestamp = System.nanoTime();
private final Runnable _idleTask = new Runnable()
{
@Override
public void run()
{
long idleLeft = checkIdleTimeout();
if (idleLeft >= 0)
scheduleIdleTimeout(idleLeft > 0 ? idleLeft : getIdleTimeout());
}
};
/** /**
* @param scheduler A scheduler used to schedule checks for the idle timeout. * @param scheduler A scheduler used to schedule checks for the idle timeout.
@ -66,21 +55,30 @@ public abstract class IdleTimeout
return _scheduler; return _scheduler;
} }
public long getIdleTimestamp() /**
{ * @return the period of time, in milliseconds, that this object was idle
return _idleTimestamp; */
}
public long getIdleFor() public long getIdleFor()
{ {
return System.currentTimeMillis() - getIdleTimestamp(); return TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - _idleTimestamp);
} }
/**
* @return the idle timeout in milliseconds
* @see #setIdleTimeout(long)
*/
public long getIdleTimeout() public long getIdleTimeout()
{ {
return _idleTimeout; return _idleTimeout;
} }
/**
* <p>Sets the idle timeout in milliseconds.</p>
* <p>A value that is less than or zero disables the idle timeout checks.</p>
*
* @param idleTimeout the idle timeout in milliseconds
* @see #getIdleTimeout()
*/
public void setIdleTimeout(long idleTimeout) public void setIdleTimeout(long idleTimeout)
{ {
long old = _idleTimeout; long old = _idleTimeout;
@ -107,14 +105,21 @@ public abstract class IdleTimeout
*/ */
public void notIdle() public void notIdle()
{ {
_idleTimestamp = System.currentTimeMillis(); _idleTimestamp = System.nanoTime();
}
private void idleCheck()
{
long idleLeft = checkIdleTimeout();
if (idleLeft >= 0)
scheduleIdleTimeout(idleLeft > 0 ? idleLeft : getIdleTimeout());
} }
private void scheduleIdleTimeout(long delay) private void scheduleIdleTimeout(long delay)
{ {
Scheduler.Task newTimeout = null; Scheduler.Task newTimeout = null;
if (isOpen() && delay > 0 && _scheduler != null) if (isOpen() && delay > 0 && _scheduler != null)
newTimeout = _scheduler.schedule(_idleTask, delay, TimeUnit.MILLISECONDS); newTimeout = _scheduler.schedule(this::idleCheck, delay, TimeUnit.MILLISECONDS);
Scheduler.Task oldTimeout = _timeout.getAndSet(newTimeout); Scheduler.Task oldTimeout = _timeout.getAndSet(newTimeout);
if (oldTimeout != null) if (oldTimeout != null)
oldTimeout.cancel(); oldTimeout.cancel();
@ -128,7 +133,7 @@ public abstract class IdleTimeout
private void activate() private void activate()
{ {
if (_idleTimeout > 0) if (_idleTimeout > 0)
_idleTask.run(); idleCheck();
} }
public void onClose() public void onClose()
@ -147,15 +152,15 @@ public abstract class IdleTimeout
{ {
if (isOpen()) if (isOpen())
{ {
long idleTimestamp = getIdleTimestamp(); long idleTimestamp = _idleTimestamp;
long idleElapsed = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - idleTimestamp);
long idleTimeout = getIdleTimeout(); long idleTimeout = getIdleTimeout();
long idleElapsed = System.currentTimeMillis() - idleTimestamp;
long idleLeft = idleTimeout - idleElapsed; long idleLeft = idleTimeout - idleElapsed;
if (LOG.isDebugEnabled()) if (LOG.isDebugEnabled())
LOG.debug("{} idle timeout check, elapsed: {} ms, remaining: {} ms", this, idleElapsed, idleLeft); LOG.debug("{} idle timeout check, elapsed: {} ms, remaining: {} ms", this, idleElapsed, idleLeft);
if (idleTimestamp != 0 && idleTimeout > 0) if (idleTimeout > 0)
{ {
if (idleLeft <= 0) if (idleLeft <= 0)
{ {