2016-03-01 4 views
0

В моем текущем проекте, основанном на 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. Было бы неплохо, если бы кто-то помог мне пролить свет на эту тему.

ответ

1

Я не уверен, на какой сессии вы печатаете и ссылаетесь на нее.

Я думаю, вы знаете это, но у вас есть 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-за-сессии подход, например, как показано здесь - Save changes to database vaadin.

Все это говорит о том же VaadinSession может быть абсолютно использован для нескольких пользовательских интерфейсов, на самом деле вы увидите карту под названием uIs в VaadinSession. Теперь вы, кажется, получаете новый VaadinSession на каждое окно браузера, но нетрудно создать несколько объектов UI из того же окна, и они будут делиться теми же VaadinSession.

В заключение отметим, что большинство нормальных установок также будут иметь один HttpSession во всех окнах экземпляра браузера.

+0

Ах, хорошо, это пролить свет на него. У меня создалось впечатление, что сеанс vaadin означает сеанс, поддерживаемый cookie, в основном для одного соединения с браузером (пока браузер не будет закрыт). Но ваш ответ предполагает совершенно иной подход. – Entrusc

+0

Итак, теперь, когда я прочитал ваш ответ более подробно, я думаю, что теперь понимаю проблему: я привязал все свои EM к пользовательскому интерфейсу, вместо этого я должен был привязать их к сеансу. Я не понимал, что пользовательский интерфейс и сеанс - это две разные вещи - я видел их как один. Спасибо за Ваш ответ! – Entrusc

Смежные вопросы