日期:2014-05-20  浏览次数:20660 次

如何实现需求:写一个sevlet,该功能是对web应用的session对象每天凌晨零点自动清空
假设任务类我已经写好了,如何写servlet调用??
任务类代码如下:
Java code
public class SessionHandleTime extends TimerTask {
    private HttpSession session=null;
    //间隔为24小时
         private long periord=24*60*60*1000;
    //任务开始执行的第一时间
     private Date startDateTime = "假设这个值是此类运行的当天晚上12点钟"; 
    private static SessionHandleTime instance = null;
    public static SessionHandleTime getInstance() {
     if (instance == null)
          instance = new SessionHandleTime();
          return instance;
        }
      public void setSession(HttpSession session) {
              this.session = session;
            }

     public void run() {
         
        session.invalidate();
      }
       public void startTimer() {
    new Timer().schedule(SessionHandleTime.getInstance(),startDateTime,this.periord);
         
        }
}


------解决方案--------------------
给你个思路:
1. 用 HttpSessionListener 监听 Session 创建和销毁,创建时将 Session 放入一列表,销毁时将 Session 从列表中移除(此步骤必须作,否则 Session 占用的资源回收不了)。
2. 在你的 TimerTask 里到设定时间就访问上面的列表,将里面的 Session 逐个 invalidate(); 然后移除之。
3. 注意线程同步。
------解决方案--------------------
探讨
SageZK同学,你说的是像下面这样吗?不知是否正确?


Java codepublic class mySessionListener implements HttpSessionListener {

private static Hashtable hashtable = new Hashtable();

public void sessionCreated(HttpSessionEvent event) {

HttpSession session = event.getSession();

hashtable.put(session.getId(), session );
}


public void sessionDestroyed(HttpSe…

------解决方案--------------------
private long periord=24*60*60*1000这样写如果服务器启动不在0点那么那清除的时间也就不一样了,如果要最简单的实现我认为直接使用spring的任务调度,设定0点执行销毁操作比较好,再者可以用普通的thread检查是否到12点如果到12点清除session这样要和servlet写在一起
spring的任务调度使用也很方便网上到处都是资料
------解决方案--------------------
每天凌晨零点自动清空

这个应该用 quartz 之类的调用,参考这个
http://www.java2000.net/viewthread.jsp?tid=1643
------解决方案--------------------
3楼的是正解,继承HttpSessionListener ,然后注意在web.xml中配置就可以了。这个问题不麻烦。
------解决方案--------------------
探讨
看来还得写一个上下文监听类,由这个监听类执行任务类了,不知是否正确


Java codepublic class MyContextListener implements ServletContextListener {

public void contextInitialized(ServletContextEvent sce) {
SessionAutoDestoryTask sessionAutoDestoryTask=new SessionAutoDestoryTask();
sessionAutoDestoryTask.startTimer();
sce.getServletContext().log(new java.util.Date()+"SessionAutoDestoryTa…

------解决方案--------------------
Hashtable 是同步的即线程安全的,将错误信息贴出来。
------解决方案--------------------
给你一个简单的例子,供参考
你可能没有在web.xml里配置
MyListener:
import java.util.Timer;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class MyListener implements ServletContextListener {
  
private Timer timer = null;

public void contextInitialized(ServletContextEvent event) {
timer = new Timer(true);
//设置任务计划,启动和间隔时间
timer.schedule(new MyTask(), 0, 86400000);
}

public void contextDestroyed(ServletContextEvent event) {
timer.cancel();
}
  
}
MyTask:
import java.util.TimerTask;