Читаем Изучаем 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.

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

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

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных

Все жанры