首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >JavaEE @PreDestroy与HttpSessionListener#sessionDestroyed之间的主要区别是什么,以及何时使用what?

JavaEE @PreDestroy与HttpSessionListener#sessionDestroyed之间的主要区别是什么,以及何时使用what?
EN

Stack Overflow用户
提问于 2017-02-28 15:51:30
回答 1查看 132关注 0票数 0

我要求在用户编辑资源时将其锁定并释放。我可以很容易地在它上设置一个锁,当用户保存它时,解锁它或当用户注销时进行解锁。

但我的问题是,当用户去编辑页面时,只是把它留在那里而不保存,或者只是在编辑页面中关闭浏览器。在这种情况下,我必须解锁资源以供其他用户访问。

这种资源的需求量并不大。所以可以等到会话超时并解锁它。所以我找到了这两种方法。1.使用@PreDestroy注释调用解锁资源的方法。2.实现HttpSessionListener,在HttpSessionListener#sessionDestroyed内部写解锁逻辑

但对我来说,两者似乎都在做同样的事情。你们现在能告诉我哪一个更适合我的场景吗?这两个之间的主要区别是什么?

使用Java7,EJB3和JSF2提前感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-07 11:00:40

好的,我用这两种方法做了一些研究,得出了结论。

带注释的@PreDestroy方法由HttpSessionListener#sessionDestroyed在内部处理。

要命中的第一个点是HttpSessionListener#sessionDestroyed,然后将调用@PreDestroy注释方法。所以我决定用HttpSessionListener#sessionDestroyed。下面是我的实现。

代码语言:javascript
代码运行次数:0
运行
复制
@WebListener
public class MyHttpSessionListener implements HttpSessionListener {

    Logger logger = new Logger();

    @Override
    public void sessionCreated(HttpSessionEvent arg0) {
        // Nothing to DO
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent arg0) {
        try {
            HttpSession session = arg0.getSession();
            Object sessionMyObj = session.getAttribute("myDTBManagedBean");

            if (sessionMyObj != null && sessionMyObj instanceof MyDTBManagedBean) {
                MyDTBManagedBean myDTB = (MyDTBManagedBean ) sessionMyObj;

                if (myDTB != null) {
                   //Do my unlocking logic
                }
            }
        }
    } catch (Exception e) {
        logger.error(//log exception);
    }
}

WebListener将该类作为servlet侦听器http://docs.oracle.com/javaee/6/api/javax/servlet/annotation/WebListener.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42503031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档