发表于: 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应用初始化...");
// 创建定时器
//Timer是jdk中提供的一个定时器工具,
// 使用的时候会在主线程之外起一个单独的线程执行指定的计划任务,可以指定执行一次或者反复执行多次。
Timer timer = new Timer();
// 每隔30秒就定时执行任务
timer.schedule(new MyTask(sessionList,lock), 0, 1000*30);
// delay为long,period为long:从现在起过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), 0, 1000*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的深度思考好多都没有听说过
评论