RMI (англ. Remote Method Invocation) — программный интерфейс вызова удаленных методов в языке Java.
Распределенная объектная модель, специфицирующая, каким образом производится вызов удаленных методов, работающих на другой виртуальной машине Java.
При доступе к объектам на другом компьютере возможно вызывать методы этого объекта.
Необходимо только =
Типичная реализация модели Java-RMI, использующая объекты=
Компьютеры выступают в роли клиента и сервера только для конкретного вызова. Вполне возможно, что при выполнении следующей операции эти компьютеры поменяются ролями, то есть сервер предыдущего вызова может сам стать клиентом при обращении к объекту на другом компьютере.
При вызове метода удаленного объекта на самом деле вызывается обычный метод языка Java, инкапсулированный в специальном объекте-заглушке (stub), который является представителем серверного объекта.
Заглушка находится на клиентском компьютере, а не на сервере. Она упаковывает параметры удаленного метода в блок байтов. Каждый параметр кодируется с помощью алгоритма, обеспечивающего независимость от аппаратуры.
Например, числа всегда передаются в порядке, при котором сначала передается старший байт (big-endian). При этом объекты подвергаются сериализации.
Процесс кодирования параметров называется развертыванием параметров (parameter marshaling).
Если удаленный метод возвращает исключение, то объект-заглушка повторит его в среде объекта-клиента.
Для вызова удаленного метода используется тот же синтаксис, что и для обращения к локальному методу.
Например, чтобы вызвать метод getQuantity() объекта-заглушки centralWarehouse центрального хранилища данных на удаленном компьютере, потребуется использовать приведенный ниже код.
Для доступа к удаленным методам клиентский код всегда использует
объектные переменные типы interface. Например, с приведенным выше
методом может быть связан следующий интерфейс:
Объявление переменной для объекта, который реализует этот интерфейс, будет выглядеть так:
Интерфейсы представляют собой абстракции и содержат только перечень методов.
Переменные типа interface всегда должны быть связаны с фактическим объектом. При вызове удаленных объектов переменная ссылается на объект-заглушку. При этом клиентская программа ничего не знает о типе заглушки, а сами заглушки и связанные с ними объекты создаются автоматически.
При передаче объекта другой программе (он может быть параметром либо возвращаемым значением удаленного метода) нужен файл класса, соответствующий этому объекту. Например, метод, который возвращает значение типа Product. При компиляции клиентской программы должен быть сгенерирован файл класса Product.class.
Распределенная объектная модель, специфицирующая, каким образом производится вызов удаленных методов, работающих на другой виртуальной машине Java.
При доступе к объектам на другом компьютере возможно вызывать методы этого объекта.
Необходимо только =
- передать параметры метода на другой компьютер
- сообщить объекту о необходимости выполнения метода
- а затем получить обратно возвращаемое значение
Типичная реализация модели Java-RMI, использующая объекты=
- 'заглушки'(stub)
- и 'скелета'(skeleton).
Компьютеры выступают в роли клиента и сервера только для конкретного вызова. Вполне возможно, что при выполнении следующей операции эти компьютеры поменяются ролями, то есть сервер предыдущего вызова может сам стать клиентом при обращении к объекту на другом компьютере.
При вызове метода удаленного объекта на самом деле вызывается обычный метод языка Java, инкапсулированный в специальном объекте-заглушке (stub), который является представителем серверного объекта.
Заглушка находится на клиентском компьютере, а не на сервере. Она упаковывает параметры удаленного метода в блок байтов. Каждый параметр кодируется с помощью алгоритма, обеспечивающего независимость от аппаратуры.
Например, числа всегда передаются в порядке, при котором сначала передается старший байт (big-endian). При этом объекты подвергаются сериализации.
Процесс кодирования параметров называется развертыванием параметров (parameter marshaling).
Основная цель развертывания параметров — преобразование их в формат, пригодный для передачи параметров от одной виртуальной машины к другой.
Передача данных удалённому объекту
Метод, принадлежащий заглушке, создает блок, в который входят следующие элементы:- идентификатор удаленного объекта;
- описание вызываемого метода;
- развернутые параметры.
Получение результатов работы удалённого объекта
Затем метод заглушки посылает эту информацию серверу. Далее объект-получатель выполняет для каждого вызова удаленного метода следующие действия:- свертывание параметров;
- поиск вызванного объекта;
- вызов заданного метода;
- извлечение и развертывание возвращаемого значения или исключения, сгенерированного данным методом;
- передача пакета, состоящего из развернутых возвращаемых данных, объекту-заглушке на клиентском компьютере. (возвращаем данные)
Если удаленный метод возвращает исключение, то объект-заглушка повторит его в среде объекта-клиента.
Для вызова удаленного метода используется тот же синтаксис, что и для обращения к локальному методу.
Например, чтобы вызвать метод getQuantity() объекта-заглушки centralWarehouse центрального хранилища данных на удаленном компьютере, потребуется использовать приведенный ниже код.
1
| int q=centralWarehouse.getQuantity(“SuperSucker 100 Vacuum Cleaner”); |
1
2
3
4
5
| interface Warehouse { int getQuantity(String description) throws RemoteException; Product getProduct(Customer cust) throws RemoteException; … } |
1
| Warehouse centralWarehouse = …; |
Переменные типа interface всегда должны быть связаны с фактическим объектом. При вызове удаленных объектов переменная ссылается на объект-заглушку. При этом клиентская программа ничего не знает о типе заглушки, а сами заглушки и связанные с ними объекты создаются автоматически.
При передаче объекта другой программе (он может быть параметром либо возвращаемым значением удаленного метода) нужен файл класса, соответствующий этому объекту. Например, метод, который возвращает значение типа Product. При компиляции клиентской программы должен быть сгенерирован файл класса Product.class.