public void addOrUpdate(final Refreshable refreshable) {
        // No point adding stuff if we are shutting down
        if (refreshable != null && !isShutdownInProgress.get()) {
            //noinspection SynchronizationOnLocalVariableOrMethodParameter
            synchronized (refreshable) {
                // Assume this refreshable has the latest state so remove any existing items on the
                // queue for this refreshable
                remove(refreshable);

                // Spawn a new DelayedRefreshable that takes a snapshot of the token's expiry
                // as we can't mutate the times being used by the delay queue
                final DelayedRefreshable delayedRefreshable = new DelayedRefreshable(refreshable);

                delayQueue.add(delayedRefreshable);
                uuidsInQueue.add(refreshable.getUuid());

                LOGGER.debug(() -> LogUtil.message("Added {}", itemToString(delayedRefreshable)));
            }
        }
    }
Register the refreshable so that its refreshing gets managed. Can be called many times
for the same {@link Refreshable}, e.g. to notify the {@link RefreshManager} that it was
refreshed externally.
stroom-security/stroom-security-common-impl/src/main/java/stroom/security/common/impl/RefreshManager.java