Vaadin 7 UI 会话过早关闭

Vaadin 7 UI session gets closed prematurely

在我当前的基于 Vaadin 7.6.2 的项目中,我收到一个错误,我根本没有在我的代码中找到解释。在此应用程序中,我为 UI 会话打开了一堆 EntityManagers,然后在会话分离时关闭它们(当调用 UI.detatch() 时)。现在我的问题是我的日志清楚地表明会话已分离然后再次使用。据我所知,这不应该发生,对吗?

以下是日志文件的摘录:

***  || 29.02.2016 09:59:32:504 | SESSION BEC3759B529AC42AA7FFE62314633979 | USER a******.i**** | de.darkblue.bagheera.db.EntityManagerBeanFactory.closeAll()
     || Closed 3 entity managers for session a******.i****

***  || 29.02.2016 09:59:32:504 | SESSION BEC3759B529AC42AA7FFE62314633979 | USER a******.i**** | de.darkblue.bagheera.BagheeraUI.detach()
     || Session de.darkblue.bagheera.BagheeraUI@1c5c5ab2 was detatched.

[...]
     
!!!! || 29.02.2016 10:00:21:159 | SESSION BEC3759B529AC42AA7FFE62314633979 | USER a******.i**** | com.vaadin.server.DefaultErrorHandler.doDefault()
     ||  caused by:
     || java.lang.IllegalStateException: Attempting to execute an operation on a closed EntityManager.
     ||         at org.eclipse.persistence.internal.jpa.EntityManagerImpl.verifyOpenWithSetRollbackOnly(EntityManagerImpl.java:1934)
     ||         at org.eclipse.persistence.internal.jpa.EntityManagerImpl.getCriteriaBuilder(EntityManagerImpl.java:2569)
     ||         at de.darkblue.bagheera.ui.tab.EditActivityReportTab.isOverlappingEntry(EditActivityReportTab.java:383)
     ||         [...]

您可以看到会话 BEC3759B529AC42AA7FFE6231463397909:59:32:504 关闭,但在将近一分钟后重新使用。我的印象是,当 UI.detatch() 被调用时(如日志第 2 行),UI 实例不再被使用,因为会话已过期(由于三个任务心跳)?我觉得我对 Vaadin UI 会话的生命周期有错误的想法。如果有人可以帮助我阐明这个主题,那就太好了。

我不确定您正在打印和指的是哪个会话。

我想你知道这一点,但你有 HttpSession 持有一个 VaadinSession 对象,该对象持有多个 UI 对象。如果其中任何一个听起来很有趣,我想你会发现这很有帮助 - how to put data in session variable and get the data in different page in vaadin?.

但是,我的感觉是您需要重新考虑您的 EntityManager 生命周期 - 请参阅 https://vaadin.com/docs/-/part/framework/jpacontainer/jpacontainer-hibernate.html

尽管如此,其他人确实提倡 EM-per-session 方法,如此处所示 - Save changes to database vaadin

综上所述,同一个VaadinSession绝对可以用于多个UI,事实上你会在VaadinSession中看到一个名为uIs的地图。现在,您似乎确实为每个浏览器 window 获得了一个新的 VaadinSession,但是从同一个 window 实例化多个 UI 对象并不难,它们将共享同VaadinSession

最后值得注意的是,大多数正常设置在浏览器实例中的所有 windows 中也只有一个 HttpSession