Главная » Delphi » Delphi,  CORBA и Enterprise Java Beans (EJB)

0

В настоящем разделе описываются методы  подключения приложений Delphi CORBA к средствам EJB, устанавливаемым на сервер приложений Borland (Borland Application Server).  Для разработки и установки EJB в данном  примере используетсяпакет  Borland JBuilder 5 и сервер приложений Borland версии 4.51. Бесплатные де монстрационные версии этих  продуктов можно  получить на Web сайте  Borland по ад ресу www.borland.com.

Интенсивный курс EJB для программистов

Delphi

Несколько лет  тому  назад  компания Sun  Microsystems выпустила  платформу  J2EE. Это расширило Java до уровня  корпоративной распределенной объектной среды. Спецификация J2EE достаточно сложная, однако  с точки  зрения разработчика при ложений она может быть разбита на несколько простых концепций.

Одним из ключевых элементов платформы J2EE является компактный, независимый от платформы, масштабируемый объект — Enterprise Java Bean (EJB), разработанный для выполнения одной  специфической задачи.  Идея  заключается в том,  что  все функции корпоративного приложения выполняются при помощи множества различных специа лизированных объектов EJB. Таким  образом, приложение обращается к какому либо объекту EJB только в том случае, если необходимо использовать его функции.

EJB — специализированный компонент

В терминах Delphi EJB представляет собой  компонент. Примером EJB является компонент, который подключается к базе  данных  и извлекает ее  записи для  после дующей передачи другим элементам приложения. В других случаях объекты EJB могут выполнять вычисления на основании получаемой ими информации (например расчет налога при продаже товара).

Контейнеры для хранения объектов  EJB

В Delphi  все компоненты хранятся в пакетах и устанавливаются в интегрирован ной  среде  разработки. Выбор  компонентов в интегрированной среде  разработки вы полняется при помощи палитры компонентов. Исходный код компонента в приложе нии создается при его размещении в форме. При  удалении  компонента из формы уда ляется и его определение в исходном коде.

Подобный подход  применяется к объектам EJB, и не  только  в интегрированной среде  разработки Delphi. В спецификации J2EE описан элемент под  названием кон тейнер EJB (EJB container). Все объекты EJB хранятся в контейнерах, наподобие того как компоненты хранятся в пакетах Delphi. Контейнер управляет процессом создания и уничтожения объектов EJB.

Использование EJB предопределенных API

В сервер приложений Borland использует внедренный контейнер EJB. Аналогично ин тегрированной среде  разработки Delphi  и ее  компонентам, контейнер EJB использует предопределенный набор  интерфейсов API, задающих  поведение объектов EJB. Разра ботчик EJB добавляет методы, реализующие специфическую функцию, но без предопре деленных API контейнер не сможет корректно управлять заключенными в нем объектами.Кроме  создания и удаления  объектов EJB, функции интерфейса API отвечают и за маршрутизацию сообщений, и за организацию обратных вызовов. Контейнер выпол няет  также  и много  других операций, описанных в спецификации, но в данной книге они рассматриваться не будут.

Интерфейсы Home и Remote

В состав  набора предопределенных API для всех  EJB должны  входить  два интер фейса. Первый называется Home, а второй — Remote. Интерфейсу Home соответствует метод инициализации, который вызывается приложением для получения экземпляра EJB. Кроме  того,  интерфейс Home отвечает за создание экземпляров интерфейса Re- mote и их последующую передачу  вызывающему приложению.

Интерфейс Remote содержит все методы, которые могут использоваться в вызы 

вающей  программе. Они  аналогичны интерфейсам, объявленным в файле IDL. Итак,

для получения экземпляра интерфейса Remote клиентское приложение вызывает ин терфейс Home объекта EJB. После  этого  клиент может  вызывать любые  предостав ленные методы  интерфейса Remote.

Типы объектов  EJB

Все объекты EJB можно разделить на две категории:

•  Session beans (элементы уровня сеанса)

•  Entity beans (собственно объекты)

Session bean, обычно, являются объектами EJB без состояния (stateless). Имеется в виду, что между вызовами объект не хранит никакой информации о вызывающем приложении. Он не отслеживает положение клиента в последовательности вызовов и потому  не имеет  эквивалента в машине  состояния (state  machine). Вполне  возможно создать session bean, учитывающий состояние (stateful), но все необходимые для этого функции придется разрабатывать самостоятельно.

Обычно entity bean  используют в качестве оболочки для записей баз данных.  Объ екты  этого  типа  учитывают состояние, так как обрабатываемые ими данные (записи) должны  сохраняться между вызовами.

Между session и entity bean есть еще одно существенное различие. При  подключении к session bean для вызывающего клиента создается отдельный экземпляр такого объекта. При  обращении с этому же session bean  другого клиента создается еще один экземпляр. Таким образом, каждый клиент использует собственный экземпляр session bean.

При  вызове  клиентом entity  bean  создается всего лишь один  его экземпляр, и при обращении к нему другого клиента они будут использовать его совместно. Управление всеми entity bean осуществляется контейнером в пуле соединения.

Настройка JBuilder 5 для разработки  EJB

Проще всего создать  EJB при помощи пакета  Borland JBuilder 5. Для подключения к Delphi  EJB должен  быть  размещен на  сервере приложений Borland версии 4.51 или выше. Демонстрационные версии JBuilder 5 и сервера приложений AppServer  можнополучить на Web сайте Borland. Сначала обычно устанавливают сервер AppServer, а за

тем — JBuilder.

Перед запуском  JBuilder создайте каталог  проектов, в котором будут сохраняться все приложения JBuilder. Обычно для этого  каталога используют имя наподобие c:\MyProjects.

После запуска JBuilder 5 мастера создания объектов EJB могут оказаться недоступ

ны. В этом случае необходимо настроить пакет  JBuilder таким образом, чтобы  он был связан  с сервером AppServer.

Для настройки поддержки EJB в пакете JBuilder 5 выполните следующие действия:

1.  Запустите JBuilder 5 и выберите в меню Tools пункт Enterprise Setup. На экране появится диалоговое окно с параметрами конфигурации CORBA.

2.  Во вкладке  CORBA выберите пункт  VisiBroker. Пакет  JBuilder поставляется  с брокером VisiBroker  для Java.

3.  Щелкните на кнопке Edit (Правка). В появившемся на экране диалоговом окне Edit Configuration введите путь  к  брокеру   ORB.  Это —  путь  размещения про граммы IDL2Java (обычно: c:\Borland\AppServer\bin).

4.  Перейдите во вкладку Application (Приложение), на которой указывается тип используемого сервера приложений. Выберите тип BAS 4.5 и укажите  коррект ный каталог  (c:\Borland\AppServer).

5.  Выберите в меню Projects (Проекты) пункт Default Project Proprieties (Свойства проекта по умолчанию) и перейдите во вкладку Servers (Серверы). Удостоверь тесь,  что  выбран именно сервер Borland Application Server. Если это  не так,  то щелкните на кнопке  с многоточием и выберите его.

Итак, настройка JBuilder завершена. Теперь можно приступить к созданию перво

го EJB.

Разработка простого EJB “Hello,  world”

Позаимствуем для первого EJB классическое приложение языка  C, которое выво дит  на  экран  строку  “Hello, world”. В данном  примере будет рассмотрен только процесс создания EJB. Более  сложные объекты EJB разрабатываются по  такой  же схеме, но при этом в них реализуются дополнительные методы  интерфейса Remote.

Запустите сначала   сервер приложений Borland, а  затем —  JBuilder. В настоящей

разделе будет рассмотрен процесс разработки EJB и его установки на сервере прило жений. Затем  с помощью Delphi  будет разработана клиентская часть для подключения к созданному объекту.  При  разработке реальных приложений чаще всего применяет ся именно такой  подход,  хотя опытные программисты Java, используя пакет  JBuilder, могут разрабатывать и проверять EJB исключительно в нем.

Чтобы создать EJB “Hello, world”, необходимо выполнить следующее:

1.  Закройте в JBuilder все  активные проекты, выберите в меню  File пункт  New Project. Присвойте проекту  имя “HelloWorld”. Это же имя будет использовано для файла  проекта при его сохранении на диске.2.  Теперь в проект необходимо добавить группу EJB. Выберите в меню File пункты New и Enterprise, а в появившемся диалоговом окне —  пиктограмму Empty EJB Group (Пустая  группа  EJB). Присвойте этой  группе  название HelloGroup. Об ратите внимание на поле ввода текста, в котором указывается имя файла  с рас ширением .jar. Данный файл предназначен для хранения откомпилированно го приложения и по  своей  сути аналогичен архивному  файлу  с расширением

.zip. Все файлы с двоичным кодом  Java архивируются в файле JAR. Это — единственный файл,  который необходим для установки приложения. Присвой те ему имя HelloWorld.jar.

3.  Теперь добавьте в проект новый EJB. Для этого  выберите в меню  File пункты New и Enterprise, а в появившемся диалоговом окне  выберите пиктограмму Enterprise Java Bean и укажите  имя  HelloBean. JBuilder 5 автоматически соз даст новый  bean и все необходимые интерфейсы.

4.  Отметьте в окне проекта файл HelloBean.java и перейдите на вкладку Source (Исходный код). Приведите исходный код объекта в соответствие с тем,  кото рый представлен в листинге 19.12.

Листинг 19.12. Исходный код JavaBean

package helloworld;

import java.rmi.*; import javax.ejb.*; import java.lang.String;

public class HelloBean implements SessionBean {

private SessionContext sessionContext;

public void ejbCreate() {

}

public void ejbRemove() throws RemoteException {

}

public void ejbActivate() throws RemoteException {

}

public void ejbPassivate() throws RemoteException {

}

public void setSessionContext(SessionContext sessionContext)

throws RemoteException {

this.sessionContext = sessionContext;

}

public String sayHello() {

return "Hello, world";

}

}

5. Единственное изменение должно  быть  внесено в последнем методе  say- Hello(). Он возвращает строку,  поэтому  в начале  исходного кода необходимо подключить пакет java.lang.String.6.  Теперь с помощью интерфейса Remote необходимо предоставить доступ к ме тоду sayHello(). Для этого  перейдите во вкладку Bean, расположенную внизу окна  исходного кода. Теперь перейдите на вкладку Methods, расположенную в нижней части  вкладки  Bean. Метод  sayHello() отображен в списке  со сбро шенным флажком. Установите флажок. В результате метод  sayHello() будет связан  с интерфейсом Remote (а следовательно, доступен  извне). Это  можно проверить, дважды  щелкнув  мышью  на  файле Hello.java в  окне  проекта. В результате на экране появится исходный код интерфейса Remote. Обратите внимание на то, что теперь в нем указан метод sayHello().

7.  Сохраните и откомпилируйте проект. Ошибок при этом возникнуть не должно.

Разработка в JBuilder демонстрационного клиентского приложения

JBuilder позволяет разработать клиентское приложение Java для проверки нового

EJB. Для этого:

1.  Выберите в меню  File пункты  New и Enterprise, а затем  пиктограмму EJB Test

Client. Присвойте новому приложению имя HelloTestClient1.java.

2.  JBuilder автоматически создаст  файл  с исходным кодом.  Перейдите в начало метода Main и внесите изменения, представленные в листинге 19.13.

Листинг 19.13. Клиентское приложение Java для проверки  нового EJB

/** Метод Main */

public static void main(String[] args) { HelloTestClient1 client = new HelloTestClient1(); client.create();

client.sayHello();

// Клиентский объект используется для вызова оболочки

// интерфейса Home, позволяющей создать ссылку на объект

// интерфейса Remote. Если возвращаемое значение соответствует

// типу интерфейса Remote, то оно может использоваться для

// доступа к его методам. Кроме того, для обращения к

// оболочкам интерфейса Remote можно использовать только

// клиентский объект.

}В метод Main были добавлены вызовы методов create() и sayHello().

Разработка клиента и проверка EJB

Для разработки клиентской части выполните следующие действия:

1.  Выделите в окне  проекта элемент HelloGroup, щелкните на нем правой кнопкой мыши и в контекстном меню выберите пункт Run (Выполнить). В результате EJBбудет запущен, о чем будут свидетельствовать сообщения в соответствующем окне JBuilder. Это займет  20 – 30 секунд, в зависимости от частоты процессора и объе ма оперативной памяти. Не забывайте, что Java требуется много ресурсов.

2.  Выделите клиентское приложение и щелкните на нем правой кнопкой мыши.

Выберите из контекстного меню пункт Run. В результате приложение будет за пущено и на экране появится окно сообщения со строкой “Hello, world”. Это означает, что EJB работает корректно.

3.  Теперь можно  дезактивировать группу EJB, щелкнув  на красной кнопке Stop, расположенной в нижней части окна сообщений.

Установка EJB на сервер приложений

Чтобы установить EJB на сервере приложений, необходимо выполнить следующие действия:

1.  Выберите в меню  Tools пункт  EJB Deployment (Установка EJB) и  выполните действия, предложенные мастером установки EJB.

2.  После  того  как  EJB будет  установлен на  сервер приложений, он  будет  запус каться   автоматически.  Щелкните  в  мастере  несколько  раз   на  кнопке  Next (Далее), пока не достигнете этапа 4.

3.  На  четвертом этапе  мастера необходимо выбрать контейнер  EJB. Убедитесь, что  сервер приложений Borland запущен,  и щелкните на кнопке Add EJB Container (Добавить контейнер EJB). В появившемся диалоговом окне  выбери те контейнер AppServer и щелкните на кнопке ОК. После  этого  выполните все остальные этапы мастера.

Создание  файла SIDL

Компанией Borland была  разработана собственная методика сопряжения EJB с ин терфейсом сервера приложений. Она  получила  название упрощенный язык определения интерфейсов (SIDL — Simplified Interface Definition Language или Simplified IDL). Подоб ное  сопряжение  гарантирует, что  устаревшие приложения  CORBA  получат  возмож ность обращаться к EJB, используя стандарт CORBA 2.1 или выше. Этот инструмент, на зываемый компилятором SIDL, поставляется в комплекте с сервером приложений и по зволяет, проанализировав интерфейс Remote, создавать соответствующие файлы IDL.

Кроме того, Borland предоставляет бесплатное дополнение к пакету JBuilder, кото

рое  при  помощи компилятора SIDL конвертирует интерфейсы EJB в IDL. Это допол нение  находится на  прилагаемом  компакт диске   и  представляет  собой   файл   ot- SIDL.jar, расположенный в том же каталоге, что и примеры исходного кода на стоящей главы. Скопируйте этот файл в каталог  c:\JBuilder5\lib\ext (или другой эквивалентный каталог, в котором установлен JBuilder). После  этого  для активизации дополнения достаточно перезапустить JBuilder.

После  запуска JBuilder выберите в меню Tools пункт IDE Options (Параметры сре ды)  и в появившемся диалоговом окне  перейдите на вкладку SIDL. Укажите  каталог для выходных данных.  В данном  случае необходимо указать каталог, в котором сохра няются файлы проекта HelloWorld (например, c:\MyProjects\HelloWorld).

Кроме того, новое средство добавило к интерфейсу EJB Remote контекстное меню.Отметьте в окне  проекта файл  HelloHome.java и щелкните на нем правой кноп кой  мыши.  Теперь в контекстном меню  есть  пункт  Generate Simplified IDL (Создать SIDL). После  выбора этого  пункта будет запущен  компилятор SIDL. Результат  его ра боты будет сохранен в каталоге classes.

Разработка в Delphi клиента EJB

Теперь, когда разработка EJB завершена, можно  использовать файл  IDL, который был создан компилятором SIDL, при разработке на Delphi клиента CORBA, способно го взаимодействовать с EJB. В подкаталоге classes текущего  проекта есть файл Hel- loHome.idl. Кроме   этого  файла   при  разработке  приложения  понадобится копия файла  sidl.idl, расположенного в каталоге Delphi6\Demos\Corba\Idl2pas\ EJB\EuroConverter. Создайте новый каталог, скопируйте в него два указанных фай ла и выполните следующие действия:

1.  Запустите Delphi  и выберите в меню File пункты  New, Other, CORBA, а затем —

пиктограмму CORBA Client Application (Клиентское приложение CORBA).

2. Добавьте в список  файлов, предназначенных для обработки, файл  Hello- Home.idl. Файл sidl.idl в этот  список  добавлять не нужно,  поскольку  он бу дет автоматически подключен в файле HelloHome.idl при помощи директивы include.

3.  Мастер  создаст  новое  клиентское приложение CORBA. Сохраните проект и на зовите его HelloClient. В результате работы мастера будет создано  множест во файлов. Кроме  модуля  Unit1.pas понадобятся только  два файла:  Hello- Home_HelloWorld_i.pas и  HelloHome_HelloWorld_c.pas. Все  остальные файлы можно закрыть.

4.   Разместите в главной форме приложения кнопку и метку. Теперь форма долж

на выглядеть примерно так, как показано на рис. 19.4.

 

 Рис. 19.4. Клиент EJB в Delphi

5.  В методе формы OnCreate() укажите вызов метода initCorba.

6.  В метод  initCorba() внесите изменения в соответствии с листингом 19.14.

В данном  случае необходимо добавить две переменные в определение класса.

Первая из них соответствует интерфейсу Home, а вторая — интерфейсу Remote. Интерфейс Home используется для создания экземпляров интерфейса Remote. После  создания экземпляра интерфейса Remote можно  вызывать методы  для обращения к EJB. Итак, в метод  initCorba() необходимо внести программ ный код, в котором выполняется привязка к интерфейсу Home и создается объ ект интерфейса Remote.

7.   Создайте для кнопки обработчик события OnClick и внесите в него программ

ный код в соответствии с листингом 19.14.8.   Откомпилируйте клиентское приложение. В случае возникновения ошибок об

ратитесь к примечанию, представленному ниже.

Листинг 19.14. Главный файл приложения клиента EJB

unit ClientMain;

interface uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,

Dialogs, Corba, HelloHome_c, HelloHome_helloworld_c,

HelloHome_helloworld_i, HelloHome_i, HelloHome_sidl_javax_ejb_c,

HelloHome_sidl_javax_ejb_i, HelloHome_sidl_java_lang_c,

HelloHome_sidl_java_lang_i, HelloHome_sidl_java_math_c,

HelloHome_sidl_java_math_i, HelloHome_sidl_java_sql_c,

HelloHome_sidl_java_sql_i, HelloHome_sidl_java_util_c,

HelloHome_sidl_java_util_i, StdCtrls;

type

TForm1 = class(TForm)

Button1: TButton;

Label1: TLabel;

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

private

{ Закрытые объявления }

protected

myHome: HelloHome;

myRemote: Hello;

procedure InitCorba;

{ Защищенные объявления }

public

{ Открытые объявления }

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.InitCorba;

begin

CorbaInitialize;

myHome := THelloHomeHelper.Bind;

myRemote := myHome._create;

end;

procedure TForm1.FormCreate(Sender: TObject);begin initCorba;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

Label1.Caption := myRemote.sayHello;

end;

end.

НА ЗАМЕТКУ

В данном случае при работе с Delphi 6 могут возникнуть две ошибки. Обе они устранены в пакете обновления Service Pack 1. Первая ошибка проявляется в сообщении компиля- тора о том, что в один из модулей не может автоматически подключить другой. В этом случае просто укажите соответствующее имя модуля в разделе uses.

Вторая ошибка проявляется во время выполнения. Она связана с методом create() интерфейса Home. Вначале слово Create было внесено в список зарезервированных слов компилятора IDL2Pas. В результате, когда компилятор встречает это слово, он помещает перед ним символ подчеркивания (_). Когда объект EJB обращается к мето- ду _create(), это приводит к возникновению исключения, потому что метода с таким именем нет.

Для устранения данной ошибки необходимо найти реализацию метода THelloHomeS- tub._create() в  файле  HelloHome_helloworld_c.pas (соответствующий  фраг- мент кода представлен ниже). Первый параметр в методе _CreateRequest() указы- вает серверу CORBA на вызываемый метод. Если в первом параметре указан метод

_create, то измените это значение на create:

function THelloHomeStub._create: HelloHome_helloworld_i.Hello;

var

_Output: CORBA.OutputStream;

_Input:          CORBA.InputStream;

begin

inherited _CreateRequest(‘create’, True, _Output);

inherited _Invoke(_Output, _Input);

Result := HelloHome_helloworld_c.THelloHelper.Read(_Input);

end;

Обе эти ошибки устранены в первом пакете обновления для Delphi 6.

Запуск приложения

Для запуска приложения необходимо выполнить следующие действия:

1.  Запустите OSAgent.

2.  Убедитесь в том, что сервер приложений Borland (AppServer) также запущен.3.  Запустите приложение HelloClient. Щелкните на кнопке. В результате текст метки изменится на “Hello, world”.

Более сложные EJB можно разработать точно также, на основании менее сложных. В Java, для расширения возможностей EJB, достаточно всего  лишь добавить большее  ко личество методов и интерфейсов. По существу, клиентский процесс останется тем же самым. В Delphi клиент CORBA будет собран компилятором SIDL из файлов IDL, обра ботанных мастером CORBA интегрированной среды разработки Delphi.

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

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