Home Contact RSS

Archive for September, 2008

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.