Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Может ли быть важно вызывать remove() для сеансового компонента EJB 3 без сохранения состояния? Возможно на weblogic?

Автор вопроса: Michael BorgwardtОтветов: 2

Я нахожусь в процессе переноса приложения EJB 2 на EJB 3 (и как приятно удалить все эти дескрипторы развертывания!). Раньше он работал на Weblogic, а теперь работает на Glassfish.

Задача выполняется очень гладко, но одна вещь меня настораживает: текущий код очень тщательно следит за тем, чтобы EJBObject.remove() вызывалась для компонента, когда он выполнил свою работу, а у других разработчиков остались (к сожалению, очень смутные) воспоминания о "плохих вещах". происходит, когда это не было сделано.

Однако в EJB3 класс реализации не реализует EJBObject, поэтому метод remove() не вызывается. И я понимаю, что на самом деле нет никакого смысла вызывать это для сеансовых компонентов без сохранения состояния, поскольку они, ну, не имеют состояния.

Могли ли эти "плохие вещи" быть специфичными для веблогики? Если нет, то что еще? Должен ли я избегать полной легкости EJB3 и оставить удаленный интерфейс, который расширяет EJBObject? Или просто списать это на культовое программирование и удалить все эти предложения try/finally?

Я склоняюсь к последнему, но чувствую себя не очень комфортно с ним.

  • Любое обновление? В EJB3 я вижу, что клиенту приходится вызывать метод, аннотированный @Remove. Также вы предполагаете, что у EJB без состояния нет состояния? Они делают. Они не имеют состояния, потому что они не поддерживают диалоговое состояние между двумя вызовами метода (они делают это во время вызова метода). dalvarezmartinez1 02.10.2014
  • @MichaelBorgwardt и др., Поскольку EJB 3 не реализует EJBObject, возвращает ли контейнер прямую ссылку локального компонента на локального клиента? Если это так, есть опасность, что клиент может присвоить значение null тому же самому, и экземпляры пула исчезнут из пулов SLSB. Если клиентские вызовы маршрутизируются через прокси, как в EJB 2.1, что это за тип прокси? lupchiazoem 03.08.2018
  • @mnmopazem: прошло слишком много времени с тех пор, как я работал с EJB, чтобы помнить особенности, но я определенно предположил бы, что локальные компоненты EJB3 передаются клиентам как прямые ссылки, и если вы думаете, что присвоение null ссылке может сделать экземпляры исчезают из пула, у вас есть некоторые неправильные представления о том, как работают ссылки. Michael Borgwardt 05.08.2018
  • @MichaelBorgwardt Интересно узнать о ссылках. Не могли бы вы уточнить то же самое. IOW, если клиент имеет прямую ссылку на bean-компонент, почему назначение null не приведет к его исчезновению из пула. Под "исчезновением" я подразумеваю, что он будет готов к сборке мусора во время выполнения. Я разместил вопрос @ stackoverflow.com/questions/51657404/. Я прошу вас поделиться своими знаниями там. lupchiazoem 05.08.2018
  • @mnmopazem: множественные ссылки на один и тот же объект полностью независимы. Упрощенно, ссылка - это адрес памяти объекта. Установка для одной ссылки значения null никак не влияет на другие ссылки на тот же объект. Объект подходит для GC, если на него нет ссылок. Это очень фундаментальное знание Java, которое вам необходимо понять, а не просто как побочный вопрос в контексте EJB. Michael Borgwardt 07.08.2018
  • @Майкл Боргвардт О. Ну, я понимаю этот момент :) Итак, имея общее понимание и возвращаясь к моему 1-му комментарию - если клиенту назначается прямая ссылка (т.е. объект SLSB), то если клиент назначает null (сразу после получения ссылки), этот объект будет готов для GC. Разве это не так? lupchiazoem 07.08.2018

glassfishweblogicejbjakarta-ee

Ответы

Ответ 1 · рейтинг 1 · Brett Kail

Я не знаком с реализацией WebLogic, но не думаю, что это важно. Я ожидаю, что каждый вызов метода в оболочке SLSB будет выделять bean-компонент из пула до вызова метода и освобождать его после, поэтому для удаления() нечего делать.

Я бы списал это на карго-культовое программирование. Предположительно, кто-то однажды забыл вызвать remove для SFSB и обнаружил, что произошли плохие вещи, поэтому шаблон был распространен на все сеансовые компоненты.

Ответ 2 · Hürol Türen

Верно. Вы не реализуете EJBObject в EJB 3, поэтому вы не можете вызвать метод remove(). Что на самом деле есть в EJB 3, так это внедрение зависимостей, которое работает с EntityManager.

В настоящее время я переношу приложения с EJB 2.1 на EJB 3 и понял, что могу решить эту проблему с помощью EntityManager.

@Resource private EntityManager em;

и в методе удаления вы можете написать em.remove(yourObject);

Надеюсь это поможет

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы