Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

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

.pdf
Скачиваний:
38
Добавлен:
24.05.2014
Размер:
1.45 Mб
Скачать

 

 

 

 û ï î ë í å í è å ç à ê ó ï ê è

Пример Кода 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

Ï ð è ë î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

Cart êàê JNDI-èìÿ. JNDI не использует строки в качестве имен. Он использует так называемые "naming names" Java. Простейшим способом преобразования строки в naming name Java является создание объекта типа javax.naming.CompositeName, что и сделано в

à å í å ð à ö è ÿ Ä å ñ ê ð è ï ò î ð à Ï î ñ ò à â ê è

Компонентом; для 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