Удаленный вызов метода Java

Удаленный вызов метода 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
интерфейс- определяет интерфейс, который используется клиентом и реализуется сервером.
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface RmiServerIntf extends Remote {
String getMessage() throws RemoteException;
}
RmiServer
сорт- слушает запросы RMI и реализует интерфейс, который используется клиентом для вызова удаленных методов.
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.rmi.registry.*;
public class RmiServer extends UnicastRemoteObject implements RmiServerIntf {
public static final String MESSAGE = "Hello World";
public RmiServer() throws RemoteException {
super(0); // required to avoid the 'rmic' step, see below
}
public String getMessage() {
return MESSAGE;
}
public static void main(String args[]) throws Exception {
System.out.println("RMI server started");
try { //special exception handler for registry creation
LocateRegistry.createRegistry(1099);
System.out.println("java RMI registry created.");
} catch (RemoteException e) {
//do nothing, error means registry already exists
System.out.println("java RMI registry already exists.");
}
//Instantiate RmiServer
RmiServer server = new RmiServer();
// Bind this object instance to the name "RmiServer"
Naming.rebind("//localhost/RmiServer", server);
System.out.println("PeerServer bound in registry");
}
}
RmiClient
сорт- это клиент, который получает ссылку (прокси) на удаленный объект, расположенный на сервере, и вызывает его метод для получения сообщения. Если бы объект сервера реализовал java.io.Serializable вместо java.rmi.Remote, он был бы сериализован и передан клиенту как значение. [2]
import java.rmi.Naming;
public class RmiClient {
public static void main(String args[]) throws Exception {
RmiServerIntf server = (RmiServerIntf)Naming.lookup("//localhost/RmiServer");
System.out.println(server.getMessage());
}
}
Прежде чем запустить этот пример, нам нужно создать файл-заглушку для используемого нами интерфейса. Для этой задачи у нас есть компилятор RMI — «rmic».
- Примечание: файл-заглушку мы делаем из файла *.class с реализацией удаленного интерфейса, а не из файла *.java.
rmic RmiServer
Обратите внимание, что начиная с версии 5.0 J2SE была добавлена поддержка динамически генерируемых файлов-заглушек, а rmic предоставляется только для обратной совместимости с более ранними средами выполнения. [3] или для программ, которые не предоставляют явный номер порта (или ноль) при экспорте удаленных объектов, что необходимо для возможности создания заглушек, как описано в Javadoc для UnicastRemoteObject. См. комментарий в конструкторе выше.
Ссылки
[ редактировать ]- ^ Тейлор, Ян Дж (2005). От P2P к веб-сервисам и сетям: одноранговые узлы в мире клиент/сервер . Компьютерные коммуникации и сети. Лондон: Springer-Verlag. дои : 10.1007/b138333 . ISBN 1852338695 . OCLC 827073874 . [ нужна страница ]
- ^ Уилсон, М. Джефф (10 ноября 2000 г.). «Будьте умны с прокси и RMI» . JavaWorld . Проверено 18 июля 2020 г.
- ^ «Примечания к выпуску Java RMI» . Оракул . Проверено 9 мая 2012 г.
Внешние ссылки
[ редактировать ]- «Домой удаленного вызова метода» . Технологическая сеть Oracle для разработчиков Java . Редвуд Шорс, Калифорния, США: Oracle Corporation . Проверено 14 июля 2014 г.
- Учебное пособие по Java RMI — хорошая отправная точка для изучения RMI. Также проверьте Hello World в RMI.
- онлайн-обучение Java RMI — очень хорошо подходит для обучения JavaRMI и в качестве справочного материала.
- Страница RMI в документации JDK
java.rmi
(Справочник Sun по Java API для пакета RMI)- Энн Волрат; Роджер Риггс; Джим Уолдо . «Распределенная объектная модель для системы Java» (PDF) . Архивировано (PDF) из оригинала 10 октября 2022 г. Проверено 11 февраля 2009 г.
- Программирование WebLogic RMI — введение в RMI в Oracle Weblogic.
- Общий вызов удаленного метода