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.

You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *