Главная » Java, JavaBeans » Разработка Session-Компонента

0

В этом разделе описан класс реализации Компонента и интерфейсы и методы, которые должны быть реализованы.

Интерфейс SessionBean

Интерфейс SessionBean session-Компонента определяет те методы, которые обязаны реализовать все session-Компоненты. Этот интерфейс наследует интерфейс EnterpriseBean. Методы этого интерфейса тесно связаны с циклом жизни такого объекта.

Пример Кода 6.1 Интерфейс SessionBean

package javax.ejb;

public interface SessionBean extends EnterpriseBean { void setSessionContext(SessionContext sessionContext)

throws EJBException, RemoteException; void ejbRemove() throws EJBException, RemoteException; void ejbActivate() throws EJBException, RemoteException; void ejbPassivate() throws EJBException, RemoteException;

}

Методы выполняют следующие действия.

• setSessionContext () устанавливает контекст сеанса (сессии).

Контейнер Компонента вызывает этот метод, чтобы ассоциировать экземпляр Компонента с контекстом сессии. Интерфейс

SessionContext объявляет методы для доступа к свойствам времени выполнения контекста, в котором выполняется сессия. Как правило, объект сохраняет этот контекст как часть своего состояния.

•          ejbRemove() уведомляет session-объект о том, что он сейчас будет удален. По какой бы причине Контейнер не удалял экземпляр Компонента (например, вследствие вызова клиентом метода remove() home- или remote-интерфейсов), он вызывает этот метод класса Компонента.

•          void ejbActivate () уведомляет объект о том, что он был активизирован.

•          void ejbPassivate () уведомляет объект о том, что сейчас он будет деактивизирован Контейнером.

Уведомления о выполнении активизации и деактивизации позволяют

реализовывать эффективные схемы управления ресурсами.

Session-интерфейс синхронизации

Необязательный интерфейс SessionSynchronization обеспечивает объекту возможность получения уведомлений о транзакционных действиях – другими словами, экземпляр получает сообщение о том, что какие-либо действия, связанные с транзакциями, либо только что произошли, либо сейчас будут выполнены. Экземпляры Компонентов могут использовать эти уведомления для выполнения некоторых действий с данными в БД. Например, реализация этого интерфейса позволяет объектам выполнить синхронизацию кешированных в памяти данных с данными в БД в процессе выполнения транзакции.

Только stateful session-Компоненты с сохранением, управляемым Контейнером (container-managed persistence, СМР), могут реализовывать интерфейс SessionSynchronization. Ни stateless-Компонентам, ни Компонентам с сохранением, управляемым Компонентом (bean-managed persistence, BMP) не следует пытаться реализовать этот интерфейс.

Пример Кода 6.2 Интерфейс SessionSynchronization

package javax ejb;

public interface SessionSynchronization { void afterBegin() throws RemoteException; void beforeCompletion() throws RemoteException; void afterCompletion(boolean completionStatus) throws RemoteException;

}

Контейнер использует эти три метода для уведомления экземпляра Компонента о начале транзакции или завершении ее этапов.

afterBegin () уведомляет объект о том, что новая транзакция началась. Контейнер вызывает этот метод перед вызовом первого бизнес-метода Компонента (не его remote-интерфейса!), но не обязательно сразу после

начала транзакции. Компонент уже включен в транзакцию, и любые действия выполняются в контексте этой транзакции.

beforeCompletion () уведомляет объект о том, что клиент завершил текущую транзакцию, но внесенные изменения еще не подтверждены. Если Компонент имеет кешированные в памяти значения данных из БД, то это подходящий момент для внесения изменений в базу данных. Если необходимо, объект может потребовать отката транзакции с помощью вызова метода setRollBackOnly() его контекста сессии.

afterCompletion () уведомляет объект о том, что текущая транзакция завершена. Аргумент completionStatus говорит о результате транзакции. Значение true говорит о том, что транзакции подтверждена (committed), false – что она откачена (rolled back).

Например, Контейнер вызывает метод afterBegin () после того, как клиент вызвал транзакционный бизнес-метод remote-интерфейса Компонента. Вызов бизнес-метода переводит объект в состояние "transaction ready". Через некоторое время, подтверждение транзакции приводит к вызову двух методов для объекта – сначала beforeCompletion (), а затем, если подтверждение успешно завершено, afterCompletion (true). В случае отката транзакции Контейнер вызывает метод объекта afterCompletion (false). (Обратите внимание, что в случае отката транзакции Контейнер не вызывает метод beforeCompletion ().) В любом случае, Компонент переходит в состояние "method ready".

Реализация session-Компонента

Класс session-Компонента (или его реализация) должен реализовать:

•      Интерфейс SessionBean

•      Методы, которые соответствуют методам home-интерфейса.

•      Методы, которые соответствуют методам remote-интерфейса.

Интерфейс SessionSynchronization (для Session-Компонентов с СМР).

Мы уже рассматривали типичную реализацию методов интерфейса SessionBean. См. рис. 6.1 "Цикл жизни stateful session-Компонента" на стр.6-2 и рис.6.2 "Цикл жизни stateless session-Компонента" на стр. 6-4.

Ноте-интерфейс объявляет один или несколько методов create (). Для каждого из них в классе Компонента должен быть объявлен и реализован соответствующий метод. При этом используется определенное соглашение об именах – имена должны быть одинаковыми, за исключением префикса "ejb", добавляемого к имени метода класса. Таким образом, в home-интерфейсе объявлены методы create (), а в классе Компонента – соответствующие им методы ejbCreate(). Число и типы аргументов должны быть одинаковыми. Методы ejbCreate() всегда имеют результат типа void, в то время как методы create () home-интерфейса всегда возвращают remote- интерфейс.

Сигнатура методов ejbCreate() выглядит так:

public void ejbCreate( <zero or more parameters> ) { 11 implementation

}

Для методов ejbCreate() не требуется задавать throws-список возможных исключений, хотя в нем могут быть возбуждены как специфические для приложения исключения, так и стандартные, такие, как javax.ejb.CreateException или javax.ejb.EJBException.

В классе Компонента должны быть реализованы те бизнес-методы, для которых в remote-интерфейсе объявлены соответствующие им методы. Сигнатуры бизнес-методов в классе и в remote-интерфейсе должны полностью совпадать. Контроль соответствия типов берет на себя Контейнер. Не существует формализованных отношений между классом Компонента и его remote-интерфейсом (например, использования "implements"). Обычно Контейнер проверяет соответствие типов в процессе поставки Компонента. Возможна и проверка на этапе разработки, если ее обеспечивают используемые инструментальные средства.

Для класса session-Компонента конструктор не нужен, и вы можете не создавать его. Все необходимые действия по инициализации Компонента выполняются методом ejbCreate().

В качестве иллюстрации рассмотрим класс session-Компонента CartBean, показанный в Примере Кода 6.3. Приведенный фрагмент содержит только часть кода; это сделано для того, чтобы сфокусировать ваше внимание на том, что обязательно должно быть сделано.

Пример Кода 6.3 Пример реализации session-Компонента

import java util

public class CartBean implements javax.ejb.SessionBean { // variables

private Vector items = new Vector();

private String cardHolderName, creditCardNumber;

// required methods

public void setSessionContext(javax.ejb.SessionContext sessionContext) {}

public void ejbCreate(String cardHolderName, String creditCardNumber, Date expirationDate) { cardHolderName = cardHolderName; creditCardNumber = creditCardNumber;

}

public void ejbRemove() {}

public void ejbActivate () {} public void ejbPassivate() {}

11 business methods

public void addltem(ltem item) {

System.out.println("\taddltem(" + item getTitle() + "): " + this);

items addElement(item);

}

public void removeltem(Item item) throws ItemNotFoundException { }

public float getTotalPrice () { }

public java.util.Enumeration getContents() { }

public void purchased }

}

Обратите внимание на то, что класс CartBean не имеет конструктора. Он содержит один метод ejbCreate (), который используется для инициализации нового экземпляра Компонента cart. Класс содержит декларации других обязательных методов – setSessionContext () , ejbRemove(), ejbActivate () и ejbPassivate (). Тем не менее, все эти методы класса CartBean ничего не делают.

Источник: Руководство программиста Enterprise JavaBeans

По теме:

  • Комментарии