Makale Özeti

Bu makale dizinsinde COM+'ın ne olduğu, ne işe yaradığını anlatan temel bir dökümanı 9 bölümde inceleyeceğiz. Makale serisinin sonunda COM+ ın temel özellikleri hakkında bilgiye sahip olacak ve kolaylıkla kullanabilir halde olacağız.

Makale

.NET Enterprise Servisleri için Asseblyleri Ayarlamak
 
Sınıflar ve asseblylerin .Net Enterprise servislerine erişimleri özellikler(attributes) sayesinde ayarlanabilir. Özellikler çalışma zamanı veya kayıt zamanında belirlenerek bir sınıfın hangi servisleri alabileceği ve servisleri nasıl kullanacağı hakkındaki yapılandırmaların yapılmasını sağlar.
 
System.EnterpriseServices namespacini projemize referans olarak ekledikten sonra bileşenimizin alabileceği herhangi bir servise ait özellikleri rahatlıkla yönetip ayarlamk mümkün olacaktır. Örneğin kullanabileceğimiz iki özellik ApplicationName ve ApplicationActivationdur. Bunlardan ApplicationName uygulamamaızın ismini belirlerken, ApplicationActivation uygulamamızın servermı yoksa library uygulamasımı olacağını belirler.
 
Bu özellikler program tarafından kodla yapılabileceği gibi Component Service yönetim ekranındanda yapılabilmektedir. Bileşenimize ait bazı özellikler kayıt sırasında belirlenmeli ve daha sonra değiştirilmemelidir. Bunalara örnek gösterecek olursak bileşenimizin transaction kullanması gerekiyorsa transaction özelliği Required olarak ayarlanmalı ve öyle kayıt edilmelidir ve kayıt sonrasında bu özelliğe ait bir değişiklik yapılmamalıdır. Bir değişiklik yapılmamasının sebebi bileşenimizin transaction içinde yer alabilecek şekilde şekilde yapılandırılması ve buna göre derlenmesidir. Bu yüzden uygulamanın gereksinimleri geliştirici tarafından uygulama yaratılmadan önce çok iyi analiz edilmelidir. Özellikleri yönetim ekranından ayarlayabileceğimiz gibi projemize EnterpriseServices i eklediğimiz ve özellikleri kodda belirlediğimiz anda COM+ kataloğunda yer alan bütün özellikler uygulamamızı derlerken kodda belirttiğimiz şekilde ayarlanacak ve özellikler COM+ kataloğuna transfer edilecektir.
 
Servis Verilen Bir Bileşen Yaratımı
 
.Net Enterprise Servislerini kullanamak için bir class mutlaka ServicedComponent classını inherit etmelidir. ServicedComponent class’ı System.EnterpriseServices namespace’i altında yer alamaktadır. Bu class bize gerekli activation ve interception işlemlerinin doğru bir şekilde çalışmasını sunar ve aynı zamanda bu sınıfta overide edebileceğimiz  ve kişiselleştirebileceğimiz Activate ve Deactivate gibi bazı methodlar vardır .
 
ServicedComponent class’ını inherit edebilmemiz için mutlaka System.EnterpriseServices namespace’ini projemize referans olarak eklemiş olmamız gerekmektedir. Daha sonra bu namespace’i import ederek ServicesComponent class’ına ulaşabiliriz.
 
Imports System.EnterpriseServices
Public Class IlkBilesenim
    Inherits ServicedComponent
    Public Sub New()
        'İlk Com+ Bileşenimizi yarattık
    End Sub
End Class
 
 
Servis Verilen Bileşenden Context’e Erişmek
 
Daha öncede basitçe değindiğimiz gibi her obje context adı verilen ve transaction, activity, ve security bilgilerini içeren bir ortam içinde çalışmaktadır. Bağlam içindeki bazı özelliklere erişmemizi ContextUtil sınıfı aracılığı ile sağlarız ve bu sınıfın bazı metodları ile bazı servisleri kontrol edebiliriz. Herbir bağlamın kendine ait GUID formunda benzersiz bir tanımlayıcı numarası vardır. Bu numaraya ContextUtil sınıfındaki GetContextId metodu ile erişebiliriz.
 
Imports System.EnterpriseServices
Public Class GuidiAlinacakBilesenim
    Inherits ServicedComponent
    Public Function BaglamGUIDi() As System.Guid
        Return ContextUtil.ContextId
    End Function
End Class
 
JIT Aktivasyonu Neden Gereklidir?
 
Database bağlantıları ve hafıza gibi sunucu kaynakları çok istemci tarafından paylaşılması gereken sınırlı kaynaklardır. Çok istemciye hizmet sunabilecek uygulamalar geliştirmek istiyorsak JIT kullanmamız kaçınılmazdır. JIT Aktivasyonu genellikle transaction ve senkronizasyon için kullanılmaktadır.
 
Geleneksel uygulamalarda istemci bir sunucu kaynağına talepte bulunur ve bunu belirsiz bir süre boyunca kullanır. Dolayısıyla her istemci bir sunucu kaynagını belirsiz bir süre boyunca kullanacağı için çok kullanıcı uygulamalardaki performans nedeniyle bu yöntem kullanılmamaktadır.
 
Ancak artık istemciler sunucu kaynaklarını sadece ihtiyaçları olduğu süre boyunca kullanakta ve böylece performanstaki düşüklük sorunu aşılacağından uygulama çoklu istemcilere yanıt verebilir hale gelmektedir. JIT sayesinde bu sunucu kaynaklarını serbest bırakacak kodunda yazılım geliştirici tarafından yazılmasına gerek kalmaz.
 
JIT ‘i tanımlarken bahsettiğimiz gibi transaction kullanılıyorsa JIT kullanılmalıdır çünkü transaction içinde yer alan bir nesne bir sonraki transactionda tekrardan yaratılmalı ve bir önceki nesnenin özelliklerini taşımamalıdır. JIT aynı zamanda senkronizasyon içinde kullanılmaktadır çünkü her bir çağırım için bir nesnenin birbirinden bağımsız örneklerini yaratmalıdır ve işi bittiği zaman bu örneklerin kullanımdan kaldırılması gerekemektedir. Transaction ve senkronizasyonda nesneler işleri bittiği zaman otomatik olarak yok edilmezlerse kaynak kullanımında aşırı bir artış gözlenmesi kaçınlmazdır.
 
Şimdide JIT’in nasıl çalıştığını inceleyelim. Bir nesneye bir istek gittiği zaman kesme eğer bu nesnede JIT aktive edilmişse nesnenin bir örneğini yaratır ve Activate metodunu çağırır. Nesne gerekli kaynakları kullanmaya hazır duruma gelir. Daha sonrasında ise nesnedeki bir method çağırıldığında bu metod işlemi gerçekleştiri ve işlem bittiği zaman Done Bit’inin değerini true olarak atar ve metodun sonucunu geriye döndürür. Daha sonrasında ise metodun Done Bit değeri true ise nesnenin Deactivate metodu çalıştırılark nesnenin rezerve ettiği kaynakları geriye bırakılır ve nesne erişemez duruma gelir. Daha sonrasında ise bu nesneleri garbace collectiondan garbage collector alarak temizler.
 
Şimdide JIT aktivasyonunu yazdığımız bir bileşene nasıl uygulayacağımızı inceleyelim.
 
<JustInTimeActivation(True)> _
Public Class JIT
    Inherits System.EnterpriseServices.ServicedComponent
    Public Sub Metodum()
 
    End Sub
    Protected Overrides Sub Activate()
        'Activate metodunda yapılacak iş
    End Sub
    Protected Overrides Sub Deactivate()
        'Deactivate metodunda yapılacak iş
    End Sub
End Class
 
JIT konusunda bahsigeçen Done Bit’inin ne işe yaradığını inceleyelim. Objede çağırılan metodun çalışma işlemi bittikten sonra true değerini alan bu bit artık nesnenin deaktive edilebileceğini belirtir. Eğer done bit’inin değeri false ise nesne hafızadan kalkmaz ve birdahaki çalışma sonucu true değerini alıncaya kadar hafızada kalır. Done Bit’inin programatik olarak yönetmek mümkündür. Bunu yönetmek için bileşenimizin özelliklerine müdahele etmemize izin verdiğini belirttiğimiz ContextUtil sınıfının DeactivateOnReturn özelliğini kullanabiliriz.  Ancak DoneBit’inin varsayılan olarak gelen false değerinin varsayılan değerini true yapmak için Autocomplete özelliğini kullanmamız gerekmektedir. Bu iki kullanıma ait bir örneği aşağıda inceleyeceğiz.
 
Public Sub Metodum()
    'Burada metodumuz işini yapar
    ContextUtil.DeactivateOnReturn = True
End Sub
 
Veya
 
<AutoComplete(True)> _
Public Sub Metodum()
    'Burada metodumuz işini yapar
End Sub
 
Aktivasyon ve Deaktivasyon
 
Yönetilebilir veya yönetilemez kodda aktivasyon ve deaktivasyonolayları birbirinden farklı olmasına rağmen yaptıkları iş tüketimin bittiği anda kaynakları serbest bırakacak bir yapı sunmaktır. Objemizi her zaman Activate metodunda başlatmalıyız. Activate metodunun çalışması ise JIT özelliğinin aktive edilip edilmemesine bağlıdır.
Alışılagelmiş deaktive yönteminde Deactivate metodu çağrıldığı zaman database bağlantısı gibi bazı kaynaklar serbest bırakılır ve Release metodu çağırılır. Bu metod ise objenin hafızadaki referansını dıfırlar. Bu sıfırlama işlemi sonrasında artık hiçbir istemci o nesneyi referans olarak kullanamayacağından bileşinimiz silinmiş demektir.Ancak .Net te ilk adım ortak olmasına karşın kesme katmanı artık o objeyi referans olarak göstermeyeceğinden dolayı nesne erişilemez duruma gelir ve artık hafızadan kaldırılabilir. .Net’te yaratılmış nesneler silinme işlemini DeActivate metodunda yaparlar ve bundan dolayı tekrardan bir Dispose metodu yazmaya gerek kalmaz. Ancak yazılması kaçınılmaz ise Deacctivate metodu ile aynı işlevselliği sağlayabilecek bir metod yazılmalıdır.
 
Senkronizasyon
 
Eşzamanlı Çalışma Sorunları
 
Burada bahsi geçen eşzamanlı aynı anda birden fazla programın uyumlu çalışabilmesinin sorunsuzca tamamlanabilmesidir.tek işlemcili bir sistemde uyumlu çalışma başarısına zaman paylaşımı tekniği kullanarak erişilmesine karşın çok işlemcili sistemlerde ise bu başarıya her bir programın veya görevin farklı işlemcilerde aynı anda çalışmasıyla erişilir. Windows XP’de bu uyumluluk thread adı verilen yapılar ile sağlanmaktadır.
 
Ölçeklenebilir uygulamalar yazarken uyumluluk kullanılması kaçınılmazdır. Online bilet satışının yapıldığı ve çok talep gören bir konserin biletlerinin satışa çoktığı anı senaryolaştıracak olursak bu durumda sunucuya belki saniyede 10 tane istek gelecektir. Sunucunun bu istekleri serileştirerek sıraya koyup yapması yerine aynı anda gelen tüm isteklere cevap vererek paralel bir şekilde işlemleri yürütmesi doğru olan yöntemdir.  Ancak bu istekleri aynı anda karşılayabilmel çoklu thread desteği olan bir altyapı ile sağlanmalıdır. Ancak bu şekilde çalışacak bir altyapı inşa etmek ve bunun üzerine kod yazmak oldukça zor ve maliyetli bir işlem olduğundan dolayı iş yapma yeteneği olan thread ler bir havuz oluşturularak saklanır. Bu havuzun maksimum ve minimum boyutu sunucumuzun donanımı ve kaynaklarına göre yapılandırılabilir. Sunucuya bir istek geldiği zaman bu havuzdan bir thread bu işlemi üzerine alır ve yerine getirir. Bu thread bu işlemle uğraşırken diğer treadler başka isteklere açık bir şekilde hazır beklerler. Öultitasking desteği bulunan işletim sistemlerinde ise threadler komplex bir algoritma ile işletim sistemi tarafından yönetilirler. Ve biz yazılım geliştiriciler tarafından kodun bu şekilde yazılması gerkemektedir. Kodun threading2e uygun şekilde yazılmaması durumunda karşımıza çıkabilecek bazı problemlere gözatacak olursak;
a)Yarış durumları
Bu genellikle farklı thread ler altında çalışacak kodların birinin diğerinin sonucuna bağımlı olması durumunda karşımıza çıkar ve eğer ilk çalışması gereken thread yarışı kazanamazsa diğer thread hata verecektir. Bunun çözmek için ilk threadin kodunda belirli bir noktasına erişildiği anda ikinci threadi başalatabiliriz. Buda senkronizasyon konusu ile alakalıdır.
 
b)Deadlock
Bu durumda ise bir threadin kaynakladığı bir kaynaga diğer thread tarafından erişilmeye çalışılmaktadır ve beklemede olduğundan dolayı onunda kilitlediği kaynaklar serbest bırakılmamılştır. İşte burumda ilk thread ikinci threadin kilitlediği kaynağa erişmeye kalkarsa bu iki thread birbirlerini kilitlemiş ve deadlock a girmiş demektir. Bu durum genellikle transacrionlarda görülebilmektedir.
 
c)Livelock
bu durumda ise iki kaynağın kilitledikleri kaynakları değişmesi sırasında meydana gelebilecek bir durum söz konusudur. Bu durumda kaynaklar arasında dar bir tünel oldugunu düşünecek ve iş yapan kişilerin bu tünelde karşılaşıp kararsızlıkta kalarak birbirlerini geçmek için sağa sola haraket etmesi ancak karşısındakininde aynı kararsızlıkta sağa sola hareket etmesi sonucu bir geçiş yolu bulamaması sonucu meydana gelir.
 
 
Senkronizasyon Mekanizmaları
 
Çok işlem yapılan ve çoklu thread içeren uygulamalarda thread ler kaynaklara erişirken başka bir thread’ın bu kaynağa erişememesi tutarlılık bakımından gereklidir. Bu basit senkronizasyon uygulamasındanda anlaşılabileceği gibi bir threadın kaynakla işi bitmeden başka bir thread o kaynağa erişmemelidir. Buda kilitleme mekanizması ile sağlanır. Bir threadd bir kaynağa erişirken o kaynağa bir kilit koyarken başka uygulamaların veya threadlerin erişimine kapar işi bittiği zaman ise koymuş olduğu kilidi açar.
 
.Net ile yazılmış olan bütün kodlar multithread dir ve bunlar arasındaki senkronizasyonu sağlayabilmek için .Net Framework yapısında System.Threading uzay ismi vardır. Ancak COM+ ile .NET senkronizasyonubirbirinden tamamen farklıdır. .Net senkronizasyonu proje düzeyindedir aynı bağlamda bulunan diğer uygulamlar veya baska bilgisayarlarda bulunan uygulamalar için geçerli değildir. Böyle br uygulamaya COM+ yapısında bulunan senkronizasyon izin vermektedir.
 


oztamer@hotmail.com
tamer.oz@yazgelistir.com
oztamer@hotmail.com