Spec-Zone .ru
спецификации, руководства, описания, API
Содержание документации

Начинание с IDL Java:
Разработка Привет Мирового Сервера

Сервер в качестве примера состоит из двух классов, слуги и сервера. Слуга, HelloImpl, является реализацией интерфейса IDL Hello; каждый экземпляр Hello реализуется экземпляром HelloImpl. Слуга является подклассом HelloPOA, который сгенерирован компилятором idlj от IDL в качестве примера.

Слуга содержит один метод для каждой работы IDL, в этом примере, методах sayHello() И shutdown(). Методы слуги точно так же как обычные методы Java; дополнительный код, чтобы иметь дело с ШАРОМ, с параметрами маршалинга и результатами, и так далее, обеспечивается скелетом.

У класса сервера есть метод main() сервера, который:

Этот урок представляет основы записи сервера CORBA. Для примера "Привет Мировой" программы с персистентным объектным сервером см. Пример 2: Привет Мир с Постоянным состоянием. Для большего количества обсуждения серверов CORBA см. Серверы Разработки.

Шаги в этом покрытии урока:

  1. Создание HelloServer.java
  2. Понимание HelloServer.java
  3. Компиляция Привет Мирового Сервера

Создание HelloServer.java

Создать HelloServer.java,

  1. Запустите свой текстовый редактор и создайте файл под названием HelloServer.java в Вашем основном каталоге проекта, Hello.
  2. Введите следующий код для HelloServer.java в текстовом файле. Следующий раздел, Понимая 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 ...");
            
      }
    }
     
    
  3. Сохраните и закройте HelloServer.java.

Понимание HelloServer.java

Этот раздел объясняет каждую строку 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 могут выдать системные исключения 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() ШАРА передает в параметрах командной строки сервера, разрешая Вам установить определенные свойства во время выполнения.

Получите Ссылку на Корневой POA и Активируйте POAManager

ШАР получает начальные ссылки на объект на службы, такие как служба имен, используя метод 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.

Управление Объектом Слуги

Сервер является процессом, который инстанцирует одного или более объектов слуги. Слуга наследовался от интерфейса, сгенерированного idlj, и фактически выполняет работу операций в том интерфейсе. Наш HelloServer нуждается в HelloImpl.

Инстанцирование Объекта Слуги

Мы инстанцируем объекта слуги в блоке 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);

Работа с Именованием COS

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,

  1. Изменитесь на каталог Hello.
  2. Выполните компилятор Java на HelloServer.java:
    javac HelloServer.java HelloApp/*.java
    
  3. Исправьте любые ошибки в своем файле и перекомпилируйте в случае необходимости.
  4. Файлы HelloServer.class и HelloImpl.class сгенерированы в каталоге Hello.

Выполнение Привет Мирового Сервера

Запущение Привет Мирового Приложения обсуждает рабочий HelloServer и остальную часть приложения.


Понимание Моделей Реализации Серверной стороны

CORBA поддерживает по крайней мере два различных отображения серверной стороны для того, чтобы реализовать интерфейс IDL:

Это учебное руководство представляет модель Наследования POA для реализации серверной стороны. Для учебных руководств, используя другие реализации серверной стороны, см. следующие документы:


Для получения дополнительной информации

Исключения: Системные Исключения
Объясняет, как системные исключения CORBA работают, и обеспечивает детали о незначительных кодах системных исключений IDL Java
Разработка Серверов
Интересные темы покрытий для программистов сервера CORBA
Служба Именования IDL Java
Покрывает Службу Именования COS более подробно

Oracle и/или его филиалы Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.
Свяжитесь с Нами