00998 {
00999 ResultCacheEntryRelaxed entry;
01000
long now;
01001
long sleep;
01002
01003 ArrayList toRemoveFromRelaxedCache =
new ArrayList();
01004
while (!
isKilled)
01005 {
01006
synchronized (
this)
01007 {
01008
try
01009 {
01010 threadWakeUpTime = 0;
01011
if (relaxedCache.isEmpty())
01012 {
01013
if (
logger.isDebugEnabled())
01014
logger.debug(Translate
01015 .get(
"relaxedcachethread.cache.empty.sleeping"));
01016 wait();
01017 }
01018
else
01019 {
01020 now = System.currentTimeMillis();
01021 clean :
for (Iterator iter = relaxedCache.iterator(); iter
01022 .hasNext();)
01023 {
01024 entry = (ResultCacheEntryRelaxed) iter.next();
01025
if (entry.getDeadline() < now)
01026 {
01027
if (entry.isDirty() || !entry.getKeepIfNotDirty())
01028 {
01029 {
01030 toRemoveFromRelaxedCache.add(entry);
01031 }
01032
continue clean;
01033 }
01034
else
01035 entry.setDeadline(now + entry.getTimeout());
01036 }
01037
if (threadWakeUpTime == 0
01038 || (entry.getDeadline() < threadWakeUpTime))
01039 threadWakeUpTime = entry.getDeadline();
01040 }
01041
01042
01043
for (
int i = 0; i < toRemoveFromRelaxedCache.size(); i++)
01044 {
01045 entry = (ResultCacheEntryRelaxed) toRemoveFromRelaxedCache
01046 .get(i);
01047
if (
logger.isDebugEnabled())
01048
logger.debug(Translate.get(
01049
"relaxedcachethread.remove.entry.from.cache", entry
01050 .getRequest().getSQL()));
01051
removeFromCache(entry.getRequest());
01052 relaxedCache.remove(toRemoveFromRelaxedCache.get(i));
01053 toRemoveFromRelaxedCache.remove(i);
01054 }
01055
if (threadWakeUpTime == 0)
01056 {
01057
01058
continue;
01059 }
01060
else
01061 {
01062 sleep = (threadWakeUpTime - now) / 1000 +
refreshCacheTime;
01063
if (
logger.isDebugEnabled())
01064 {
01065
logger.debug(Translate.get(
"relaxedcachethread.sleeping",
01066 sleep));
01067 }
01068 sleep = (sleep) * 1000;
01069 wait(sleep);
01070 }
01071 }
01072 }
01073
catch (Exception e)
01074 {
01075
logger.warn(e.getMessage(), e);
01076 }
01077 }
01078 }
01079 }