@Override public void clear() { writeLock.lock(); try { for (ExpiringEntry<K, V> entry : entries.values()) entry.cancel(); entries.clear(); } finally { writeLock.unlock(); } }
/** * Notifies expiration listeners that the given entry expired. Must not be called from within a locked context. * * @param entry Entry to expire */ void notifyListeners(final ExpiringEntry<K, V> entry) { if (asyncExpirationListeners != null) for (final ExpirationListener<K, V> listener : asyncExpirationListeners) { LISTENER_SERVICE.execute(new Runnable() { public void run() { try { listener.expired(entry.key, entry.getValue()); } catch (Exception ignoreUserExceptions) { } } }); } if (expirationListeners != null) for (final ExpirationListener<K, V> listener : expirationListeners) { try { listener.expired(entry.key, entry.getValue()); } catch (Exception ignoreUserExceptions) { } } }
/** * Creates a new ExpiringEntry object. * * @param key for the entry * @param value for the entry * @param expirationPolicy for the entry * @param expirationNanos for the entry */ ExpiringEntry(K key, V value, AtomicReference<ExpirationPolicy> expirationPolicy, AtomicLong expirationNanos) { this.key = key; this.value = value; this.expirationPolicy = expirationPolicy; this.expirationNanos = expirationNanos; this.expectedExpiration = new AtomicLong(); resetExpiration(); }
entry.schedule(entryFuture);
entry.schedule(entryFuture);
entry.schedule(entryFuture);
entry = new ExpiringEntry<K, V>(key, value, variableExpiration ? new AtomicReference<ExpirationPolicy>(expirationPolicy) : this.expirationPolicy, variableExpiration ? new AtomicLong(expirationNanos) : this.expirationNanos); if (entries.size() == 1 || entries.first().equals(entry)) scheduleEntry(entry); } else { oldValue = entry.getValue(); if (!ExpirationPolicy.ACCESSED.equals(expirationPolicy) && ((oldValue == null && value == null) || (oldValue != null && oldValue.equals(value)))) return value; entry.setValue(value); resetEntry(entry, false);
entry = new ExpiringEntry<K, V>(key, value, variableExpiration ? new AtomicReference<ExpirationPolicy>(expirationPolicy) : this.expirationPolicy, variableExpiration ? new AtomicLong(expirationNanos) : this.expirationNanos); if (entries.size() == 1 || entries.first().equals(entry)) scheduleEntry(entry); } else { oldValue = entry.getValue(); if (!ExpirationPolicy.ACCESSED.equals(expirationPolicy) && ((oldValue == null && value == null) || (oldValue != null && oldValue.equals(value)))) return value; entry.setValue(value); resetEntry(entry, false);
private V load(K key) { if (entryLoader == null && expiringEntryLoader == null) return null; writeLock.lock(); try { // Double check for entry ExpiringEntry<K, V> entry = getEntry(key); if (entry != null) return entry.getValue(); if (entryLoader != null) { V value = entryLoader.load(key); put(key, value); return value; } else { ExpiringValue<? extends V> expiringValue = expiringEntryLoader.load(key); if (expiringValue == null) { put(key, null); return null; } else { long duration = expiringValue.getTimeUnit() == null ? expirationNanos.get() : expiringValue.getDuration(); TimeUnit timeUnit = expiringValue.getTimeUnit() == null ? TimeUnit.NANOSECONDS : expiringValue.getTimeUnit(); put(key, expiringValue.getValue(), expiringValue.getExpirationPolicy() == null ? expirationPolicy.get() : expiringValue.getExpirationPolicy(), duration, timeUnit); return expiringValue.getValue(); } } } finally { writeLock.unlock(); } }
private V load(K key) { if (entryLoader == null && expiringEntryLoader == null) return null; writeLock.lock(); try { // Double check for entry ExpiringEntry<K, V> entry = getEntry(key); if (entry != null) return entry.getValue(); if (entryLoader != null) { V value = entryLoader.load(key); put(key, value); return value; } else { ExpiringValue<? extends V> expiringValue = expiringEntryLoader.load(key); if (expiringValue == null) { put(key, null); return null; } else { long duration = expiringValue.getTimeUnit() == null ? expirationNanos.get() : expiringValue.getDuration(); TimeUnit timeUnit = expiringValue.getTimeUnit() == null ? TimeUnit.NANOSECONDS : expiringValue.getTimeUnit(); put(key, expiringValue.getValue(), expiringValue.getExpirationPolicy() == null ? expirationPolicy.get() : expiringValue.getExpirationPolicy(), duration, timeUnit); return expiringValue.getValue(); } } } finally { writeLock.unlock(); } }
entry = new ExpiringEntry<K, V>(key, value, variableExpiration ? new AtomicReference<ExpirationPolicy>(expirationPolicy) : this.expirationPolicy, variableExpiration ? new AtomicLong(expirationNanos) : this.expirationNanos); if (entries.size() == 1 || entries.first().equals(entry)) scheduleEntry(entry); } else { oldValue = entry.getValue(); if (!ExpirationPolicy.ACCESSED.equals(expirationPolicy) && ((oldValue == null && value == null) || (oldValue != null && oldValue.equals(value)))) return value; entry.setValue(value); resetEntry(entry, false);
private V load(K key) { if (entryLoader == null && expiringEntryLoader == null) return null; writeLock.lock(); try { // Double check for entry ExpiringEntry<K, V> entry = getEntry(key); if (entry != null) return entry.getValue(); if (entryLoader != null) { V value = entryLoader.load(key); put(key, value); return value; } else { ExpiringValue<? extends V> expiringValue = expiringEntryLoader.load(key); if (expiringValue == null) { put(key, null); return null; } else { long duration = expiringValue.getTimeUnit() == null ? expirationNanos.get() : expiringValue.getDuration(); TimeUnit timeUnit = expiringValue.getTimeUnit() == null ? TimeUnit.NANOSECONDS : expiringValue.getTimeUnit(); put(key, expiringValue.getValue(), expiringValue.getExpirationPolicy() == null ? expirationPolicy.get() : expiringValue.getExpirationPolicy(), duration, timeUnit); return expiringValue.getValue(); } } } finally { writeLock.unlock(); } }
/** * Notifies expiration listeners that the given entry expired. Must not be called from within a locked context. * * @param entry Entry to expire */ void notifyListeners(final ExpiringEntry<K, V> entry) { if (asyncExpirationListeners != null) for (final ExpirationListener<K, V> listener : asyncExpirationListeners) { LISTENER_SERVICE.execute(new Runnable() { public void run() { try { listener.expired(entry.key, entry.getValue()); } catch (Exception ignoreUserExceptions) { } } }); } if (expirationListeners != null) for (final ExpirationListener<K, V> listener : expirationListeners) { try { listener.expired(entry.key, entry.getValue()); } catch (Exception ignoreUserExceptions) { } } }
/** * Notifies expiration listeners that the given entry expired. Must not be called from within a locked context. * * @param entry Entry to expire */ void notifyListeners(final ExpiringEntry<K, V> entry) { if (asyncExpirationListeners != null) for (final ExpirationListener<K, V> listener : asyncExpirationListeners) { LISTENER_SERVICE.execute(new Runnable() { public void run() { try { listener.expired(entry.key, entry.getValue()); } catch (Exception ignoreUserExceptions) { } } }); } if (expirationListeners != null) for (final ExpirationListener<K, V> listener : expirationListeners) { try { listener.expired(entry.key, entry.getValue()); } catch (Exception ignoreUserExceptions) { } } }
/** * Resets the given entry's schedule canceling any existing scheduled expiration and reordering the entry in the * internal map. Schedules the next entry in the map if the given {@code entry} was scheduled or if * {@code scheduleNext} is true. * * @param entry to reset * @param scheduleFirstEntry whether the first entry should be automatically scheduled */ void resetEntry(ExpiringEntry<K, V> entry, boolean scheduleFirstEntry) { writeLock.lock(); try { boolean scheduled = entry.cancel(); entries.reorder(entry); if (scheduled || scheduleFirstEntry) scheduleEntry(entries.first()); } finally { writeLock.unlock(); } }
/** * Resets the given entry's schedule canceling any existing scheduled expiration and reordering the entry in the * internal map. Schedules the next entry in the map if the given {@code entry} was scheduled or if * {@code scheduleNext} is true. * * @param entry to reset * @param scheduleFirstEntry whether the first entry should be automatically scheduled */ void resetEntry(ExpiringEntry<K, V> entry, boolean scheduleFirstEntry) { writeLock.lock(); try { boolean scheduled = entry.cancel(); entries.reorder(entry); if (scheduled || scheduleFirstEntry) scheduleEntry(entries.first()); } finally { writeLock.unlock(); } }
/** * Resets the given entry's schedule canceling any existing scheduled expiration and reordering the entry in the * internal map. Schedules the next entry in the map if the given {@code entry} was scheduled or if * {@code scheduleNext} is true. * * @param entry to reset * @param scheduleFirstEntry whether the first entry should be automatically scheduled */ void resetEntry(ExpiringEntry<K, V> entry, boolean scheduleFirstEntry) { writeLock.lock(); try { boolean scheduled = entry.cancel(); entries.reorder(entry); if (scheduled || scheduleFirstEntry) scheduleEntry(entries.first()); } finally { writeLock.unlock(); } }
@Override public boolean remove(Object key, Object value) { Assert.notNull(key, "key"); writeLock.lock(); try { ExpiringEntry<K, V> entry = entries.get(key); if (entry != null && entry.getValue().equals(value)) { entries.remove(key); if (entry.cancel()) scheduleEntry(entries.first()); return true; } else return false; } finally { writeLock.unlock(); } }
@Override public boolean remove(Object key, Object value) { Assert.notNull(key, "key"); writeLock.lock(); try { ExpiringEntry<K, V> entry = entries.get(key); if (entry != null && entry.getValue().equals(value)) { entries.remove(key); if (entry.cancel()) scheduleEntry(entries.first()); return true; } else return false; } finally { writeLock.unlock(); } }
/** * Creates a new ExpiringEntry object. * * @param key for the entry * @param value for the entry * @param expirationPolicy for the entry * @param expirationNanos for the entry */ ExpiringEntry(K key, V value, AtomicReference<ExpirationPolicy> expirationPolicy, AtomicLong expirationNanos) { this.key = key; this.value = value; this.expirationPolicy = expirationPolicy; this.expirationNanos = expirationNanos; this.expectedExpiration = new AtomicLong(); resetExpiration(); }