RenewOnCallTime 120
SponsorshipTimeout 120
LeaseManagerPollTime 10

Обновление аренды

Как показано в таблице, время аренды по умолчанию для объекта составляет 300 секунд. Если клиент вызывает метод на объекте, когда аренда истекла, возникает исключение. Если имеется клиент, где удаленный объект может понадобиться на время более 300 с, то существует три способа обновления аренды:

□ Неявное обновление делается автоматически, когда клиент вызывает метод на удаленном объекте. Если текущее время аренды меньше, чем значение RenewOnCallTime, то аренда задается как RenewOnCallTime.

□ При явном обновлении клиент определяет новое время аренды. Это делается с помощью метода Renew() из интерфейса ILease. Доступ к интерфейсу ILease можно получить, вызывая метод GetLifetimeService() на прозрачном прокси.

□ Третьей возможностью обновления аренды является спонсорство. Клиент может создать спонсора, который реализует интерфейс ISponsor и регистрирует спонсора в службах аренды с помощью метода Register() из интерфейса ILease. Когда аренда заканчивается, у спонсора запрашивают ее продления. Механизм спонсорства используется, если на сервере требуются долгоживущие удаленные объекты.

Классы, используемые для управления временем жизни

ClientSponsor является спонсором, который реализует интерфейс ISponsor. Он применяется на клиентской стороне для продления аренды. С помощью интерфейса ILease можно получить всю информацию об аренде, все свойства аренды, а также время и состояние текущей аренды. Состояние определяется с помощью перечисления LeaseState. С помощью служебного класса LifetimeServices можно получить и задать свойства аренды для всех удаленных объектов в домене приложения.

Пример: получение информации об аренде

В этом небольшом примере кода доступ к информации аренды осуществляется с помощью вызова метода GetLifetimeService() на прозрачном прокси. Для интерфейса ILease необходимо открыть пространство имен System.Runtime.Remoting.Lifetime:

Помните, что эти действия годятся только для активизированных клиентом объектов. Экземпляры объектов SingleCall создаются для каждого вызова метода, поэтому механизм аренды не используется.

ILease lease = (ILease)obj.GetLifetimeService();

if (lease != null) {

 Console.WriteLine('Lease Configuration:');

 Console.WriteLine(

  'InitialLeaseTime: ' + lease.InitialLeaseTime);

 Console.WriteLine(

  'RenewOnCallTime: ' + lease.RenewOnCallTime);

 Console.WriteLine(

  'SponsorshipTimeout: ' + lease.SponsorshipTimeout);

 Console.WriteLine(lease.CurrentLeaseTime);

}

В результате получается следующий вывод в окне клиентской консоли:

Изменение используемых по умолчанию конфигураций аренды

Сам сервер может изменить используемую по умолчанию конфигурацию аренды для всех удаленных объектов, используя служебный класс System.Runtime.Remoting.Lifetime.LifetimeServices:

LifetimeServices.LeaseTime = TimeSpan.FromMinutes(10);

LifetimeServices.RenewOnCallTime = TimeSpan.FromMinutes(2);

Если требуются другие используемые по умолчанию значения параметров времени жизни, в зависимости от типа удаленного объекта, можно изменить конфигурацию аренды удаленного объекта, переопределяя метод InitializeLifetimeService() базового класса MarshalByRefObject:

public class Hello : System.MarshalByRefObject {

 public Hello() {

  Console.WriteLine('Constructor called');

 }

 ~Hello() {

  Console.WriteLine('Destructor called');

 }

 public override Object InitializeLifetimeService() {

  ILease lease = (ILease)base.InitializeLifetimeService();

  lеase.InitialLeaseTime = TimeSpan.FromMinutes(10);

  lease.RenewOnCallTime = TimeSpan.FromSeconds(40);

  return lease;

 }

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату