В вычислениях, Java Remote Method Invocation (Java RMI ) - это Java API, который выполняет вызов удаленного метода, объектно-ориентированный эквивалент вызовов удаленных процедур (RPC), с поддержкой прямая передача сериализованных классов Java и распределенной сборки мусора.
Исходная реализация зависит от механизмов представления классов виртуальной машины Java (JVM) и, таким образом, поддерживает только создание звонки от одной JVM к другой. Протокол, лежащий в основе этой реализации только для Java, известен как (JRMP). Для поддержки кода, работающего в контексте, отличном от JVM, программисты позже разработали версию CORBA.
Использование термина RMI может обозначать исключительно программный интерфейс или может обозначать как API, так и IIOP или другую реализацию, тогда как термин RMI -IIOP (читай: RMI поверх IIOP ) конкретно обозначает интерфейс RMI, делегирующий большую часть функциональности поддерживающей реализации CORBA.
Основная идея Java RMI, протокола распределенной сборки мусора (DGC) и большая часть архитектуры, лежащей в основе оригинальной реализации Sun, исходят из функции «сетевых объектов» Modula-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. Он функционирует аналогично, но обеспечивает более продвинутую безопасность, возможности обнаружения объектов и другие механизмы для приложений с распределенными объектами.
Следующие классы реализуют простую клиент-серверную программу с использованием RMI, которая отображает сообщение.
RmiServer
class - слушает запросы RMI и реализует интерфейс, который используется клиентом для вызова удаленных методов.
импортировать java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; import java.rmi.registry. *; открытый класс RmiServer расширяет UnicastRemoteObject, реализует RmiServerIntf {общедоступный статический финальный String MESSAGE = "Hello World"; public RmiServer () выбрасывает RemoteException {super (0); // требуется, чтобы избежать шага rmic, см. ниже} public String getMessage () {return MESSAGE; } public static void main (String args) выдает исключение {System.out.println ("RMI-сервер запущен"); try {// специальный обработчик исключений для создания реестра LocateRegistry.createRegistry (1099); System.out.println ("Реестр Java RMI создан."); } catch (RemoteException e) {// ничего не делаем, ошибка означает, что реестр уже существует System.out.println («java RMI registry уже существует.»); } // Создание экземпляра RmiServer RmiServer server = new RmiServer (); // Привязать этот экземпляр объекта к имени «RmiServer» Naming.rebind («// localhost / RmiServer», server); System.out.println ("PeerServer привязан к реестру"); }}
RmiServerIntf
interface - определяет интерфейс, который используется клиентом и реализуется сервером.
импортировать java.rmi.Remote; import java.rmi.RemoteException; открытый интерфейс RmiServerIntf extends Remote {String getMessage () выбрасывает RemoteException; }
RmiClient
class - это клиент, который получает ссылку (прокси) на удаленный объект, живущий на сервере, и вызывает свой метод для получения сообщения. Если бы объект сервера реализовал java.io.Serializable вместо java.rmi.Remote, он был бы сериализован и передан клиенту в качестве значения.
import java.rmi.Naming; открытый класс RmiClient {public static void main (String args) выдает исключение {RmiServerIntf server = (RmiServerIntf) Naming.lookup ("// localhost / RmiServer"); System.out.println (server.getMessage ()); }}
Перед запуском этого примера нам нужно создать «заглушку» для интерфейса, который мы использовали. Для этой задачи у нас есть компилятор RMI - 'rmic'
rmic RmiServer
Обратите внимание, что начиная с версии 5.0 J2SE была добавлена поддержка динамически генерируемых файлов-заглушек, а rmic предоставляется только для обратной совместимости с более ранними средами выполнения или для программ, которые не предоставляют явный номер порта (или ноль) при экспорте удаленных объектов, что требуется для возможности создания заглушек, как описано в документации Javadoc для UnicastRemoteObject. См. Комментарий в конструкторе выше.
java.rmi
(Справочник Sun по Java API для пакета RMI)| journal =
()