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

JAVA. Серверные приложения

.pdf
Скачиваний:
0
Добавлен:
06.09.2026
Размер:
2 Мб
Скачать
Часть 4. Распределенные компненты EJB 211
жизненным циклом entity bean. Клиенты не имеют доступа к методам, описанным в каждом классе. Для управления Entity bean клиент ис­пользует методы home-, и remote-интерфейсов.
Home interface. Основной интерфейс определяет методы, использу­емые клиентом по созданию (create), нахождению (find) и удалению (remove) экземпляра entity bean. Как и в случае с remote-интерфей­сом, все аргументы и типы результата методов, объявленных в home­интерфейсе, должны соответствовать требованиям RMI-IIOP. Все ме­тоды должны содержать исключение java.rmi.RemoteException в своем throw-списке исключений. В home-интерфейсе должны быть объявле­ны один или несколько методов create(). Имя такого метода должно быть именно create, а его аргументы — как их число, так и типы — должны быть такими же, как аргументы метода ejbCreate() класса ре­ализации экземпляра EJB. Обратите внимание, что типы результата у соответствующих методов класса экземпляра и его home-интерфейса отличаются друг от друга. Home-интерфейс для Entity-EJB содержит также методы поиска (find-методы). Home-интерфейс Entity-EJB со­держит точно такие же методы create(), как и Session bean. В допол­нение к ним интерфейс определяет find-методы для поиска нужных экземпляров EJB с целью их последующего использования. Такие операции необходимы, так как экземпляры Entity bean являются «долгоживущими» объектами и могут использоваться многими клиен­тами. Для большинства приложений используемые в них Entity-bean уже существуют, и клиент просто должен найти нужный экземпляр для выполнения вызова. Home-интерфейс EJB должен обеспечивать базовый метод поиска, findByPrimaryKey (primaryKey), который слу­жит для поиска экземпляра EJB по значению его primary key. Метод имеет единственный аргумент, а в качестве результата возвращает remote-интерфейс экземпляра. В качестве primary key может исполь­зоваться любой тип Java, производный от Object. Разработчик поме­щает описание primary key в дескриптор. Обратите внимание, что ме­тод findByPrimaryKey () по определению возвращает только один объект, в то время как другие find-методы могут возвращать наборы объектов. Home-интерфейс может объявлять и другие методы поиска. Каждый такой метод должен быть реализован в классе экземпляра. Каждый finder-метод home-интерфейса EJB должен соответствовать следующим соглашениям:
1. Типом результата является либо remote-интерфейс EJB, либо, в случае соответствия сразу нескольких экземпляров EJB указанному критерию поиска, набор (collection) таких интерфейсов.
2. Корректными типами-наборами Java являются java.util. Enumera­tion (для JDK 1.1) и java.util.Collection (для Java 2).
3. Имя метода поиска всегда начинается с префикса find.
4. Соответствующий ему finder-метод в классе экземпляра должен начинаться с ejbFind.
5. Созданный метод ejbFind() должен объявлять возможность воз­буждения исключения java.rmi.RemoteException.
6. Созданный метод ejbFind() должен объявлять возможность воз­буждения исключения javax.ejb.FinderException.
212 Часть 4. Распределенные компненты EJB
7. Списки возможных исключений методов find() home-интерфейса и ejbFind() класса должны быть одинаковыми.
8. В дополнение к этому home-интерфейс Entity bean может объяв­лять один или несколько методов create(). Все эти методы возвращают remote-интерфейс экземпляра EJB. Список их аргументов определяется разработчиком приложения.
Методы create() home-интерфейса должны соответствовать следую-
щим правилам:
1. Все используемые методы create() должны объявлять возможность возбуждения исключения java.rmi.RemoteException.
2. Все используемые методы create() должны объявлять возможность возбуждения исключения javax.rmi.CreateException.
3. Все используемые методы create() возвращают remote-интерфейс EJB.
4. Имя метода — всегда create.
5. Каждому методу create() интерфейса должен соответствовать ме­тод ejbCreate() в основном классе EJB с тем же списком своих аргумен­тов.
6. Список возможных исключений метода create() интерфейса дол­жен включать в себя все исключения методов ejbCreate() и ejbPostCrea­te() основного класса EJB, т. е. список исключений метода.
7. Возвращаемым значением метода ejbCreate() всегда является объ­ект класса Primary Key.
8. Аргументы метода create() используются при инициализации ново­го экземпляра EJB.
Remote interface. Клиент использует home interface для получения доступа к бизнес-методам, реализованным в entity bean класс. Все ме­тоды remote-интерфейса должны быть объявлены как public и возбуж­дать исключение java.rmi.RemoteException. Кроме того, аргументы этих методов и возвращаемые ими результаты должны иметь типы, соответ­ствующие требованиям RMI. Должно быть обеспечено соответствие между методами класса экземпляра и методами его remote-интерфейса. Каждая пара методов должна иметь одно и то же имя, число и тип ар­гументов, тип результата и список возможных исключений.
Primary key class. В этом классе описаны одна или больше перемен­ных, определяющих экземпляр EJB. Здесь также реализованы методы для создания и манипулирования объектами primary key.
1. import java.rmi.RemoteExcepton;
2. import javax.ejb.*;
3. public class MyFirstBean implements javax.ejb.EntityBean{
4. public String name=null;
5. public int type=1;
6. public float Balance=0. 0 f;
7. public void setName(String name){sname=name;}
8. public float getBalance(){return Balance;}
9. public setBalance(float Balance) {someData=Bflanse;}// какой-то код}
Часть 4. Распределенные компненты EJB 213
Поскольку каждый EJB является распределенным объектом, то обя­зательно используются классы исключительных ситуаций, описываю­щие взаимодействие объектов. В случае с EJB большинство методов жизненного цикла генерируют вызов объекта класса java.rmi.RemoteEx­ception. Первые две строки указывают необходимые пакеты для созда­ния EJB. Самые интересные здесь строки2и3,гдеуказывается созда­ние Entity bean класса MyFirstBean с использованием интерфейса Enti­tyBean, находящегося в пакете javax.ejb. Строкис4по6определяют бизнес-переменные. А строки 7, 8, 9 описывают бизнес-методы. Основ­ным этапом создания Entity bean считается создание класса, реализую­щего интерфейс EntityBean.
Соглашение об именовании создаваемого enterprise bean поддержи­вает правила именования классов в Java плюс добавления в имени сло­ва Bean, т. е. MyFirst
Каждый entity bean класс должен иметь уровень доступа public, но не abstract и должен реализовывать интерфейс javax.ejb.EntityBean. Реализация данного интерфейса определяет основные методы и жиз­ненный цикл entity bean.
В Entity bean содержатся различные данные. Хранение важных дан­ных Entity bean доверяет базе данных. При создании Entity bean разра­ботчик должен определить, какие данные будут использоваться и где данные буду храниться. Также на этапе проектирования описываются методы обработки данных и способы синхронизации. Если проектиров­щик полностью удовлетворен способами, которые использует контей­нер, то можно опустить разработку с помощью Bean Managed Persisten­ce(BMP). Иcпользование BMP прекрасно подходит для создание Entity bean, работающих с базой данных, не поддерживаемой EJB сервером.
Bean.
31.7. Жизненный цикл Entity bean
Как и у всякого другого bean, жизнь Entity bean состоит из несколь­ких этапов. Начало «жизни EJB» — этап установки экземпляра Entity bean (рис. 4.4).
Так как Entity bean обычно является представлением информации в базе данных, его цикл жизни совпадает с циклом жизни самих дан­ных — Entity bean существует в течение долгого времени, обычно го­раздо дольше, чем клиентское приложение, которое его создало. Такие bean существуют не только после завершения сеанса связи или клиент­ского приложения, они существуют дольше, чем серверный процесс, в контексте которого они выполняются. Подобно данным в базе данных, Entity bean не разрушается в результате сбоя сервера с последующим его перезапуском.
В процессе существования entity bean может находиться в трех раз­личных состояниях:
1. Nonexistent. Экземпляр Entity bean не существует.
2. Pooled. Экземпляр Entity bean существует, но не сопоставлен ни с
какими конкретными данными (говорят, что он не имеет identity).
3. Ready. Экземпляр Entity-EJB сопоставлен с конкретными данными.
214 Часть 4. Распределенные компненты EJB
Рис. 4.4. Жизненный цикл Entity bean.
Начало началу — рознь. Entity bean начинает свою долгую жизнь, в отличие от session bean, с момента создания контейнером экземпляра Entity bean. Получить сведения о месте исполнения Entity bean помога­ет метод setEntityContext(). Этот метод извещает Entity bean о возмож­ностях, предоставляемых заново рожденному контейнером.
После рождения Entity bean помещается в специальное место — ро­оl. Пока экземпляр находится в пуле, контейнер вызывает только мето­ды find() и их аналогии.
Затем наступает состояние готовности. Используемые методы — cre­ate(). Затем контейнер вызывает метод setEntityContext() для передачи экземпляру ссылки на интерфейс EntityContext. Этот интерфейс обес­печивает возможность доступа к сервисам контейнера и позволяет эк­земплярам EJB получить информацию об их клиентах.
Сейчас экземпляр Entity-bean находится в состоянии Pooled. Для каждого типа Entity-bean создается свой собственный пул. Ни один из экземпляров, находящихся в пуле, не сопоставлен с конкретными дан­ными. Другими словами, они не имеют identity — ни одно из их полей не имеет установленных значений — и, следовательно, все они эквива­лентны. Контейнер может выбрать любой экземпляр для обслуживания клиента, который решил использовать такой EJB. Реализация контей­нера определяет, когда именно создавать экземпляры EJB и как много таких экземпляров следует поместить в пул.
Когда контейнер выбрал экземпляр для обслуживания запроса кли­ента, этот экземпляр переходит из состояния pooled в состояние ready. Контейнер вызывает Entity bean из пула, когда клиент нуждается в данных, описанных в созданном Entity bean. Обычно два события спо­собствуют перемещению Entity bean из пула в состояние готовности.
Первым событием является вызов клиентом метода ejbCreate(), опи­санного в home-интерфейсе Entity bean, после чего в базе данных появ­ляется новая запись. Результатом вызова методов ejbCreate()и ejbPost­Create() будет созданный новый экземпляр Entity bean.
Часть 4. Распределенные компненты EJB 215
Другим событием является вызов у существующего экземпляра Enti­ty bean методов find() и его аналогов. В этом случае контейнер вызыва­ет метод ejbActivate() для активизации экземпляра, чтобы он мог об­служивать вызовы конкретных клиентов. Обычно контейнер использует метод ejbActivate(), когда нет подходящих экземпляров в состоянии re­ady для обслуживания клиентских запросов.
Итак, состояние готовности (ready) достигнуто, теперь необходимо получить данные из базы данных. Для этой операции существуют спе­циальные методы ejbLoad() и ejbStore(), предназначенные для синхро­низации данных в различных источниках. Когда экземпляр находится в состоянии ready, он сопоставлен с конкретным Entity bean (например, с определенной записью в базе данных). Клиент может вызвать бизнес­методы этого Entity bean. Контейнер использует методы ejbLoad() и ejb­Store() для того, чтобы заставить экземпляр считывать или записывать свои данные. Все эти методы — бизнес-методы, ejbLoad() и ejbStore() — могут быть вызваны много раз, а могут и ни одного, в соответствии с ло­гикой клиентского приложения. Методы ejbLoad() и ejbStore() позволя­ют экземпляру выполнять синхронизацию его состояния с информацией в базе данных. Дальее клиент может вызывать бизнес-методы. После того как контейнер определит ненужность бизнес-методов, описанных в Entity bean, контейнер опять перемещает их в пул. Помещению в пул способствуют два события:
1. Контейнер использует метод ejbPassivate(), чтобы отделить этот экземпляр от данных без удаления Entity-объекта, т. е. собственно этих данных. Обычно контейнер выполняет деактивизацию при завершении транзакции. Тем не менее он может выполнить деактивизацию даже тогда, когда экземпляр EJB сопоставлен с транзакцией; в этом случае он сначала вызывает метод ejbStore(), чтобы экземпляр мог синхрони­зировать свое состояние с состоянием базы данных. Когда позднее про­исходит активизация экземпляра, контейнер автоматически вызывает метод ejbLoad(), чтобы опять-таки выполнить синхронизацию между экземпляром и базой данных.
2. Клиент вызывает метод remove(). При вызове вышеуказанного ме­тода в основной базе данных удаляются данные о Entity bean. Вызов этого метода происходит в ответ на вызов клиентским приложением ме­тода remove() home- или remote-интерфейса EJB. Контейнер удаляет как экземпляр EJB, так и сам Entity-объект (запись из базы данных).
Последний жизненный этап начинается с момента вызова контейне­ром метода UnsetEntityContext() Entity bean, находящегося в пуле. К счастью, удаление не стирает всю информацию, в базе данных оста­ются все записи, чтобы их можно было использовать при создании но­вого экземпляра Entity bean. В отличие от Session bean, с которыми со­поставлено значение тайм-аута (и для которых контейнер удаляет эк­земпляр bean при завершении периода тайм-аута), к Entity bean неприменимо понятие тайм-аута. Вне зависимости от того, как долго они остаются неактивными, контейнер не удаляет их из хранилища. Контейнер удаляет только экземпляры bean из самого контейнера. Единственный способ удалить Entity-bean — сделать это явно. Это мо­жет быть сделано с помощью вызова метода remove(), который удаляет
216 Часть 4. Распределенные компненты EJB
как экземпляр EJB, так и сопоставленную с ним информацию из базы данных, или с помощью средств DBMS (или других существующих приложений, не имеющих отношения к EJB).
Следует обратить внимание на то, что метод ejbCreate() имеет свои особенности при работе с Entity-EJB. Реализация Entity bean может во­обще не реализовывать метод ejbCreate(). Обычно это происходит, если Entity-bean создаются не по запросу клиента, а автоматически, напри­мер, при добавлении новых записей в базу данных. Типом возвращаемого значения для метода ejbCreate() является класс Primary Key EJB. Метод ejbCreate() для Entity bean c CMP должен возвращать void, для Entity bean разработанного с помощью BMP — класс Primary Key экземпляра.
Основные методы entity bean:
ejbActivate() — метод, активирующий состояние bean, вызываемое из контейнера. Данный метод подобен методам init() в servlet и applet, содержит любой код, который необходимо выполнить в момент актива­ции bean. Активация подразумевает помещение вызываемого bean в специальную область памяти для дальнейшей обработки;
ejbLoad() — загружает поля, отображенные в базе данных, т. е. при­сваивает постоянным переменным их эквивалентным значения из базы данных. Может содержать любой код, который должен быть выполнен при синхронизации данных. При использовании клиентом бизнес-мето­дов setXXX()/getXXX() контейнер читает данные из основной базы данных. При вызове одного из методов find() контейнер вызывает метод ejbLoad() для их инициализации;
ejbPassivate() — вызывается контейнером для деактивации bean. Как и другие методы, содержит код, выполняемый перед деактивацией be­an, т. е. выгрузкой bean из памяти; обычно это операции закрытия сое­динения с базой данных и прекращение работы с файлами. Если Entity bean не используется долгое время, контейнер производит операцию не используемого Entity bean во временное хранилище до того момента, пока клиент не вызовет один из бизнес-методов данного bean;
ejbRemove() — вызывается клиентом для удаления bean из контей­нера, а поля будут удалены из базы данных. Может вызывать исключе­ние javax.ejb. RemoveException, если контейнер не может в силу раз­личных причин удалить Entity bean;
setEntityContext() — устанавливает свойства среды выполнения be­an. Контейнер вызывает этот метод один раз при получении свойств Entity bean. Окружение Entity bean изменяется динамически, когда в контейнере происходит какое-то событие, такое, как добавление нового или удаление старого Entity bean и т. д.;
ejbStore() — необходим при синхронизации данных, находящихся в базе и полей. Метод ejbStore() используется для сохранения данных в основной базе;
unsetEntityContext() — вызывается контейнером для освобождения ресурсов, занятых bean, метод вызываться до удаления bean. Данный метод вызывается после вызова метода ejbRemove() по вполне объясни­мым причинам.
Entity bean класс должен определять переменные, с которыми будет работать bean. Entity bean класс должен реализовывать метод ejbCrea-
Часть 4. Распределенные компненты EJB 217
te(), для каждого метода ejbCreate() обязательно должен существовать метод ejbPostCreate() с теми же параметрами что и существующий ме­тод ejbCreate(). Если методов ejbCreate() несколько, то для каждого дол­жен существовать метод-близнец ejbPostCreate(). Методы ejbcreate() и ejbPostCreate() реализуются в home-интерфейсе Entity bean. Метод ej­bCreate() применяется для создания нового EJB. Метод ejbPostCreate() вызывается контейнером после выполнения метода ejbCreate(). Но в от­личие от своего предшественника, ejbPostCreate() не возвращает ника­ких значений. Метод ejbPostCreate() используется после создания эк­земпляра bean, но перед тем, как bean станет доступен клиенту. Подоб­но бизнес-методам, они не могут вызываться непосредственно клиентом. Для вызова используется объект EJBHome, посредством которого осу­ществляется доступ к методам ejbCreate() и ejbPostCreate(). При успешном выполнении методов EJBHome создает постоянные поля, ас­социированные с этими объектами, и затем помещает поля в базу дан­ных. Каждый метод ejbPostCreate() должен имеет уровень доступа pub­lic, не возвращать никакого значения, т. е. void, и иметь те же аргумен­ты, что и метод ejbCreate(). Если необходимо, то оба метода, ejbCreate() и ejbPostCreate(), могут вызывать исключения java.rmi.RemoteException и javax.ejb.CreateException.
Существует два типа полей (переменных) — стандартные перемен­ные, ничем не отличающиеся от обычных, и постоянные переменные, которые не могут быть константами и иметь уровень доступа final. Они также не могут иметь уровень доступа static. Все постоянные перемен­ные должны иметь уровень доступа public, постоянные поля — храни­ться в базе данных. Временные поля не могут храниться в базе данных, они должны использоваться с осторожностью и не использоваться для взаимодействия методов. Существуют определенные правила именова­ния временных полей entity beans, отвечающие правилам для использо­вания в CORBA IDL. Во-первых, в имени полей допустимо использова­ние только символов Latin-1, т. е. обычной латиницы, имя переменной не должно начинаться с символа подчеркивания ( _ ), также оно не мо­жет содержать знак доллара ($) и не должно быть ни одним из зарезер­вированных слов, используемых в CORBA. Поля обязательно должны называться по-разному, непозволительно употребление в одном классе полей (переменных) с одинаковыми именами, myfieldsample и Myfiled­sample, и подобные вариации нельзя использовать в одном классе. По­дробнее об именовании CORBA-объектов можно узнать из руководств по программированию CORBA-объектов. Поля не могут быть массивами объектов EJBObject или EJBHome, они также не могут порождаться от класса javax.ejb.Handle. Строковые массивы полей не должны содер­жать значений null в момент выполнения.
1. import java.rmi.RemoteExcepton;
2. import javax.ejb.*;
3. public class MyFirstBean implements EntityBean{
4. public String name=null;
5. public int type=1;
6. public float Balance=0. 0 f;
218 Часть 4. Распределенные компненты EJB
7. public void ejbCreate (String name){}
8. public void ejbPostCreate (String name) throws RemoteException {}
9. public void ejbCreate(somename, 2, 0. 0f)}
10. public void ejbCreate(String name, int type, float Balanse) throws Remote-
Exception{}
На то, что созданный bean является Entity bean, указывает 3-я стро­ка примера, класс MyFirstBean реализует интерфейс Entity Bean. Далее создаются три поля — строки 4, 5, 6. Основные методы создания Entity bean, ejbCreate() ejbPostCreate() распределены по парам — строки 7, 8 и другая пара методов создания — строки 9, 10. Вызов методов созда­ния ejbCreate() подобен обычным вызовам конструкторов классов.
Основная задача клиента — получить доступ к бизнес-методам и пе­ременным. Для выполнения этой задачи контейнер должен создать эк­земпляр bean. Операция создания bean выполняется при помощи мето­да сreate().
Метод сreate() — предназначен для создания экземпляра bean и ас­соцированием полей (переменных) bean с данными, хранящимися в основной базе данных. Метод должен называться сreate(), иметь не­сколько аргументов, таких же, как у ejbCreate(), и вызывать исключи­тельные ситуации java.rmi.RemoteException и javax.ejb.CreateException.
Создание метода find() предназначено для поиска объекта класса EJ­BHome. Каждый метод find() должен именоваться как findName, где окончание Name описывает искомый параметр. Как минимум в каждом home-интерфейсе должен быть хотя бы один метод findByPrimary­Key(), имеющий один аргумент класса primary key и возвращающий значение объекта remote-интерфейс. Другие методы find() должны от­вечать следующим требованиям: возвращать объекты remote interface или коллекцию объектов java.util.Enumeration, если возвращается не­сколько объектов, и вызывать исключения java.rmi.RemoteException и javax.ejb. FinderException.
Каждый entity bean должен содержать хотя бы один find() метод. Ничто не запрещает добавить собственные поисковые методы.
Каждый EJB-сервер использует findByPrimaryKey() метод, содер­жащий код для поиска в базе данных. Для каждого добавочного find() метода, определенного в home interface, должна быть реализована логи­ка поиска элементов. Спецификация EJB не определяет логику поиска.
Entity bean класс может реализовывать remote interfase, но это не рекомендуется. Если ситуация требует использования remote interface, необходимо использование переменой в методе с ключевым словом this.
Home interface — описывает методы, необходимые клиенту для со­здания, манипулирования, удаления bean. Контейнер организует доступ клиента ejb, используя технологию java naming and directory Interfa­ce(JNDI). Данная технология предназначена для именования объектов по универсальным правилам, позволяя глобально идентифицировать объект независимо от специфики именования для каждой платформы. По принятому соглашению home interface получает имя bean, в котором реализован с добавлением окончания Home — MyBeanHome. Каждый home interface должен соответствовать следующим требованиям:
Часть 4. Распределенные компненты EJB 219
Реализовывать javax.ejb.EJBHome interface, наследуя его методы.
Параметры и возвращаемые значения для каждого метода определя­емые в home interface, должны быть валидными для использования с Java RMI, при этом каждый метод может генерировать вызов исключи­тельной ситуации java.rmi.RemoteException:
1. import java.rmi.*;
2. import java.util.*;
3. import javax.ejb.*;
4. public interface AccountHome extends EJBHome{
5. Account create (int AcountId) throws CreateException, RemoteException ;{}
6. Account findByPrimaryKey(int AccountID) throws FinderException, Remo-
teException;{}
7. Enumeration findLargeAcconts(int AccountId) throws FinderException, Re-
moteException; {} }
Remote Interface — описывает бизнес-методы, доступные в bean, ме­тоды удаления экземпляра bean, обработчик объектов, primary key.
По соглашению remote interface имеет имя Name, указывающие на ejb, для которого реализован remote interface.
Каждый remote intеrface должен отвечать следующим требованиям:
должен наследовать интерфейс javax.ejb.EJBObjects, используя
часть его методов;
должен определять взаимные методы для каждого бизнес-метода, используемого в ejb классе;
параметры и возвращаемые значения каждого метода должны быть правильными при использовании java rmi.Remote intreface и
вызывать исключения java rmi.RemoteException. Рассмотрим Primary key класс. В контейнере каждый entity bean имеет уникальный идентификатор,
определяющий использование комбинации имени home intrface и pri­mary key. Если два объекта имеют одинаковый идентификатор, то они идентичны. Primary key класс находится в EJBObject. По соглашению имя primary key содержит приставку Name и слово Key, NameKey, где Name — имя enterprise bean, например, MyBeanKey. Primary key класс используется для создания и управления объектом primary key в EJB. Этот класс должен соответствовать следующим требованиям:
иметь public уровень доступа, а также быть серилизованным объ-
ектом;
переменные должны иметь уровень доступа public;
обязательно должен иметься конструктор, тоже с уровнем доступа
public.
31.8. Основные EJB Session bean
Session bean подобен entity bean с некоторыми различиями: во-пер-
вых, session bean не имеет primary key класс, и в home interface не определяется ни один метод find(). Session bean используется клиентом
220 Часть 4. Распределенные компненты EJB
только во время сессии и после уничтожается. Поскольку данные sessi­on bean не сохраняются, в нем не определены методы по загрузке и вы­грузке данных. Все данные касаются только пользовательской сессии.
Основные части, из которых состоит sesion bean: Bean class. — Этот класс содержит данные, ассоциированные с sessi-
on bean, и методы, описанные разработчиком для доступа к этим дан­ным. Здесь также описываются методы, используемые контейнером для управления жизненным циклом session bean. EJB-клиент — обычно другой EJB или пользовательское приложение не имеет доступа к объ­ектам этого класса. Для доступа к данным используются методы home­и remote-интерфейсов.
Home interface. — Основной интерфейс определяет методы, исполь-
зуемые клиентом по созданию (create), и удалению (remove) экземпля­ра session bean. Home-интерфейс session bean порожден от интерфейса javax.ejb.EJBHome в виде объекта EJBHome и содержит единственный метод create(). Метод create() не имеет аргументов и может возбуждать два типа исключений — RemoteException и CreateException. Помните, что клиент не вызывает методы экземпляра session bean непосредст­венно; вместо этого клиент вызывает методы remote-интерфейса. State­full session bean может поддерживать определенное состояние, а это значит, что он может предоставлять клиенту несколько методов для со­здания собственных экземпляров и требовать передачи некоторых па­раметров для выполнения инициализации экземпляра. Stateless Session bean может иметь только один метод create(), причем без аргументов. Метод remove(), который удаляет экземпляр из пула, унаследован от интерфейса javax.ejb.EJBHome, и от программиста не требуется объяв­лять его в интерфейсе home. Home-интерфейс выступает в роли созда­теля экземпляров EJB, поскольку он содержит один или несколько ме­тодов create().
Спецификация EJB определяет следующие соглашения для каждого
метода create():
1. Метод create() возвращает значение remote-интерфейс для своего
экземпляра.
2. Имя метода — всегда create.
3. Каждый метод create() должен соответствовать методу ejbCreate в
основном классе созданного EJB. Эти методы должны иметь одно и то же число аргументов одинаковых типов.
4. Метод create() должен объявлять возможность возбуждения иск-
лючения java.rmi.RemoteException, а также возможность возбуждения исключения javax.ejb.CreateException.
5. Аргументы метода create() используются для инициализации ново-
го экземпляра EJB.
Обратите внимание, что home-интерфейс Session-EJB не содержит
методов для поиска объектов, поскольку такой объект может быть ис­пользован только создавшим его клиентом. Другие клиенты не могут получить к нему доступ и, следовательно, не нуждаются в средствах поиска.
Remote interface. — Клиент использует remote интерфейс для полу-
чения доступа к бизнес-методам, реализованным в bean классе. Этот