流沙团
session扫描器
2016-8-7 流沙团


很经典的一段代码:



list线程安全



线程锁



定时器







package com.gyarmy.servletListener;

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
import java.util.Timer;
import java.util.TimerTask;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class Test2 implements HttpSessionListener,ServletContextListener{

private List<HttpSession> list = Collections.synchronizedList(new LinkedList<HttpSession>());
private Object lock = new Object();

@Override
public void sessionCreated(HttpSessionEvent se) {
// TODO Auto-generated method stub
HttpSession session = se.getSession();


synchronized (lock) {
list.add(session);
}

System.out.println("sessionCreated");
}

@Override
public void sessionDestroyed(HttpSessionEvent se) {
// TODO Auto-generated method stub


System.out.println("sessionDestroyed");
}

@Override
public void contextDestroyed(ServletContextEvent sce) {
// TODO Auto-generated method stub

}

@Override
public void contextInitialized(ServletContextEvent sce) {
// TODO Auto-generated method stub

Timer time = new Timer();
time.schedule(new MyTimeTask(list,lock), 0, 1000*60*5);
}

}

class MyTimeTask extends TimerTask{

private List<HttpSession> list;
private Object lock;

public MyTimeTask(List<HttpSession> list,Object lock)
{
this.list = list;
this.lock = lock;
}
@Override
public void run() {
// TODO Auto-generated method stub

synchronized (lock) {
//删除session
ListIterator<HttpSession> listIterator = list.listIterator();
while(listIterator.hasNext())
{
HttpSession session = listIterator.next();

if(System.currentTimeMillis()-session.getLastAccessedTime()>1000*60*5)
{
//删除这个session
session.invalidate();
listIterator.remove();
}
}

}

}

}









发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容