.NET Remoting. Час життя об'єктів. Основи
Завантажити презентаціюПрезентація по слайдам:
Зміст Управління часом життя об'єктів. Загальні положення. Ліцензії. Доступ до ліцензії об'єкта. Управління часом життя та config-файли. Диспетчери (менеджери) ліцензій. Спонсори ліцензій. .NET Remoting. Lifetime
Управління часом життя об'єктів. Загальні положення У .NET Remoting підтримуються два види активізації об'єктів: серверна (об'єкти з серверною активізацією SAO) та клієнтська (об'єкти з клієнтською активізацією CAO). До того ж є два режими серверної активізації: Singleton і SingleCall. Управління часом життя об'єктів: CAO; SAO Singleton; SAO SingleCall. (Тут ситуація проста. Такі об'єкти створюються при кожному виклику будь-якого з методів і з завершенням виконання метода ліквідовуються – позначаються для вилучення "збирачем сміття”. Отже, підкреслимо, що на такі об'єкти – на об'єкти SAO SingleCall викладені далі принципи управління часом життя не розповсюджуються). Загалом керування часом життя об'єктів ґрунтується на поняттях ліцензій, спонсорів та диспетчерів ліцензій. .NET Remoting. Lifetime
Ліцензії При активізації віддаленого об'єкта CLR отримує (і передає диспетчеру для реєстрації) дані стосовно ліцензії цього об'єкта. Такі дані надаються методом InitializeLifetimeService і визначають початкові умови стосовно життєдіяльності об'єкта (зазначений метод може перевизначатись у конкретному серверному класі, що успадковується від System.MarshalByRefObject ). Особливості існування remotable-об'єктів (їх ліцензії) визначаються реалізацією “ліцензійного” інтерфейсу ILease. Інтерфейс ILease (з простору імен SystemRuntime.Remoting.Lifetime) має кілька властивостей, які дозволяють “управляти” часом життя об'єктів. .NET Remoting. Lifetime
Зауваження. Ліцензійні дані можна модифікувати тільки у момент активізації об'єкта, тобто коли його ліцензія “знаходиться” у початковому стані. Саме цим обумовлена наявність у прикладі оператора if . Приклад перевизначення метода InitializeLifetimeService CurrentState – ще одна властивість ILease .NET Remoting. Lifetime
Перевизначення метода InitializeLifetimeService. Приклад. Виконання програм Варіант клієнтської активізації (СAO) Об'єкт припинив своє існування .NET Remoting. Lifetime
Перевизначення метода InitializeLifetimeService. Приклад. Виконання програм Варіант серверної активізації (SAO), режим Singleton. Змінилось кілька поколінь серверного об'єкту Один клієнт .NET Remoting. Lifetime
Перевизначення метода InitializeLifetimeService. Об'єкти з необмеженим терміном ліцензії .NET Remoting. Lifetime
Перевизначення метода InitializeLifetimeService. Об'єкти з необмеженим терміном ліцензії - 2 Об'єкти з необмеженим (нескінченим) терміном ліцензії – це об'єкти класів з null-ліцензією (InitializeLifetimeService має повертати null): class SomeMBRClass : MarshalByRefObject { … public override object InitializeLifetimeService() { return null; } … } .NET Remoting. Lifetime
Управління часом життя. Config-файли Окрім перевизначення метода MarshalByRefObject.InitializeLifetimeService існує ще одна можливість встановлення початкових умов життєдіяльності об'єктів, а саме використовуючи файли конфігурації (config). Умови існування об'єктів задаються атрибутами елемента . Зауваження. Початкові умови існування, що задаються таким чином, стосуються всіх об'єктів для всіх remotable-класів (!) у серверному процесі. Приклад. Файл Host.exe.config (він, звичайно, повинен бути зареєстрований, використовуючи RemotingConfiguration.Configure): . . . . . . . . . Варіанти суфіксів при визначенні часового інтервалу: D (дні), Н (години), M (хвилини), S (секунди) та MS (мілісекунди). Число без суфікса інтерпретується як секунди. .NET Remoting. Lifetime
Доступ до ліцензії об'єкта та управління його часом життя У серверній програмі: метод (серверного об'єкта) GetLifetimeService (успадковується від MarshalByRefObject) дозволяє отримати посилання на інтерфейс ILease . Далі, наприклад, можна викликати ILease.CurrentLeaseTime (для перевірки часу, що залишився) та ILease.Renew (для продовження терміну існування). У клієнтській програмі : (статичний) метод RemotingServices.GetLifetimeService також дозволяє отримати посилання на інтерфейс ILease. Далі так само можна викликати ILease.CurrentLeaseTime, ILease.Renew. .NET Remoting. Lifetime
Диспетчери (менеджери) ліцензій. Спонсори ліцензій При активізації віддаленого об'єкту CLR отримує (і передає диспетчеру для реєстрації) дані стосовно ліцензії цього об'єкта. Диспетчер ліцензій (lease manager) є у кожнім домені. Він періодично (за замовчуванням кожні 10 секунд) перевіряє зареєстровані об'єктні ліцензії, чи не завершився їх термін. (Періодичність опитування ліцензій можна змінити: LifetimeServices.LeaseManagerPollTime = System.TimeSpan.FromMinutes(1);) При завершенні терміну ліцензії об'єкт усе ж має можливість продовжити час свого існування за наявності спонсорів, зареєстрованих у ліцензіях. В інтерфейсі ILease визначені методи Register та Unregister для реєстрації (відповідно де- реєстрації) спонсорів. .NET Remoting. Lifetime
Спонсори . . . Спонсори – це об'єкти, що реалізують інтерфейс System.Runtime.Remoting.Lifetime.ISponsor. Інтервал часу, на який спонсор продовжує ліцензію, задається властивістю ISponsor.RenewalTime. Спонсори можуть бути зареєстровані як серверною, так і клієнтською програмами, використовуючи доступ до ліцензії. Властивість ILease.SponsorshipTimeout визначає час очікуванні відповіді спонсора (виклику Renewal). (Нагадаємо, що спонсор може бути на іншій машині). Є “готовий” клас-спонсор ClientSponsor (див. додаток) у просторі імен System.Runtime.Remoting.Lifetime. ILease .NET Remoting. Lifetime
Спонсори. Приклад (2/3) using System; using System.Runtime.Remoting; using System.Runtime.Remoting.Lifetime; public class Client{ public static void Main(){ RemotingConfiguration.Configure("Client.exe.config"); Server.ServerObject m_Obj1 = new Server.ServerObject(); ILease serverLease = (ILease)RemotingServices.GetLifetimeService(m_Obj1); MyClientSponsor sponsor = new MyClientSponsor(); serverLease.Register(sponsor); Console.WriteLine("Client-activated object: " + m_Obj1.Hi()); Console.ReadLine(); } } public class MyClientSponsor : MarshalByRefObject, ISponsor{ private DateTime lastRenewal; public MyClientSponsor(){ lastRenewal = DateTime.Now; } public TimeSpan Renewal(ILease lease){ Console.WriteLine("MyClientSponsor.Renewal"); Console.WriteLine("Time since last renewal:" + (DateTime.Now - lastRenewal).ToString()); lastRenewal = DateTime.Now; return TimeSpan.FromSeconds(20); } } Client.cs .NET Remoting. Lifetime
Спонсори. Приклад (3/3) using System; using System.Runtime.Remoting; using System.Runtime.Remoting.Lifetime; namespace Server { public class ServerObject : MarshalByRefObject { private Guid m_id; public ServerObject() { m_id = Guid.NewGuid(); Console.WriteLine("ServerObject created. MyGUID: {0}", m_id.ToString()); } public string Hi() { Console.WriteLine("Hi() method called. MyGUID: {0}", m_id.ToString()); return "Hi!"; } public override Object InitializeLifetimeService() { ILease lease = (ILease)base.InitializeLifetimeService(); if (lease.CurrentState == LeaseState.Initial) { lease.InitialLeaseTime = TimeSpan.FromSeconds(5); lease.SponsorshipTimeout = TimeSpan.FromSeconds(8); lease.RenewOnCallTime = TimeSpan.FromSeconds(3); } return lease; } } } SObj1.cs .NET Remoting. Lifetime
Managing the Lifetime of Remote .NET Objects with Leasing and Sponsorship (msdn.microsoft.com) To configure global defaults programmatically, use the static properties of the LifetimeServices class defined in the System.Runtime.Remoting.Lifetime namespace: You typically use these properties in the Main method of your host (the application assembly hosting the remote objects) as shown in the following code snippet: .NET Remoting. Lifetime
ILease.CurrentState CurrentState is read-only property of the ILease interface. CurrentState is of the enum type LeaseState: .NET Remoting. Lifetime
Схожі презентації
Категорії