发表于: 2017-10-08 23:40:39

1 770



今天完成的事情:

1.监听session的数量,仔细了解每一行代码的意思

2.了解事物管理器


明天计划的事情

1. 完成事物管理器

2. 完善代码


遇到的问题:

1. session的失效问题:

当session失效过期后这个session对象是否存在?

一个sesion对象里可以存储多个key-value

例如:

session.setAttribute("user",user);
session.setAttribute("user2",user);


这个是删除该会话的session对象,而非某一个key-value

((HttpSession) session.getSession()).invalidate();


2. 昨天的传值问题今天的小课堂解决了。

使用的pojo来传值 可以在

<input type="text" id="u" name="username" class="inputstyle"/>

"username"对应Student里的类成员变量username.


收获:

1. 监听session的数量,仔细了解每一行代码的意思

和前面代码联系了起来

/**
* 1 ServletContext 对象是一个为整个 web 应用提供共享的内存,任何请求都可以访问里面的内容
* 2 :如何实现在服务启动的时候就动态的加入到里面的内容:我们需要做的有:
*    1 ) 实现 servletContextListerner 接口 并将要共享的通过 setAttribute name,data )方法提交到内存中去
*    2 )应用项目通过 getAttribute(name) 将数据取到 。
* @param servletContextEvent
*/
// web应用关闭时触发contextDestroyed事件
public void contextDestroyed(ServletContextEvent servletContextEvent) {
loggerSSL.info("web应用关闭...");
}

// web应用启动时触发contextInitialized事件
public void contextInitialized(ServletContextEvent servletContextEvent) {
loggerSSL.info("web应用初始化...");
   // 创建定时器

   //Timerjdk中提供的一个定时器工具,
   // 使用的时候会在主线程之外起一个单独的线程执行指定的计划任务,可以指定执行一次或者反复执行多次。
   Timer timer = new Timer();
   // 每隔30秒就定时执行任务
   timer.schedule(new MyTask(sessionList,lock), 0, 1000*30);
   // delaylong,periodlong:从现在起过delay毫秒以后,每隔period
   // 毫秒执行一次。
}


定时任务:


public class MyTask extends TimerTask {
private static Logger loggerMT = Logger.getLogger(SessionListener.class);


   private List<HttpSession> list;
   // 存储传递过来的锁
   private Object lock;
   // 构造方法
   public MyTask(List<HttpSession> list, Object lock){
        this.list = list;
       this.lock = lock;
   }
   @Override
   public void run() {
// 考虑到多线程的情况,这里必须要同步
       synchronized (lock){
                loggerMT.info("定时器开始执行...");

           /**
            * ListIterator只能用于List及其子类型。

        * List接口中,有一个方法listIterator(int index)

          可以得到List的迭代器(ListIterator接口的对象)

        * 迭代器指向的位置是元素之前的位置
        */
           ListIterator<HttpSession> listIterator = list.listIterator();
           //hasNext():以正向遍历列表时,如果列表迭代器后面还有元素,则返回 true,否则返回false
           while(listIterator.hasNext()){
               HttpSession httpSession = listIterator.next();
               // httpSession.getLastAccessedTime() = session的最后访问时间
          if(System.currentTimeMillis() - httpSession.getLastAccessedTime() > 1000*60*2){
                  // 手动销毁session
                   httpSession.invalidate();
                   // 从集合中移除已经被销毁的session
                   listIterator.remove();
                   loggerMT.info("sessionList数量" + list.size());
               }
           }
      }
  }
}


①当容器启动时

public void contextInitialized(ServletContextEvent servletContextEvent)

方法随之启动,初始化web容器,并启动定时任务,我设定从开始,每30S扫描运行一次。

timer.schedule(new MyTask(sessionList,lock)01000*30);


②当打开网页,产生会话时,生成session,触发方法: 

public void sessionCreated(HttpSessionEvent httpSessionEvent)


private List<HttpSession> sessionList = Collections.synchronizedList(new LinkedList<HttpSession>());

private Object lock = new Object();

将生成的session对象放到

HttpSession httpSession = httpSessionEvent.getSession();
synchronized (lock){
sessionList.add(httpSession);
   loggerSSL.info("sessionList数量" + sessionList.size());
}


当到扫描时间后,会对sessionList里的session进行扫描,如果有超过2分钟没有用的就删除session对象。


2.了解事物管理器

什么情况下用事务管理器,解决的什么问题?:

当某几种动作之间有强关联,事件1完成事件2就必须完成,若事件2失败事件1就不能进行。

事物管理器就是管理这这种事物的

事务是一系列的动作,它们综合在一起才是一个完整的工作单元,这些动作必须全部完成,如果有一个失败的话,那么事务就会回滚到最开始的状态,仿佛什么都没发生过一样。


事务管理器的实现:

Spring并不直接管理事务,而是提供了多种事务管理器,他们将事务管理的职责委托给Hibernate或者JTA等持久化机制所提供的相关平台框架的事务来实现。 
Spring事务管理器的接口是org.springframework.transaction.PlatformTransactionManager,通过这个接口,Spring为各个平台如JDBC、Hibernate等都提供了对应的事务管理器,但是具体的实现就是各个平台自己的事情了





进度: 

         任务开始时间:8.14

         预计完成时间:10.10

         是否有延期风险:事务管理器

禅道:http://task.ptteng.com/zentao/project-task-264.html


PS:任务2的深度思考好多都没有听说过









返回列表 返回列表
评论

    分享到