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

IDL Java: "Привет Мировой" Пример С Серверной Моделью POA-связи

Этот документ является общим обзором того, как создать полный CORBA (Общая Архитектура Посредника запросов к объектам) приложение, используя IDL (Интерфэс Дефинитон Лэнгуэдж), чтобы определить интерфейсы и компилятор IDL Java, чтобы генерировать тупики и скелеты. Этот документ описывает использование Серверной Модели POA-связи. Вы могли бы хотеть использовать модель Связи вместо типичной модели Наследования, если Ваша реализация должна наследоваться от некоторой другой реализации. Java позволяет любое число наследования интерфейса, но есть только один слот для наследования class. Если Вы используете модель наследования, тот слот израсходован. При использовании Модели Связи тот слот освобождается для Вашего собственного использования. Недостаток - то, что это представляет уровень абстракции: один дополнительный вызов метода происходит, вызывая метод.

Другая часть этой модели программирования является Переносимым Объектным Адаптером, или POA, который разрабатывается, чтобы удовлетворить следующим целям:

Этот документ содержит:

Определение Интерфейса (Hello.idl)

Первый шаг к создаванию приложения CORBA должен определить все Ваши объекты и их интерфейсы, используя Язык определения интерфейсов OMG (IDL). IDL имеет синтаксис, подобный C++, и может использоваться, чтобы определить модули, интерфейсы, структуры данных, и больше. IDL может быть отображен на множество языков программирования. IDL, отображающийся для Java, получается в итоге в IDL к Сводке Отображения Языка Java.

Следующий код пишется в IDL OMG, и описывает объект CORBA, работа sayHello() которого возвращает строку и чей метод shutdown() завершает работу ШАРА. Чтобы узнать больше о Синтаксисе IDL OMG и Семантике, считайте Главу 3 CORBA 2.3.1 Спецификации.

Hello.idl

module HelloApp
{
  interface Hello
  {
  string sayHello();
  oneway void shutdown();
  };
};
ОТМЕТЬТЕ: при записи кода в IDL OMG не используйте имя интерфейса в качестве имени модуля. Выполнение так рискует получать непоследовательные результаты, компилируя с инструментами от различных поставщиков, таким образом подвергая опасности мобильность кода. Например, код, содержащий те же самые имена, мог быть скомпилирован с IDL в компилятор Java от Sun Microsystems и получить один результат. Тот же самый код, скомпилированный с IDL другого поставщика в компилятор Java, мог привести к различному результату.

Чтобы завершить приложение, Вы просто обеспечиваете сервер (HelloServer.java) и клиент (HelloClient.java) реализации.

Реализация Сервера (HelloServer.java)

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

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

Код, который отличается от этого в учебном руководстве по значению по умолчанию, выделяется полужирным.

HelloServer.java

// Copyright and License 
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;
  }
  
  public String sayHello(){
    return "\nHello world !!\n";
  }
  
  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); 

      // create a tie, with servant being the delegate.
      HelloPOATie tie = new HelloPOATie(helloImpl, rootpoa);

      // obtain the objectRef for the tie
      // this step also implicitly activates the object
      Hello href = tie._this(orb);
           
      // 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 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 ...");
        
  }
}
 

Реализация Клиентского приложения (HelloClient.java)

Клиент приложения в качестве примера, который следует, является тем же самым как тем, представленным в учебном руководстве по значению по умолчанию. Реализация сервера является единственным файлом, который изменяется от того примера. Клиентское приложение в качестве примера:

HelloClient.java

// Copyright and License 
 
import HelloApp.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.CORBA.*;

public class HelloClient{

  public static void main(String args[]){
  
    try{
      // create and initialize the ORB
      ORB orb = ORB.init(args, null);

      // get the root naming context
      org.omg.CORBA.Object objRef = 
          orb.resolve_initial_references("NameService");
          
      // Use NamingContextExt instead of NamingContext. This is 
      // part of the Interoperable naming Service.  
      NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
 
      // resolve the Object Reference in Naming
      String name = "Hello";
      Hello helloImpl = HelloHelper.narrow(ncRef.resolve_str(name));

      System.out.println("Obtained a handle on server object: " + helloImpl);
      System.out.println(helloImpl.sayHello());
      helloImpl.shutdown();
      }
      
    catch (Exception e) {
      System.out.println("ERROR : " + e) ;
      e.printStackTrace(System.out);
    }
  }
}
 

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

Несмотря на его простой проект, Привет Мировая программа позволяет Вам учиться и экспериментировать со всеми задачами, требуемыми разработать почти любую программу CORBA, которая использует статический вызов.

Этот пример требует службы именования, которая является службой CORBA, которая позволяет объектам CORBA быть названными посредством привязки имени к ссылке на объект. Привязка имени может быть сохранена в службе именования, и клиент может предоставить имя, чтобы получить требуемую ссылку на объект. Эти две опции для Именования Служб, поставленных с этой версией Java, SE является tnameserv, переходная служба именования, и orbd, которые содержат Службу Именования. Этот пример использует orbd.

Выполняя этот пример, помните, что при использовании программного обеспечения Соляриса следует стать корнем, чтобы запустить процесс на порту под 1024. Поэтому мы рекомендуем, чтобы Вы использовали номер порта, больше чем или равный 1024. Опция -ORBInitialPort используется, чтобы переопределить номер порта значения по умолчанию в этом примере. Следующие инструкции предполагают, что можно использовать порт 1050 для Демона Посредника запросов к объектам IDL Java, orbd. Можно заменить различным портом в случае необходимости. Выполняя эти примеры на машине Windows, subtitute наклонная черта влево (\) в путях.

Выполнять это клиент-серверное приложение на Вашей машине разработки:

  1. Создайте программные файлы или загрузите и разархивируйте файл HelloTie.zip.
  2. Изменитесь на каталог, который содержит программные файлы.
  3. Выполните компилятор IDL к Java, idlj, дважды на файле IDL, чтобы создать тупики и скелеты. Этот шаг предполагает, что Вы включали путь к Java/каталогу bin в Вашем пути.
      idlj -fall  Hello.idl
      idlj -fallTie Hello.idl
    

    Следует использовать опцию -fall с компилятором idlj, чтобы генерировать и клиент и серверную привязку. Эта командная строка генерирует серверную привязку значения по умолчанию, который принимает модель программирования POA. Опция -fallTie генерирует другой файл, HelloPOATie, который используется, чтобы создать Связь. Для получения дополнительной информации по опциям idlj соединитесь с опциями компилятора IDL к Java.

    Компилятор idlj генерирует много файлов. Фактическое число сгенерированных файлов зависит от опций, выбранных, когда файл IDL компилируется. Сгенерированные файлы обеспечивают стандартную функциональность, таким образом, можно проигнорировать их, пока не пора развернуть и выполнить Вашу программу. Файлы, сгенерированные компилятором idlj для Hello.idl, с параметром командной строки -fall:

    Файлы, сгенерированные компилятором idlj для Hello.idl, с параметром командной строки -fallTie:

  4. Скомпилируйте файлы .java, включая тупики и скелеты (которые находятся в каталоге HelloApp). Этот шаг предполагает, что Java/каталог bin включается в Ваш путь.
       javac *.java HelloApp/*.java
    
  5. Запустите orbd.

    Чтобы запустить orbd с командного процессора UNIX, войдите:

      orbd -ORBInitialPort 1050 -ORBInitialHost localhost&
    

    От системного приглашения MS-DOS (Windows) войдите:

      start orbd -ORBInitialPort 1050 -ORBInitialHost localhost
    

    Отметьте, что 1050 является портом, на котором Вы хотите, чтобы сервер имени работал. -ORBInitialPort является необходимым параметром командной строки. Отметьте, что при использовании программного обеспечения Соляриса, следует стать корнем, чтобы запустить процесс на порту под 1024. Поэтому мы рекомендуем, чтобы Вы использовали номер порта, больше чем или равный 1024.

    -ORBInitialHost является дополнительным параметром командной строки. Для этого примера, начиная с обоих клиентов и серверов при работе машины разработки, мы установили узел localhost. Разрабатывая больше чем на одной машине, Вы замените это именем узла. Для примера того, как выполнить эту программу на двух машинах, см. Выполнение Привет Мировой Программы на 2 машинах.

  6. Запустите Привет сервер.

    Чтобы запустить Привет сервер от командного процессора UNIX, войдите:

      java HelloServer -ORBInitialPort 1050 -ORBInitialHost localhost&
    

    От системного приглашения MS-DOS (Windows) войдите:

      start java HelloServer -ORBInitialPort 1050 -ORBInitialHost localhost
    

    Для этого примера можно опустить -ORBInitialHost localhost, так как сервер имени работает на том же самом узле как Привет сервер. Если сервер имени работает на различном узле, используйте -ORBInitialHost nameserverhost, чтобы определить узел, на котором работает сервер имени IDL.

    Определите сервер имени (orbd) порт как сделано в предыдущем шаге, например, -ORBInitialPort 1050.

    Сервер запускается и echos следующее сообщение назад к терминалу:

    HelloServer ready and waiting ...
    
  7. Выполните клиентское приложение:
      java HelloClient -ORBInitialPort 1050 -ORBInitialHost localhost
    

    Для этого примера можно опустить -ORBInitialHost localhost, так как сервер имени работает на том же самом узле как Привет клиент. Если сервер имени работает на различном узле, используйте -ORBInitialHost nameserverhost, чтобы определить узел, на котором работает сервер имени IDL.

    Определите сервер имени (orbd) порт как сделано в предыдущем шаге, например, -ORBInitialPort 1050.

    Клиент работает и echos следующая информация назад к терминалу:

    Obtained a handle on server object: IOR: 
    ...
    Hello World!
    Hello Server Exiting ...
    

Когда Вы закончили это учебное руководство, убедиться, что завершили работу или уничтожили сервер имени (orbd). Чтобы сделать это от командной строки DOS, выберите окно, которое выполняет orbd, и введите Ctrl+C, чтобы завершить работу этого. Чтобы сделать это от оболочки Unix, найдите процесс, и уничтожьте его. Сервер имени будет продолжать ожидать вызовов, пока он не будет явно остановлен.

Запущение Привет Мирового Приложения на Двух Машинах описывает один способ распределить простое приложение через две машины - клиент и сервер.


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