使用監聽器:定時清除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));  		}  	}  }