Лабораторная работа: Удаленный вызов методом RMI

Уровни архитектуры RMI

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

Следующий уровень – уровень удаленной ссылки. Этот уровень понимает, как интерпретировать и управлять ссылками на удаленные объекты служб. В JDK 1.1 этот уровень соединяет клиентов с удаленными объектами служб, которые исполняются на сервере. Это соединение является связью типа один к одному (однонаправленное соединение). В Java 2 SDK этот уровень был расширен поддержкой активации пассивных удаленных объектов при помощи технологии Remote Object Activation .

Транспортный уровень основан на соединениях ТСР/IР между сетевыми машинами. Он обеспечивает основные возможности соединения и некоторые стратегии защиты от несанкционированного доступа.

При использовании уровневой архитектуры каждый из уровней может быть изменен или заменен без воздействия на остальную систему. Например, транспортный уровень может быть заменен протоколом UDP/IP без изменения остальных уровней.

Уровень заглушки и скелета

Уровень заглушки и скелета RMI расположен непосредственно перед разработчиком Java. На этом уровне RMI использует прокси-модель проектирования, которая описана в книге Gamma, Helm, Johnson и Vlissides «DesignPatterns». В прокси-модели объект одного контекста представляется другим (прокси-объектом) в отдельном контексте. Прокси-объект знает, как направлять вызовы методов между этими объектами. На следующей диаграмме классов показана прокси-модель.

В прокси-модели, используемой в RMI, роль прокси выполняет класс заглушки, а роль RealSubject выполняет класс, реализующий удаленную службу.

Скелет является вспомогательным классом, который создается для использования RMI. Скелет понимает, как взаимодействовать с заглушкой при RMI‑соединении. Скелет поддерживает общение с заглушкой; он читает параметры для вызова метода из соединения, производит вызов объекта, реализующего удаленную службу, принимает возвращаемое значение и записывает его обратно в заглушку.

В реализации RMIJava 2 SDK новый протокол связи сделал классы скелетов не нужными. RMI использует отражение для установления соединения с объектом удаленной службы. Вы должны использовать классы и объекты скелетов только в JDK 1.1 и совместимых с ним реализациях систем.

Уровень удаленных ссылок

Уровни удаленных ссылок определяют и поддерживают семантику вызовов соединения RMI. Этот урове предоставляет объект RemoteRef, который обеспечивает соединение с объектами, реализующими удаленные службы.

Объекты заглушки используют метод invoke() в объекте RemoteRef для направления вызова метода. Объект RemoteRef понимает семантику вызова удаленных служб.

Реализация RMI в JDK 1.1 обеспечивает только один способ соединения клиентов с реализациями удаленных служб: однонаправленное соединение типа точка-точка. Перед тем, как клиент сможет использовать удаленную службу, экземпляр объекта, реализующего ее, должен быть создан на сервере и экспортирован в систему RMI. (Если это основная служба, она также должна быть поименована и зарегистрирована в реестре RMI).

Реализация RMI в Java 2 SDK добавляет новую семантику для соединения клиент-сервер. В этой версии RMI поддерживает способные к активизации удаленные объекты. Когда производится вызов метода прокси для такого объекта, RMI определяет, находится ли объект, реализующий удаленную службу, в пассивном состоянии. Если да, то RMI создаст экземпляр объекта и восстановит его состояние из дискового файла. Как только объект активизируется в памяти, он начинает вести себя так же, как и объект, реализующий удаленную службу JDK 1.1.

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

Транспортный уровень

Транспортный уровень осуществляет соединение между различными JVM. Все соединения представляют собой основанные на потоках сетевые соединения, использующие TCP/IP.

Даже если две JVM работают на одном и том же физическом компьютере, они соединяются через стек сетевых протоколов TCP/IP. (Вот почему вы должны иметь действующую конфигурацию TCP/IP на вашем

компьютере для выполнения упражнений этого курса). На следующей диаграмме показаны TCP/IP соединения между разными JVM. Транспортный уровень RMI был разработан для осуществления соединения между клиентами и сервером даже с учетом сетевых помех.

Хотя транспортный уровень предпочитает использовать несколько ТСР/IР соединений, некоторые сетевые конфигурации разрешают только одно TCP/IP‑соединение между клиентом и сервером (некоторые броузеры ограничивают апплеты одним сетевым соединением с их сервером).

В этом случае, транспортный уровень распределяет несколько виртуальных соединений внутри одного TCP/IP‑соединения.

Именование удаленных объектов

При рассмотрении архитектуры RMI постоянно откладывался один вопрос: «Как клиент находит удаленную службу RMI?» Сейчас вы получите ответ на этот вопрос. Клиенты находят удаленные службы, используя службу имен или каталогов. Это может показаться хождением по кругу. Как клиент может найти службу, используя службу? И это действительно так. Служба имен или каталогов исполняется на хорошо известном хосте и имеет известный номер порта. (Хорошо известный означает, что все в организации знают об этом).

RMIможет использовать много различных служб каталогов, включая JavaNamingandDirectoryInterface (JNDI). RMI и сама включает в себя простую службу, называемую реестром RMI, rmiregistry. Реестр RMI работает на каждой машине, содержащей объекты удаленных служб и принимающей запросы на обслуживание, по умолчанию используя порт 1099.

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

На стороне клиента к реестру RMI доступ обеспечивается через статический класс Naming . Он предоставляет метод lookup (), который клиент использует для запросов к реестру. Метод lookup() принимает URL, указывающий на имя хоста и имя требуемой службы. Метод возвращает удаленную ссылку на обслуживающий объект. URL принимает следующий вид:

rmi:// <host_name>

[:<name_service_port>] /<service_name>

К-во Просмотров: 303
Бесплатно скачать Лабораторная работа: Удаленный вызов методом RMI