javaWeb 학습 총화 (11) - 모니터 (Listener) 개발 에서 의 응용

13319 단어 자바
모니터 는 자바 웹 개발 에 많이 사용 되 고 있 습 니 다. 다음은 모니터 (Listener) 가 개발 에서 흔히 볼 수 있 는 응용 프로그램 을 말씀 드 리 겠 습 니 다.
1. 현재 온라인 인원수 통계
자바 웹 응용 개발 에서 우 리 는 현재 온라인 사용자 수 를 통계 해 야 할 때 가 있 습 니 다. 이때 모니터 기술 로 이 기능 을 실현 할 수 있 습 니 다.
 
package me.gacl.web.listener;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/**
* @ClassName: OnLineCountListener
* @Description:           
* @author:     
* @date: 2014-9-10   10:01:26
*
*/ 
public class OnLineCountListener implements HttpSessionListener {

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        ServletContext context = se.getSession().getServletContext();
        Integer onLineCount = (Integer) context.getAttribute("onLineCount");
        if(onLineCount==null){
            context.setAttribute("onLineCount", 1);
        }else{
            onLineCount++;
            context.setAttribute("onLineCount", onLineCount);
        }
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        ServletContext context = se.getSession().getServletContext();
        Integer onLineCount = (Integer) context.getAttribute("onLineCount");
        if(onLineCount==null){
            context.setAttribute("onLineCount", 1);
        }else{
            onLineCount--;
            context.setAttribute("onLineCount", onLineCount);
        }
    }
}

2. 사용자 정의 세 션 스캐너
웹 애플 리 케 이 션 이 만 든 Session 이 많 을 때 Session 이 너무 많은 메모 리 를 차지 하지 않도록 메모리 에 있 는 session 을 수 동 으로 없 앨 수 있 습 니 다. 그러면 이때 도 모니터 기술 을 통 해 이 루어 질 수 있 습 니 다.
package me.gacl.web.listener;

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;

/**
* @ClassName: SessionScanerListener
* @Description:    session   
* @author:     
* @date: 2014-9-10   10:16:42
* 
*/ 
public class SessionScanerListener implements HttpSessionListener,ServletContextListener {

    /**
    * @Field: list
    *                        HttpSession
    *        LinkedList           
    */ 
    /**
     * private List list = new LinkedList();
     *             ,SessionScanerListener          
     * sessionCreated           ,
     *             ,                session
     *   sessionCreated                  ,        sessionCreated  
     * sessionCreated                    session,    session     
     *      Session              ,        session ,               
     *                  ?
     *        Collections.synchronizedList(List list)          list         list  
     */
    //   Collections.synchronizedList(List list)   LinkedList            
    private List list = Collections.synchronizedList(new LinkedList());
    //      ,          ,        list       session   list    session         
    private Object lock = new Object();
            
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("session    !!");
        HttpSession session = se.getSession();
        
        synchronized (lock){
            /**
             *          ,    thread-1(  1)        ,    lock   ,        session,
             *   session             thread-2(  2)    ,thread-2           ,
             * thread-2   run    list    session ,      list    session         ,
             *             session   thread-1   ,  thread-2    thread-1             
             * thread-1   session  ,  lock   ,  thread-2  lock,       list    session      
             *               session       session           ,              。
             */
            list.add(session);
        }
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("session     !!");
    }

    /* Web           
     * @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent)
     */
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("web     ");
        //     
        Timer timer = new Timer();
        //  30        
        timer.schedule(new MyTask(list,lock), 0, 1000*30);
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("web    ");
    }
}

/**
* @ClassName: MyTask
* @Description:           
* @author:     
* @date: 2014-9-11   12:02:36
*
*/ 
class MyTask extends TimerTask {
        
    //  HttpSession list  
    private List list;
    //        
    private Object lock;
    public MyTask(List list,Object lock){
        this.list = list;
        this.lock = lock;
    }
    /* run            
     * @see java.util.TimerTask#run()
     */
    @Override
    public void run() {
            //          
        synchronized (lock) {
            System.out.println("     !!");
            ListIterator it = list.listIterator();
            /**
             *   list    session,   list    session              ,
             *      ,             session,      sessionCreated list       session,
             *               list    session           list        session   ,
             *        list       session   list    session           
             *           "list.add(session) while(it.hasNext()){//  list  }"         ,
             *            "list.add(session)"     ,          "while(it.hasNext()){//  list  }"    
             *                   ,       (Object lock),              ,
             *         list       session   list    session         
             *      list       session   ,              list        ,
             *      list         ,                   list       session
             */
            while(it.hasNext()){
                HttpSession session = (HttpSession) it.next();
                /**
                 *       -session       >1000*15(15 )
                 * session.getLastAccessedTime()  session       
                 */
                if(System.currentTimeMillis()-session.getLastAccessedTime()>1000*30){
                    //    session
                    session.invalidate();
                    //           session
                    it.remove();
                }
            }
        }
    }
}

 
다음으로 전송:https://www.cnblogs.com/crazylqy/p/4171809.html

좋은 웹페이지 즐겨찾기