Изучаем Java EE 7 - [117]

Шрифт
Интервал

JNDI-именем, которое я описывал ранее.

Сессионные EJB-компоненты без сохранения состояния могут поддерживать большое количество клиентов, минимизируя объем любых необходимых ресурсов. Наличие приложений без сохранения состояния — один из способов улучшить масштабируемость (поскольку контейнеру не придется сохранять состояние и управлять им).

EJB-компоненты с сохранением состояния

EJB-компоненты без сохранения состояния обеспечивают бизнес-методы для своих клиентов, но не поддерживают для них диалоговое состояние. EJB-компоненты с сохранением состояния, наоборот, поддерживают диалоговое состояние. Они полезны для решения задач, с которыми необходимо справиться в несколько этапов. При этом каждый из этапов полагается на состояние, сохраненное на предыдущем этапе. Обратимся к примеру корзины на сайте для электронной торговли. Клиент входит в систему (его сессия начинается), выбирает первую книгу, добавляет ее в свою корзину, затем выбирает вторую книгу и добавляет ее в свою корзину. В конце клиент подсчитывает стоимость всех выбранных книг, оплачивает их и выходит из системы (сессия завершается). Корзина поддерживает состояние того, сколько книг клиент выбрал по ходу всего взаимодействия (что может занять некоторое время, в частности время сессии клиента). Код этого взаимодействия с компонентом с сохранением состояния мог бы выглядеть следующим образом:

>Book book = new Book();

>book.setTitle("Автостопом по Галактике");

>book.setPrice(12.5F);

>book.setDescription("Научно-фантастический комедийный сериал, созданный Дугласом Адамсом.");

>book.setIsbn("1-84023-742-2");

>book.setNbOfPage(354);

>statefulComponent.addBookToShoppingCart(book);

>book.setTitle("Роботы зари");

>book.setPrice(18.25F);

>book.setDescription("Айзек Азимов, серия про роботов");

>book.setIsbn("0-553-29949-2");

>book.setNbOfPage(276);

>statefulComponent.addBookToShoppingCart(book);

>statefulComponent.checkOutShoppingCart();

В приведенном чуть выше коде показано, как именно работает сессионный EJB-компонент с сохранением состояния. Создаются два экземпляра Book, а затем они добавляются в корзину, которую представляет компонент с сохранением состояния. В конце метод checkOutShoppingCart() опирается на сохраненное состояние и может подсчитать стоимость двух выбранных книг.

Когда клиент вызовет EJB-компонент с сохранением состояния на сервере, EJB-контейнеру потребуется обеспечить тот же самый экземпляр при каждом последующем вызове метода. EJB-компоненты с сохранением состояния не могут повторно использоваться другими клиентами. На рис. 7.5 показана корреляция «один к одному» между экземпляром EJB-компонента и клиентом. С точки зрения разработчика, никакого дополнительного кода здесь не требуется, поскольку EJB-контейнер автоматически управляет этой корреляцией «один к одному».


Рис. 7.5. Клиенты, осуществляющие доступ к EJB-компонентам с сохранением состояния


За корреляцию «один к одному» придется кое-чем заплатить, поскольку, как вы, возможно, уже догадались, если у вас будет один миллион клиентов, то в вашем случае в памяти окажется один миллион EJB-компонентов с сохранением состояния. Чтобы избежать такого большого объема занимаемой памяти, контейнер временно удаляет EJB-компоненты из памяти до того, как следующий запрос от клиента вернет их назад. Эта методика называется пассивизацией и активизацией. Пассивизация — это процесс удаления экземпляра из памяти и сохранения его в постоянной локации (в файле на диске, в базе данных и т. д.). Активизация — это обратный процесс, который заключается в восстановлении состояния и применении его к экземпляру. Пассивизация и активизация выполняются автоматически контейнером; вам не нужно беспокоиться о том, чтобы осуществить их самостоятельно, поскольку об этом заботится контейнерная служба. Вам следует побеспокоиться о высвобождении всех ресурсов (используемых, например, для подключения к базе данных; либо это могут быть фабрики JMS, тоже обеспечивающие подключение, и т. д.), прежде чем EJB-компонент подвергнется пассивизации. С выходом EJB 3.2 также появилась возможность отключать пассивизацию, как вы увидите в следующей главе, с использованием аннотаций жизненного цикла и обратных вызовов.

Вернемся к примеру корзины и применим его для EJB-компонента с сохранением состояния (листинг 7.8). Клиент входит в систему на сайте, просматривает каталог элементов и добавляет две книги в корзину (с помощью метода addItem()). Атрибут cartItems включает все содержимое корзины. Затем клиент решает сделать себе кофе. Пока он занят этим, контейнер может осуществить пассивизацию экземпляра, чтобы высвободить некоторый объем памяти, что, в свою очередь, приводит к сохранению содержимого корзины на постоянном запоминающем устройстве. Спустя несколько минут клиент возвращается и хочет узнать общую цену (с помощью метода getTotal()) товаров в своей корзине, прежде чем что-либо покупать. Контейнер активизирует EJB-компонент и восстанавливает данные в корзину. После этого клиент может подсчитать стоимость всех выбранных книг (с помощью метода checkout()) и купить их. Как только клиент выходит из системы, его сессия завершается и контейнер высвобождает память, навсегда удаляя экземпляр EJB-компонента с сохранением состояния.


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

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


Симуляция частичной специализации

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


Обработка событий в С++

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


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.