Spec-Zone .ru
спецификации, руководства, описания, API
|
Сервер в качестве примера состоит из двух классов, слуги и сервера. Слуга, HelloImpl, является реализацией интерфейса IDL Hello; каждый экземпляр Hello реализуется экземпляром HelloImpl. Слуга является подклассом HelloPOA, который сгенерирован компилятором idlj от IDL в качестве примера.
Слуга содержит один метод для каждой работы IDL, в этом примере, методах sayHello() И shutdown(). Методы слуги точно так же как обычные методы Java; дополнительный код, чтобы иметь дело с ШАРОМ, с параметрами маршалинга и результатами, и так далее, обеспечивается скелетом.
У класса сервера есть метод main() сервера, который:
Этот урок представляет основы записи сервера CORBA. Для примера "Привет Мировой" программы с персистентным объектным сервером см. Пример 2: Привет Мир с Постоянным состоянием. Для большего количества обсуждения серверов CORBA см. Серверы Разработки.
Шаги в этом покрытии урока:
Создать HelloServer.java,
// HelloServer.java import HelloApp.*; import org.omg.CosNaming.*; import org.omg.CosNaming.NamingContextPackage.*; import org.omg.CORBA.*; import org.omg.PortableServer.*; import org.omg.PortableServer.POA; import java.util.Properties; class HelloImpl extends HelloPOA { private ORB orb; public void setORB(ORB orb_val) { orb = orb_val; } // implement sayHello() method public String sayHello() { return "\nHello world !!\n"; } // implement shutdown() method public void shutdown() { orb.shutdown(false); } } public class HelloServer { public static void main(String args[]) { try{ // create and initialize the ORB ORB orb = ORB.init(args, null); // get reference to rootpoa & activate the POAManager POA rootpoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA")); rootpoa.the_POAManager().activate(); // create servant and register it with the ORB HelloImpl helloImpl = new HelloImpl(); helloImpl.setORB(orb); // get object reference from the servant org.omg.CORBA.Object ref = rootpoa.servant_to_reference(helloImpl); Hello href = HelloHelper.narrow(ref); // get the root naming context org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); // Use NamingContextExt which is part of the Interoperable // Naming Service (INS) specification. NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef); // bind the Object Reference in Naming String name = "Hello"; NameComponent path[] = ncRef.to_name( name ); ncRef.rebind(path, href); System.out.println("HelloServer ready and waiting ..."); // wait for invocations from clients orb.run(); } catch (Exception e) { System.err.println("ERROR: " + e); e.printStackTrace(System.out); } System.out.println("HelloServer Exiting ..."); } }
Этот раздел объясняет каждую строку HelloServer.java, описывая, что код делает, так же как почему это необходимо для этого приложения.
Структура программы сервера CORBA является тем же самым как большинством приложений Java: Вы импортируете требуемые пакеты библиотеки, объявляете класс сервера, определяете метод main(), и обрабатываете исключения.
Во-первых, мы импортируем пакеты, требуемые для класса сервера:
// The package containing our stubs import HelloApp.*; // HelloServer will use the naming service import org.omg.CosNaming.*; // The package containing special exceptions thrown by the name service import org.omg.CosNaming.NamingContextPackage.*; // All CORBA applications need these classes import org.omg.CORBA.*; // Classes needed for the Portable Server Inheritance Model import org.omg.PortableServer.*; import org.omg.PortableServer.POA; // Properties to initiate the ORB import java.util.Properties;
В этом примере мы определяем класс для объекта слуги в пределах HelloServer.java, но вне класса HelloServer.
class HelloImpl extends HelloPOA { // The sayHello() and shutdown() methods go here. }
Слуга является подклассом HelloPOA так, чтобы он наследовал общую функциональность CORBA, сгенерированную для этого компилятором.
Во-первых, мы создаем частную переменную, orb
это используется в setORB(ORB)
метод. Метод setORB является закрытым методом, определенным разработчиком приложений так, чтобы они могли установить значение ШАРА со слугой. Это значение ШАРА используется, чтобы вызвать shutdown() на тот определенный ШАР в ответ на вызов метода shutdown() от клиента.
private ORB orb; public void setORB(ORB orb_val) { orb = orb_val; }
Затем, мы объявляем и реализуем необходимый метод sayHello():
public String sayHello() { return "\nHello world!!\n"; }
И продлитесь всех, мы реализуем shutdown()
метод похожим способом. shutdown()
вызовы метода org.omg.CORBA.ORB.shutdown(boolean)
метод для ШАРА. shutdown(false)
работа указывает, что ШАР должен сразу завершить работу, не ожидая обработки, чтобы завершиться.
public void shutdown() { orb.shutdown(false); }
Следующий шаг должен объявить класс сервера:
public class HelloServer { // The main() method goes here. }
Каждое приложение Java нуждается в методе main. Это объявляется в рамках класса HelloServer:
public static void main(String args[]) { // The try-catch block goes here. }
Поскольку все программы CORBA могут выдать системные исключения CORBA во время выполнения, вся функциональность main() помещается в пределах блока try-catch. Программы CORBA бросают исключения на этапе выполнения всякий раз, когда проблема происходит во время любого из процессов (маршалинг, немаршалинг, upcall) включенный в вызов. Обработчик исключений просто печатает исключение, и его стек прослеживают до стандартного вывода, таким образом, можно видеть, какая вещь пошла не так, как надо.
Блок try-catch устанавливается в main(), как показано:
try{ // The rest of the HelloServer code goes here. } catch(Exception e) { System.err.println("ERROR: " + e); e.printStackTrace(System.out); }
Сервер CORBA нуждается в локальном объекте ШАРА, так что делает клиент CORBA. Каждый сервер инстанцирует ШАРА и регистрирует его объекты слуги так, чтобы ШАР мог найти сервер, когда это получает вызов для этого.
Переменная ШАРА объявляется и инициализируется в блоке try-catch.
ORB orb = ORB.init(args, null);
Звонок в метод init() ШАРА передает в параметрах командной строки сервера, разрешая Вам установить определенные свойства во время выполнения.
ШАР получает начальные ссылки на объект на службы, такие как служба имен, используя метод resolve_initial_references
.
Ссылка на корневой POA получается, и POAManager активируется изнутри блока try-catch.
POA rootpoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA")); rootpoa.the_POAManager().activate();
activate()
работа изменяет состояние менеджера POA к активному, вызывая связал POAs, чтобы начать обрабатывать запросы. Менеджер POA инкапсулирует состояние обработки POAs, с которым оно связывается. Каждый POA
у объекта есть связанное POAManager
объект. Менеджер POA может быть связан с одним или более объектами POA.
Мы инстанцируем объекта слуги в блоке try-catch, сразу после активирования менеджера POA, как показано:
HelloImpl helloImpl = new HelloImpl();
Раздел кода, описывающего класс слуги, был объяснен ранее.
В следующей строке кода setORB(orb) определяется на слуге так, чтобы ORB.shutdown() можно было вызвать как часть работы завершения работы. Этот шаг требуется из-за метода shutdown(), определенного в Hello.idl.
helloImpl.setORB(orb);
Есть другие опции для того, чтобы реализовать работу завершения работы. В этом примере метод shutdown(), к которому обращаются, Object заботится о завершении работы ШАРА. В другой реализации реализация метода завершения работы, возможно, просто установила флаг, который сервер, возможно, проверил и вызвал shutdown().
Следующий набор кода используется, чтобы связать ссылку на объект со слугой. Метод narrow() обязан бросать ссылки на объект CORBA на их надлежащие типы.
org.omg.CORBA.Object ref = rootpoa.servant_to_reference(helloImpl); Hello href = HelloHelper.narrow(ref);
HelloServer работает с Общими Объектными Службами (COS) Служба Именования, чтобы сделать операции объекта слуги доступными для клиентов. Сервер нуждается в ссылке на объект на службу именования так, чтобы это могло опубликовать ссылки на объекты, реализовывая различные интерфейсы. Эти ссылки на объект используются клиентами для того, чтобы вызвать методы. Иначе слуга может сделать объекты доступными для клиентов для вызовов, stringifying ссылки на объект на файл.
Эти две опции для Именования Служб, поставленных с J2SE v.1.4:
Этот пример использует orbd.
В блоке try-catch, ниже получения ссылки на объект для слуги, мы вызываем orb.resolve_initial_references(), чтобы получить ссылку на объект на сервер имени:
org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
Строка "NameService" определяется для всех ШАРОВ CORBA. Когда Вы передаете в той строке, ШАР возвращает объект контекста именования, который является ссылкой на объект для службы имен. Строка "NameService" указывает:
Собственная строка "TNameService" указывает, что служба именования будет переходным процессом при использовании именования ORBD службы.
Как со всеми ссылками на объект CORBA, objRef является универсальным объектом CORBA. Чтобы использовать это в качестве NamingContextExt object, следует сузить это к его надлежащему типу. Звонок в narrow() только ниже предыдущего оператора:
NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
Здесь Вы видите использование idlj - сгенерированный класс помощника, подобный в функции к HelloHelper. Объектом ncRef является теперь org.omg.CosNaming.NamingContextExt, и можно использовать его, чтобы получить доступ к службе именования и зарегистрировать сервер, как показано в следующей теме.
NamingContextExt object является частью Взаимодействующей спецификации Службы Именования.
Только ниже звонка в narrow(), мы создаем новый массив NameComponent. Поскольку у пути к Hello есть единственный элемент, мы создаем одноэлементный массив, которого NamingContext.resolve требует для его работы:
String name = "Hello"; NameComponent path[] = ncRef.to_name( name );
Наконец, мы передаем path и объект слуги к службе именования, связывая объект слуги с "Привет" идентификатор:
ncRef.rebind(path, href);
Теперь, когда клиент вызывает resolve("Hello") на начальном контексте именования, служба именования возвращает ссылку на объект на слугу Hello.
Предыдущие разделы описывают код, который делает сервер готовым; следующий раздел объясняет код, который позволяет ему просто ждать клиент, чтобы запросить его службу. Следующий код, который является в конце (но в пределах) блок try-catch, шоу, как выполнить это.
orb.run();
Когда вызвано основным потоком, ORB.run() позволяет ШАРУ выполнить работу, используя основной поток, ожидая, пока вызов не прибывает из ШАРА. Из-за его размещения в main(), после того, как вызов завершается и возвраты sayHello(), сервер будет ожидать снова. Это - причина что HelloClient
явно завершает работу ШАРА после завершения его задачи.
Теперь мы скомпилируем HelloServer.java так, чтобы мы могли исправить любые ошибки прежде, чем продолжать с этим учебным руководством.
Пользователи Windows отмечают, что следует заменить наклонными чертами влево (\) наклонные черты (/) во всех путях в этом документе.
Скомпилировать HelloServer.java,
javac HelloServer.java HelloApp/*.java
Запущение Привет Мирового Приложения обсуждает рабочий HelloServer и остальную часть приложения.
CORBA поддерживает по крайней мере два различных отображения серверной стороны для того, чтобы реализовать интерфейс IDL:
Используя Модель Наследования, Вы реализуете интерфейс IDL использование класса реализации, который также расширяет сгенерированный компилятором скелет.
Модели наследования включают:
Отображение серверной стороны по умолчанию, сгенерированное, когда или -fall или параметры -fserver используются, соответствует Главе 11, Переносимый Объектный Адаптер (POA) CORBA 2.3.1 Спецификации
Преимущества использования Переносимого Объектного Адаптера (POA):
ОТМЕТЬТЕ: ImplBase является obsoleted в пользу модели POA, но предоставляется, чтобы позволить совместимость с серверами, записанными в J2SE 1.3 и предшествующий. Мы не рекомендуем создать новые серверы, используя эту нестандартную модель.
Используя Модель Делегации, Вы реализуете интерфейс IDL использование двух классов:
Модель Делегации также известна как модель Связи, или модель Делегации Связи. Это наследовалось или от POA или от ImplBase сгенерированный компилятором скелет, таким образом, модели будут описаны как POA/Tie или модели ImplBase/Tie в этом документе.
Это учебное руководство представляет модель Наследования POA для реализации серверной стороны. Для учебных руководств, используя другие реализации серверной стороны, см. следующие документы:
Вы могли бы хотеть использовать модель Связи вместо типичной модели Наследования, если Ваша реализация должна наследоваться от некоторой другой реализации. Java позволяет любое число интерфейсного наследования, но есть только один слот для наследования классов. Если Вы используете модель наследования, тот слот израсходован. При использовании Модели Связи тот слот освобождается для Вашего собственного использования. Недостаток - то, что это представляет уровень абстракции: один дополнительный вызов метода происходит, вызывая метод.
Модель серверной стороны ImplBase является Моделью Наследования, как модель POA. Используйте компилятор idlj с флагом -oldImplBase, чтобы генерировать привязку серверной стороны, которая является совместимой с более старой версией IDL Java (до J2SE 1.4).
Отметьте, что использование флага -oldImplBase нестандартно: эти API являются obsoleted. Вы использовали бы этот флаг ТОЛЬКО для совместимости с существующими серверами, записанными в J2SE 1.3 или ранее. В этом случае Вы должны были бы изменить существующий MAKE-ФАЙЛ, чтобы добавить флаг -oldImplBase к компилятору idlj, иначе POA-на-основе отображения серверной стороны будут сгенерированы.