使用監聽器:定時清除map快取
- 2019 年 12 月 6 日
- 筆記
配置web.xml:注意位置
<!-- 清理map快取 --> <listener> <listener-class>com.test.utils.sms.CacheMap</listener-class> </listener>
監聽類:
import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.List; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import com.test.utils.sms.VerifyCodeManager.InnerCode; public class CacheMap implements ServletContextListener { public void contextDestroyed(ServletContextEvent event) { // 服務停止時執行 } public void contextInitialized(ServletContextEvent arg0) { // 服務啟動、初始化時執行------60分鐘一次 int minutes = 60; int second = 60; int timeDistance = 1000; // 使用定時類,每隔一段時間執行 java.util.Timer timer = new java.util.Timer(); timer.schedule(new MyRandomMap(), new Date(), minutes * second * timeDistance); } private class MyRandomMap extends java.util.TimerTask // 實現了TimerTask的類 { public void run() { clearRandomMap();// 每隔一段時間執行 //System.out.println("start++++++++++"); } } public void clearRandomMap() { // 清除map過期的key List<String> list = new ArrayList<String>(); Iterator<String> iter = VerifyCodeManager.codes.keySet().iterator(); while (iter.hasNext()) { String key = iter.next().toString(); InnerCode val = VerifyCodeManager.codes.get(key); // 設計很巧妙:使用時間比較大小返回真假(取反),寫入將要刪除的數組 if (!val.isExpire()) { list.add(key); //System.out.println("key:"+key); } } // 執行刪除操作 for (int i = 0; i < list.size(); i++) { VerifyCodeManager.codes.remove(list.get(i)); //System.out.println("delete:"+list.get(i)); } } }