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

Jakarta ee JavaEE@PreDestroy与HttpSessionListener#sessionDestroyed之间的主要区别是什么?何时使用什么?,jakarta-ee,session-timeout,Jakarta Ee,Session Timeout,我需要在用户编辑资源时锁定并释放它。 我可以很容易地设置一个锁,当用户保存它解锁它或当用户注销做解锁 但我的问题是,当用户进入编辑页面时,不保存就将其保留在那里,或者在编辑页面中关闭浏览器。 在这种情况下,我必须解锁资源以供其他用户访问 资源需求量不大。因此,您可以等待会话超时并解锁它。所以我找到了这两种方法。 1.使用“@PreDestroy”注释调用将解锁资源的方法。 2.实现“HttpSessionListener”并将解锁逻辑写入“HttpSessionListener#sessionD

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

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

资源需求量不大。因此,您可以等待会话超时并解锁它。所以我找到了这两种方法。 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使类成为servlet侦听器