В моем текущем проекте, основанном на Vaadin 7.6.2
, я получаю сообщение об ошибке, которое я просто не нашел в моем коде. В этом приложении я открываю кучу EntityManagers для сеанса пользовательского интерфейса, а затем закрываю их при отключении сеанса (когда вызывается UI.detatch()
). Теперь моя проблема заключается в том, что в моем журнале четко указано, что сеанс отключен, а затем снова используется. AFAIK это не должно произойти, не так ли?Vaadin 7 сеанс UI закрывается досрочно
Вот excerp из файла журнала:
*** || 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 [email protected] 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)
|| [...]
Вы можете увидеть, что сеанс BEC3759B529AC42AA7FFE62314633979
был закрыт в 09:59:32:504
, но затем повторно почти через одну минуту. У меня создалось впечатление, что когда был вызван UI.detatch()
(как в строке журнала 2), экземпляр пользовательского интерфейса больше не использовался, потому что сеанс истек (из-за трех пульсирующих пультов)? У меня возникает ощущение, что у меня неправильное представление о жизненном цикле сеанса пользовательского интерфейса Vaadin. Было бы неплохо, если бы кто-то помог мне пролить свет на эту тему.
Ах, хорошо, это пролить свет на него. У меня создалось впечатление, что сеанс vaadin означает сеанс, поддерживаемый cookie, в основном для одного соединения с браузером (пока браузер не будет закрыт). Но ваш ответ предполагает совершенно иной подход. – Entrusc
Итак, теперь, когда я прочитал ваш ответ более подробно, я думаю, что теперь понимаю проблему: я привязал все свои EM к пользовательскому интерфейсу, вместо этого я должен был привязать их к сеансу. Я не понимал, что пользовательский интерфейс и сеанс - это две разные вещи - я видел их как один. Спасибо за Ваш ответ! – Entrusc