Makale 16: Remoting Objelerinin Yaşam Süreleri
Giriş
.NET Remoting uygulamaları üzerinde bulunan, yani Marshal-by-reference tipindeki, remote object’ler Remoting server üzerinde belirli bir süre boyunca tutulurlar ve bu süre sponsorlar ve lease manager tarafından belirlenir. Sponsorlar System.Runtime.Remoting.Lifetime.ISponsor interface’ini implement eden remotable type’lardır. Lease manager ise System.Runtime.Remoting.Lifetime.ILease interface’ini implement eden ve tek görevi remote object’in ne kadar süre memory üzerinde tutulacağı ile ilgili işlemlerin yönetimi olan object’leri ve sponsorları yönetmek ile görevlidir.
.NET Remoting uygulamalarında bu sistemin bulunmasının sebebi Remoting server’ın, kendisine connected durumda olan Remoting client’ları ile iletişim halince olmadan hangi remote object’i ne zaman garbage collection ile memory’de sileceğini bilemeyecek olmasıdır.
Marshal-by-value tipindeki remote object’ler ise instance’ları oluşturulup, tüm object client’a gönderildikten sonra ilk garbage collection’da memory’den silinecek şekilde mark’lanırlar.
Remoting Objesinin Oluşturulması
System.MarshalByRefObject class’ını inherit eden remotable type’lar InitializeLifetimeService method’unu override ederek memory’de ne kadar süre kalacaklarını belirlerler. InitializeLifetimeService method’u System.Runtime.Remoting.Lifetime.ILease tipinde bir object return eder ve bu object’in CurrentState property’si LeaseState.Initial değilse, üzerinde bulunan diğer özelliklerin set edilmesi başarılı olmayacaktır. InitializeLifetimeService method’u remote object üzerindeki method’lardan birisinin ilk kez call edilmesi durumunda otomatik olarak call edilmektedir.
InitializeLifetimeService method’unun kullanımı
using System; using System.Runtime.Remoting.Lifetime; namespace Module3.Chapter5.InitializeLifetime { public class MyRemotableType : MarshalByRefObject { public MyRemotableType() { } public override object InitializeLifetimeService() { ILease lease = (ILease)base.InitializeLifetimeService(); if (lease.CurrentState == LeaseState.Initial) { lease.InitialLeaseTime = TimeSpan.FromMinutes(10); lease.RenewOnCallTime = TimeSpan.FromMinutes(5); lease.SponsorshipTimeout = TimeSpan.FromMinutes(2); } return lease; } } }
ILease interface’ine ait özellikler aşağıdaki tabloda listelenmiştir.
Property
|
Type | Description |
CurrentLeaseTime | System.TimeSpan | Remote object’in ne kadar süre sonra memory’den silineceği bilgisini verir. |
CurrentState | System.Runtime.Remoting.Lifetime.LeaseState | Lease object’inin hangi state’e sahip olduğu bilgisini verir. |
InitialLeaseTime | System.TimeSpan | Remote object’in başlangıcından itibaren, renew edilmemesi durumunda, ne kadar süre boyunca memory’de kalacağının bilgisidir. |
RenewOnCallTime | System.TimeSpan | Remote object’in üzerindeki bir method’un call edilmesi durumunda life time’ın ne kadar süre uzatılacağının bilgisidir. |
SponsorshipTimeout | System.TimeSpan | Sponsor’a remote object’in ne kadar süre daha memory’de kalması sorulduğunda sponsor’un cevabının ne kadar süre bekleneceğinin bilgisidir. |
ILease interface’ine ait method’lar aşağıdaki tabloda listelenmiştir.
Method Name
|
Type | Description |
Register | void | Parametre olarak verilen ISponsor object’ini ILease object’i üzerinde register eder. |
Renew | System.TimeSpan | Remote object’in life time’ını verilen süre boyunca uzatır ve remote object’in yeni expiration time’ını return eder. |
Unregister | void | Parametre olarak verilen ISponsor object’ini ILease object’i üzerinde unregister eder. |
ILease interface’ine ait InitialLeaseTime, RenewOnCallTime ve SponsorshipTimeout property’leri Remoting configuration file’ı içerisinde de belirtilebilir. Bu yönetimin kullanılması durumunda yalnızca Client Activated Object tipindeki object’lerin life time’ları tanımlanabilir. <lifetime> node’unun tüm attribute’leri opsiyoneldir ve aldıkları değerin yanında, default S olmak üzere, D (day), H (hour), M (minute), S (second) ve ya MS (millisecond) değerlerinden biri eklenerek değer verilirler.
<lifetime> node’unun kullanımı
<configuration> <system.runtime.remoting> <application> <lifetime leaseTime="10M" renewOnCallTime="5M" sponsorshipTimeOut="2M" leaseManagerPollTime="30S" /> </application> </system.runtime.remoting> </configuration>
<lifetime> interface’ine ait özellikler aşağıdaki tabloda listelenmiştir.
Property | Description |
leaseTime | Remote object’in başlangıcından itibaren, renew edilmemesi durumunda, ne kadar süre boyunca memory’de kalacağının bilgisidir. |
renewOnCallTime | Remote object’in üzerindeki bir method’un call edilmesi durumunda life time’ın ne kadar süre uzatılacağının bilgisidir. |
sponsorshipTimeOut | Sponsor’a remote object’in ne kadar süre daha memory’de kalması sorulduğunda sponsor’un cevabının ne kadar süre bekleneceğinin bilgisidir. |
leaseManagerPollTime | Lease manager lease time’larını kontrol ettikten sonra ne kadar süre beklemelidir bilgisidir. |
Life time yönetimi için bir diğer opsiyon ise System.Runtime.Remoting.Lifetime.LifetimeServices class’ı içerisinde bulunan static property’lerin uygulama başladığında set edilmesidir. LifetimeServices class’ı <lifetime> node’u ile aynı özelliklere sahiptir. Life time property’lerinin bu şekilde belirlenmesi property’lerin set edildiği AppDomain içerisindeki tüm remote object’lerin life time property’lerini bu şekilde set edecektir.
System.Runtime.Remoting.Lifetime.LifetimeServices class’ı kullanımı
LifetimeServices.LeaseTime = TimeSpan.FromMinutes(10); LifetimeServices.RenewOnCallTime = TimeSpan.FromMinutes(5); LifetimeServices.SponsorshipTimeout = TimeSpan.FromMinutes(2); LifetimeServices.LeaseManagerPollTime = TimeSpan.FromSeconds(30);
Remoting Objesinin Yenilenmesi
Remoting server’ları remote object’lerin memory’den ne zaman silineceğini tek başlarına bilemeyeceklerinden remote object’leri silmeden önce sponsor’lara, sırasıyla, remote object’in lease time’ını uzatmak isteyip istemediklerini sorarlar. Remoting server’ı bir sponsordan ILease interface’inin üzerinde bulunan SponsorshipTimeout süresi boyunca cevap alamazsa bu sponsoru otomatik olarak unregister eder ve eğer varsa diğer register edilmiş sponsorlar için de aynı kuralı takip eder.
Register edildiği lease üzerinden her request gelişinde remote object’in lease time’ını 30 saniye daha uzatacak olan bir sponsor şu şekilde yazılır.
MyRemotableType.cs
public class MyRemotableType : MarshalByRefObject { public MyRemotableType() { } }
MyRemotableTypeSponsor.cs
public class MyRemotableTypeSponsor : MarshalByRefObject, ISponsor { public MyRemotableTypeSponsor() { } #region ISponsor Members public TimeSpan Renewal(ILease lease) { return TimeSpan.FromSeconds(30); } #endregion }
Sponsor’un kullanımı
MyRemotableType remoteObject = (MyRemotableType)Activator.GetObject (typeof(MyRemotableType), "tcp://localhost:1234/MyRemotableType.rem"); ILease lease = (ILease) System.Runtime.Remoting.RemotingServices.GetLifetimeService(remoteObject); MyRemotableTypeSponsor sponsor = (MyRemotableTypeSponsor)Activator.GetObject (typeof(MyRemotableTypeSponsor), "tcp://localhost:1234/MyRemotableTypeSponsor.rem"); lease.Register(sponsor);
Sponsorlara ek olarak, developer istediği durumlarda remote object’in lease time’ını uzatma imkanına sahiptir. Bunun için Remoting client’ın kodu içerisinde RemotingServices.GetLifetimeService method’u kullanılarak ILease object’ine erişilebilir ve ILease class’inin Renew methodu kullanılarak lease time istenilen süre boyunca uzatılabilir.
ILease.Renew method’u kullanımı
MyRemotableType remoteObject = new MyRemotableType(); ILease lease = (ILease)RemotingServices.GetLifetimeService(remoteObject); lease.Renew(TimeSpan.FromSeconds(30));
Özet
- Life time yönetimi Remoting server’ın, kendi üzerinde bulunan remote object’lerin hala kullanılır olup olmadığını anlaması gerektiği için önemlidir.
- Sponsorlar System.Runtime.Remoting.Lifetime.ISponsor interface’ini implement eden remotable type’lardır.
- Life time initial value’ları configuration dosyası içerisinde <lifetime> node’u kullanılarak yapılabilir.
- Marshal-by-value olarak tanımlanan remotable type’lar instance’ları client’a gönderildikten hemen sonra ilk garbage collection’da memory’den silinecek şekilde flag’lenirler.