代码:http://pan.baidu.com/s/1i4XxeFN
为了减轻服务器负担:清理规定 时长未登录过的session。
// httpSession.getLastAccessedTime(): session的最后访问时间
【规定未登录时长=System.currentTimeMillis() - httpSession.getLastAccessedTime()】
核心代码:
// web应用启动时触发contextInitialized事件
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("web应用初始化...");
// 创建定时器
final Timer timer = new Timer();
// 每隔30秒就定时执行任务
//=== ===外部类方式
//timer.schedule(new MyTask(sessionList,lock), 0, 1000*30);
//=== ===匿名内部类方式
/*
*===一次定时器=== timer.schedule(task, delay);
*===多次定时器===【和js window.setTimeOut()和setInterval()相似】
*参数:(task, delay, period)(事件处理方法体(线程体),第一次执行延时,之后执行的延时)
* timer.schedule(task, delay, period);
*/
//===一次定时器===
/*timer.schedule(new TimerTask() {
@Override
public void run() {
// 考虑到多线程的情况,这里必须要同步
synchronized (lock){
System.out.println("定时器开始执行...");
ListIterator<HttpSession> listIterator = sessionList.listIterator();
while(listIterator.hasNext()){
HttpSession httpSession = listIterator.next();
// httpSession.getLastAccessedTime(): session的最后访问时间
if(System.currentTimeMillis() - httpSession.getLastAccessedTime() > 1000*60){
// 手动销毁session
httpSession.invalidate();
// 从集合中移除已经被销毁的session
listIterator.remove();
}
}
}
//timer.cancel();//==一次定时任务执行完毕,结束定时器。使程序结束
timer.cancel();//局部内部类调用局部变量,局部变量必须被 final 修饰
}
}, 1000*10);*/
//===多次定时器===【管理过时的 session】
timer.schedule(new TimerTask() {
@Override
public void run() {
// 考虑到多线程的情况,这里必须要同步
synchronized (lock){
System.out.println("定时器开始执行...");
ListIterator<HttpSession> listIterator = sessionList.listIterator();
while(listIterator.hasNext()){
HttpSession httpSession = listIterator.next();
// httpSession.getLastAccessedTime(): session的最后访问时间
if(System.currentTimeMillis() - httpSession.getLastAccessedTime() > 1000*60){
// 手动销毁session
httpSession.invalidate();
// 从集合中移除已经被销毁的session
listIterator.remove();
}
}
}
}
}, 0, 1000*30);
}
sevletContext初始化时,就设置 定时器(定时执行某一任务):操作整个项目范围数据(session)的任务 。自然在servletContext里提前执行,事先准备好,优化效率。
===当然也可以在session创建时或者request创建时设置定时器。==这里不符合需求。
=====【事先设置定时器】需要依赖 servletContext监听器,在服务器启动时,创建servletContext对象时执行。