![](/user_photo/1438_p9ksI.png)
Руководство программиста Enterprise JavaBeans
.pdf
|
|
|
 û ï î ë í å í è å ç à ê ó ï ê è |
Пример Кода A.9 |
Выходная информация 7 для Контейнера |
||
*sc* user |
received request: CORBA::Object.removeItem |
||
*st* prepare context READY --[method:removeItem]--> READY |
|||
Invoking method |
void CartBean.removeItem(Item=Book@317ed1) |
||
caller identity |
null |
|
|
run as identity |
null |
|
|
transaction attribute |
TX_NOT_SUPPORTED |
||
transaction status |
StatusNoTransaction |
||
removeItem(The Art of Computer Programming): |
|||
CartBean[name=Jack B. Quick] |
|
||
completed |
CartBean.removeItem() |
||
*st* commit context READY --[method:removeItem]--> READY |
|||
*sc* user |
received request: CORBA::Object.addItem |
||
*st* prepare context READY --[method:addItem]--> READY |
|||
Invoking method |
void CartBean.addItem(Item=Book@318040) |
||
caller identity |
null |
|
|
run as identity |
null |
|
|
transaction attribute |
TX_NOT_SUPPORTED |
||
transaction status |
StatusNoTransaction |
||
addItem(Programming with VisiBroker): CartBean[name=Jack B. |
|||
Quick] |
|
|
|
completed |
CartBean.addItem() |
||
*st* commit context READY --[method:addItem]--> READY |
|||
*sc* user |
received request: CORBA::Object._get_contents |
||
*st* prepare context READY --[method:getContents]--> READY |
|||
Invoking method |
java.util.Enumeration CartBean.getContents() |
||
caller identity |
null |
|
|
run as identity |
null |
|
|
transaction attribute |
TX_NOT_SUPPORTED |
||
transaction status |
StatusNoTransaction |
||
getContents(): CartBean[name=Jack B. Quick] |
|||
result |
|
|
|
java.util.Enumeration=com.inprise.ejb.util.VectorEnumeration@318243 |
|||
CartBean.getContents() |
|
|
|
*st* commit context READY --[method:getContents]--> READY |
|||
*sc* user |
received request: CORBA::Object._get_totalPrice |
||
*st* prepare context READY --[method:getTotalPrice]--> READY |
|||
Invoking method |
float CartBean.getTotalPrice() |
||
caller identity |
null |
|
|
run as identity |
null |
|
|
transaction attribute |
TX_NOT_SUPPORTED |
||
transaction status |
StatusNoTransaction |
||
getTotalPrice(): CartBean[name=Jack B. Quick] |
|||
result |
|
float=56.96 CartBean.getTotalPrice() |
|
*st* commit context READY -- |
[method:getTotalPrice]--> READY |
À í à ë è ç ð å ç ó ë ü ò à ò î â ï ð è ì å ð à c a r t |
A-9 |
 û ï î ë í å í è å ç à ê ó ï ê è |
|
|
|
|
*sc* user |
received request: CORBA::Object.purchase |
|||
*st* prepare context READY --[method:purchase]--> READY |
||||
*tx* Dispatcher.invoke: tx.begin(serverTransaction) |
||||
*sc* user |
sending request: CosTransactions::TransactionFactory._is_a |
|||
*sc* user |
received request: CORBA::Object._is_a |
|||
*tx* Dispatcher.invoke: tx.register_synchronization() |
||||
*st* commit context READY --[afterBegin:afterBegin]--> TX_READY |
||||
Invoking method |
|
void CartBean.purchase() |
||
caller identity |
null |
|
||
run as identity |
null |
|
||
transaction attribute |
TX_REQUIRED |
|
||
transaction status |
StatusActive |
|
||
purchase(): CartBean[name=Jack B. Quick] |
||||
call threw exception |
CartBean.purchase() |
|||
*tx* Dispatcher.invoke: tx.rollback(serverTransaction) |
||||
*st* commit context TX_READY -- |
|
|||
[afterCompletionRollback:afterCompletion]--> READY |
||||
*st* commit context READY --[method:purchase]--> READY |
||||
*sc* user |
received request: CORBA::Object.remove |
|||
*st* prepare context READY --[remove:ejbRemove]--> BEFORE_FINALIZE |
||||
Invoking method |
|
void CartBean.ejbRemove() |
||
caller identity |
null |
|
||
run as identity |
null |
|
||
transaction attribute |
TX_NOT_SUPPORTED |
|
||
transaction status |
StatusNoTransaction |
|||
completed |
|
CartBean.ejbRemove() |
||
*st* commit context READY --[remove:ejbRemove]--> BEFORE_FINALIZE |
||||
|
|
EJB Container Statistics |
|
|
|
|
======================== |
|
|
|
|
Time |
|
Fri Mar 19 10:29:46 PST 1999 |
|
|
Memory (used) |
656 Kb (max 656 Kb) |
|
|
|
Memory (total) |
1023 Kb (max 1023 Kb) |
|
|
|
Memory (free) |
35.0% |
|
|
|
------------------------ |
|
|
|
|
Home |
|
cart |
|
|
BEFORE_FINALIZE |
1 |
|
|
|
Total created |
1 |
|
|
|
Total active |
1 |
|
|
|
======================== |
|
Вывод для Контейнера показывет, что клиент выполнил обращ ение к методу purchase(). Напоминаем, что атрибуты в Дескрипторе Постав ки требуют выполнения этого метода в контексте транзакции. Клиент явно не начал транзакцию. Тогда транзакцию начал Контейне р, и он же обратился к regiter_synchronization() после того, как он вызвал метод afterBegin(). Затем он вызвал метод purchase() Компонента CartBean. В соответствие с требованиями спецификации Sun EJB, транзакция
A-10 |
Ð ó ê î â î ä ñ ò â î Ï ð î ã ð à ì ì è ñ ò à E n t e r p r i s e J a v a B e a n s |
 û ï î ë í å í è å ç à ê ó ï ê è
откатывается, если Компонент возбудил исключительную си туацию в коде транзакционного метода. Транзакция откатывается, по сле чего вызывается метод afterCompletion(). Выполнение метода purchase() завершено.
Посмотрим теперь, что при удалении происходит на стороне клиента.
Пример Кода A.10 Выходная информация 4 для клиента
*sc* user sending request: Cart.remove
À í à ë è ç ð å ç ó ë ü ò à ò î â ï ð è ì å ð à c a r t |
A-11 |
Ð ó ê î â î ä ñ ò â î |
Ï ð î ã ð à ì ì è ñ ò à |
E n t e r p r i s e |
J a v a B e a n s |
![](/html/1438/356/html_DBXvVmMqxH.EYF2/htmlconvd-d3Wn_5185x1.jpg)
Ï ð è ë îBæ å í è å
Поддержка EJB 1.0
Генерация Дескриптора Поставки
Класс GenerateDescriptors генерирует Дескриптор Поставки EJB 1.0. Дескрипторы Поставки - это объекты языка Java, свойства котор ых описывают, как нужно поставить (deploy) конкретную программу, написанную на Java. Например, свойство может описывать, как ну жно запустить программу на выполнение или как зарегистриров ать ее имя в службе имен (naming service). В EJB 1.0 Дескриптор Поставки хранится в файле в сериализованном виде. Процесс построен ия приложения включает в себя помещение файла, содержащего сериализованный Дескриптор Поставки, в jar-файл.
Этот класс создает выходной файл, устанавливает свойства Дескриптора, а затем выполняет его запись в файл как стандартную проце дуру сериализации Java. Давайте сначала ознакомимся с функцией main() этого класса (Пример Кода 11.1). Функция создает файл с именем cart.ser, для работы с которым создается объект типа "поток вывод а". Для вывода класса Java в поток используется стандартный класс ObjectOutputStream. Затем происходит обращение к методу createDescriptor(), который создает Дескриптор Поставки и записывает его в файл cart.ser. См. Пример Кода 11.2.
Пример Кода B.1 Функция main() класса GenerateDescriptors
public static void main(String[] args) throws Exception { ObjectOutputStream objectOutput =
new ObjectOutputStream(new FileOutputStream("cart.ser")); objectOutput.writeObject(createDescriptor());
}
При создании Дескриптора Поставки метод createDescriptor() инициализирует session-Дескриптор (так как CartBean является Session-
Ï î ä ä å ð æ ê à E J B 1 . 0 |
B-1 |
à å í å ð à ö è ÿ Ä å ñ ê ð è ï ò î ð à Ï î ñ ò à â ê è
Компонентом; для Entity-Компонента была бы выполнена инициализация entity-Дескриптора) и устанавливает следующие его свойства:.
. CartBean как имя класса реализации Компонента.
. CartHome как имя home-интерфейса.
. Cart как имя remote-интерфейса.
.нашем примере.
STATEFUL_SESSION как тип состояния Компонента CartBean. Это
выполняется с помощью вызова функции setStateManagementType(). (Для stateless Session-Компонента использовалось бы значение STATELESS_SESSION). Это также устанавливает режим транзакций
. для Компонента EJB.
Атрибуты транзакций. С CartBean сопоставлен атрибут TX_NOT_SUPPORTED. Метод purchase() получает атрибут
. TX_REQUIRES.
0 как величину тайм-аута сеанса связи. Эта величина являетс я настраиваемым значением, которая влияет на цикл жизни Компонента. Существуют два фактора, которые управляют цик лом жизни. Session-Компонента:
Явные команды клиента. Как правило, клиент создает Компон ент,
.использует его, а затем уничтожает.
Величина тайм-аута, если она задана. Если она задана, то Кон тейнер может самостоятельно уничтожить Компонент, если в течени е определенного периода времени клиент к нему не обращался . В нашем примере величина тайм-аута в Дескрипторе Поставки установлена равной 0. Нулевое значение означает, что интер вал тайм-аута не установлен и Контейнер не удалит объект, если клиент забыл это сделать. Если же установить величину тай м-аута равной 100, то если в течение 100 секунд клиент не будет обращаться к Компоненту, Контейнер его уничтожит.
Пример Кода B.2 Установка свойств Дескриптора
public class GenerateDescriptors {
static DeploymentDescriptor createDescriptor() throws Exception { SessionDescriptor d = new SessionDescriptor(); d.setEnterpriseBeanClassName("CartBean"); d.setHomeInterfaceClassName("CartHome"); d.setRemoteInterfaceClassName("Cart");
d.setBeanHomeName(new javax.naming.CompositeName("cart")); d.setSessionTimeout(0);
B - 2 |
Ð ó ê î â î ä ñ ò â î Ï ð î ã ð à ì ì è ñ ò à E n t e r p r i s e J a v a B e a n s |
à å í å ð à ö è ÿ Ä å ñ ê ð è ï ò î ð à Ï î ñ ò à â ê è
d.setStateManagementType(d.STATEFUL_SESSION); { // set the default control descriptor
ControlDescriptor defaultControl = new ControlDescriptor(null); DefaultControl.setTransactionAttribute
(ControlDescriptor.TX_NOT_SUPPORTED);
// set the transaction mode on purchase to TX_REQUIRES ControlDescriptor purchaseControl =
new ControlDescriptor(CartBean.class.getMethod("purchase", null));
purchaseControl.setTransactionAttribute (ControlDescriptor.TX_REQUIRED);
ControlDescriptor[] controls = { defaultControl, purchaseControl };
d.setControlDescriptors(controls);
}
return d;
}
Ï î ä ä å ð æ ê à E J B 1 . 0 |
B-3 |