В этой главе рассматривается использование LiveConnect для доступа к
распределённым объектам CORBA. С помощью LiveConnect Вы можете получить доступ к Java;
через Java - соединяться с CORBA-объектами, используя Netscape Internet Service Broker for Java.
Netscape Internet Service Broker for Java (ISB for Java) это брокер запроса
объектов фирмы Netscape. ISB for Java устанавливает соединения внутри себя и с
другими брокерами запроса объектов/object request brokers (ORB) путём
использования протокола Internet InterORB Protocol (IIOP).
ISB for Java даёт Вашим приложениям JavaScript доступ к распределённой объектной
модели CORBA, опубликованной в ORB, работающем на основе IIOP (включая сам ISB for Java).
Эти объекты могут быть частью распределённого приложения. Чтобы получить доступ
к такому распределённому объекту, Вы обязаны иметь Java-stub/основу, и этот stub-класс
обязан быть в пути Вашей CLASSPATH. В свою очередь, Вы можете
использовать Java и LiveConnect для экспонирования частей Вашего серверного
приложения JavaScript как распределённых объектов CORBA.
За пределами данного учебника остаётся описание создания CORBA-исполняемых
распределённых объектов с использованием ISB for Java, а также то, как
делать Java-стабы для таких объектов. Об этом см. учебник .
Приложения серверного JavaScript могут получать доступ к распределённому объекту
в зависимости от того как он опубликован. Простейшей альтернативой является
создание и запуск распределённого объекта как отдельного процесса, что показано
на следующем рисунке.
Рисунок 22.1 Приложение JavaScript CORBA-клиент
Как видно на рисунке, среды запуска Java и JavaScript находятся вместе на одном web-сервере.
Они взаимодействуют путём использования LiveConnect стандартным способом,
описанным ранее в этой главе. Методы, вызываемые в оболочке стаба в JavaScript,
дают в результате вызов методов объекта Java-стаба в Java. Стаб использует Java ORB
для взаимодействия с удалённым сервисом. В данной архитектуре серверный процесс
объекта может проходить только на машине, которая имеет ORB, и может быть
написан на любом языке.
Приложение-образец flexi иллюстрирует это. В нём FlexiServer
это отдельное приложение Java, содержащее реализации нескольких распределённых
объектов. Этот пример обсуждается в разделе "Приложение-Образец Flexi".
После того как поработаете с flexi, прочтите в разделе "Альтернативные
Публикации" обсуждение более сложных альтернатив публикации.
Приложение-Образец Flexi
Приложение flexi иллюстрирует использование серверного JavaScript
для доступа к удалённому сервису, запущенному на ORB с включённым протоколом IIOP,
а также показывает удалённый сервис, написанный целиком на Java с использованием ISB for Java.
И исходные файлы, и исполняемые файлы приложения flexi установлены
в директории $NSHOME\js\samples\flexi.
A flexible spending account (FSA)/гибко расходуемый счёт это счёт, на котором
служащие могут хранить доллары предоплаты, используемые для медицинских расходов.
Служащие обычно подписываются на этот план через администратора плана и выбирают
сумму в долларах, которую они хотят хранить на своих счетах. Если служащий
осуществляет затраты на медицинские цели, он отправляет запрос, который, если
одобрен, вызывает снятие суммы со счёта и перевод её служащему.
Приложение flexi предоставляет поддержку обслуживания
FSA. В этом приложении администратор имеет следующие
опции:
Создание нового счёта с указанным балансом.
Выбор существующего счёта по фамилии служащего.
Хранение дополнительных вложений на выбранном счёте.
Закрытие счёта.
Принятие или отказ в выполнении
запроса, отправленного служащим.
Для служащего имеются следующие опции:
Просмотр статуса счёта, включая статус любого отклонённого запроса.
Отправка нового запроса путём заполнения формы.
CORBA. Клиентский и Серверный Процессы
Рисунок 22.2 показывает две основные части flexi.
Они реализуют клиента и сервис CORBA.
Рисунок 22.2 Приложение-Образец flexi
Клиент CORBA это приложение на серверном JavaScript, известное как flexi.
Это приложение реализует пользовательские интерфейсы администратора и служащего,
описанные ранее. Оно соединяется с объектом FSA-Admin (описанном далее) в
отдельном процессе или даже на отдельном компьютере. Приложение затем использует
этот и другие объекты, возвращаемые из FSA-Admin, для выполнения большинства своих операций.
Сервер CORBA это отдельное Java-приложение, работающее из оболочки/shell. Оно
содержит реализации всех интерфейсов, определённых в IDL-файле Flexi.idl.
Это приложение под названием FlexiServer реализует основную
функциональность системы FSA. После старта это приложение создаёт экземпляр
объекта, реализующий интерфейс ::FSA::Admin, и регистрирует его под
именем "FSA-Admin." Клиенты этого сервиса (такие как приложение flexi
на JavaScript) получают доступ к этому объекту, разрешая сначала своё имя.
Клиенты используют этот объект для создания других объектов и для получения
удалённых ссылок на них.
Старт FlexiServer
FlexiServer это отдельное приложение Java. Оно может работать
только на машине, имеющей JDK 1.0.2. В Enterprise Server 3.01 и в FastTrack Server
3.01 Вы можете также запускать его на машине с JDK 1.1.2. Прежде чем запустить FlexiServer,
Вы должны убедиться, что среда работы корректна.
Из оболочки, где Вы запускаете FlexiServer, убедитесь, что Ваша
переменная окружения PATH содержит $JDK\bin и что CLASSPATH
включает следующее:
Здесь $JDK это директория, в которой установлен JDK, а $NSHOME
это директория, в которой установлен Ваш web-сервер.
Если среда корректна, Вы можете стартовать FlexiServer так:
cd $NSHOME\js\samples\flexi\impl java FlexiServer
Вы должны увидеть такое сообщение:
Started FSA Admin: Admin[Server,oid=PersistentId[repId=IDL:Flexi/Admin:1.0,objectName=FSA-Admin]]
С этого момента FlexiServer стартовал как сервис CORBA и
зарегистрировал в ORB объект с интерфейсом ::FSA::Admin и именем FSA-Admin. FlexiServer
работает в фоновом режиме, ожидая запросов на обслуживание.
Старт Flexi
Вы обязаны стартовать FlexiServer до старта flexi,
поскольку стартовая страница flexi пытается соединиться с FlexiServer.
Добавьте $NSHOME\js\samples\flexi в CLASSPATH Вашего web-сервера.
О том, как это сделать, см. "Установка LiveConnect".
Используя Application Manager, установите приложение flexi JavaScript,
как описано в разделе "Установка Нового Приложения". Параметры, устанавливаемые
Вами для flexi, показаны в следующей таблице.
Таблица 22.1 Установки Приложения Flexi
Установка
Значение
Name
flexi
Web File Path/Путь к web-файлу
$NSHOME\js\samples\flexi\flexi.web
Default Page/Страница по Умолчанию
fsa.html
Initial Page/Начальная Страница
start.html
Client Object Maintenance/Обслуживание Объекта сlient
client-cookie
Использование Flexi
Чтобы стартовать flexi, Вы можете запустить его из Application Manager
или ввести следующий URL:
http://server-name/flexi
Страница по умолчанию позволяет пользователю идентифицировать себя как
администратора или как служащего. Чтобы быстрее прочувствовать то, как работает
это приложение, следуйте этому сценарию:
Администратор создаёт для пользователя баланс.
Служащий выбирает счёт.
Служащий отправляет запрос.
Администратор выбирает счёт служащего.
Администратор принимает запрос, что уменьшает баланс счёта служащего, и
отправляет чек на запрошенную сумму.
Служащий
выбирает счёт.
Служащий просматривает статус
счёта.
Администратор выбирает счёт служащего.
Администратор удаляет запрос.
Система может обрабатывать только один запрос служащего в единицу времени. После
удаления запроса может быть отправлен новый запрос.
Исходные Файлы
В таблице показаны первичные файлы и директории для flexi.
Таблица 22.2 Файлы и Директории Приложения Flexi
flexi.idl
Файл, определяющий интерфейс с удалённым сервисом, включая Admin, Account, Claim.
Flexi\
Директория, содержащая код, сгенерированный из Flexi.idl
программой idl2java. Эта директория содержит каркасы и стабы (каркасы\основы) интерфейсов.
impl\
Директория, содержащая Java-реализации всех интерфейсов, определённых во Flexi.idl.
Она также содержит класс FlexiServer, реализующий main-программу
приложения Java, которое работает как сервис.
*.html
Файлы, реализующие серверное приложение JavaScript. Сюда входит также web-файл приложения, flexi.web.
Просмотрите эти файлы, чтобы добиться полной ясности в вопросах работы
приложения. Здесь обсуждаются лишь некоторые детали.
Установка FlexiServer как CORBA-Сервера
Функция main отдельного Java-приложения
реализована в flexi\impl\FlexiServer.java. Его код таков:
import org.omg.CORBA.*;
class FlexiServer
{ public static void main(String[] args) {
try { // Инициализируются orb и boa.
org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init();
org.omg.CORBA.BOA boa = orb.BOA_init();
// Создаётся серверный объект.
Admin __admin = new Admin();
// Информирует boa, что серверный объект готов.
boa.obj_is_ready(__admin);
// Регистрируется имя объекта с именем сервиса.
// Сначала определяется хост имени сервиса, по умолчанию это <localhost>:80.
String _nameServiceHost = null; if (args.length > 0)
{ // Принимается, что первый arg это имя хоста имени // сервиса. Ожидаемый формат: <hostname>:<port>
_nameServiceHost = args[0]; }
Этот код инициализирует ORB и создаёт экземпляр класса Admin. Затем
экземпляр регистрируется как распределённый объект с URL в форме http://host:port/FSA-Admin. По умолчанию host
это имя хоста, на котором запущен FlexiServer, а port
равен 80. Вы можете поставить Ваши собственные значения для host:port
путём передачи их как аргументов для FlexiServer при его старте.
Чтобы использовать локальный хост, но другой номер порта, Вам нужно изменить
исходный код и перекомпилировать его. Если код имеет соответствующее имя, он
регистрирует объект, используя метод
register объекта netscape.WAI.Naming. Дополнительно
см. книгу .
Наконец, код печатает сообщение на консоль и ожидает запросы от
CORBA-клиентов. В данном случае единственным CORBA-клиентом, который знает о
нём, является приложения flexi на языке
JavaScript.
Установка flexi как CORBA-Клиента
Файл start.html это начальная страница приложения JavaScript flexi.
Эта страница использует LiveConnect для инициализации ISB for Java и
установления соединения с FSA-Admin.
// Устанавливается соединение с сервисом "FSA-Admin". // По умолчанию принимается, что name service запущен на текущем сервере.
nameHost = "http://" + server.hostname; serviceName = "/FSA-Admin";
serviceURL = nameHost + serviceName;
// Разрешается имя и получается ссылка на стаб Admin. project.fsa_admin = Packages.Flexi.AdminHelper.narrow(
netscape.WAI.Naming.resolve(serviceURL));
</server>
Первый оператор инициализирует ISB for Java, вызывая static-метод init Java-класса org.omg.CORBA.ORB.
Он сохраняет возвращённый объект как свойство объекта project, так
что он доступен для всего приложения.
Второй набор операторов определяет URL, который использовался для регистрации
объекта FSA-Admin.
Если Вы использовали при регистрации этого объекта другой URL (как описано в
последнем разделе), Вам нужно сделать соответствующие изменения в этих
операторах. URL, используемый в CORBA-сервере, обязан быть точно тем же, что и URL,
используемый в CORBA-клиенте.
Код затем вызывает метод resolve объекта netscape.WAI.Naming
для установления соединения с объектом Admin, который был
зарегистрирован FlexiServer как
FSA-Admin. Наконец, он вызывает метод narrow объекта AdminHelper
для приведения полученного объекта к соответствующему типу Java-объекта. Этот Java-метод
возвращает Java-объект, соответствующий распределённому объекту. Машина
выполнения JavaScript обёртывает этот Java-объект как JavaScript-объект и
сохраняет его как свойство объекта project. Теперь Вы можете
вызывать методы и получать доступ к свойствам этого возвращённого объекта, как и
любого другого Java-объекта. Другие страницы flexi работают через
этот объект.
И ещё раз - о том, как работают CORBA-объекты, см. книгу
.
Использование Объекта Admin для
Администрирования и Просмотра Новых Счетов
Код во flexi создаёт другие объекты, кроме объекта Admin,
и осуществляет к ним доступ во FlexiServer. Эти объекты создаются
путём вызовов метода объекта Admin. Например, если служащий
отправляет запрос, новый запрос создаётся в account-empl.html
следующим оператором:
Этот код вызывает метод submitClaim объекта Account
для создания нового запроса служащего. Реализация этого метода в файле impl\Account.java
создаёт новый Claim-объект, который регистрируется в ORB и
возвращается:
public Flexi.Claim submitClaim(float amount, String serviceDate,
String providerName, String details) {
Claim __clm = new Claim(this, amount, serviceDate,
providerName, details); org.omg.CORBA.ORB.init().BOA_init().obj_is_ready(__clm);
_current_clm = __clm;
System.out.println("***Created a new claim: " + __clm); return __clm; };
Альтернативные
Публикации
Имеются две альтернативы для публикации распределённых CORBA-объектов,
представляющие интерес при работе с серверным JavaScript:
Объект может быть создан web-сервером (а не приложением JavaScript) и запущен
на web-сервере.
Объект может быть создан приложением JavaScript и запущен на web-сервере.
В этих альтернативных вариантах CORBA-клиент и CORBA-сервер оба работают в одном
процессе web-сервера.
С этой точки зрения, если CORBA-клиент не является приложением JavaScript,
первый вариант пригоден для тех же целей, что и в случае, когда CORBA-сервер запущен как отдельный процесс.
Однако второй вариант, создающий распределённый объект в приложении JavaScript,
реально делает это приложение сервисом CORBA. Рисунок 22.3 иллюстрирует эти альтернативы.
Рисунок 22.3 Приложение JavaScript как CORBA-сервер
Ещё раз: среды выполнения Java и JavaScript находятся вместе на одном web-сервере.
Они взаимодействуют через использование LiveConnect стандартным способом,
описанным ранее в этой главе.
В это случае, однако, процессы Java и JavaScript действуют вместе как CORBA-сервис.
Этот сервис затем взаимодействует с CORBA-клинтом через ISB for Java стандартным способом.
Образец-приложение bank это пример приложения JavaScript,
реализующего CORBA-сервис.
В данном случае CORBA-клиент может находиться на любой машине, имеющей ORB с IIOP,
и может быть написан на любом языке. Интересно то, что CORBA-клиент может быть
клиентским приложением Java
(и через LiveConnect на клиенте - клиентским приложением JavaScript).
Это даёт совершенно другой способ взаимодействия клиентского приложения JavaScript
с серверным приложением JavaScript.