Удаленный вызов метода Java ( Java RMI ) — это Java API , который выполняет удаленный вызов метода , объектно-ориентированный эквивалент удаленных вызовов процедур (RPC), с поддержкой прямой передачи сериализованных классов Java и распределенной сборки мусора .
Исходная реализация зависит от механизмов представления классов виртуальной машины Java (JVM) и, таким образом, поддерживает только вызовы от одной JVM к другой. Протокол, лежащий в основе этой реализации только для Java, известен как протокол удаленного метода Java (JRMP). Для поддержки кода, работающего в контексте, отличном от JVM, программисты позже разработали версию CORBA .
Использование термина RMI может обозначать исключительно интерфейс программирования или может означать как API, так и JRMP, IIOP или другую реализацию, тогда как термин RMI-IIOP (читай: RMI поверх IIOP ) конкретно обозначает интерфейс RMI, делегирующий большую часть функций поддерживающая реализация CORBA .
Основная идея Java RMI, протокола распределенной сборки мусора (DGC) и большая часть архитектуры, лежащей в основе исходной реализации Sun, взяты из функции «сетевых объектов» Modula-3 .
Программисты исходного API RMI несколько обобщили код для поддержки различных реализаций, таких как транспорт HTTP . Кроме того, в CORBA была добавлена возможность передавать аргументы « по значению » для обеспечения совместимости с интерфейсом RMI. Тем не менее, реализации RMI-IIOP и JRMP не имеют полностью идентичных интерфейсов.
Функциональность RMI поставляется в пакете java.rmi
, тогда как большая часть реализации Sun находится в sun.rmi
пакете. Обратите внимание, что в версиях Java, предшествующих Java 5.0, разработчикам приходилось компилировать заглушки RMI на отдельном этапе компиляции с использованием rmic
. Версия Java 5.0 и более поздние версии больше не требуют этого шага.
Jini предлагает более продвинутую версию RMI на Java. Он функционирует аналогично, но обеспечивает более продвинутую безопасность, возможности обнаружения объектов и другие механизмы для приложений с распределенными объектами. [1]
Следующие классы реализуют простую клиент-серверную программу, использующую RMI, которая отображает сообщение.
RmiServerIntf
интерфейсимпортировать java.rmi.Remote ; импортировать java.rmi.RemoteException ; общедоступный интерфейс RmiServerIntf расширяет Remote { String getMessage () выдает RemoteException ; }
RmiServer
сортимпортировать java.rmi.Naming ; импортировать java.rmi.RemoteException ; импортировать java.rmi.server.UnicastRemoteObject ; импортировать java.rmi.registry.* ; общественный класс RmiServer расширяет UnicastRemoteObject реализует RmiServerIntf { public static Final String MESSAGE = "Hello World" ; public RmiServer () выдает RemoteException { super ( 0 ); // требуется, чтобы избежать шага 'rmic', см. ниже } public String getMessage () { return MESSAGE ; } public static void main ( String args [] ) выдает исключение { System . вне . println ( "Сервер RMI запущен" ); try { //специальный обработчик исключений для создания реестра LocateRegistry . создать реестр ( 1099 ); Система . вне . println ( "Реестр Java RMI создан." ); } catch ( RemoteException e ) { //ничего не делать, ошибка означает, что реестр уже существует System . вне . println ( "Реестр Java RMI уже существует." ); } // Создание экземпляра RmiServer Сервер RmiServer = новый RmiServer (); // Привязываем этот экземпляр объекта к имени «RmiServer» Naming . перепривязка ( «//localhost/RmiServer» , сервер ); Система . вне . println ( "PeerServer привязан к реестру" ); } }
RmiClient
сортимпортировать java.rmi.Naming ; общественный класс RmiClient { public static void main ( String args [] ) выдает исключение { RmiServerIntf server = ( RmiServerIntf ) Именование . поиск ( «//localhost/RmiServer» ); Система . вне . println ( server.getMessage ( ) ); } }
Прежде чем запустить этот пример, нам нужно создать файл-заглушку для используемого нами интерфейса. Для этой задачи у нас есть компилятор RMI — «rmic».
rmic RmiServer
Обратите внимание, что начиная с версии 5.0 J2SE была добавлена поддержка динамически генерируемых файлов-заглушек, а rmic предоставляется только для обратной совместимости с более ранними средами выполнения [3] или для программ, которые не предоставляют явный номер порта (или ноль) при экспорте. удаленные объекты, что необходимо для создания заглушек, как описано в Javadoc для UnicastRemoteObject. См. комментарий в конструкторе выше.
java.rmi
(Справочник Sun по Java API для пакета RMI)