Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Т2. Связь_Таненбаум_СРС_ПРИС.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
1.59 Mб
Скачать

2.3.3. Статическое и динамическое удаленное обращение к методам

После того как клиент свяжется с объектом, он может через заместителя обра­титься к методам объекта. Подобное удаленное обращение к методам {Remote Method Invocation, RMI) в части маршалинга и передачи параметров очень напо­минает RPC. Основное различие между RMI и RPC состоит в том, что RMI, как говорилось ранее, в основном поддерживает внутрисистемные ссылки на объекты. Кроме того, отпадает необходимость в клиентских и серверных заглушках общего назначения. Вместо них мы можем использовать значительно более удобные в ра­боте и специфические для объектов заглушки, которые мы также обсуждали.

Стандартный способ поддержки RMI — описать интерфейсы объектов на языке определения интерфейсов, так же как в RPC. Однако с тем же успехом мы мо­жем использовать объектный язык, например Java, который обеспечивает авто­матическую генерацию заглушек. Такой подход к применению предопределен­ных определений интерфейсов часто называют статическим обращением {static invocation). Статическое обращение требует, чтобы интерфейсы объекта при раз­работке клиентского приложения были известны. Также оно предполагает, что при изменении интерфейса клиентское приложение перед использованием но­вых интерфейсов будет перекомпилировано.

В качестве альтернативы обращение к методам может осуществляться более динамичным образом. В частности, иногда удобнее собрать параметры обраще­ния к методу во время исполнения. Этот процесс известен под названием дина­мического обращения {dynamic invocation). Основное его отличие от статического обращения состоит в том, что во время выполнения приложение выбирает, ка­кой метод удаленного объекта будет вызван. Динамическое обращение обычно выглядит следующим образом:

invoke(object. method. input_parameters. output_parameters);

118 Глава 2. Связь

З десь object идентифицирует распределенный объект; method — параметр, точ­но задающий вызываемый метод; input_parameters — структура данных, в кото­рой содержатся значения входных параметров метода; output_parameters — струк­тура данных, в которой хранятся возвращаемые значения.


Динамическое обращение будет выглядеть так:



В качестве примера рассмотрим добавление целого числа int к объекту fobject файла. Для этого действия объект предоставляет метод append. В этом слу­чае статическое обращение будет иметь вид:

Здесь операция id(append) возвращает идентификатор метода append. Для ил­люстрации динамического обращения рассмотрим браузер объектов, используемый для просмотра наборов объектов. Предположим, что этот браузер поддерживает удаленное обращение к объектам. Это будет означать, что браузер в состоянии выполнить привязку к распределенному объекту и предоставить пользователю интерфейс с объектом. Пользователю после этого может быть предложено вы­брать метод и ввести значения его параметров, после чего браузер сможет произ­вести действительное обращение. Обычно подобные браузеры объектов разраба­тываются так, чтобы они поддерживали любые возможные интерфейсы. Такой подход требует исследования интерфейсов во время выполнения и динамическо­го создания обращений к методам.

Другая область применения динамических обращений — службы пакетной об­работки, для которых запросы на обращение могут обрабатываться в течение всего того времени, пока обращение ожидает выполнения. Служба может быть реали­зована в виде очереди запросов на обращение, упорядоченных по времени посту­пления. Основной цикл службы просто ожидает назначения очередного запроса, удаляет его из очереди и, как это было показано ранее, вызывает процедуру invoke.