1 23 24 package org.continuent.sequoia.controller.cache.result.threads; 25 26 import java.util.ArrayList ; 27 import java.util.Iterator ; 28 29 import org.continuent.sequoia.common.i18n.Translate; 30 import org.continuent.sequoia.common.log.Trace; 31 import org.continuent.sequoia.controller.cache.result.ResultCache; 32 import org.continuent.sequoia.controller.cache.result.entries.ResultCacheEntryEager; 33 34 41 public final class EagerCacheThread extends Thread 42 { 43 private final ResultCache cache; 44 private long threadWakeUpTime = 0; 45 int refreshCacheRate = 60; 46 int refreshCacheTime = 60 / refreshCacheRate; 47 private Trace logger = Trace 48 .getLogger(EagerCacheThread.class 49 .getName()); 50 private boolean isKilled = false; 51 52 57 public EagerCacheThread(ResultCache cache) 58 { 59 super("EagerCacheThread"); 60 this.cache = cache; 61 } 62 63 68 public long getThreadWakeUpTime() 69 { 70 return threadWakeUpTime; 71 } 72 73 76 public void run() 77 { 78 ResultCacheEntryEager entry; 79 long now; 80 long sleep; 81 ArrayList toRemoveFromEagerCache = new ArrayList (); 83 while (!isKilled) 84 { 85 synchronized (this) 86 { 87 try 88 { 89 threadWakeUpTime = 0; 90 if (cache.getEagerCache().isEmpty()) 91 { if (logger.isDebugEnabled()) 93 logger.debug(Translate.get("cachethread.cache.empty.sleeping")); 94 wait(); 95 } 96 else 97 { now = System.currentTimeMillis(); 99 for (Iterator iter = cache.getEagerCache().iterator(); iter 100 .hasNext();) 101 { 102 entry = (ResultCacheEntryEager) iter.next(); 103 if (entry.getDeadline() < now) 104 { toRemoveFromEagerCache.add(entry); 106 continue; 107 } 108 109 if ((threadWakeUpTime == 0) 111 || (entry.getDeadline() < threadWakeUpTime)) 112 threadWakeUpTime = entry.getDeadline(); 113 } 114 115 int size = toRemoveFromEagerCache.size(); 117 for (int i = 0; i < size; i++) 118 { 119 entry = (ResultCacheEntryEager) toRemoveFromEagerCache.get(i); 120 if (logger.isDebugEnabled()) 121 logger.debug(Translate.get( 122 "cachethread.remove.entry.from.cache", entry.getRequest() 123 .getUniqueKey())); 124 try 125 { 126 cache.removeFromCache(entry.getRequest()); 127 } 128 catch (Exception e) 129 { 130 logger.warn("cachethread.remove.entry.error", e); 131 } 132 try 133 { 134 cache.getEagerCache().remove(entry); 135 } 136 catch (Exception e) 137 { 138 logger.warn("cachethread.remove.entry.error", e); 139 } 140 } 141 toRemoveFromEagerCache.clear(); 142 if (threadWakeUpTime == 0) 143 { continue; 146 } 147 else 148 { sleep = (threadWakeUpTime - now) / 1000 + refreshCacheTime; 150 if (logger.isDebugEnabled()) 151 { 152 logger.debug(Translate.get("cachethread.sleeping", sleep)); 153 } 154 sleep = (sleep) * 1000; 155 wait(sleep); 156 } 157 } 158 } 159 catch (Exception e) 160 { 161 logger.warn(e.getMessage(), e); 162 } 163 } 164 } 165 } 166 167 170 public synchronized void shutdown() 171 { 172 isKilled = true; 173 notify(); 174 } 175 176 } | Popular Tags |