Читаем Изучаем Java EE 7 полностью

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

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


Листинг 7.8. Сессионный EJB-компонент с сохранением состояния ShoppingCartEJB

@Stateful

@StatefulTimeout(value = 20, unit = TimeUnit.SECONDS)

public class ShoppingCartEJB {

··private List cartItems = new ArrayList<>();

··public void addItem(Item item) {

····if (!cartItems.contains(item))

······cartItems.add(item);

··}

··public void removeItem(Item item) {

····if (cartItems.contains(item))

······cartItems.remove(item);

··}

··public Integer getNumberOfItems() {

····if (cartItems == null || cartItems.isEmpty())

······return 0;

····return cartItems.size();

··}

··public Float getTotal() {

····if (cartItems == null || cartItems.isEmpty())

······return 0f;

····Float total = 0f;

····for (Item cartItem: cartItems) {

······total += (cartItem.getPrice());

····}

····return total;

··}

··public void empty() {

····cartItems.clear();

··}

··@Remove

··public void checkout() {

····// Выполнить некоторую бизнес-логику

····cartItems.clear();

··}

}

Рассмотренная нами ситуация с корзиной — это стандартный подход к использованию EJB-компонентов с сохранением состояния, при котором контейнер автоматически обеспечивает поддержание диалогового состояния. Единственная необходимая аннотация — @javax.ejb.Stateful, которая обладает тем же API-интерфейсом, что и аннотация @Stateless, описанная в листинге 7.7.

Перейти на страницу:

Похожие книги

C# 4.0: полное руководство
C# 4.0: полное руководство

В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

Герберт Шилдт

Программирование, программы, базы данных
97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Нил Форд , Билл де Ора , Майкл Хайгард

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT