Управляет ли Tapestry всеми потоками внутри приложения?

Рассмотрим сервис, который запускает внутри себя некий thread. Будет ли Tapestry 5 управлять этим потоком в части, например. закрытие hibernate сеансов внутри такого потока или нет? (Например, мы можем передать объект Session внутри такого дочернего потока из сервиса. Будет ли Tapestry безопасно закрывать этот сеанс после того, как поток умрет?).


person Andremoniy    schedule 22.03.2013    source источник


Ответы (2)


Tapestry может управлять только вещами, объявленными в вашем AppModule.

Как правило, если вы используете ключевое слово «новое», оно не управляется гобеленом.

Если вы хотите, чтобы гобелен управлял вашим исполняемым файлом, взгляните на ParallelExecutor.

Если вы хотите имитировать поток, управляемый гобеленом, вы должны вызвать Perthreadmanager.cleanup() после завершения выполнения вашего исполняемого файла.

person lance-java    schedule 23.03.2013
comment
Служба PerThreadManager имеет API для помощи в этом. См. Tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/ - person Howard M. Lewis Ship; 28.03.2013

Сеанс Hibernate подключается к потоку веб-контейнера, который обрабатывает текущий запрос.

Если вы решите создать свой собственный поток и передать ему этот сеанс, то изменения в этом сеансе будут зафиксированы, только если они будут выполнены до того, как Tapestry зафиксирует или до того, как вышеупомянутый поток веб-контейнера завершит обработку этого запроса.

Контроль Tapestry над сеансом гибернации привязан к текущему запросу, после обработки запроса сеанс закрывается, поэтому порождение еще одного потока, пережившего запрос на использование сеанса, было бы плохой идеей.

person Nicolas Barrera    schedule 22.03.2013
comment
Ничего не понял. Вы можете ответить: да или нет на мой вопрос? - person Andremoniy; 22.03.2013
comment
В гобелене нет ничего, что связывало бы сеанс гибернации с запросом. Сеанс гибернации, предоставляемый гобеленом, представляет собой лениво загруженное значение perthread. Базовое соединение с базой данных создается по запросу. Вам просто нужно убедиться, что вы вызываете perthreadmanager.cleanup, если вы находитесь в порожденном потоке. Гобелен вызывает это для вас, если в потоке запроса - person lance-java; 23.03.2013
comment
Объект Session является прокси; передайте прокси в новый поток, и будет создан новый реальный экземпляр для этого нового потока. Таким образом, в этом нет необходимости... просто введите глобальный объект Session. - person Howard M. Lewis Ship; 28.03.2013