Классы и интерфейсы механизма RMI . Архитектура и конфигурирование RMI

RMI-технология позволяет выполнять прозрачный запуск методов объектов Java, которые расположены на удаленных машинах, таким образом, как если бы они располагались на локальных машинах. RMI – позволяет строить приложения, работа которых распределена между несколькими машинами в архитектуре клиент-сервер.

Интерфейсы: основа RMI. На основе использования интерфейсов было достигнуто разделения описания поведения (интерфейс) и реализации этого поведения(классы). Такое разделение соответствует принятой практике, в которой клиенты знают об определениях служб, а серверы предоставляют эти службы. В RMI интерфейсы определяют поведение, а классы – реализацию. RMI поддерживает два класса, реализующих один и тот же интерфейс: первый реализует поведения и исполняется на сервере, второй класс работает как промежуточный интерфейс для удаленной службы и исполняется на клиентской машине.

Уровни архитектуры RMI: первый - уровень заглушки и скелета, обслуживающий пользователя. Этот уровень перехватывает вызовы методов, произведенные клиентом при помощи переменной - ссылки на интерфейс, и переадресует их в удаленную службу RMI. используется пользователем. В прокси-модели, используемой в RMI, роль прокси выполняет класс заглушки, а роль RealSubject выполняет класс, реализующий удаленную службу. Скелет является вспомогательным классом, который создается для использования RMI. Скелет понимает, как взаимодействовать с заглушкой при RMI-соединении. Он читает параметры для вызова метода из соединения, производит вызов объекта, реализующего удаленную службу, принимает возвращаемое значение и записывает его обратно в заглушку. Второй – уровень удаленной ссылки. Предоставляет объект RemoteRef , который обеспечивает соединение с объектами, реализующими удаленные службы. Этот уровень понимает, как интерпретировать и управлять ссылками на удаленные объекты служб. Это соединение является связью типа один к одному (однонаправленное соединение). Третий - Транспортный уровень, основанный на соединениях TCP/IP между сетевыми машинами. Он обеспечивает основные возможности соединения и некоторые стратегии защиты от несанкционированного доступа. При использовании уровневой архитектуры каждый из уровней может быть изменен или заменен без воздействия на остальную систему. Даже если две JVM работают на одном и том же физическом компьютере, они соединяются через стек сетевых протоколов TCP/IP. Это соединение основано на адресе IP и номере порта, либо имя DNS; На вершине TCP/IP RMI использует протокол уровня соединения, называемый Java Remote Method Protocol (JRMP). JRMP является частным, основанным на потоках , протоколом , который только частично специфицирован в настоящее время в двух версиях.

Суть: При вызове метода удаленного объекта на самом деле вызывается обычный метод языка Java, инкапсулированный в специальном объекте-заглушке (stub), который является представителем серверного объекта. Заглушка находится на клиентском компьютере, а не на сервере. Она упаковывает параметры удаленного метода в блок байтов. Каждый параметр кодируется с помощью алгоритма, обеспечивающего независимость от аппаратуры. При этом объекты подвергаются сериализации. Процесс кодирования параметров называется развертыванием параметров (parameter marshaling). Основная цель развертывания параметров — преобразование их в формат, пригодный для передачи параметров от одной виртуальной машины к другой. Метод, принадлежащий заглушке, создает блок, в который входят следующие элементы: 1. идентификатор удаленного объекта; 2. описание вызываемого метода; 3. развернутые параметры. Затем метод заглушки посылает эту информацию серверу. Далее объект-получатель выполняет для каждого вызова удаленного метода следующие действия: 1. свертывание параметров; 2. поиск вызванного объекта; 3. вызов заданного метода; 4. извлечение и развертывание возвращаемого значения или исключения, сгенерированного данным методом; 5. передача пакета, состоящего из развернутых возвращаемых данных, объекту-заглушке на клиентском компьютере.Клиентский объект-заглушка свертывает возвращаемое значение или исключение, полученное с сервера. Результат свертывания становится возвращаемым значением метода заглушки. Если удаленный метод возвращает исключение, то объект-заглушка повторит его в среде объекта-клиента.