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

时间:2017-02-28 07:51:30

标签: java-ee session-timeout

我需要在用户编辑资源时锁定和释放资源。 我可以轻松地设置锁定,当用户保存时解锁或用户注销时解锁。

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

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

但对我而言似乎都在做同样的事情。 你们能告诉我哪一个更适合我的情景以及这两者之间的主要区别吗?

使用JAVA 7,EJB3和JSF2 提前谢谢。

1 个答案:

答案 0 :(得分:0)

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

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

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

@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