/** * */ package cn.bran.play; import java.io.Serializable; import java.util.concurrent.atomic.AtomicBoolean; public class CachedItemStatus implements Serializable{ private static final int MIN_ALERT_ADVANCE = 1000; private long timein; private long ttl; private long safeBefore; // private AtomicBoolean isRefreshing = new AtomicBoolean(false); private boolean expireSoon; public CachedItemStatus(long timein, long ttl) { super(); this.timein = timein; this.ttl = ttl; long unsafeZone = (long) (ttl * (1 - RenderResultCache.SAFE_TIME_ZONE)); if (unsafeZone < MIN_ALERT_ADVANCE) { // make a minimum 1s alert advance safeBefore = timein + ttl - MIN_ALERT_ADVANCE; } else { safeBefore = timein + ttl - unsafeZone; } } public CachedItemStatus(long ttl) { this(System.currentTimeMillis(), ttl); } boolean expireSoon() { return this.expireSoon ? true : (this.expireSoon = System.currentTimeMillis() > safeBefore); } public boolean isRefreshing() { return isRefreshing.get(); } public void setIsRefreshing() { isRefreshing.set(true); } /** * this one mutate the internal state of expiration flag if it will expire * soon. * * @return */ public boolean shouldRefresh() { if (expireSoon()) return isRefreshing.compareAndSet(false, true); else return false; } public boolean isExpired() { return System.currentTimeMillis() > timein + ttl; } }