RMI

RMI

RMI (англ. Remote Method Invocation) — программный интерфейс вызова удаленных методов в языке Java.

Содержание

Описание работы

Распределенная объектная модель, специфицирующая, каким образом производится вызов удаленных методов, работающих на другой виртуальной машине Java.

При доступе к объектам на другом компьютере возможно вызывать методы этого объекта. Необходимо только передать параметры метода на другой компьютер, сообщить объекту о необходимости выполнения метода, а затем получить обратно возвращаемое значение. Механизм RMI дает возможность организовать выполнение всех этих операций.

Типичная реализация модели Java-RMI, использующая объекты 'заглушки'(stub) и 'скелета'(skeleton).

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

При вызове метода удаленного объекта на самом деле вызывается обычный метод языка Java, инкапсулированный в специальном объекте-заглушке (stub), который является представителем серверного объекта. Заглушка находится на клиентском компьютере, а не на сервере. Она упаковывает параметры удаленного метода в блок байтов. Каждый параметр кодируется с помощью алгоритма, обеспечивающего независимость от аппаратуры. Например, числа всегда передаются в порядке, при котором сначала передается старший байт (big-endian). При этом объекты подвергаются сериализации. Процесс кодирования параметров называется развертыванием параметров (parameter marshaling). Основная цель развертывания параметров — преобразование их в формат, пригодный для передачи параметров от одной виртуальной машины к другой.

Метод, принадлежащий заглушке, создает блок, в который входят следующие элементы:

  • идентификатор удаленного объекта;
  • описание вызываемого метода;
  • развернутые параметры.

Затем метод заглушки посылает эту информацию серверу. Далее объект-получатель выполняет для каждого вызова удаленного метода следующие действия:

  • свертывание параметров;
  • поиск вызванного объекта;
  • вызов заданного метода;
  • извлечение и развертывание возвращаемого значения или исключения, сгенерированного данным методом;
  • передача пакета, состоящего из развернутых возвращаемых данных, объекту-заглушке на клиентском компьютере.

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

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

  int q=centralWarehouse.getQuantity(“SuperSucker 100 Vacuum Cleaner”);

Для доступа к удаленным методам клиентский код всегда использует объектные переменные типы interface. Например, с приведенным выше методом может быть связан следующий интерфейс:

interface Warehouse {
        int getQuantity(String description) throws RemoteException;
        Product getProduct(Customer cust) throws RemoteException;}

Объявление переменной для объекта, который реализует этот интерфейс, будет выглядеть так:

 
         Warehouse centralWarehouse =;

Конечно, интерфейсы представляют собой абстракции и содержат только перечень методов. Переменные типа interface всегда должны быть связаны с фактическим объектом. При вызове удаленных объектов переменная ссылается на объект-заглушку. При этом клиентская программа ничего не знает о типе заглушки, а сами заглушки и связанные с ними объекты создаются автоматически.

При передаче объекта другой программе (он может быть параметром либо возвращаемым значением удаленного метода) нужен файл класса, соответствующий этому объекту. Например, метод, который возвращает значение типа Product. При компиляции клиентской программы должен быть сгенерирован файл класса Product.class.

При загрузке фрагментов кода по сети всегда возникают сомнения по поводу должного обеспечения безопасности. В связи с этим в приложениях с использованием RMI применяется диспетчер защиты. Он защищает заглушки от проникновения в них вирусов.

История создания

Стандарты

Пример

Класс RmiServer — отслеживает RMI запросы и реализует интерфейс, используемый клиентом для вызова удаленных методов.

import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.RMISecurityManager;
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 {
    }
 
    public String getMessage() {
        return MESSAGE;
    }
 
 
    public static void main(String args[]) {
        System.out.println("RMI server started");
 
        // Create and install a security manager
        if (System.getSecurityManager() == null) {
            System.setSecurityManager(new RMISecurityManager());
            System.out.println("Security manager installed.");
        } else {
            System.out.println("Security manager already exists.");
        }
 
        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.");
        }
 
        try {
            //Instantiate RmiServer
            RmiServer obj = new RmiServer();
 
            // Bind this object instance to the name "RmiServer"
            Naming.rebind("//localhost/RmiServer", obj);
 
            System.out.println("PeerServer bound in registry");
        } catch (Exception e) {
            System.err.println("RMI server exception:" + e);
            e.printStackTrace();
        }
    }
}

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

import java.rmi.Remote;
import java.rmi.RemoteException;
 
public interface RmiServerIntf extends Remote {
    public String getMessage() throws RemoteException;
}

RmiClient class— клиент, использующий заместителя(proxy) удаленного объекта размещенного на стороне сервера и вызывающий его методы для получения данных. Если объект сервера реализует интерфейс java.io.Serializable вместо java.rmi.Remote, то он будет сериализован и клиенту будет передано его значение значение.[1].

import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.RMISecurityManager;
 
public class RmiClient { 
    // "obj" is the reference of the remote object
    RmiServerIntf obj = null; 
 
    public String getMessage() { 
        try { 
            obj = (RmiServerIntf)Naming.lookup("//localhost/RmiServer");
            return obj.getMessage(); 
        } catch (Exception e) { 
            System.err.println("RmiClient exception: " + e); 
            e.printStackTrace(); 
 
            return e.getMessage();
        } 
    } 
 
    public static void main(String args[]) {
        // Create and install a security manager
        if (System.getSecurityManager() == null) {
            System.setSecurityManager(new RMISecurityManager());
        }
 
        RmiClient cli = new RmiClient();
 
        System.out.println(cli.getMessage());
    }
}

Перед запуском этого приложения, необходимо создать файл 'Заглушки'(Stub) для используемого интерфейса. Для этого можно воспользоваться RMI компилятором - 'rmic'

  • Внимание: заглушка создается из *.class файла содержащего реализацию удаленного интерфейса, а не из '*.java' файла*
rmic RmiServer

Файл server.policy— необходим для предоставлению серверу права TCP/IP соединения к удаленному регистру и RMI серверу.

grant {
    permission java.net.SocketPermission "127.0.0.1:*", "connect,resolve";
    permission java.net.SocketPermission "127.0.0.1:*", "accept";
};

Файл server.policy используется с помощью аргумента '-D' в Java RTE :

java.exe -Djava.security.policy=server.policy RmiServer

Файл client.policy—необходим для того, чтобы клиент смог присоединиться к серверу RMI по TCP/IP.

grant {
    permission java.net.SocketPermission "127.0.0.1:*", "connect,resolve";
};

Файл no.policy— рекомендуется использовать для клиента либо сервера при возникновения проблем с соединением.

grant {
    permission java.security.AllPermission;
};

См. также

Удалённый вызов процедур

Примечания



Wikimedia Foundation. 2010.

Игры ⚽ Поможем решить контрольную работу

Полезное


Смотреть что такое "RMI" в других словарях:

  • Rmi — Cette page d’homonymie répertorie les différents sujets et articles partageant un même nom. {{{image}}}   Sigles d une seule lettre   Sigles de deux lettres > Sigles de trois lettres …   Wikipédia en Français

  • RMI — puede referirse (entre otras cosas) a: Aeropuerto de Rímini (Italia), en su código IATA. Java Remote Method Invocation (invocación remota de métodos en Java), en informática. Radio México Internacional: emisora mexicana que transmitía en onda… …   Wikipedia Español

  • RMI — (Java Remote Method Invocation) es el mecanismo ofrecido en Java que permite a un procedimiento (método, clase,aplicación o como guste llamarlo) poder ser invocado remotamente. Una de las ventajas al diseñar un procedimiento con RMI es… …   Enciclopedia Universal

  • RMI — can refer to:In computing:* Raza Microelectronics Inc, a manufacturer of CPUs * Rights Management Information, see WIPO Internet Treaties * Java remote method invocation, a Java application programming interface * RIFF MIDI file, used in… …   Wikipedia

  • RMI — steht für: Flughafen Rimini in Italien (IATA Flughafencode) Radio Magnetic Indicator, Variante des ADF Anzeigegerätes in der Funknavigation Radio Media International, einer Nachrichtenagentur für diverse private deutschsprachige Radiosender in… …   Deutsch Wikipedia

  • RMI — Cette page d’homonymie répertorie les différents sujets et articles partageant un même nom.   Sigles d’une seule lettre   Sigles de deux lettres > Sigles de trois lettres   Sigles de quatre lettres …   Wikipédia en Français

  • RMI — Revenu Minimum d Insertion. Créé par une loi de décembre 1988. Au 31 décembre 1999, environ 1,45 million de foyers percevaient le RMI (ce qui concernait environ 2,26 millions de personnes, aussi bien en métropole que dans les DOM). Il s agit d… …   Sigles et Acronymes francais

  • RMI-IIOP — Saltar a navegación, búsqueda RMI IIOP (leído RMI sobre IIOP) denota la interfaz RMI de Java sobre el sistema CORBA. Este estándar fue creado intentando simplificar el desarrollo de las aplicaciones CORBA, mientras preservaba todos los beneficios …   Wikipedia Español

  • RMI Corporation — RMI Corporation, also known as RMI, formerly known as Raza Microelectronics, Inc., is a privately held Fabless semiconductor company headquartered in Cupertino, California, which specializes in designing CPU chips for specialized, primarily… …   Wikipedia

  • RMI (radio) — RMI logo de RMI Langue français Pays  Belgique Statut radio locale …   Wikipédia en Français


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»