如何在浏览器关闭事件上调用@PreDestroy?

时间:2014-06-01 12:09:46

标签: jsf-2 primefaces

这是我的情景。我有一个搜索某些记录的组件,在搜索时,这些记录被标记为已锁定。我正在使用JSF-2和primefaces。我的MBean是ViewScoped。现在我有一个要求,在关闭浏览器时,需要释放对这些记录的锁定。我正在寻找,我最好的选择似乎是@PostDestroy。所以有人可以提供帮助,无论使用PostDestroy是否正确。 StackOverFlow上的一些线程表明,PostDestroy不会在浏览器关闭事件上被调用。我在PostDestroy上找不到太多东西。有人可以提供有关这种方法的指示吗?

谢谢, 本

1 个答案:

答案 0 :(得分:0)

您的@ViewScoped Bean不知道用户是否正在关闭浏览器。对于Bean,如果客户端是浏览器或其他HTTP客户端,则无关紧要。

如果您的应用程序将回发发送到下一个视图,@ViewScoped Bean的生命周期正常结束(请参阅How and when is a view scope bean destroyed in JSF获取确切答案)。

您可以尝试使用JavaScript window.onunload事件检测关闭浏览器,但我不建议这样做。有些浏览器会在浏览器关闭时触发此事件,其他浏览器则不会,有些浏览器会在重新加载时触发此事件(有关详细信息,请参阅DOM Window unload event, is it reliable?)。

@PreDestroy带注释的方法(不是@PostDestroy btw。)也可能not be called immediately in some cases。您只能依赖于会话超时时调用它。锁定记录可能需要很长时间......

您可以使用某种调度程序在较短的时间后释放锁定的记录,但我建议切换到optimistic locking(不要锁定并检查数据是否已更改之前你写的。)