Вызов удаленного метода Java - Java remote method invocation

Типичная модель реализации Java-RMI с использованием заглушка и скелет объекты. Java 2 SDK, Standard Edition, v1.2 устраняет необходимость в каркасе.

В вычисление, то Вызов удаленного метода Java (Java RMI) это Ява API который выполняет вызов удаленного метода, объектно-ориентированный эквивалент вызовы удаленных процедур (RPC), с поддержкой прямой передачи сериализованный Классы Java и распределенный сборщик мусора.

Исходная реализация зависит от Виртуальная машина Java (JVM) механизмы представления классов, поэтому он поддерживает только вызовы от одной JVM к другой. Протокол, лежащий в основе этой реализации только для Java, известен как Протокол удаленного метода Java (JRMP). Чтобы поддерживать код, работающий в контексте, отличном от JVM, программисты позже разработали CORBA версия.

Использование термина RMI может обозначать исключительно программный интерфейс или может обозначать как API, так и JRMP, IIOP, или другая реализация, тогда как термин RMI-IIOP (читайте: RMI over IIOP ) специально обозначает интерфейс RMI, делегирующий большую часть функций вспомогательной CORBA выполнение.

Основная идея Java RMI, протокола распределенной сборки мусора (DGC) и большая часть архитектуры, лежащей в основе исходной реализации Sun, исходят из функции «сетевых объектов» Модула-3.

Обобщенный код

Программисты исходного RMI API несколько обобщили код для поддержки различных реализаций, таких как HTTP транспорт. Кроме того, возможность передавать аргументы "по стоимости "был добавлен в CORBA для обеспечения совместимости с интерфейсом RMI. Тем не менее, реализации RMI-IIOP и JRMP не имеют полностью идентичных интерфейсов.

Функциональность RMI входит в комплект java.rmi, в то время как большая часть реализации Sun находится в sun.rmi упаковка. Обратите внимание, что в версиях Java до Java 5.0 разработчикам приходилось компилировать заглушки RMI на отдельном этапе компиляции, используя rmic. Версия 5.0 Java и выше больше не требует этого шага.

Версия Jini

Джини предлагает более продвинутую версию RMI на Java. Он работает аналогично, но обеспечивает более продвинутую безопасность, возможности обнаружения объектов и другие механизмы для приложений с распределенными объектами.[1]

Пример

Следующие классы реализуют простую клиент-серверную программу с использованием RMI, которая отображает сообщение.

RmiServer учебный класс - слушает запросы RMI и реализует интерфейс, который используется клиентом для вызова удаленных методов.

импорт java.rmi.Naming;импорт java.rmi.RemoteException;импорт java.rmi.server.UnicastRemoteObject;импорт java.rmi.registry. *;общественный учебный класс RmiServer расширяет UnicastRemoteObject орудия RmiServerIntf {    общественный статический окончательный Нить СООБЩЕНИЕ = "Привет, мир";    общественный RmiServer() бросает RemoteException {        супер(0); // требуется, чтобы избежать шага rmic, см. ниже    }    общественный Нить getMessage() {        возвращаться СООБЩЕНИЕ;    }    общественный статический пустота главный(Нить аргументы[]) бросает Исключение {        Система.из.println("Сервер RMI запущен");        пытаться { // специальный обработчик исключений для создания реестра            Найдите Реестр.createRegistry(1099);            Система.из.println("Реестр java RMI создан".);        } ловить (RemoteException е) {            // ничего не делаем, ошибка означает, что реестр уже существует            Система.из.println(«Реестр Java RMI уже существует».);        }                   // Создание экземпляра RmiServer        RmiServer сервер = новый RmiServer();        // Связываем этот экземпляр объекта с именем "RmiServer"        Именование.переплетать("// localhost / RmiServer", сервер);        Система.из.println(«PeerServer привязан к реестру»);    }}

RmiServerIntf интерфейс - определяет интерфейс, который используется клиентом и реализуется сервером.

импорт java.rmi.Remote;импорт java.rmi.RemoteException;общественный интерфейс RmiServerIntf расширяет Удаленный {    Нить getMessage() бросает RemoteException;}

RmiClient учебный класс - это клиент, который получает ссылку (прокси) на удаленный объект, живущий на сервере, и вызывает его метод для получения сообщения. Если бы объект сервера реализовал java.io.Serializable вместо java.rmi.Remote, он был бы сериализован и передан клиенту в качестве значения.[2]

импорт java.rmi.Naming;общественный учебный класс RmiClient {    общественный статический пустота главный(Нить аргументы[]) бросает Исключение {        RmiServerIntf сервер = (RmiServerIntf)Именование.искать("// localhost / RmiServer");        Система.из.println(сервер.getMessage());    }}

Перед запуском этого примера нам нужно создать «заглушку» для интерфейса, который мы использовали. Для этой задачи у нас есть компилятор RMI - rmic

  • Примечание: мы делаем заглушку из файла '* .class' с реализацией удаленного интерфейса, а не из файла '* .java'.
rmic RmiServer

Обратите внимание, что начиная с версии 5.0 J2SE была добавлена ​​поддержка динамически генерируемых файлов-заглушек, а rmic предоставляется только для обратной совместимости с более ранними средами выполнения,[3] или для программ, которые не предоставляют явный номер порта (или ноль) при экспорте удаленных объектов, что требуется для возможности создания заглушек, как описано в документации Javadoc для UnicastRemoteObject. См. Комментарий в конструкторе выше.

Рекомендации

  1. ^ Тейлор, Ян Дж (2005). От P2P к веб-службам и сетям: одноранговые узлы в мире клиент / сервер. Компьютерные коммуникации и сети. Лондон: Springer-Verlag. Дои:10.1007 / b138333. ISBN  1852338695. OCLC  827073874.[страница нужна ]
  2. ^ Уилсон, М. Джефф (10 ноября 2000 г.). «Умейте с прокси и RMI». JavaWorld. Получено 2020-07-18.
  3. ^ «Примечания к выпуску Java RMI». Oracle. Получено 9 мая 2012.

внешняя ссылка