30 Mayıs 2016 Pazartesi

QARTZ.NET İLE ZAMANLANMIŞ GÖREVLER - 2

   Merhaba, bir önceki yazımda (buradan ulaşabilirsiniz) Quartz.Net kütüphanesinden ayrıntılarıyla bahsetmiştik. Bu yazımda konuyu fazla uzatmadan uygulama senaryolarından ve web üzerinde çalışan örneklerinden bahsediyor olacağım. Konuya hemen giriş yapmak adına, zamanlanmış görevler nerelerde hangi senaryolar ile işimize yarar derseniz?

1 - Entegrasyonlarda. Farklı canlı sistemler arasında data aktarımlarının yaşandığı entegrasyonlarda çok işimize yarar. Örneğin 2 farklı ERP sisteminde sipariş,fatura,müşteri..vb gibi dataların sürekli online olarak birbirine aktarılması gerektiği durumlar olabilir. Bu durumda  hemen bir web servis (WCF, Web Api vs) yazılıp, servisin içinde Quartz kütüphanesi kullanılarak zamanlanmış görevler kullanılabilir. 

2 - Yoğun data içeren raporların oluşturulmasında kullanılabilir. Örneğin milyonlarca kayıt içeren ve çok fazla sayısal hesaplamaların olduğu, çalışması runtime için düşünüldüğünde uzun zaman alan günlük bazda alınması gereken raporlarınız olabilir. Bu tip durumlarda sistemin daha az yoğun olduğu (00:00 - 05:00) arasında çalışacak zamanlanmış görevler oluşturulabilir. Böylelikle hem sistem gündüz meşgul edilmemiş, hem de bir önceki güne ait raporlar sabah için geceden hazırlanmış olur.

3 - Başka bir senaryo olarak da uygulamalarımızda log kaydı atılan bu yüzden çok fazla şişen tablolar olabilir, bu tablolarda rahatlama yapmak sebebiyle gereksiz kayıtların belirli periyotlarla silinmesi gerekebilir. Bu tip durumlarda da gerek web servis üzerinde yazılan, gerekse web ortamında oluşturulan zamanlanmış görevler kullanılabilecektir.

 4 - Belirli saatlerde, özel günlerde veya bir iş sonucu olarak ilgili kişilere mail gönderiminin yapılmasının istendiği durumlarda kullanılabilir. Mail gönderim olayı job olarak yazılan en sık durumlardan birisidir.

Bu örnekler elbette daha da çoğaltılabilir.Temel olarak zamanlanmış görevlerin daha çok aktarımlarda kullanıldığını kulak dolgunluğu olması açısından söyleyebiliriz.

Örnek - 1
     Örneğimizde web sayfası üzerinden bir butonla tetiklenen ve DB 'e 10 sn de bir kayıt atan zamanlanmış görevin tasarımından bahsediyor olacağız. Bu yüzden DB 'de hemen bir tablo uluşturup, entity framework kullanarak tabloyu projeye include ettim.













Sonrasında Scheduler ve işin yapılacağı Job sınıflarımı tanımladım. Job'ın Execute metodunda EF ile oluşturduğum tabloya kayıt atma işlemini gerçekleştirdim.

Job :


















Scheduler :















En son olarak web sayfamıza bir buton ekleyip, butonun event olayında zamanlayıcıyı başlatıyorum.







Çalıştırdıktan sonra 10 sn ' de bir tabloya attığı kayıtları gözlemleyebiliriz.












Dikkat ederseniz 10 sn aralıklarla job çalışarak istediğim işlemi yaptı. Belirtmem gereken bir nokta bu job tetiklendikten sonra bitiş paramatresi verilmediği ve RepeatForever() ile tanımlandığı için IIS üzerinde web sitesi çalıştığı müddetçe, tetiklenmeye devam edecektir. Job'ı durdurmak için ya web sitesinin durdurulması, yada IIS' in restart edilmesi gerekmektedir.

Örnek - 2
    Şimdiki örneğimizde ise, web sitesinin IIS üzerinde çalışmaya başladığı andan itibaren "Global.Asax" üzerinden tetiklenmeye başlayan ve 25 sn aralıklarla mail atan bir zamanlanmış görev yazıyor olacağız.Hemen bir web application oluşturup, içerisine job ve scheduler sınıflarımızı ekleyelim.

EMailJob :




















Scheduler :















   Daha sonrasında projemize sağ tıklayıp, Add - Global Application Class dedikten sonra "Global.Asax" classımızı ekleyelip, "Application_Start" metodunda zamanlayıcımızı başlatalım.

















    Bu aşamadan sonra web projemizi IIS üzerinden yayınlamaya başladığımız andan itibaren Global.Asax üzerindeki Application_Start metodu zamanlayıcıyı tetikleyecek ve ortama 25 sn'de bir gmail üzerinden mail gönderecektir. Ben uygulamayı çalıştırıp gmail adresinizi kontrol ederseniz, maillerin geldiğini göreceksiniz.



24 Mayıs 2016 Salı

QUARTZ.NET İLE ZAMANLANMIŞ GÖREVLER -1

   Herkese merhaba, herkesin yaptığı projelerde zamana bağlı olarak çalışması gerekecek yapılara ihtiyaç duymuştur. Bu gereksinimler pek çok farklı yöntemle çözülebilir. Ben bugün sizlere Quartz.Net library'sini kullanarak bu problemi nasıl çözdüğümüzden bahsediyor olacağım. Tabi ki sadece Quartz kütüphanesini kullanarak değil, bin bir türlü yöntemle Job tanımlayıp çözüm bulabilirsiniz fakat Quartz ile daha pratik ve hızlı bir şekilde sorunu halletmiş olursunuz.
     Quartz.Net kütüphanesinden bahsetmemiz gerekirse, open source olup kaynak kodlarına Github üzerinden erişilebilir durumdadır. Aşağıdaki linklerden indirerek dll'i projenize referans olarak ekleyebilirsiniz.


Ya da ikinci bir yöntem olarak View - Other Windows - Package Manager Console açıldıktan sonra içerisine Install-Package Quartz yazıp, çalıştırarak proje içerisine otomatik olarak indirilip eklenmesini sağlayabilirsiniz. İşlem bittikten sonra References bölümünde Quartz kütüphanesinin projeye dahil edildiğini görebilirsiniz.
     Quartz kütüphanesini "JOB" ve "TRIGGER" olmak üzere 2 kısma ayırabiliriz. Job kısmında yapılacak işler tanımlanır, trigger kısmında ise bu işlemlerin hangi zaman aralığında hangi sıklıkla yapılacağı (ne zaman tetikleneceği) belirtilir. 

JOB :
     Job sınıfı IJob Interface'inden implemente edilerek oluşturulur ve Execute metodu yeniden yazılır. Bu metod ilgili sınıf çağrıldığında yani job tetiklendiğinde ilk çalışacak yerdir. Asıl yapılacak işler burada - yada ilk buradan tetiklenir desek daha doğru olur -  yazılır.










TRIGGER :
    Yazılan Job sınıfının tetiklenmesini sağlayan yapılardır. Bu yapılarda job' ın ne zaman, hangi sıklıkla, ne kadar, hangi saatler/günler arasında çalışacağı gibi bilgiler tanımlanır. SimpleTrigger ve CronTrigger olmak üzere 2'ye ayrılır.

1 - Simple Trigger
    Basit ve kolay zaman tanımlamalarının yapıldığı trigger çeşididir. Örneğin 5 sn' de bir görevi tetikleme olayı aşağıdaki gibi yazılabilir.(sonsuza kadar çalışır)











Tabi simple trigger içinde kullanılan bazı terimler vardır. Öncelikle onları açıklamak gerekirse;

StartAt : Zamanlayıcının ne zaman başlayacağını belirtir.
EndAt : Zamanlayıcının duracağı/sonlanacağı zamanı belirtir.
WithSimpleSchedule : Zamanlayıcı başladıktan sonraki programı belirtir.
WithIntervalInSeconds : Zamanlayıcının kaç sn'de bir tetikleneceğini belirtir.
WithIntervalInMinutes - Hours : Zamanlayıcının kaç dk veya saatte bir tetikleneceğini belirtir.
WithRepeatCount : Zamanlayıcının kaç tekrardan sonra duracağını belirtir.
RepeatForever : Zamanlayıcının sonsuza dek çalışacağını belirtir.

Simple trigger yapısına bir kaç örnek vermek vermemiz gerekirse;
-  Sadece girilen saatte (yalnızca 1 defa) görevin tetiklenmesi istenirse..








- Görevin tetiklenmesinden sonra her 20 sn'de bir tetiklensin, ama sadece 5 kez çalışsın istenirse..






bir console application yaratılıp, ilgili zamanlayıcı çağrılırsa ekran görüntüsü aşağıdaki gibi olacaktır.




















- Görevin girilen başlangıç ve bitiş saatleri arasında 10 sn de bir tetiklenmesi istenirse..

















2 - Cron Trigger
   Simple trigger yapısına göre daha kompleks zaman tanımlamalarının yapıldığı trigger yapısıdır. Kendine has zaman tanımlamaları Expression ifadeleri ile belirtilir. Örneğin "Her Pazartesi ve Cuma 08:30-12:30 Arasında Saatte Bir Çalışan Job" ifadesi cron trigger ile bağdaşabilir.








Cron trigger tanımında yer alan expression ifadenin bir anlamı vardır.

 * * * * *      Zaman komutunu ele alırsak
 ┬ ┬ ┬ ┬ ┬
 │ │ │ │ │
 │ │ │ │ │
 │ │ │ │ └───── Haftanın günü (0-6 arası değer veya *) (0 = Pazar’ı ifade eder.)
 │ │ │ └────────── Ay (1-12 arası değer veya *)
 │ │ └─────────────── Gün (1-31 arası değer veya *)
 │ └──────────────────── Saat (0-23 arası değe rveya *)
 └───────────────────────── Dakika (0-59 arası değer veya *)

* karakteri "Her" manası taşır, "her gün", "her hafta", "her ay" gibi koyulduğu ifadenin yerine göre mana kazanabilir.
- Her gün 22: 30' da çalışan expression bir ifade için..
 ( 30 22 * * * )

-  Her gün 8:00 - 17: 00  arasında dk'da 1 çalışan job 








- Her pazartesi yarım saatte bir çalışan job 








- Hafta içi her gün tam 12:00 ' de çalışan job








- Hafta içi her gün tam 00:00, 12:00,  ve 15:00 olmak üzere 3 kez çalışan job








örnekleri daha fazla çoğaltılabilir. Bu arada ben Expression ifadelerle uğraşmak istemiyorum derseniz aşağıdaki araçtan faydalanarak Expression Cron Patternlerini oluşturabilirsiniz.


   Bugün ki yazımızda Quartz.Net kütüphanesinden bahsettik, bir sonraki yazımızda bir web uygulamasında nasıl kullanılır, IIS üzerinde nasıl çalışır bu konulara değiniyor olacağız. 

21 Mayıs 2016 Cumartesi

TUPLE NEDİR?

     Herkese merhaba, bu yazımızda C# "Tuple" kavramına değineceğiz. Tuple aslında F# dilinde kullanılan ama daha sonra C# dilinde de desteklenen veri türüdür. Normalde herhangi bir veri tipi tanımladığımızda ( List, Array vs) o tanımlanan veri tipi neyse, elemanlarımızın da o veri tipinden olması gerekmektedir. Peki tanımladığımız bir veri tipinin içeriklerinin farklı türlerde olmasını istediğimiz hiç olmuyor mu? Elbette oluyor ki aslında biz bunları "Anonymous" veri tipleri ile halledebiliyorduk. Fakat "Tuple" sınıfı ile tanıştıktan sonra bu işlemleri daha zahmetsiz bir şekilde çözebilecek seviyeye geliyoruz.  
     Tuple sınıfını farklı türlerin bir araya geldiği yapı olarak nitelendirebiliriz. Aslında kısacası her çeşit çiçeğin bir arada bulunduğu demet olarak düşünebilirsiniz. Tuple tanımlaması ve içerisindeki verilere erişim aşağıdaki 2 şekilde yapılabilmektedir.

 1 - 






 2 - 






   İlk olarak direk klasik nesne tanımlama yöntemiyle, ikinci olarak da Tuple sınıfı içerisinde static olarka yer alan Create metodu ile yapılabilmektedir. İçerisindeki nesnelere erişim ise Item1,Item2,...,Item8 şekline 8 parametreye kadar gidebilmektedir. Tuple sınıfının create metodunu incelediğimizde aşağıda da görüleceği gibi T1,T2...,T7,Tuple<T8> şekilnde maksimum 8 tane parametre alabileceği görülmektedir.









Bu durumda 8 farklı tipte parametre tanımlanabilirken, son parametrenin de bir Tuple olması aslında sınırsız sayıda veri tanımlayabilmemize olanak vermektedir. Object browser ile .NET Framework 4.0 ve yukarısına baktığımızda da aşağıdaki gibi 8. parametrenin "TRest" olarak tanımlandığı görülebilir.
















Tuple sınıfının her bir elemanı herhangi bir tip olabileceği gibi, bir Tuple da olabilir. Bu şartlar altında istediğimiz kadar parametre vermiş olabiliyoruz. Burada belirtmek istediğim bir durum var , son elemanın yani 8. elemanın kesinlikle Tuple tipli olması gerektiği ve bu elemana "Rest" referansı ile ulaşabileceğimiz konusudur. Aksi halde aşağıdaki hatayla karşılaşılacaktır.


Son elemanı Tuple olarak tanımlarsak;








Peki Tuple nesnesinin herhangi bir elemanı da Tuple olursa erişim nasıl olur derseniz, aşağıdaki örneği inceleyebilirsiniz.



Peki Tuple Hangi Senaryolarda Kullanılabilir ?

1 - Birden farklı veri tipi tanımlayıp, bunları bir arada tutmak istersek













2 - Metodlardan birden fazla değer return etmek istersek ( Out Parametresi ile de olabilir)












3 -  Sadece tek 1 parametre göndermek zorunda kaldığımız durumlarda. Thread yapıları buna en güzel örnektir, eğer parametreli kullanacaksak sadece 1 parametre göndermek zorunda oluğumuz yapılardır. Bu yapıları Tuple kullanarak birden fazla parametre gönderilir hale getirebiliriz.


2 Mayıs 2016 Pazartesi

VS 2015 C# INTERACTIVE WINDOW

      Merhaba, bu yazımızda VS 2015 Update 1 ile gelen C# Interactive' den bahsediyor olucaz. Kısaca nedir bu C# Interactive derseniz hemen şöyle açıklayalım, bazen yazdığımız kod bloklarının veya satırlarının doğru çalışıp çalışmadığını test etmek isteriz ve bunun için genellikle yeni proje açıp orada deneme yaparız (bunu hemen herkes yapmıştır).C# Interactive sayesinde artık bu dertten kurtulmuş olup alt tarafta açılan text editör sayesinde kod bloğumuzu kolayca test edip sonuçlarını görebiliyoruz.
      C# Interactive Window'u açabilmeniz için öncelikle Visual Studio 2015 Update 1 ' i kurmanız gerekmektedir. Update'i kurduktan sonra VS üst menüsünden View - Other Windows - C# Interactive seçeneği ile ilgili ekranı açabiliriz.






















   Diğer bir yöntemde sağ üst köşedeki Quick Launch kısmından direk aratmak olabilir.









Herhangi bir şekilde ekran açıldıktan sonra alt kısımda C# Interactive penceresinin açıldığını göreceksiniz.Şimdi tek yapmanız gereken ilgili kod parçacığını buraya yazıp çalıştırmak.













   Görüldüğü üzere C# Interactive içine yazılan kod tek satırlık olmak zorunda değildir.Normal program yazar gibi metod yazılıp çağırılabilir, nesneler oluşturulabilir. C# Interactive penceresine yazılan kodlar kendine ait context-stack üzerinde saklandığı için üst satırlarda tanımlanan metod,değişken, hatta dll referanslarına alt satırlarda erişilebilir.













      Editörü temizlemek için #cls ve #clear komutlarını kullanabilirsiniz.Editörü komple resetlemek için de #reset komutunu girebilirsiniz.Bu komutlar arasında şöyle bir fark vardır, cls ve clear komutları sadece editörü temizler, yani önceden yazdığımız değişken,metod yada import ettiğimiz dll ler bu komutlarla silinmez, arka planda tutulur.Bu komutları çalıştırdıktan sonra önceden yazdığımız verileri tekrar çağırabiliriz.Fakat reset komutu her şeyi temizler, editörü ilk haline çekerek önceden tanımladığımız tüm verileri siler. Bunlar haricinde;

#help : Interactive editöre yazılabilecek kodlar hakkında yardım almak için kullanılır.



















#r : C# Interactive Window içine Dll referansı eklemek için kullanılır. Referans yazıldıktan sonra import edilen Dll içerisindeki tipler Intellisense yardımıyla görülebilir :)






















#load : Bu komut belirtilen yoldaki dosya içindeki kodları çalıştırır.Örneğin test.txt dosyasında bir takım kodlar bulunsun ve biz bu dosyayı load komutu ile çağırıp çalıştıralım




















    C# Interactive Tool hakkında bu kadar bilgiyi verdikten sonra,şimdi de Visual Studio Update 2' yi buradan indirip kuralım ve bir değişikliğe daha göz atalım. Update 2 ile gelen Interactive Tool yenilikleri daha basit ve etkili bir şekilde kullanmamızı sağlıyor. Artık Interactive Tool içerisine kodları yazmak zorunda kalmıyoruz, direk program yazarken ilgili kod bloğunu seçip "Execute in Interactive" ögesini tıklamamız yeterli olacaktır. Bu sayede Interactive Window açılarak otomatik olarak kod derlenip sonucu ekrana yansıyacaktır.Aynı işlemi Ctrl+E,Ctrl+E kısa yol kombinasyonu ile de yapabiliriz.






























   C# Interactive Window bence visual studio için zamanla vazgeçilmezler arasında yer alacaktır. Bizi başka projeler açıp farklı yerlerde test etme zahmetinden kurtardığı gibi, kısa kodların hemen pratik bir şekilde derlenip test edilmesi için de süper bir fırsat sunmuştur.
    Değinmeden edemeyeceğim bir başka konuda update 2 ile dikkatinizi çekmiştir, "Node js Interactive Window" özelliğinin de gelmesidir. Bu da bize Node js kullanırken, C# Interactive Window ile neler yapabiliyorsak aynı rahatlığı sağlayacağı manasına gelmektedir. Detaylı bilgi için buraya bakabilirsiniz.