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

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

.pdf
Скачиваний:
0
Добавлен:
06.09.2026
Размер:
2 Мб
Скачать
Часть 4. Распределенные компненты EJB 201
не предназначены для считывания данных с клавиатуры и использова­ния AWT-библиотеки для отображения информации. На сетевом уровне Enterprise bean запрещено работать с сокетами. На системном уровне проектирования EJB отсутствует возможность использования библио­тек, созданных на других языках программирования.
Различные Application Server имеют встроенные контейнеры для различных типов EJB. В большинстве случаев количество контейнеров не является столь важным, как возможность работы контейнера раз­личными способами. Фирма SUN в своей спецификации указывает один общий контейнер для всех Enterprise Bean. Именно это решение и при­сутствует в распространяемом сервере приложений J2EE. Компания IBM поставляет свои WEBSphere Application Server в различных кон­фигурациях, как с одним, так и с двумя контейнерами. Различий в со­здании EJB для одно- и многоконтейнерных версий не существует. Дру­гие компании наделяют свои контейнеры способностью к клонированию по вызову или при установке. Любой подход имеет право на жизнь, и преимущества каждого подхода видны только при конкретном исполь­зовании в правильно спроектированном приложении.
Среда выполнения организует программные возможности исполне­ния EJB. Кроме самих EJB, в этой среде могут размещаться другие Ja­va EJB, такие, как servlet и JSP.
30.2. Источник данных
Источником данных необязательно является СУБД, он может быть плоским файлом или любым другим приложением. Спецификация EJB не требует, чтобы источником данных обязательно была СУБД. Enterp­rise bean для организации доступа к различным источникам должны использовать различные методы. Поскольку EJB представляют бизнес­логику приложения, использование источника данных в виде СУБД имеет ряд преимуществ. Во-первых, создание приложения, использую­щего базу данных, достаточно простой процесс. Во-вторых, применение SQL в программе облегчает работу с СУБД, данные не надо хранить в самом приложении, ответственность за целостность данных полностью лежит на СУБД. В-третьих, данные, хранимые в СУБД, могут одновре­менно использовать несколько клиентов. Каждый контейнер использует собственные источники данных. Каждый производитель сервера прило­жений, соответствующего стандарту J2EE, предлагает для своих кон­тейнеров различные источники данных. Фирма SUN поставляет свой пакет с базой данных фирмы Cloudscape, а компания IBM интегрирует свой WEBSphere Application Server с DB2, Oracle и Sybase. Кроме это­го, двухконтейнерная версия WEBSphere Application Server поддержи­вает стандартные средства компании IBM — IBM CICS, IBM IMS и IBM MQSeries. Другие производители могут использовать другие источники данных, поддерживающие стандарт ODBC.
Если возможностей СУБД не хватает или необходимо использовать другой источник, EJB должны разрабатываться с помощью контейнер­независимого способа BMP.
202 Часть 4. Распределенные компненты EJB
В спецификации 1.1 точно не определено, какой тип базы данных должно использовать EJB-приложение. Два основных типа enterprise bean имеют доступ к базе данных, но если Entity bean сам по себе явля­ется отражением данных, хранящихся в СУБД, то session bean является отражением клиентской сессии, однако это обстоятельство не запреща­ет использовать SQL-операторы в теле session bean:
1. Если приложение достаточно простое и не производит значитель-
ных транзакций.
2. Если возвращаемые SQL-оператором данные не используются в
многоклиентской сессии.
3. Если данные не представляют деловой объект.
Доступ к базе данных из Entity bean возможен при следующих усло­виях:
1. Более чем один клиент использует данные.
2. Данные описывают бизнес-логику приложения.
3. Для скрытия информации об используемой базе данных в session bean прописываются все параметры доступа (что не есть хорошо, в en­tity bean данные берутся из самой базы).
Стандартным интерфейсом доступа к базе данных является JDBC­версии 1.0 или 2.0, в зависимости от типа драйвера доступа к базе дан­ных. Новые версии контейнеров EJB реализуют интерфейс DataSource JDBC 2.0. Это означает, что EJB может использовать интерфейс javax.sql.DataSource, а не javax.sql.DriverManager, хотя интерфейс Dri­verManager все еще поддерживается для совместимости с предыдущи­ми версиями. Рекомендуется использовать интерфейс DataSource вследствие более высокой его производительности. Работа с этим интер­фейсом не требует наличия драйверов JDBC 2.x; приложение может ис­пользовать существующие драйвера JDBC 1.x. Кроме того, при замене драйверов JDBC 1.x на JDBC 2.x в приложение не требуется вносить никаких изменений.
Новая спецификация доступа SQLJ применяется достаточно редко в связи с неопределенностью некоторых основных производителей СУБД о поддержке данной технологи, а также реализацией доступа различ­ными серверами приложений. Пулы доступа к базам данных могут на­ходиться в адресном пространстве того же процесса, в котором испол­няется контейнер EJB или, с целью повышения производительности, выполняется как отдельный поток.
30.3. Типы клиентов
В спецификации EJB описаны два вида клиентов, способных рабо­тать с методами, предоставляемыми EJB:
— HTTP-клиент взаимодействует с EJB-сервером, используя HTTP­протокол и другие Java EJB, servlets или JavaServer Pages (JSP), пару applet-servlet;
— RMI-клиент описывает взаимодействие Java-приложений с EJB­сервером при посредничестве протокола Java вызова удаленных ме-
Часть 4. Распределенные компненты EJB 203
тодов (RMI)-используемого поверх Internet Inter-ORB Protocol (RMI/IIOP).
К счастью, различия между использованием этих двух протоколов минимальны с точки зрения программирования EJB.
Оба типа клиентов используют сервис транзакций, основанный на JTA-спецификации.
Клиентом EJB является независимое (stand-alone) приложение — servlet или апплет — или другой EJB. В любом случае для использова­ния EJB клиент должен выполнить следующие действия:
1. Получить доступ к home-интерфейсу EJB. Спецификация EJB го­ворит, что для получения ссылки на интерфейс клиенту следует ис­пользовать JNDI (Java Naming and Directory Interface) API.
2. Получить ссылку на remote-интерфейс EJB. Для этого использу­ются методы home-интерфейса. Можно либо создать Session-bean, либо создать или найти Entity bean.
3. Вызвать те или иные методы, доступные методы EJB. Клиент не может обращаться непосредственно к методам собственно EJB. Вместо этого он вызывает методы его remote-интерфейса. Это те методы, кото­рые EJB объявляет доступными для клиента.
Каждый EJB-клиент, использующий http-протокол для доступа к
enterprise bean, использует два уровня безопасности:
а. Первый предоставляется Web-сервером, например, при исполь­зовании https-протокола. б. Другой обеспечивается EJB-контейнером.
Клиенты EJB, представляющие Java-приложения, использующие протокол RMI, используют только второй уровень, предоставляемый EJB-контейнером.
Оба типа EJB-клиентов используют стандартный JTA-интерфейс для обеспечения транзакций.
Кроме стандартных типов клиентов, EJB-сервер поддерживает рабо­ту с Microsoft ActiveX EJBми, CORBA объектами написанных на Java, CORBA-объектами, написанными на C++.
30.4. Интерфейс управления
Интерфейс управления предназначен для возможности манипулиро­вания системным окружением EJB-сервера. Обычно под интерфейсом управления понимается системная консоль администратора. Больше об интерфейсе управления конкретного EJB-сервера можно узнать из до­кументации, поставляемой на Application Server.
Большинство коммерческих продуктов, основанных на EJB-техноло­гии, предлагают графические средства управления EJB-контейнером. Вместе с тем полного отказа от использования командной строки не произошло, и еще можно встретить EJB-серверы, управляемые руко­творным вводом.
Независимо от используемого интерфейса управления, графического интерфейса или командной строки, основными характеристиками сер­вера можно считать все сервисы, предоставляемые EJB-сервером.
204 Часть 4. Распределенные компненты EJB
Используемая база данных, тип менеджера транзакции, способы ре­ализации транзакций, способы обеспечения безопасности — внешние сервисы, настраиваемые с помощью интерфейса управления. Именно через интерфейс управления определяется количество используемых EJB-контейнеров, а также ряд важных характеристик, присущих EJB­контейнерам.
Основными параметрами EJB-контейнеров являются параметры, описывающие работу с памятью, точнее, работу с системным кэшем. Для каждой конкретной версии EJB-контейнера описываются собствен­ные параметры настройки.
Если предполагается использование средства разработки сторонних разработчиков относительно сервера приложений, для предотвращения различного рода ошибок используйте при работе с EJB только те сред­ства взаимодействия с EJB-контейнерами, которые входят в состав это­го средства. Следует также убедиться в том, что инструмент поддержи­вает правильные версии спецификации EJB и API EJB. Также необхо­димо убедиться, что установлена верная версия JDK.
30.5. Общие принципы работы EJB-технологии
Все описанные выше EJB-архитектуры предназначены для одной цели, — создания распределенного приложения, используемого в e­commerсe.
На первом этапе HTML-страница, показанная в Web-браузере кли­ента, организует доступ к Web-контейнеру, содержащему servlet или JSP. После формирования объекта request Web-компонент servlet или JSP перенаправляет объект request в EJB-контейнер. Контейнер EJB создает экземпляр session bean home-интерфейса, вызывая методы cre­ate() или findByPrimaryKey(). Созданный session bean ассоциируется с пользовательским запросом, объектом request. Метод create() возвраща­ет значение remote-интерфейса созданного bean. Клиентский запрос осуществляет размещение или поиск уже существующего EJB с помо­щью home-интерфейса. Использование поисковых и отправляемых дан­ных Web-клиентом вызывает бизнес-методы, описанные в remote-ин-
Ðèñ. 4.2.
Часть 4. Распределенные компненты EJB 205
терфейсе session bean. Прежде чем вызвать бизнес-методы, описанные в EJB-remote-интерфейсе, клиент должен создать или найти необходи­мый объект. Использование JNDI помогает системе найти нужный объ­ект. EJB-клиент вызывает session bean и ассоциированный с ним Entity bean (рис. 4.2).
Глава 31. Основные Enterprise Java Bean, Entity bean и Session bean
При разработке EJB создаются два типа компонентов, методы биз­нес-логики и системные методы самого EJB. Сам EJB представляет со­бой несколько классов, особенных для каждого EJB и два интерфей­са — remote и home. Основной Bеаn — Entity bean — является объек­том, свойства которого описаны в базе данных. Доступ к Entity bean могут осуществлять через методы, описанные в интерфейсе, несколько клиентов, одновременно работающих с данными, предоставляемыми Entity bean. Session bean, в отличие от Entity bean, ассоциирован только с одиночной, пользовательской сессией. Все рабочие данные session be­an, удаляются после окончания пользовательской сессии.
Для всех размещаемых в контейнере Enterprise Bean соблюдаются определенные правила. Во-первых, каждый EJB обязательно содержит описание двух интерфейсов — home и remote и одного основного клас­са. Во-вторых, каждый создаваемый EJB должен наследоваться от кон­кретного интерфейса. Основной класс entity bean наследует интерфейс javax.ejb.EntityBean, а session bean — javax.ejb. SessionBean.
Каждый домашний интерфейс — home и remote — основного EJB наследуется от специфических интерфейсов, javax.ejb.EJBHome и ja­vax.ejb.EJBObject соответственно (рис. 4.3).
Ðèñ. 4.3.
31.1. Home-интерфейс
Интерфейс home содержит методы для создания, поиска и уничтоже­ния EJB. Для различных типов EJB home-интерфейс описывается по­разному. Home-интерфейс для Session bean (stateless) значительно про­ще, поскольку содержит только один метод create() без аргументов. У En-
206 Часть 4. Распределенные компненты EJB
tity bean, кроме основных методов установки, create() и remove(), описы­вается дополнительный метод поиска существующего экземпляра find­ByPrimaryKey(). В теле home-интерфейса session bean (statefull) может содержаться несколько методов create(), с различными аргументами:
import javax.ejb.*;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.*;
public interface SampleHome extends javax.ejb.EJBHome {;
Remote_object create() throws java.rmi.RemoteException, javax.ejb.CreateEx-
ception;}
Циклы жизни Session- и Entity-компонентов отличаются друг от друга. Жизненные циклы каждого EJB описаны ниже в этой главе. Сле­довательно, их home-интерфейсы содержат различные методы. Разра­ботчик обязан объявить home-интерфейс, но за его реализацию отвеча­ет контейнер EJB. Как и в случае с remote-интерфейсом, все аргументы и типы результата методов, объявленных в home-интерфейсе, должны соответствовать требованиям RMI-IIOP. Все методы должны содержать исключение java.rmi.RemoteException в своем throw-списке исключе­ний. В home-интерфейсе должны быть объявлены один или несколько методов create(). Имя такого метода должно быть именно create, а его аргументы — как их число, так и типы — должны быть такими же, как аргументы метода ejbCreate() класса реализации EJB. Родительский ин­терфейс javax.ejb.EJBHome содержит описание трех методов жизненно­го цикла EJB. Предусмотрены два варианта метода удаления remove() экземпляра EJB из контейнера. Первый из них удаляет экземпляр EJB по его идентификатору (handle), второй — по значению primary key En­tity bean. Handle EJB представляет собой его уникальный идентифика­тор; для него может быть выполнена операция сериализации Java. Вре­мена существования handle и сопоставленного с ним объекта совпадают. При работе с Entity bean клиент может сохранять (с помощью Java-се­риализации) значение этого идентификатора с последующим восстанов­лением в нужный момент. Этот идентификатор может корректно ссыла­ться даже на различные экземпляры EJB ; он остается корректным да­же после сбоя на сервере с последующим перезапуском, а также в случае перемещения объектов на другие серверы или компьютеры.
Второй вариант remove() для определения подлежащего удалению эк­земпляра EJB использует значение его primary key. Его типом может быть любой тип Java, который наследует класс Object и реализует ин­терфейс Serializable. Primary key — главное средство для идентифика­ции Entity bean. Как правило, он совпадает с первичным ключом в табли­це базы данных, используемым для уникальной идентификации записи, объектным представлением которой является данный bean. Метод getEJ­BMetaData() возвращает metadata-интерфейс для EJB. Этот интерфейс предоставляет клиенту возможность получить информацию о структуре EJB (его метаданные). Обычно его используют инструментальные про­граммные средства, создающие приложения из поставленных EJB.
Часть 4. Распределенные компненты EJB 207
31.2. Remote-интерфейс
Все бизнес-методы, описанные в основном классе EJB, доступны клиенту через remote-интерфейс. Каждый метод, объявленный в ин­терфейсе Remote_object, должен иметь соответствующий метод в основном классе; методы должны иметь одинаковые имя и сигнатуры:
import javax.ejb.*;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.Vector;
public interface Remote_object extends javax.ejb.EJBObject {;
Vector some_method()
java.rmi.RemoteException;}
Remote-интерфейс EJB является public-интерфейсом, который на­следуется от другого интерфейса javax.ejb.EJBObject. Родительский ин­терфейс имеет ряд замечательных методов, предназначенных для опре­деления внешних данных, таких как ссылка на home-интерфейс, указа­ние primary key и пр. Метод getEJBHome() позволяет вам получить соответствующий home-интерфейс. При работе с Entity bean, можно воспользоваться методом getPrimaryKey() для получения Primary Key Entity bean. Метод remove() уничтожает экземпляр из временного пула контейнера. Метод getHandle() возвращает ссылку на экземпляр EJB. Эта ссылка имеет смысл до тех пор, пока существует экземпляр EJB. Метод isIdentical () позволяет сравнивать EJB на идентичность.
По требованиям спецификации EJB 1.1 все методы remote-интер­фейса должны иметь уровень доступа к public и возбуждать исключе­ние java.rmi.RemoteException. Кроме того, аргументы этих методов и возвращаемые ими результаты должны иметь типы, соответствующие требованиям RMI-IIOP. Должно быть обеспечено соответствие между методами основного класса и методами его remote-интерфейса. Каждая пара методов класа и интерфейса должна иметь одно и то же имя, чис­ло и тип аргументов, тип результата и список возможных исключений.
Основной класс EJB
Независимо от создаваемого типа EJB, будь то Entity или session, кроме домашних интерфейсов каждый EJB должен содержать основной класс. Bean. Основной класс определяет бизнес-методы, к которым мо­жет обращаться клиент. Класс SampleBean содержит реализации мето­да some_method(). Именно использование этого метода делает приложе­ние доступным для клиента. Также в основном классе описывается ме­тод ejbCreate(), который соответствует методу create() home­интерфейса. Home-интерфейс SampleHome определяет единственный метод create() без аргументов, возбуждает исключение java.rmi.Remote­Exception. Класс SampleBean реализует метод ejbCreate() без аргумен­тов и также возбуждающий исключение java.rmi.RemoteException. Ме­тод ejbCreate() ничего не возвращает, т. е. void.
208 Часть 4. Распределенные компненты EJB
Класс SampleBean не имеет public-конструктора, хотя это и разре­шено. SamleBean объявляет четыре метода, помимо бизнес-методов и методов создания (create). Вот эти методы: ejbRemove(), ejbPassivate(), ejbActivate() и ejbSessionContext(). За реализацию этих методов отвеча­ет EJB-контейнер. Класс SampleBean должен просто их объявить как public-методы, возвращающие тип void.
public class SampleBean implements javax.ejb. SessionBean {
public void setSessionContext(javax.ejb.SessionContext
sessionContext) {}
public void ejbCreate() throws java.rmi.RemoteException {}
public void ejbRemove() throws java.rmi.RemoteException {}
public void ejbActivate() throws java.rmi.RemoteException {}
public void ejbPassivate() throws java.rmi.RemoteException {}
public Vector some_method() throws
java.rmi.RemoteException {
try (...
return result;}
catch(javax.ejb.CreateException e) {
throw new java.rmi .serverException(«Could not create ejb», e);}
catch(javax.ejb. RemoveException e) {
throw new java.rmi .serverException(«Could not remove sort instance», e);}}
Между home- и remote-интерфейсами и основным классом EJB не существует никаких формальных отношений, подобных отношению на­следования. Тем не менее спецификация определяет правила, которым должны подчиняться, например, имена методов, объявленных в этих двух интерфейсах и классе. Например, если объявить некоторый метод основного класса EJB, реализующий часть его функциональности (биз­нес-логики), то точно такой же метод — с тем же именем и такой же сигнатурой — должен быть объявлен в remote-интерфейсе. Каждый эк­земпляр имеет как минимум один метод с именем ejbCreate(); при этом он может иметь несколько методов с таким именем, но различными ар­гументами. Каждому из таких методов должен быть поставлен в соот­ветствие метод с таким же списком аргументов, но с именем create(). Еще одно отличие состоит в том, что метод ejbCreate() класса возвра­щает другой тип результата по сравнению с методом create() home-ин­терфейса: create() возвращает тип remote-интерфейса, а ejbCreate()ли­бо void (в случае использования сохранения, управляемого контейне­ром, CMP), либо тип Primary Key Entity bean (при использовании сохранения, управляемого EJB, BMP).
31.4. Entity beans
Entity bean содержит постоянные данные, которые хранятся во внешних источниках, таких, как базы данных или файловые системы, и имеет методы для манипулирования этими данными. В большинстве случаев entity bean должен использовать транзакционный механизм
Часть 4. Распределенные компненты EJB 209
для синхронизации изменяемых данных. Entity bean включает в себя бизнес-логику приложений. Для предотвращения потери данных, entity bean размещает свои данные в базе данных. В спецификации EJB опре­делены два вида Entity bean: первый использует свойства контейнера для организации своей работы. Свойства, заданные по умолчанию, испо­льзуются контейнером при работе с EJB. Называется данный способ Container Managed Persistence (CMP). Контейнер полностью несет от­ветственность за данные, используемые Entity bean, другой, более гиб­кийивтожевремя более сложный способ называется Bean Managed Persistence (BMP). При данном методе сам разработчик переопределяет необходимые методы, в том числе самостоятельно организует доступ к базе данных, хранящей EJB-переменные. В этом случае сам bean отве­чает за сохранность данных, представленных Entity bean. Чаще всего этот способ используется для организации доступа к базе данных, не поддерживаемой EJB-сервером. Entity bean представляют собой объек­тное представление данных из СУБД. Несколько клиентов могут одно­временно обращаться к одному экземпляру Entity bean. При изменении содержимого таблицы базы данных соответствующие Entity bean также меняют свои данные. Состояние Entity bean в общем случае нужно со­хранять, и «живут» они столько, сколько существуют в базе данных те данные, которые они представляют, (а не столько, сколько существуют клиентский или серверный процессы). Остановка или «падение» сервера не приводит к уничтожению содержащихся в EJB-контейнере Entity bean. Каждый Entity-компонент характеризуется своим уникальным идентификатором — primary key. Обычно это тот же самый primary key, что и идентификатор данных в БД, Primary key используется для поиска нужного EJB в исполняемом окружении.
31.5. Session beans
Другой enterprise bean — session bean содержит временные значе­ния, необходимые для работы клиента с EJB. В противоположность en­tity bean, session bean не хранит данные во внешних источниках, а хра­нит таковые во временных. Однако session bean может изменять дан­ные, которые хранятся в базе данных и используются entity bean, но session bean непосредственно не связан с представлением данных в базе данных. Объект session bean создается контейнером как ответ на посту­пивший от клиента запрос. Session bean представляет собой объекты, созданные для обслуживания запросов только одного клиента. Каждый session bean ассоциирован с одним клиентским запросом, жизнь session bean продолжается до тех пор, пока продолжается клиентская сессия, после окончания сессии экземпляр session bean удаляется из временно­го пула самим контейнером.
Вызов несколькими клиентами одного ssesion bean вызывает исклю­чительную ситуацию, потому что session bean ассоциирован только с одним клиентом. Если клиент или сервер прервали работу, то данные session bean теряются.
210 Часть 4. Распределенные компненты EJB
Существуют две версии session bean по работе с пользовательской сессией: stateless — «короткоживущие» и stateful — «долгоиграющие» версии, данные в них обрабатываются различными session bean. Обычно Session bean содержит параметры, которые характеризуют состояние его взаимодействия с клиентом, т. е. он сохраняет некоторое состояние между вызовами удаленных методов в процессе сеанса связи с клиен­том. Session-EJB, которые поддерживают состояние, называются state­ful. В таком состоянии session bean пребывает, пока существует сеанс взаимодействия с клиентом, т. е. session bean создается в контексте сес­сии (или сеанса связи), и в продолжение всего сеанса экземпляр session bean обслуживает запросы только одного клиента, создавшего непо­средственно данный bean.
Session bean может также не иметь состояния stateless. Он не хранит характеристик своего взаимодействия с клиентом. Когда клиент вызы­вает один из его методов, разумеется, происходит изменение значений некоторых внутренних переменных, но эти значения имеют смысл толь­ко во время обработки этого единственного клиентского вызова — до его окончания. Таким образом, все экземпляры одного stateless bean явля­ются идентичными. Вследствие этого ничто не мешает одному и тому же экземпляру session bean обслуживать вызовы различных клиентов. Контейнер EJB может создать пул экземпляров таких bean и выбирать любой из них для обслуживания клиентских запросов.
«Короткоживущая» версия не предполагает использование специфи­ческих данных, «долгоиграющая» наоборот, чаще всего она и использу­ется. Находясь в состоянии stateless, она не управляет пользователь­ской сессией. Клиент может вызывать методы stateless session bean. Вы­бор конкретного типа session bean зависит от многих факторов:
типа клиента: Web-клиент ( из Web-браузера вызывается servlet по HTTP-прото­колу); Java-приложение (доступ организуется посредством RMI/IIOP-прото­кола);
затребованных системных ресурсов:
доступности;
выполнения различных функций.
Stateless Session Beans более динамичны по сравнению с Stateful Ses­sion Beans используют значительно меньше системных ресурсов и легче управляются.
Программно Entity и Session beans очень похожи между собой, но первый содержит дополнительный класс — primary key, о котором бу­дет сказано ниже.
31.6. Основные EJB Entity bean
Каждый entity bean должен иметь следующий EJB:
Bean class. Этот класс содержит данные для entity bean и бизнес-ме­тоды, описанные разработчиком для доступа к этим данным. Здесь так­же описываются методы, используемые контейнером для управления