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

What is the main difference between JavaEE @PreDestroy vs HttpSessionListener#sessionDestroyed and when to use what?

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

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

该资源的需求量不大。所以可以等到会话超时再解锁。所以我找到了这两种方法来做到这一点。 1. 使用“@PreDestroy”注解调用解锁资源的方法。 2.实现"HttpSessionListener",将解锁逻辑写在"HttpSessionListener#sessionDestroyed"

里面

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

使用JAVA7、EJB3和JSF2 提前致谢。

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

@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 使 class 作为 servlet 侦听器 http://docs.oracle.com/javaee/6/api/javax/servlet/annotation/WebListener.html