Java三大器(过滤器,拦截器,监听器)之补充:定时器+监听器-demo:管理服务器session,销毁过时session

代码: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对象时执行。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值