java ejb3 @PostConstruct - PullRequest
       9

java ejb3 @PostConstruct

3 голосов
/ 10 июля 2009

Я экспериментирую с EJB3 на JBoss, разрабатывая bean-компонент без состояния. По сути, после развертывания модуля мне нужно выполнить некоторые действия, связанные с загрузкой настроек приложения. Для этого я аннотировал метод как @PostConstruct, который, насколько я знаю из API, инструктирует контейнер вызывать его после развертывания компонента и до его ввода в эксплуатацию. (правильный?) Теперь я запутался, потому что из журнала этот метод выглядит не просто вызванным после того, как был развернут, но перед тем, как вызывается каждый открытый метод. Мне нужно вызывать этот метод только один раз, а не каждый раз, когда он получает вызов. Какой будет лучший подход?

Заранее спасибо

Алессандро Илардо

Ответы [ 5 ]

2 голосов
/ 10 июля 2009

Бин без гражданства должен быть просто без гражданства. Это означает, что при использовании вы не должны ни знать, ни заботиться о том, был ли компонент извлечен из пула или создан по требованию для вашего запроса. Мне трудно представить, как PostConstruct может применяться к среде без состояния, поскольку я всегда использую эту функцию для завершения построения состояния компонента.

По-видимому, JBoss либо отказывается от объединения бинов без сохранения состояния и каждый раз создает их новые, либо, если он использует пулы, обрабатывает их так, как будто они реконструируются каждый раз (поскольку они не должны нести информацию о состоянии). Я на самом деле немного удивлен, что он вообще вызывает PostConstruct.

1 голос
/ 11 июля 2009

Прежде всего PostConstruct вызывается до того, как первый метод будет вызван в бобе. Если никакой метод не будет вызван, никакая пост-конструкция никогда не будет вызвана.

Во-вторых, вы можете выполнить обратные действия в методе PreDestory для удаления побочных эффектов.

В любом случае, какое действие вы должны выполнить?

0 голосов
/ 18 февраля 2010

PostConstruct вызывается до того, как клиент запустит метод biz. Это означает, что если компонент не объединен в пул, контейнер будет создавать экземпляр компонента, делать инъекцию, вызывать метод @PostConstruct, а затем разрешать запуск метода biz.

В случае пула be, тогда метод @PostConstruct будет запускаться каждый раз, когда бин извлекается из пула. С bean-компонентами без состояния это будет между каждым вызовом метода. С бобами Stateful это будет после поиска клиента или внедрения.

Если вам нужно что-то запустить при развертывании приложения, ваши параметры будут зависеть от имеющейся у вас версии Java EE.

Для Java EE 6 вы можете использовать @Startup для @Singleton EJB, который содержит метод @PostConstruct.

Для Java EE 5 и более ранних версий вам придется использовать ServletContextListener в веб-архиве. Вы можете сделать так, чтобы ServletContextListener вызывал EJB, если хотите.

Однако, что может быть более важным вопросом, куда вы хотите загрузить эти настройки приложения? Если вы имеете дело с некластеризованной одиночной конфигурацией JVM, то вы, вероятно, захотите загрузить их в синглтон некоторого типа. В Java EE 5 вам придется самостоятельно реализовать шаблон проектирования Singleton, а в EE 6 использовать тип @Singleton EJB.

0 голосов
/ 10 июля 2009

Сколько SLSB у вас в вашем бассейне? В зависимости от контейнера @PostConstruct может не вызываться до тех пор, пока первый клиент не получит к нему доступ (не уверен в JBoss), поэтому может быть поэтому он выглядит так, как при каждом доступе. Было бы интересно узнать, не перестал ли он вызывать ваш метод после конструирования после того, как он вызвал количество раз, равное размеру вашего пула.

Если вы выполняете некоторые дорогостоящие действия в своем методе пост-построения, то, возможно, делаете это в SFSB при запуске и «внедряете» этот SFSB в ваш SLSB в пост-конструкции.

0 голосов
/ 10 июля 2009

Сервер приложений управляет жизненным циклом EJB. Он может решить построить, инициализировать и разрушить бины, когда сочтет нужным. Может случиться так, что каждый вызов вашего bean-компонента без состояния связан с новым экземпляром класса вашего bean-компонента, хотя это кажется чем-то необычным.

Сервер приложений вызывает метод @PostConstruct несколько раз для одного и того же экземпляра объекта или для каждого экземпляра каждый раз? Попробуйте вставить инструкции log внутри конструктора и метода @PostConstruct.

...