Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции OOP c#.doc
Скачиваний:
44
Добавлен:
22.09.2019
Размер:
3.38 Mб
Скачать

3.3. Активация удаленных объектов и их время жизни

Перед доступом к удаленному объекту он должен быть создан и инициализирован. Данный процесс называется активацией. В Remoting удаленные объекты поддерживают два вида активации: серверную активацию и клиентскую активацию2.

При серверной активации инфраструктура Remoting регистрирует тип на сервере и назначает ему универсальный идентификатор ресурсов (Uniform Resource Identifier, URI). Так как каждому типу назначен некий известный URI, то такие типы получили название общеизвестных типов (well-known types). Объекты общеизвестных типов далее будут обозначаться как SAOserver activated objects.

В Remoting поддерживаются два режима серверной активации: режим Singleton и режим SingleCall. При использовании режима Singleton существует один объект для обслуживания всех вызовов клиентов. Этот объект создается инфраструктурой на стороне сервера при первой необходимости (при вызове клиентом метода объекта). Будучи активированным, Singleton-объект обслуживает вызовы своих методов от различных клиентов в течение некоторого периода времени (в течение своего времени жизни). Затем этот объект автоматически уничтожается. Singleton-объект может сохранять свое состояние между отдельными вызовами методов.

Следующий пример кода показывает конфигурирование типа на сервере в режиме Singleton:

RemotingConfiguration.RegisterWellKnownServiceType(

typeof(SomeMBRType),

"SomeURI",

WellKnownObjectMode.Singleton);

В коде используется класс System.Runtime.Remoting.RemotingConfiguration для регистрации типа с именем SomeMBRType. Клиент также должен сконфигурировать тип SomeMBRType как общеизвестный в режиме Singleton:

RemotingConfiguration.RegisterWellKnownClientType(

typeof(SomeMBRType),

"http://SomeWellKnownURL:Port/SomeURI");

Режим серверной активации SingleCall предназначен для реализации концепции объектов без сохранения состояния. Если некий тип сконфигурирован в режиме SingleCall, инфраструктура Remoting создает объект типа для каждого вызова метода типа. После вызова метода объект уничтожается. Следующий пример демонстрирует конфигурирование типа в режиме SingleCall:

RemotingConfiguration.RegisterWellKnownServiceType(

typeof(SomeMBRType),

"SomeURI",

WellKnownObjectMode.SingleCall);

С точностью до последнего параметра этот фрагмент кода идентичен коду для случая режима Singleton. Клиентский код регистрации полностью совпадает для двух режимов.

В некоторых программных сценариях требуется, чтобы каждый клиент работал со своей копией удаленного объекта. В этом случае следует использовать клиентскую активацию. Объекты типов с клиентской активацией (далее – CAO, client activated objects) сохраняют свое состояние между вызовами методов. Такие объекты имеют определенное время жизни, после которого автоматически уничтожаются.

Приведем пример кода, конфигурирующего тип на сервере как тип для CAO:

RemotingConfiguration.RegisterActivatedServiceType(

typeof(SomeMBRType));

Соответствующий конфигурационный код на клиенте выглядит следующим образом:

RemotingConfiguration.RegisterActivatedClientType(

typeof(SomeMBRType), "http://SomeURL");

Более детально типы с клиентской активацией будут рассмотрены ниже.

Рассмотрим некоторые вопросы, связанные с отслеживанием временим жизни удаленных объектов. Эта проблема актуальна для CAO и SAO Singleton. В Remoting для управления временем жизни таких объектов используется механизм на основе лицензий и спонсоров.

Лицензия (lease) – это объект, инкапсулирующий несколько значений типа TimeSpan1. В Remoting для описания лицензий используется интерфейс ILease (пространство имен System.Runtime.Remoting.Lifetime). Интерфейс ILease определяет несколько свойств, связанных с расчетом времени жизни объекта:

  • InitialLeaseTime

  • RenewOnCallTime

  • SponsorshipTimeout

  • CurrentLeaseTime

Свойство только для чтения CurrentLeaseTime содержит время, оставшееся до истечения срока действия лицензии. Свойство InitialLeaseTime указывает на первоначальный срок лицензии. При выдаче лицензии CurrentLeaseTime устанавливается равным InitialLeaseTime. Если InitialLeaseTime равно 0, то срок лицензии никогда не заканчивается. При вызове клиентом метода удаленного объекта инфраструктура Remoting определяет время, оставшееся до истечения лицензии. Если это время меньше, чем RenewOnCallTime, то лицензия продлевается на интервал, равный RenewOnCallTime. Свойство SponsorshipTimeout определяет, как долго инфраструктура Remoting будет ожидать ответа спонсора лицензии. Все перечисленные свойства имеют тип TimeSpan.

Когда создается объект с клиентской активацией или объект с серверной активацией в режиме Singleton, исполняющая среда запрашивает у объекта лицензию, вызвав его метод InitializeLifetimeServices(). Это виртуальный метод класса MarshalByRefObject. Для реализации лицензии с нестандартными параметрами метод можно перекрыть.

В каждом домене приложения имеется специальный диспетчер лицензий, который управляет лицензиями экземпляров типов, зарегистрированных в домене2. После активации удаленного объекта связанная с ним лицензия передается диспетчеру. Диспетчер содержит таблицу, в которой сопоставлены лицензии и момент окончания их действия. Диспетчер периодически просматривает данную таблицу3. Если момент окончания действия лицензии наступил, лицензия уведомляется об этом.

Истекшие лицензии пытаются продлить себя, опросив своих спонсоров. Если у лицензии нет спонсоров или никто из спонсоров не продлил ее, то лицензия уведомляет диспетчер о том, что ее следует удалить из таблицы лицензий, и связанный с лицензией удаленный объект уничтожается.

Спонсор – это объект, который может продлить лицензию. Класс спонсора должен реализовывать System.Runtime.Remoting.Lifetime.ISponsor. Спонсоры могут размещаться как на клиенте, так и на сервере, а значит, класс спонсора должен быть MBR-типом. Созданного спонсора разрешается связать с лицензией, вызвав метод ILease.Register(). У лицензии может быть несколько спонсоров.

Рис. 7. Спонсоры и лицензии

В пространстве имен System.Runtime.Remoting.Lifetime содержится класс ClientSponsor. Это MBR-тип и он реализует интерфейс ISponsor. Класс ClientSponsor позволяет регистрировать ссылки на удаленные объекты, которые предполагается спонсировать. Когда методу ClientSponsor.Register() передается ссылка на удаленный объект, этот метод регистрирует экземпляр ClientSponsor в качестве спонсора лицензии удаленного объекта и запоминает ссылку на лицензию удаленного объекта во внутренней хэш-таблице. Интервал времени, на который спонсор продлит лицензию, задается свойством ClientSponsor.RenewalTime. Ниже показан пример использования ClientSponsor:

ClientSponsor cp = new ClientSponsor(TimeSpan.FromMinutes(5));

cp.Register(someMBR);