Описание и пример rmi технологии

Что относительно CORBA и J2EE?

В дополнение к IDL Java и RMI по IIOP, J2EE включает Предприятие технология JavaBeans (EJB).

является частью Платформы Java, Enterprise Edition. Серверная компонентная модель EJB упрощает разработку компонентов промежуточного программного обеспечения, которые являются транзакционными, масштабируемыми, и переносимыми. Серверы EJB уменьшают сложность разработки промежуточного программного обеспечения, оказывая автоматическую поддержку для служб промежуточного программного обеспечения, таких как транзакции, безопасность, связь базы данных, и больше.

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

  • Клиент Java, использующий ШАР от одного поставщика, может получить доступ к корпоративным компонентам, находящимся на сервере EJB, обеспеченном другим поставщиком.
  • Корпоративные компоненты в одном сервере EJB могут получить доступ к корпоративным компонентам в другом сервере EJB.
  • Платформа не-Java клиент CORBA может получить доступ к любому объекту корпоративного компонента.

Авторское право 1993, 2012, Oracle и/или его филиалы. Все права защищены.

Каков IIOP RMI?

RMI

УчебнуюRMI

RMI испытывает недостаток в функциональной совместимости с другими языками, потому что это не использует CORBA-IIOP в качестве протокола связи.

IIOP, CORBA, и IDL Java

Java (ТМ) 2 Платформы, Standard Edition (J2SE) CORBA/IIOP реализация известны как IDL Java. Наряду с компилятором idlj, IDL Java может использоваться, чтобы определить, реализовать, и получить доступ к объектам CORBA от языка программирования Java.

Веб-страница IDL Java высказывает Вам хорошее, центральное Java мнение программирования CORBA/IIOP. Чтобы получить быстрое введение в запись программ IDL Java, см. Начинание: Привет Мировая веб-страница.

Background Reading

  • The contains links to RMI-IIOP documentation, sample code, specifications,
    news, other related web sites, and more. Check it out!
  • The RMI-IIOP Tutorial gives a step-by-step example for creating and running a simple RMI-IIOP application.

  • The
    home page contains links to RMI documentation, examples, specification,
    and more. Make sure you read this.
  • The in the Java Tutorial.
  • The Java
    IDL web page will familiarize you with Sun’s CORBA/IIOP implementation.
  • The Java
    IDL Tutorial is the newest version of the IDL trail from the Java Tutorial.
  • The document is a detailed technical specification of RMI-IIOP. For further information on how the specification is implemented in this version of J2SE, see the compliance document.


RMI-IIOP Home

How to Make RMI Programs Use IIOP

  1. If you are using the RMI registry for naming services, you need
    to switch to JNDI with the CosNaming plugin. You need to do the
    following:
    1. In both your client and server code, you need to create an InitialContext
      for JNDI using the following code:
         import javax.naming.*;
         ...
         Context initialNamingContext = new InitialContext();

Modify all uses of RMI registry lookup() and bind() to
use JNDI lookup() and bind()instead. For example, instead
of your RMI server using:

         import java.rmi.*;
         ...
         Naming.rebind("MyObject", myObj);

use:

         import javax.naming.*;
         ...
         initialNamingContext.rebind("MyObject", myObj);

If the client is an applet, the client applet needs to pass this
to the JNDI CosNaming plugin. Replace the above code with the
following:

        import java.util.*;
        import javax.naming.*;
        ...
        Hashtable env = new Hashtable();
        env.put("java.naming.applet", this);
        Context ic = new InitialContext(env);

If you are not using the RMI registry for naming services, you have
some other way of bootstrapping your initial remote object reference. For
example, your server code may be using Java serialization to write an RMI
object reference to an ObjectOutputStream and passing this to
your client code for deserializing into an RMI stub.

On the server side, use the PortableRemoteObject.toStub()
call to obtain a stub, then use writeObject() to serialize this
stub to an ObjectOutputStream. The code to do this looks something
like:

On the client side, use readObject() to deserialize a remote reference
to the object from an ObjectInputStream, with code like:

Either change your remote implementation classes to inherit from javax.rmi.PortableRemoteObject,
or explicitly export implementation objects after creation by calling PortableRemoteObject.exportObject().

 

Change all the places in your code where there is a Java cast of a remote
interface to use javax.rmi.PortableRemoteObject.narrow().

 

Don’t depend on distributed garbage collection or use any of the RMI DGC
facilities. Use PortableRemoteObject.unexportObject() to unexport
objects that are no longer in use. This has no effect for objects exported
to JRMP on 1.1.6.

 

Regenerate the RMI stubs and ties using the rmic command with
the -iiop option. This will produce stub and tie files with the
following names:

     _<implementionName>_Tie.class
     _<interfaceName>_Stub.class

Before starting the server, start the CosNaming server (in its
own process) using the following command:

     tnameserv

This uses the default port number of 900. If you want to use a different
port number (for example, port 1050), use the ORBInitialPort modifier:

     tnameserv -ORBInitialPort 1050

When starting client and server applications, specify the following system
properties:

     java -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory
          -Djava.naming.provider.url=iiop://<hostname>:900
           <appl_class>

This example uses the default name service port number of 900. If you specified
a different port in step 7, you need to use the same port number in the
provider URL here. The <hostname> in the provider URL is the host name
that was used to start the CosNaming server in step 7.
If the client is an applet, specify the following properties in the applet
tag:

     java.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory
     java.naming.provider.url=iiop://<hostname>:900

This example uses the default name service port number of 900. If you specified
a different port in step 7, you need to use the same port number in the
provider URL here. The <hostname> in the provider URL is the host name
that was used to start the CosNaming server in step 7.

Restrictions When Running RMI Programs Over IIOP

  1. Make sure all constant definitions in remote interfaces are of
    primitive types or String and evaluated at compile time.
  2. Don’t use Java names that conflict with IDL mangled names
    generated by the Java to IDL mapping rules. See section 28.3.2 of
    the Java Language to
    IDL Mapping
    specification for the Java to IDL name mapping
    rules.
  3. Don’t inherit the same method name into a remote interface more
    than once from different base remote interfaces.
  4. Be careful when using names that differ only in case. The use
    of a type name and a variable of that type whose name differs from
    the type name only in case is supported. Most other combinations of
    names that differ only in case are not supported.
  5. Don’t depend on runtime sharing of object references to be
    preserved exactly when transmitting object references across IIOP.
    Runtime sharing of other objects is preserved correctly.
  6. Don’t use the following features of RMI:
    • RMISocketFactory
    • UnicastRemoteObject
    • Unreferenced
    • The Distributed Garbage Collection (DGC) interfaces

Другие Вещи Следует Знать

Взаимодействие с Другими ШАРАМИ

ОТМЕТЬТЕ: Хотя это — истина, что ШАРЫ, записанные на различных языках, должны быть в состоянии говорить с друг другом, мы не протестировали функциональную совместимость ШАРА Java с ШАРАМИ другого поставщика.

Когда я использую UnicastRemoteObject по сравнению с PortableRemoteObject?

UnicastRemoteObject должен использоваться в качестве суперкласса для объектной реализации в программировании RMI. PortableRemoteObject должен использоваться в программировании IIOP RMI. Если PortableRemoteObject используется, можно переключить транспортный протокол или на JRMP или на IIOP во время времени выполнения.

Известные проблемы

  • JNDI 1.1 не поддерживает java.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory как параметр Апплета. Вместо этого это нужно явно передать как свойство конструктору InitialContext. Эта возможность поддерживается в JNDI 1.2.
  • Выполняя Службу Именования на Солярис, следует использовать номер порта, больше чем 1024.
  • На Солярисе можно испытать «из дескрипторов файлов» проблема, запуская приложения IIOP RMI. Это может произойти, если Вы используете слишком много дескрипторов файлов, которые могут произойти, потому что каждый файл JAR в пути к классу использует один дескриптор файла и JDK, 1.1.6 установки добавляют многочисленные файлы JAR к пути к классу. Прежде, чем запустить приложения, установленные предел дескриптора файла к числу, больше чем его значение по умолчанию 64. Например, определите номер ulimit к 90 или выше, следующим образом:
  • ulimit -n 90
    

Converting the RMI Hello World Program to RMI-IIOP

RMI
Hello World example

Here’s the RMI Hello World players:

  • HelloImpl.java is the RMI server.
  • Hello.java is the remote interface implemented by HelloImpl.
  • HelloApplet.java is the RMI client.
  • Hello.html loads HelloApplet.

$HOME/jdk1.1/mysrc/example/hello$HOME/public_html/codebase$HOME

If you haven’t already, go through the RMI Hello World example. Once
you’ve completed this example, take the following steps.

Adapt the Implementation Class (Server) to RMI-IIOP:

  1. Import javax.rmi.server.PortableRemoteObject rather than javax.rmi.server.UnicastRemoteObject:
     //Goodbye
     //import java.rmi.server.UnicastRemoteObject;

     //Hello
     import javax.rmi.PortableRemoteObject;

Import the JNDI naming package:

     import javax.naming.*;

Make HelloImpl extend PortableRemoteObject rather than
UnicastRemoteObject:

     public class HelloImpl
                  extends PortableRemoteObject
                  ...

Use the JNDI registry, rather than the RMI registry, by adding the following
code:

     Context initialNamingContext = new InitialContext();

This step provides an initial JNDI naming context (and will also need to
be done in the client).
 

Use JNDI rebind(), rather than the RMI version:

Old code:

     HelloImpl obj = new HelloImpl("HelloServer");
     Naming.rebind("HelloServer", obj);

New code:

     HelloImpl obj = new HelloImpl("HelloServer"); //unchanged
     initialNamingContext.rebind("HelloServer",obj);

HelloApplet.java

  1. Import the PortableRemoteObject package:
     import javax.rmi.PortableRemoteObject;

Create a JNDI initial naming context, and pass this to the CosNaming plugin:

     import java.util.*;
     import javax.naming.*;
     ...
     Hashtable env = new Hashtable();
     env.put("java.naming.corba.applet", this);
     //The next two values will be specifiable
     //By applet tag params in future releases
     env.put("java.naming.factory.initial",
             "com.sun.jndi.cosnaming.CNCtxFactory");
     env.put("java.naming.provider.url", "iiop://<hostname>:900");
     Context ic = new InitialContext(env);

Use JNDI lookup(), rather than the RMI version, AND replace
the Java remote interface cast with a call to javax.rmi.PortableRemoteObject.narrow():

Old code:

     import java.rmi.*;
     ...
     Hello obj = (Hello)Naming.lookup("//" +
                     getCodeBase().getHost() + "/HelloServer");

New code:

     import javax.naming.*;
     ...
     Hello obj =
      (Hello)PortableRemoteObject.narrow(
                         initialNamingContext.lookup("HelloServer"),
                         Hello.class);

Specify Naming Properties in the Applet Tag

Add the following properties to Hello.html applet tag:

Compile the Java Source Files

Generate the Stub and Tie Classes

Make sure that your search path finds the rmic command in the
$RMI_IIOP_HOME/bin
directory.

Hello_Stub.classHelloImpl_Tie.class$HOME/public_html/codebase/examples/hello

Start the JNDI Name Server

Start the Hello Server

Start the Hello Client

Use appletviewer to load Hello.html.

Hello.html
appletviewerHelloServer

Классификация платформ Java

Внутри Java существуют три основных семейства технологий:

  • J2EE или Java EE (начиная с v1.5) — Java Enterprise Editon, для создания программного обеспечения уровня предприятия;
  • J2SE или Java SE (начиная с v1.5) — Java Standard Editon, для создания пользовательских приложений, в первую очередь — для настольных систем;
  • J2ME, Java ME или Java Micro Edition, для использования в устройствах, ограниченных по вычислительной мощности, в том числе мобильных телефонах, PDA, встроенных системах

Самыми популярными считаются серверные технологии семейства J2EE.
Здесь Java, действительно, держит мировое лидерство[источник?].

Последним релизом является версия 1.6, в которой было произведено улучшение системы безопасности, улучшение поддержки XML, а также добавлена поддержка скриптового языка JavaScript на основе механизма Mozilla Rhino (англ.), улучшена интеграция с рабочим столом, добавлены некоторые новые возможности в создании графических интерфейсов.

Вступление. Краткая история и особенности языка

Как-то давно мы с моим товарищем и коллегой Егором готовили обучающий курс по Java Core. Но как-то не срослось и это дело не было доведено до какого-либо логического конца. И вот, спустя время, я решил, что не стоит пропадать добру и по-этому запускаю серию статей про Java Core для самых маленьких.

Начало разработки языка было положено еще в 1991 году компанией Sun Microsystems, Inc. Вначале язык был назван Oak (Дуб), но в 1995 он был переименован в Java. Публично заявили о создании языка в 1995 году. Причиной создания была потребность в независящем от платформы и архитектуры процессора языке, который можно было бы использовать для написания программ для бытовой электротехники. Но поскольку в таких устройствах применялись различные процессоры, то использование популярных на то время языков С/С++ и прочих было затруднено, поскольку написанные на них программы должны компилироваться отдельно для конкретной платформы.

Особенностью Java, которая решила эту проблему, стало то, что компилятор Java выдает не машинный исполняемый код, а байт-код — оптимизированный набор инструкций, которые выполняются в так называемой виртуальной машин Java (JVM — Java Virtual Machine). А на соответствующую платформу предварительно устанавливается JVM с необходимой реализацией, способная правильно интерпретировать один и тот же байт-код. У такого подхода есть и слабые стороны, такие программы выполняются медленнее, чем если бы они были скомпилированы в исполняемый код.

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

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

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

Чтобы запустить Службу Именования, работать из командной строки. Эта команда не производит вывода и обычно выполняется в фоновом режиме. Для больше на инструмент, можно обратиться к страница руководства.

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

    orbd -ORBInitialPort 1060&

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

    start orbd -ORBInitialPort 1060

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

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

Restrictions When Running RMI Programs Over IIOP

  1. Make sure all constant definitions in remote interfaces are of primitive
    types or String and evaluated at compile time.
  2. Don’t use Java names that conflict with IDL mangled names generated by
    the Java to IDL mapping rules. See section 28.3.2 of the Java Language
    to IDL Mapping
    specification for the Java to IDL name mapping rules.
  3. Don’t inherit the same method name into a remote interface more than once
    from different base remote interfaces.
  4. Be careful when using names that differ only in case. The use of a type
    name and a variable of that type whose name differs from the type name
    only in case is supported. Most other combinations of names that differ
    only in case are not supported.
  5. Don’t depend on runtime sharing of object references to be preserved exactly
    when transmitting object references across IIOP. Runtime sharing of other
    objects is preserved correctly.
  6. Don’t use the following features of RMI:
  • RMISocketFactory
  • UnicastRemoteObject
  • Unreferenced
  • The DGC interfaces

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

localhost

    java 
      -classpath . 
      -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory
      -Djava.naming.provider.url=iiop://localhost:1060 
      HelloClient 
Client: Obtained a ref. to Hello server.

Окно сервера возвратит следующее сообщение:

It works! Hello World!!

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

  • , Форум Разработчика Sun для IIOP RMI. Следует зарегистрироваться в Соединении Разработчика Java, чтобы получить доступ к этому сайту.
  • Клиенты EJB взаимодействуют с J2EE EJB уровень, используя протокол IIOP RMI. Для получения дополнительной информации об использовании IIOP RMI таким образом, см. Java 2 Платформы, Enterprise Edition или .
  • Учебное руководство по IDL Java включает пример для того, чтобы выполнить клиент и сервер на различных машинах. Понятие Выполнения Привет Мирового Примера на Двух Машинах применяется к этому примеру также.

Авторское право 1993, 2012, Oracle и/или его филиалы. Все права защищены.

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

  • Удаленный интерфейс должен быть объявлен . Иначе, клиент получит ошибку, пытаясь загрузить удаленный объект, который реализует удаленный интерфейс, если тот клиент не находится в том же самом пакете как удаленный интерфейс.
  • Удаленный интерфейс расширяется интерфейс.
  • Каждый метод должен объявить (или суперкласс ) в пункт, в дополнение к любым специализированным исключениям.
  • Тип данных любого удаленного объекта, который передают как значение аргумента или возвращаемое значение (или непосредственно или встраивается в пределах локального объекта), должен быть объявлен как удаленный тип интерфейса (например, ) не реализация class ().

Для этого примера создайте все исходные файлы в том же самом каталоге, например, . Вот определение интерфейса для удаленного интерфейса, . Интерфейс содержит только один метод, :

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

public interface HelloInterface extends java.rmi.Remote {
  public void sayHello() throws java.rmi.RemoteException;
}

Что относительно CORBA и J2EE?

В дополнение к IDL Java и RMI по IIOP, J2EE включает Предприятие технология JavaBeans (EJB).

является частью Платформы Java, Enterprise Edition. Компонентная модель серверной стороны EJB упрощает разработку компонентов промежуточного программного обеспечения, которые являются транзакционными, масштабируемыми, и переносимыми. Серверы EJB уменьшают сложность разработки промежуточного программного обеспечения, оказывая автоматическую поддержку для служб промежуточного программного обеспечения, таких как транзакции, безопасность, связь базы данных, и больше.

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

  • Клиент Java, использующий ШАР от одного поставщика, может получить доступ к корпоративным компонентам, находящимся на сервере EJB, обеспеченном другим поставщиком.
  • Корпоративные компоненты в одном сервере EJB могут получить доступ к корпоративным компонентам в другом сервере EJB.
  • Платформа не-Java клиент CORBA может получить доступ к любому объекту корпоративного компонента.

Авторское право 1993, 2011, Oracle и/или его филиалы. Все права защищены.

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

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

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

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

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

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

    orbd -ORBInitialPort 1050&

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

    start orbd -ORBInitialPort 1050

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

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

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

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

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

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

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

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

Hello Server: Ready ...

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

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

    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 и Привет сервер будет продолжать работать, пока они не будут явно остановлены. На Солярисе можно остановить эти процессы, используя и команды из окна терминала. На Windows можно ввести в быстром окне, чтобы уничтожить процесс.

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

  • Клиенты EJB взаимодействуют с J2EE EJB уровень, используя протокол IIOP RMI. Для получения дополнительной информации об использовании IIOP RMI таким образом, см. Платформу Java, Enterprise Edition или .
  • Другое учебное руководство IIOP RMI включает поддержку Переносимого Объектного Адаптера (POA). Поддержка POA IIOP RMI нестандартна.
  • Учебное руководство по IDL Java включает пример для того, чтобы выполнить клиент и сервер на различных машинах. Понятие Выполнения Привет Мирового Примера на Двух Машинах применяется к этому примеру также.

Авторское право 1993, 2012, Oracle и/или его филиалы. Все права защищены.

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

Как минимум, класс реализации удаленного объекта, должен:

//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() throws java.rmi.RemoteException {
    System.out.println( "It works!  Hello World!!" );
  }
}

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

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

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

  public class HelloImpl extends PortableRemoteObject
    implements HelloInterface{

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

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

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

        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

Рассмотреть:класс реализации для удаленного объекта нуждается к:

  • Реализуйте удаленный интерфейс
  • Экспортируйте объект так, чтобы он мог принять входящие удаленные вызовы метода
  • Объявите, что его конструктор (ы) бросает, по крайней мере, a

  public HelloImpl() throws java.rmi.RemoteException { 
    super(); 
  }
  • вызов метода вызывает конструктора без параметров , который экспортирует удаленный объект.
  • Конструктор должен бросить , потому что попытка RMI экспортировать удаленный объект во время конструкции могла бы перестать работать, если коммуникационные ресурсы не доступны.

проверенное исключение, не исключение на этапе выполнения.

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

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

  public void sayHello() throws java.rmi.RemoteException {
    System.out.println( "It works!  Hello World!!" );
  }
  • По умолчанию локальные объекты передает копия, что означает, что все элементы данных (или поля) объекта копируются, кроме отмеченных как или .
  • Удаленные объекты передает ссылка. Ссылка на удаленный объект является фактически ссылкой на тупик, который является прокси клиентской стороны для удаленного объекта. Мы создадим тупики позже в этом учебном руководстве в разделе: .

Converting the Client Applet to an Application

Adapt the Client Application to RMI-IIOP:

  1. Convert HelloApplet to an application:
  • Copy HelloApplet.java (the original RMI version) to HelloApp.java.
  • Change the class name (for example, to HelloApp).
  • Remove the extends Applet clause.
  • Change init() to main().
  • Move String message ="";.
  • Eliminate the paint() method.

Use the JNDI registry, rather than the RMI registry:

     import javax.naming.*;
     ...
     Context initialNamingContext = new InitialContext();

Use JNDI lookup(), rather than the RMI version, AND replace
the Java remote interface cast with a call to javax.rmi.PortableRemoteObject.narrow():

Old code:

     import java.rmi.*;
     ...
     Hello obj = (Hello)Naming.lookup("//" +
                     getCodeBase().getHost() + "/HelloServer");
     import javax.naming.*;
     ...
     Hello obj = (Hello)PortableRemoteObject.narrow(
                         initialNamingContext.lookup("HelloServer"),
                         Hello.class);

Compile the HelloApp Source

Start the Name Server and Hello Server

Start these the same as in the applet example.

Start the Hello Application Client

Here’s how:

An Introduction To The CORBA And Java RMI-IIOP

An Introduction To The CORBA And Java RMI-IIOP

In this article, I’d like to introduce to you the Common Object Request Broker Architecture, which is abbreviated as CORBA, and its implementation in Java, which is named Java RMI-IIOP. You may think the CORBA is an outdated technology, actually it is still acting as the the basic architecture of distributed object invocation field. Many of state-of-the-art projects are built on top of CORBA. For example, Narayana, the transaction processing project provided by JBoss community, use many idl files to describe its OTS implementation interfaces. Narayana is acting as the transaction processing subsystem in Wildfly.

Java RMI is an distributed object invocation solution provided from Java community, and it was then enhenced by the RMI-IIOP standard to fully compliant with the CORBA standard. Because CORBA provides platform independency, so the Java RMI-IIOP allows the Java applications to communicate with the systems that conforms to the CORBA that is not written in Java.

The CORBA and Java RMI-IIOP technologies are usually hide from the application level to the end users, but they are broadly used in middleware level as implemenations of remoting and transaction processing subsystems. In this article, I’d like to give you an introduction on these technologies. First let’s learn how to write a CORBA application.

Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
Работатека
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: