假设任务类我已经写好了,如何写servlet调用??
任务类代码如下:
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.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【renwangxing】截止到2008-07-04 12:53:38的历史汇总数据(不包括此帖):
    发帖的总数量:54                       发帖的总分数:2780                     
    结贴的总数量:34                       结贴的总分数:2380                     
    无满意结贴数:0                        无满意结贴分:0                        
    未结的帖子数:20                       未结的总分数:400                      
    结贴的百分比:62.96 %               结分的百分比:85.61 %                  
    无满意结贴率:0.00  %               无满意结分率:0.00  %                  
    楼主加油
      

  2.   

    给你个思路:
    1. 用 HttpSessionListener 监听 Session 创建和销毁,创建时将 Session 放入一列表,销毁时将 Session 从列表中移除(此步骤必须作,否则 Session 占用的资源回收不了)。
    2. 在你的 TimerTask 里到设定时间就访问上面的列表,将里面的 Session 逐个 invalidate(); 然后移除之。
    3. 注意线程同步。
      

  3.   

    SageZK同学,你说的是像下面这样吗?不知是否正确?public 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(HttpSessionEvent event) {
            HttpSession session = event.getSession();
             hashtable.remove(session.getId());
     } public static Iterator getAllSession( ){         return hashtable.values().iterator();    }然后在SessionHandleTime 类中的run方法这样写:
    public void run() {
         
          Iterator it=mySessionListener.getAllSession();
          while(it.hasNext()){
           HttpSession session=(HttpSession)it.next();
           session.invalidate();
          }
      
        }
      

  4.   


    没错儿,不过要仔细地实际测试一下,你 Hashtable 用的挺好,改成泛型用法能更方便些:
    private static Hashtable<String, HttpSession> hashtable = new Hashtable<String, HttpSession>();
    另外得注意 Hashtable 访问的线程同步。
      

  5.   

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

  6.   

    每天凌晨零点自动清空这个应该用 quartz 之类的调用,参考这个
    http://www.java2000.net/viewthread.jsp?tid=1643
      

  7.   

    SageZK,因为开发用的是java1.4, 所以用不了泛型。楼上的两位,我的应用中没有用到spring,所以,暂且使用java API自带的TimerTask和Timer类来实现,现在监听器和任务类已经写出来了,但是怎么调用呢?有谁调用??
    人物类:
      public class SessionAutoDestoryTask extends TimerTask {
          public void run() {
         Iterator it=mySessionListener.getAllSession();
          while(it.hasNext()){
           HttpSession session=(HttpSession)it.next();
           session.invalidate();
           System.out.println("注销用户会话--"+session.getId());
          }
      
        }  public void startTimer() {
          new Timer().schedule(SessionAutoDestoryTask.getInstance(),
                               今晚十二点钟,
                               24小时);
    }
    }监听器:
    public 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(HttpSessionEvent event) {
            HttpSession session = event.getSession();
             hashtable.remove(session.getId());
     } public static Iterator getAllSession( ){         return hashtable.values().iterator();    }
      

  8.   

    3楼的是正解,继承HttpSessionListener ,然后注意在web.xml中配置就可以了。这个问题不麻烦。
      

  9.   

    看来还得写一个上下文监听类,由这个监听类执行任务类了,不知是否正确public class MyContextListener implements ServletContextListener { public void contextInitialized(ServletContextEvent sce) { 
    SessionAutoDestoryTask sessionAutoDestoryTask=new SessionAutoDestoryTask();
    sessionAutoDestoryTask.startTimer();
    sce.getServletContext().log(new java.util.Date()+"SessionAutoDestoryTask start up!"); } 
    public void contextDestroyed(ServletContextEvent sce) { 
    sessionAutoDestoryTask=null;
    sce.getServletContext().log(new java.util.Date()+"SessionAutoDestoryTask  destroyed!"); 
      

  10.   

    SageZK同学,果然在运行中出现线程同步问题,hashtable不是线程安全吗?怎么出现在删除了第一个session之后就报并发错误呢??
      

  11.   

    Hashtable 是同步的即线程安全的,将错误信息贴出来。
      

  12.   

    给你一个简单的例子,供参考
    你可能没有在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;public class MyTask extends TimerTask {  public void run() {
        // System.out.println("call at " + (new Date()));
        // TODO 此处添加具体任务代码
      }}
    web.xml配置:
    <listener>
    <listener-class>com.fastunit.samples.listener.MyListener</listener-class>
    </listener>