Использовать метод @predestroy для выполнения ожидающих инструкций в конце сеанса?

Безопасно ли хранить список ожидающих выполнения в контексте действий пользователя в веб-приложении в bean-компоненте с областью действия сеанса, а затем надежно выполнять эти действия в конце сеанса с помощью @Predestroy аннотированного метода (я имею в виду безопасность в контексте @predestroy метод не вызывается и, следовательно, действие не выполняется при некоторых обстоятельствах или около того !? ).


person Rajat Gupta    schedule 14.08.2012    source источник
comment
этот мгновенный плохой заголовок был результатом опечатки, когда я нажимал кнопку отправки, из-за которой мой заголовок был стерт..   -  person Rajat Gupta    schedule 14.08.2012
comment
@Juan: посмотри на теги вопросов.   -  person BalusC    schedule 14.08.2012
comment
Я не уверен, что вы конкретно спрашиваете. Но для меня было бы совершенно разумно, что они не будут выполняться, когда сервер выйдет из строя или будет убит. Это то, что вам нужно знать? Или это нелогично? Или вы наблюдали совершенно другое поведение? Кстати, почему вы отдаете предпочтение этому вопросу? Даже без избранного вы, как запрашивающий, по умолчанию уже будете уведомлены о любых новых действиях.   -  person BalusC    schedule 14.08.2012
comment
Я не возражаю, если иногда/редко/когда-то действие не выполнялось, но обычно терпеть не могу.   -  person Rajat Gupta    schedule 14.08.2012
comment
Теги @BalusC были добавлены, потому что я задал вопрос.   -  person Juan Mendes    schedule 14.08.2012
comment
проголосовали за ноль, потому что это справедливый вопрос о реализации интересного аспекта, и постер добавил теги в соответствии с просьбой   -  person him    schedule 16.08.2012
comment
Проголосовал против, потому что вопрос не имеет никакого смысла. Это все равно, что просить других крепко держать вас за руки. Stack Overflow — это скорее место, где можно задать реальные проблемы и найти ответы на них. У ОП, похоже, вообще нет какой-то конкретной реальной проблемы, просто какая-то необоснованная неопределенность.   -  person BalusC    schedule 16.08.2012


Ответы (2)


вы можете захотеть перенести свою логику в реализацию HttpSessionListener (это интерфейс). вы бы запускали события sessionDestroyed (через реализацию этого метода в вашей конкретной реализации).

это довольно простое в использовании и отличное место для обработки такого рода вещей (я реализовал один в текущем продукте как JMX-бин для обработки управляющих сеансов во время выполнения).

ТИА

person him    schedule 16.08.2012
comment
Аннотированный метод @Predestroy управляемого компонента @SessionScoped находится за кулисами JSF, уже вызванными HttpSessionListener#sessionDestroyed(). Поэтому я совершенно не понимаю, насколько полезно и безопасно заменить это собственной реализацией. - person BalusC; 16.08.2012
comment
не предлагал его как более безопасный, просто сделал его семантически ориентированным. да, есть несколько способов снять шкуру с этого кота, но поскольку он особенно заинтересован в запуске некоторого поведения/аспекта во время уничтожения сеанса, может иметь смысл поместить логику в bean-компонент, предназначенный для этого поведения. если его обратному вызову нужны другие компоненты/ресурсы, которые не нужны во время нормальной работы, их внедрение только для того, чтобы они были доступны при уничтожении сеанса, может представлять собой загрязнение компонента. опять же, без показа кода его пришлось бы взвешивать абстрактно. - person him; 21.08.2012

Совершенно безопасно хранить ожидающие выполнения или фиксации БД в методе @preDestroy. В этом состоянии управляемый компонент не будет уничтожен. Таким образом, состояние управляемого компонента будет таким же, как и при обычном вызове метода внутри компонента. Пожалуйста, обратитесь к приведенной ниже документации.

http://docs.oracle.com/javaee/6/tutorial/doc/gmgkd.html#gmghg

«Подготовка к уничтожению управляемого компонента с помощью аннотации @PreDestroy Подготовка к уничтожению управляемого компонента указывает метод обратного вызова жизненного цикла, который сигнализирует о том, что компонент приложения будет уничтожен контейнером.

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

Аннотируйте объявление метода аннотацией javax.annotation.PreDestroy. CDI вызывает этот метод перед тем, как начать уничтожать компонент».

person Ajanthan    schedule 28.02.2017