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

Учебное руководство: Начинающий Используя IIOP RMI


Это учебное руководство показывает Вам шаги, чтобы следовать, чтобы создать распределенную версию классики "Привет Мировая" программа, используя Java Удаленный Вызов метода (RMI) по интернет-Протоколу Межшара (IIOP). IIOP RMI добавляет CORBA (Общая Архитектура Посредника запросов к объектам) возможность к Java RMI, обеспечивая основанную на стандартах функциональную совместимость и связь ко многим другим языкам программирования и платформам. IIOP RMI позволяет распределенным Поддерживающим сеть приложениям Java прозрачно вызвать операции на удаленные сетевые службы, используя IIOP промышленного стандарта, определенный Группой по управлению объектами. Компоненты времени выполнения включают ШАР Java для распределенных вычислений, используя передачу IIOP.

IIOP RMI для программистов Java, которые хотят программировать к интерфейсам RMI, но IIOP использования как базовый транспорт. IIOP RMI предоставляет функциональной совместимости другие объекты CORBA, реализованные на различных языках - но только если все удаленные интерфейсы первоначально определяются как Java интерфейсы RMI. Это особенно интересно к Предприятию использования программистов JavaBeans (EJB), так как модель удаленного объекта для EJBs основана на RMI.

Другие опции для того, чтобы создать распределенные приложения:


Учебное руководство: Привет Мировое Приложение

Распределенный Привет Мировой пример использует клиентское приложение, чтобы сделать удаленный вызов метода через IIOP к серверу, работающему на узле, с которого был загружен клиент. Когда клиент работает, "Привет от MAR!" выводится на экран.

Это учебное руководство организуется следующим образом:

  1. Шаги, чтобы записать исходные файлы
  2. Шаги, чтобы скомпилировать пример
  3. Шаги, чтобы выполнить пример

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


Запишите или Загрузите Исходные файлы

Есть три задачи завершиться в этом разделе:

  1. Определите функции удаленного class как интерфейс, записанный в языке программирования Java
  2. Запишите реализации class
  3. Запишите серверу class
  4. Запишите клиентскую программу, которая использует удаленную службу
Исходные файлы, используемые в этом учебном руководстве:

Следуйте за шагами ниже, чтобы создать исходные файлы или загрузить и разархивировать HelloRMIIIOP.zip.

Определите функции удаленного class как интерфейс, записанный в языке программирования Java

В языке программирования Java удаленный объект является экземпляром class, который реализует a Remote интерфейс. Ваш удаленный интерфейс объявит каждый из методов, которые требуется вызвать от других машин. У удаленных интерфейсов есть следующие характеристики:

Для этого примера создайте все исходные файлы в том же самом каталоге, например, $HOME/mysrc/helloWorld.

значок шагаСоздайте файл HelloInterface.java. Следующий код является определением интерфейса для удаленного интерфейса, HelloInterface, который содержит только один метод, sayHello:


//HelloInterface.java
import java.rmi.Remote;

public interface HelloInterface extends java.rmi.Remote {
   public void sayHello( String from ) throws java.rmi.RemoteException;
}
Поскольку удаленные вызовы метода могут перестать работать совсем другими способами от локальных вызовов метода (из-за связанных с сетью проблем коммуникации и проблем сервера), удаленные методы сообщат о коммуникационных отказах, бросая a java.rmi.RemoteException. Если Вы хотите больше информации об отказе и восстановлении в распределенных системах, можно хотеть считать Примечание по Распределенным вычислениям.

Запишите Класс Реализации

Как минимум, реализация удаленного объекта class, HelloImpl.java должен:

значок шагаСоздайте файл HelloImpl.java. Код для этого файла следует. Объяснение каждого из предыдущих шагов следует за исходным кодом:

//HelloImpl.java
import javax.rmi.PortableRemoteObject;

public class HelloImpl extends PortableRemoteObject implements HelloInterface {
   public HelloImpl() throws java.rmi.RemoteException {
       super();     // invoke rmi linking and remote object initialization
   }

   public void sayHello( String from ) throws java.rmi.RemoteException {
       System.out.println( "Hello from " + from + "!!" );
       System.out.flush();
   }
}

Реализуйте удаленный интерфейс

В языке программирования Java, когда class объявляет, что это реализует интерфейс, контракт формируется между class и компилятором. Заключая этот контракт, class обещает, что это обеспечит тела метода, или определения, для каждых из сигнатур методов, объявленных в том интерфейсе. Методы интерфейса неявно public и abstract, так, если реализация class не выполняет свой контракт, это становится по определению abstract class, и компилятор укажут на этот факт, если class не был объявлен abstract.

Реализация class в этом примере HelloImpl. class реализации объявляет, какой удаленный интерфейс (ы) он реализует. Вот HelloImpl Объявление class:

  public class HelloImpl extends PortableRemoteObject
    implements HelloInterface{
Как удобство, реализация class может расширить удаленный class, который в этом примере является javax.rmi.PortableRemoteObject. Расширяясь PortableRemoteObject, HelloImpl class может использоваться, чтобы создать удаленный объект, который использует основанный на IIOP транспорт для передачи.

Определите конструктора для удаленного объекта

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

Кроме того, экземпляр удаленного объекта должен будет быть "экспортирован". Экспорт удаленного объекта делает доступным, чтобы принять входящие удаленные запросы метода, прислушиваясь к входящим вызовам к удаленному объекту на анонимном порту. Когда Вы расширяетесь javax.rmi.PortableRemoteObject, Ваш class будет экспортироваться автоматически после создания.

Поскольку объектный экспорт мог потенциально бросить a java.rmi.RemoteException, следует определить конструктора, который бросает a RemoteException, даже если конструктор не делает ничего иного. Если Вы забываете конструктора, javac произведет следующее сообщение об ошибке:

        HelloImpl.java:3: unreported exception java.rmi.RemoteException; must be
        caught or declared to be thrown. 
        
        public class HelloImpl extends PortableRemoteObject implements HelloInterface{
               ^ 
        1 error
Рассмотреть: реализация class для удаленного объекта нуждается к: Вот конструктор для HelloImpl class:
  public HelloImpl() throws java.rmi.RemoteException { 
    super(); 
  }
Отметьте следующее:

Хотя звонок в конструктора суперкласса без параметров, super(), происходит по умолчанию (даже если опущенный), это включается в этот пример, чтобы ясно дать понять факт, что суперкласс будет создан перед class.

Обеспечьте реализацию для каждого удаленного метода

class реализации для удаленного объекта содержит код, который реализует каждый из удаленных методов, определенных в удаленном интерфейсе. Например, вот реализация для sayHello() метод, который возвращает строку "Привет из MAR!!" к вызывающей стороне:
   public void sayHello( String from ) throws java.rmi.RemoteException {
       System.out.println( "Hello from " + from + "!!");
       System.out.flush();
   }

Параметры, или возвращаемые значения от, удаленные методы могут быть любым типом данных для платформы Java, включая объекты, пока те объекты реализуют интерфейс java.io.Serializable. Большинство базовых классов в java.lang и java.util реализуйте Serializable интерфейс. В RMI:

Запишите Класс Сервера

class сервера является class, у которого есть a main метод, который создает экземпляр реализации удаленного объекта, и связывает тот экземпляр с именем в Службе Именования. class, который содержит это main метод мог быть реализацией class непосредственно, или другой class полностью.

В этом примере, main метод является частью HelloServer.java, который делает следующее:

значок шагаСоздайте файл HelloServer.java. Исходный код для этого файла следует. Объяснение каждого из предыдущих шагов следует за исходным кодом:

//HelloServer.java
import javax.naming.InitialContext;
import javax.naming.Context;


public class HelloServer {
    public static void main(String[] args) {
        try {
            // Step 1: Instantiate the Hello servant
            HelloImpl helloRef = new HelloImpl();

            // Step 2: Publish the reference in the Naming Service 
            // using JNDI API
            Context initialNamingContext = new InitialContext();
            initialNamingContext.rebind("HelloService", helloRef );

            System.out.println("Hello Server: Ready...");

         } catch (Exception e) {
            System.out.println("Trouble: " + e);
            e.printStackTrace();
         } 
     }
}

Создайте экземпляр удаленного объекта

main метод сервера должен создать экземпляр реализации удаленного объекта, или Слугу. Например:
    HelloImpl helloRef = new HelloImpl();
Конструктор экспортирует удаленный объект, что означает, что когда-то создаваемый, удаленный объект готов принять входящие вызовы.

Опубликуйте ссылку на объект

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

Как только удаленный объект регистрируется на сервере, вызывающие стороны могут искать объект по имени (использующий службу именования), получить ссылку удаленного объекта, и затем удаленно вызвать методы на объект. В этом примере мы используем Службу Именования, которая является частью Демона Посредника запросов к объектам (orbd).

Например, следующий код связывает имя "HelloService" со ссылкой для удаленного объекта:

            // Step 2: Publish the reference in the Naming Service 
            // using JNDI API
            Context initialNamingContext = new InitialContext();
            initialNamingContext.rebind("HelloService", helloRef );

Отметьте неотступно следование за параметрами rebind вызов метода:

Запишите клиентскую программу, которая использует удаленную службу

Клиентское приложение в этом примере удаленно вызывает sayHello метод, чтобы получить строку "Привет от MAR!!" чтобы вывести на экран, когда клиентское приложение работает.

значок шагаСоздайте файл HelloClient.java. Вот исходный код для клиентского приложения:

//HelloClient.java
import java.rmi.RemoteException;
import java.net.MalformedURLException;
import java.rmi.NotBoundException;
import javax.rmi.*;
import java.util.Vector;
import javax.naming.NamingException;
import javax.naming.InitialContext;
import javax.naming.Context;

public class HelloClient {

    public static void  main( String args[] ) {
        Context ic;
        Object objref;
        HelloInterface hi;

        try {
            ic = new InitialContext();
         
        // STEP 1: Get the Object reference from the Name Service
        // using JNDI call.
            objref = ic.lookup("HelloService");
            System.out.println("Client: Obtained a ref. to Hello server.");

        // STEP 2: Narrow the object reference to the concrete type and
        // invoke the method.
            hi = (HelloInterface) PortableRemoteObject.narrow(
                objref, HelloInterface.class);
            hi.sayHello( " MARS " );

        } catch( Exception e ) {
            System.err.println( "Exception " + e + "Caught" );
            e.printStackTrace( );
            return;
        }
    }
}

Во-первых, клиентское приложение получает ссылку на реализацию удаленного объекта (рекламируемый как "HelloService") от Службы Именования, используя Интерфейс Именования и Каталога Java [ТМ] (JNDI) вызовы. Как Naming.rebind метод, Naming.lookup метод берет java.lang.String значение, представляющее имя объекта искать. Вы предоставляете Naming.lookup() имя объекта, который Вы хотите искать, и это возвращает объект, связанный с тем именем. Naming.lookup() возвращает тупик для удаленной реализации Hello взаимодействуйте через интерфейс к его вызывающей стороне (HelloClient).


Скомпилируйте Пример

Исходный код для этого примера теперь полон, и каталог содержит четыре файла: В этом разделе Вы компилируете файл реализации удаленного объекта, HelloImpl.java, чтобы создать .class файлы должны были работать rmic. Вы тогда работаете rmic компилятор, чтобы создать тупики и скелеты. Тупик является клиентским прокси для удаленного объекта, который вперед IIOP RMI призывает к серверному диспетчеру, который поочередно вперед звонок в фактическую реализацию удаленного объекта. Последняя задача состоит в том, чтобы скомпилировать остающееся .java исходные файлы, чтобы создать .class файлы.

Следующие задачи будут завершены в этом разделе:

  1. Скомпилируйте реализацию удаленного объекта
  2. Использовать rmic генерировать тупики и скелеты
  3. Скомпилируйте исходные файлы

Скомпилируйте реализацию удаленного объекта

Создать тупик и скелетные файлы, rmic компилятор должен быть выполнен на полностью определенных именах пакета скомпилированных файлов class, которые содержат реализации удаленного объекта. В этом примере файл, который содержит реализации удаленного объекта, HelloImpl.java. Генерировать тупики и скелеты:

значок шагаСкомпилировать HelloImpl.java, следующим образом:

    javac -d . -classpath . HelloImpl.java

"-d ."опция указывает, что сгенерированные файлы должны быть помещены в каталог, из которого Вы выполняете компилятор."-classpath ."опция указывает на это файлы на который HelloImpl.java зависит может быть найден в этом каталоге.

Использовать rmic генерировать скелеты и тупики

Чтобы создать CORBA-совместимый тупик и скелетные файлы, работайте rmic компилятор с -iiop опция. rmic -iiop команда берет одно или более имен class в качестве параметра и производит файлы class формы _HelloImpl_Tie.class и _HelloInterface_Stub.class. Удаленный файл реализации, HelloImpl.class, имя class, чтобы передать в этом примере.

Для объяснения rmic опции, можно сослаться на Солярис rmic страница руководства или Windows rmic страница руководства.

значок шагаСоздать тупик и скелет для HelloImpl реализация удаленного объекта, выполненная rmic как это:

    rmic -iiop HelloImpl

Предыдущая команда создает следующие файлы:

Скомпилируйте исходные файлы

значок шагаСкомпилируйте исходные файлы следующим образом:

    javac -d . -classpath . HelloInterface.java HelloServer.java HelloClient.java

Эта команда создает файлы class HelloInterface.class, HelloServer.class, и HelloClient.class. Они - удаленный интерфейс, сервер, и клиентское приложение соответственно. Для объяснения javac опции, можно сослаться на Солярис javac страница руководства или Windows javac страница руководства.


Выполните Пример

Следующие задачи будут завершены в этом разделе:
  1. Запустите Службу Именования
  2. Запустите сервер
  3. Выполните клиентское приложение

Запустите Службу Именования

Для этого примера мы будем использовать Демона Посредника запросов к объектам, orbd, который включает и Переходный процесс и Персистентную Службу Именования, и доступен с каждой загрузкой J2SE 1.4 и выше.

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

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

значок шагаЗапустите Службу Именования, работая orbd из командной строки.

Для этого примера, на операционной системе Соляриса:

    orbd -ORBInitialPort 1050&

или, на операционной системе Windows:

    start orbd -ORBInitialPort 1050

Следует определить порт, на котором можно работать orbd. Для этого примера порт 1050 выбирается, потому что в операционной среде Соляриса, пользователь должен стать корнем, чтобы запустить процесс на порту под 1024. Для больше на orbd инструмент, можно обратиться к orbd страница руководства.

Следует остановить и перезапустить сервер любое время, Вы изменяете удаленный интерфейс или используете измененные/дополнительные удаленные интерфейсы в реализации удаленного объекта. Иначе, тип ссылки на объект, связанной в Службе Именования, не будет соответствовать измененный class.

Запустите сервер

Откройте другое окно терминала и изменитесь на каталог, содержащий исходные файлы для этого примера. Команда для того, чтобы выполнить клиент была распространена ниже, чтобы облегчить читать, но должна быть введена без возвратов между строками. Следующая команда показывает, как запустить HelloServer сервер. Если Вы использовали порт кроме 1050 или узел кроме localhost запускаясь orbd инструмент, замените те значения в команде ниже с фактическими значениями, используемыми, чтобы запустить orbd.

значок шагаЗапустите Привет сервер, следующим образом:

    java 
      -classpath . 
      -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory
      -Djava.naming.provider.url=iiop://localhost:1050 
      HelloServer

Для объяснения java опции, можно сослаться на Солярис java страница руководства или Windows java страница руководства.

Вывод должен быть похожим на это:

Hello Server: Ready ...

Выполните клиентское приложение

Как только Служба Именования и сервер работают, клиентское приложение может быть выполнено. Из нового окна терминала пойдите в каталог исходного кода, и выполните клиентское приложение из командной строки, как показано ниже. Команда для того, чтобы выполнить клиент была распространена ниже, чтобы облегчить читать, но должна быть введена без возвратов между строками. Если Вы использовали порт кроме 1050 или узел кроме localhost запускаясь orbd инструмент, замените те значения в команде ниже с фактическими значениями, используемыми, чтобы запустить orbd.

значок шагаЗапустите клиентское приложение, следующим образом:

    java 
      -classpath . 
      -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory
      -Djava.naming.provider.url=iiop://localhost:1050 
      HelloClient 
После выполнения клиентского приложения Вы будете видеть вывод, подобный следованию Вашего дисплея в клиентском окне:
Client: Obtained a ref. to Hello server.

Следующее сообщение выведет на экран в окне сервера:

Hello from  MARS 

ORBD и Привет сервер будет продолжать работать, пока они не будут явно остановлены. На Солярисе можно остановить эти процессы, используя pkill orbd и pkill HelloServer команды из окна терминала. На Windows можно ввести Ctrl+C в быстром окне, чтобы уничтожить процесс.

Это завершает основное учебное руководство IIOP RMI. Если Вы готовы идти дальше к более сложным приложениям, вот некоторые источники, которые могут помочь:


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