这是我的场景。我有一个组件,它搜索一些记录,在搜索时,这些记录被标记为锁定。我使用的是JSF-2和primefaces。我的MBean是ViewScoped。现在我有一个要求,在关闭浏览器的同时,需要释放对这些记录的锁定。我一直在搜索,我最好的选择似乎是@PostDestroy。因此,如果使用PostDestroy是正确的方法,那么是否有人可以提供帮助。StackOverFlow上的一些帖子建议,PostDestroy不会在浏览器关闭事件时被调用。我我在PostDestroy上找不到太多。有没有人能就这种方法提供一些建议?
谢谢,本
发布于 2014-06-01 22:54:27
您的@ViewScoped Bean不知道用户是否正在关闭浏览器。对于Bean来说,客户端是浏览器还是其他HTTP客户端都无关紧要。
如果您的应用程序将回发发送到下一个视图(有关确切答案,请参见How and when is a view scope bean destroyed in JSF ),则@ViewScoped Bean的生命周期将正常结束。
您可以尝试使用JavaScript window.onunload事件检测正在关闭的浏览器,但我不建议这样做。一些浏览器会在浏览器关闭时触发此事件,其他浏览器则不会,一些浏览器会在重新加载时触发此事件,等等(有关详细信息,请参阅DOM Window unload event, is it reliable? )。
带@PreDestroy注释的方法(不是@PostDestroy btw.)也可以使用not be called immediately in some cases。您只能依赖于它将在会话超时时被调用。锁定记录可能需要很长时间...
您可以使用某种调度程序在较短的时间后自行释放锁定的记录,但我建议切换到optimistic locking (在写入之前不要锁定并检查数据是否已更改)。
https://stackoverflow.com/questions/23979711
复制相似问题