使用监听器:定时清除map缓存

配置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));
		}
	}
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java学习网

Java中使用栈实现一个队列,实用代码

本功能提供下面四个方法: push(x) ——添加元素x到队列。 pop()——从队列中删除前面的元素。 peek()——得到前面的元素。 empty()——返...

2729
来自专栏xiaoxi666的专栏

谈谈知识的融汇贯通:以“java中的迭代器失效问题”为例

参考文章 java迭代器失效 和 Collection与Iterator的remove()方法区别与ConcurrentModificationExceptio...

1292
来自专栏闻道于事

JavaWeb(二)jsp运行原理,九大内置对象

JSP运行原理: 每个JSP页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理。JSP引擎先将JSP翻译成一个_jspServ...

4106
来自专栏IT笔记

聊一聊生产环境中如何动态监听配置文件变化并重载

上一篇,我们谈到Java中的几种读取properties配置文件的方式,但是在生产环境中,最忌讳的就是重启应用了。比如某个系统的路径常量或者接口变更,需要线上及...

43611
来自专栏Vamei实验室

纸上谈兵: 堆 (heap)

堆(heap)又被为优先队列(priority queue)。尽管名为优先队列,但堆并不是队列。回忆一下,在队列中,我们可以进行的限定操作是dequeue和en...

2127
来自专栏尾尾部落

[剑指offer] 二叉搜索树的后序遍历序列

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。

2042
来自专栏芋道源码1024

Java中高级面试题(1)

1、ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高(在内存里是连着放的)。

690
来自专栏DT乱“码”

Request对象的主要方法

Request对象的主要方法: setAttribute(String name,Object):设置名字为name的request的参数值 getAttrib...

1868
来自专栏电光石火

使用监听器:定时清除map缓存

配置web.xml:注意位置 <!-- 清理map缓存 --> <listener> <listener-class>com.test.utils.sms.C...

3645
来自专栏软件开发 -- 分享 互助 成长

状态模式

一、简介 1、状态模式中当一个对象的内部状态改变时允许改变其行为,这个对象看起来像是改变了其类。 2、状态模式可以消化较大的分支,将每个分支放入一种状态中,减少...

2378

扫码关注云+社区

领取腾讯云代金券