C# ile AppFabric Cache Yönetimi – 2

Önceki makalemde sizlerle C# üzerinden AppFabric Cache PowerShell komutlarını nasıl kullanabilceğinizi paylaşmıştım. Örnek kod üzerinden nasıl önbellek kümesine bağlanabileceğinizi ve yeni bir önbellek oluşturabileceğinizi anlatmıştım;

var initialSessionState = InitialSessionState.CreateDefault();
initialSessionState.ImportPSModule(new[] { "DistributedCacheAdministration" });
initialSessionState.ThrowOnRunspaceOpenError = true;

var cacheRunspace = RunspaceFactory.CreateRunspace(initialSessionState);

cacheRunspace.Open();

var pipe = cacheRunspace.CreatePipeline();

pipe.Commands.Add("Use-CacheCluster");

var newCacheKomutu = new Command("New-Cache");
newCacheKomutu.Parameters.Add("CacheName", "test");
pipe.Commands.Add(newCacheKomutu);

var sonuc = pipe.Invoke();

PowerShell komutlarımızın çalışacağı bir çalışma alanı içerisinde bir pipeline oluşturmuş ve son satırda bu pipeline’ı çalıştırmıştık. Bu örnekte dikkat edecek olursanız sonuc değişkeni içerisinde System.Management.Automation.PSObject barındıran 0 boyutlu bir koleksiyon bulunmamakta; çünkü pipeline içerisinde çalıştırdığımız AppFabric Cache komutlarının bir geri dönüş değeri bulunmamakta.

Bu makalemde AppFabric Cache komutlarından gelen bilgileri C# içerisinde nasıl kullanabileceğinizi anlatmaya çalışacağım.

Önceki makaledeki kodu ilk çalıştırmanız sonrasında alınan aşağıdaki ekran görüntüsünde PowerShell oturumunda, DistributedCacheAdministration modülünün yüklendiğini ve bilgisayarın bağlı olduğu önbellek kümesinin kullanıldığını, ardından da bu önbellek kümesinde bulunan önbelleklerin listesinin alındığını göreceksiniz.

Get-Cache

Görüldüğü gibi test adıyla bir önbellek oluşturulmuş durumda.

Aynı kodu ikinci defa çalıştıracak olursanız, verdiğiniz isimde bir önbelleğin küme içerisinde daha önceden oluşturulmuş olduğuna dair “ErrorCode<ERRCAdmin011>:SubStatus<ES0001>:Specified Cache is already present in cluster.” şeklinde bir hata mesajı alırsınız. Bu durumdan kaçınmak için öncelikle küme içerisindeki önbellekleri listeyip içlerinde oluşturmak istediğimiz önbelleğin olup olmadığına bakmalıyız. Eğer yoksa yeni bir önbellek oluşturmalıyız.

pipe.Commands.Add("Get-Cache");

var sonuc = pipe.Invoke();

ilk kodumuzdaki diğer komutları çıkartaran sadece “Get-Cache” kullandığımız yukarıdaki örnek kod bize içerisinde sadece tek bir elemanı olan bir PSObject listesi verecektir. Quick Watch ile sonuc değişkenine bakacak olursak 0. indeksteki PSObject içerisinde CacheInfo türünden bir nesne barındırdığını görürüz. Bu nesneye PSObject içerisindeki BaseObject özelliğinden ulaşabiliriz.

Sonuc QuickWatch

Aşağıdaki kodla, gelen sonuçlar arasında test önbelleği olup olmadığını kontrol ederek bu bilgiyi daha sonra kullanmak üzere bir boolean içerisinde tutuyoruz.

var testOnbellegiBulundu = false;
foreach (var cacheInfoPSObject in sonuc)
{
var cacheInfo = ((CacheInfo)cacheInfoPSObject.BaseObject);

if (cacheInfo.CacheName == "test")
{
testOnbellegiBulundu = true;
break;
}
}

devamında ise eğer test önbelleği yoksa ilk örneğimizdeki oluşturma kodunu çalıştırıyoruz;

if (!testOnbellegiBulundu)
{
pipe = cacheRunspace.CreatePipeline();

var newCacheKomutu = new Command("New-Cache");
newCacheKomutu.Parameters.Add("CacheName", "test");
pipe.Commands.Add(newCacheKomutu);

pipe.Invoke();
}

AppFabric Cache PowerShell komutları ve bu komutları çalıştırdığımızda dönecek nesneleri get-help komutu yardımıyla öğrenebiliriz. Örneğin; Get-Cache komutu hakkında aşağıdaki şekilde bilgi alabilirsiniz;

Get-Help Get-Cache -full

Get-Help Get-Cache -full

Gelen yardım bilgilerinin sonunda komutun çıktısı hakkındaki bilgiler “OUTPUTS” başlığı altında verilmektedir.

Şimdiye kadar ki anlattıklarımı toparlayacak olursak, kodumuz aşağıdaki hale gelmiştir;

var initialSessionState = InitialSessionState.CreateDefault();
initialSessionState.ImportPSModule(new[] { "DistributedCacheAdministration" });
initialSessionState.ThrowOnRunspaceOpenError = true;

var cacheRunspace = RunspaceFactory.CreateRunspace(initialSessionState);

cacheRunspace.Open();

var pipe = cacheRunspace.CreatePipeline();

pipe.Commands.Add("Use-CacheCluster");

pipe.Commands.Add("Get-Cache");

var sonuc = pipe.Invoke();

var testOnbellegiBulundu = false;
foreach (var cacheInfoPSObject in sonuc)
{
    var cacheInfo = ((CacheInfo)cacheInfoPSObject.BaseObject);

    if (cacheInfo.CacheName == "test")
    {
        testOnbellegiBulundu = true;
        break;
    }
}


if (!testOnbellegiBulundu)
{
    pipe = cacheRunspace.CreatePipeline();

    var newCacheKomutu = new Command("New-Cache");
    newCacheKomutu.Parameters.Add("CacheName", "test");
    pipe.Commands.Add(newCacheKomutu);

    pipe.Invoke();
}

Şimdiye kadar anlatılanlarla oluşturmak istediğimiz önbelleğin varlığı kontrol ettikten sonra yoksa oluşturmayı, çalıştırılan PowerShell komutlarının sonuçlarını cast ederek kullanmayı öğrendik; fakat bazı AppFabric Cache komutlarında malesef ki hayat biz yazılım geliştiriciler için o kadar kolay olmuyor.Bazı komutların sonuç sınıfları barındıkları assembly içerisinde internal olarak tanımlanmaları nedeniyle dışarıdan kullanılamayabilir. Get-CacheStatistics komutunu ele alalım;

Get-Help Get-CacheStatistics -full

Get-Help Get-CacheStatistics -full

Bu komut bize iki tür sonuç döndürebilir;

  1. Microsoft.Data.Caching.NamedCacheStats (gerçekte Microsoft.ApplicationServer.Caching.NamedCacheStats)
  2. Microsoft.Data.Caching.HostCacheStats (gerçekte Microsoft.ApplicationServer.Caching.HostCacheStats)

 

Fakat bunlar assembly dışından erişilemeyen sınıflar (internal class) olduğu için kodumuz içerisinde doğrudan kullanamayız. Peki bu durumda ne yapmalıyız?

Bu durumda PSObject.BaseObject NamedCacheStats ya da HostCacheStats sınıflarına dönüştürülemeyeceği için imdadımıza PSObject’in Properties özelliği yetişiyor. Properties yardımıyla PSObject’in barındırdığı sonuç nesnesinin özelliklerine erişilebilir.

var psObject = sonuc[0];

var ItemCount = (long)psObject.Properties["ItemCount"].Value;
var MissCount = (long)psObject.Properties["MissCount"].Value;
var RegionCount = (long)psObject.Properties["RegionCount"].Value;
var RequestCount = (long)psObject.Properties["RequestCount"].Value;
var Size = (long)psObject.Properties["Size"].Value;

Fatih Boy

Ankara'da yaşayan Fatih, bir kamu kurumunda danışman olarak çalışmaktadır. ALM süreçleri, kurumsal veri yolu sistemleri, kurumsal altyapı ve yazılım geliştirme konularında destek vermektedir. Boş zamanlarında açık kaynak kodlu projeler geliştirmeyi ve bilgisini yazdığı makalelerle paylaşmayı seven Fatih, aynı zamanda Visual C# ve Visual Studio teknolojileri konusundan Microsoft tarafından altı yıl üst üste MVP (En Değerli Profesyonel) ödülüne layık görülmüştür. İş hayatı boyunca masaüstü uygulamaları, web teknolojileri, akıllı istemciler gibi konularda Asp.Net, Php, C#, Java programlama dilleri ve MySql, MsSql ve Oracle gibi veritabanı yönetim yazılımları ile çalışmıştır. İngilizce ve Türkçe olarak yayınlanan makalelerini gerek İngilizce bloğunda, gerekse de Türkçe bloğunda bulabileceğiniz gibi web sitesinden de açık kaynak kodlu geliştirdiği yazılımlarına ulaşabilirsiniz. vCard - Twitter - Facebook - Google+

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir