﻿
{"id":3911,"date":"2016-04-05T05:56:58","date_gmt":"2016-04-05T05:56:58","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=3911"},"modified":"2016-04-05T06:35:11","modified_gmt":"2016-04-05T06:35:11","slug":"c-quartz-net-kutuphanesi-ile-zamanlanmis-gorevler-olusturma","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/c-quartz-net-kutuphanesi-ile-zamanlanmis-gorevler-olusturma\/","title":{"rendered":"C# &#8211; Quartz.Net K\u00fct\u00fcphanesi \u0130le Zamanlanm\u0131\u015f G\u00f6revler Olu\u015fturma"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Masa\u00fcst\u00fc veya Web projelerinde belirli periyotluk yap\u0131lmas\u0131 yahut tetiklenmesi gereken i\u015flemlerin ihtiyac\u0131n\u0131 hissetmi\u015fsinizdir. \u0130\u015fte b\u00f6yle durumlarda prosed\u00fcrel olarak binbir t\u00fcrl\u00fc i\u015flem ger\u00e7ekle\u015ftirebilir, ihtiyac\u0131n\u0131z\u0131 giderebilirsiniz. Tabi birde Quartz.Net k\u00fct\u00fcphanesini kullanarak daha pratik bir \u015fekilde hareket edebilir, projenize dinamizm ve h\u0131z kazand\u0131rabilirsiniz.<\/p>\n<p>\u015eimdi bu i\u00e7eri\u011fimizde Quartz.Net k\u00fct\u00fcphanesini kullanarak \u00f6rnek bir projede g\u00f6revler zamanlayaca\u011f\u0131z. Tabi projede \u00f6rneklendirmeyi yapmadan \u00f6nce Quartz.Net k\u00fct\u00fcphanesini a&#8217;dan z&#8217;ye inceleyecek ve size nas\u0131l bir mekanizmayla \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 g\u00f6sterece\u011fim.<\/p>\n<p>\u00d6ncelike Quartz.Net k\u00fct\u00fcphanesini projeye entegre edebilmek i\u00e7in &#8220;Package Manager Console&#8221; penceresine &#8220;Install-Package Quartz&#8221; komutunu yaz\u0131p, entera bas\u0131n\u0131z. E\u011fer komut \u00e7al\u0131\u015fm\u0131yorsa <a href=\"https:\/\/www.nuget.org\/packages\/quartz\/\" target=\"_blank\">\u015fu<\/a> adrese g\u00f6z at\u0131n\u0131z.<\/p>\n<p>Velhas\u0131l, ilgili DLL&#8217;i projeye entegre etti\u011finizi varsay\u0131yorum.<\/p>\n<p>\u015eimdi buradaki mekanizmay\u0131 \u015f\u00f6yle d\u00fc\u015f\u00fcnece\u011fiz.<br \/>\n<em><span style=\"color: #008000;\"><strong>G\u00f6rev<\/strong><\/span><\/em> -&gt; <span style=\"color: #008000;\"><em><strong>G\u00f6rev Tetikleyici[Tetiklenirken \u015eartlar Belirtilecek]<\/strong><\/em><\/span><\/p>\n<p>Yani bir g\u00f6revimiz olacak, bu g\u00f6rev yeri ve zaman\u0131 geldimi tetiklenecektir. Tetiklenme s\u00fcrecinde verilen ba\u015flang\u0131\u00e7 zaman\u0131, tetiklenme periyodu ve ka\u00e7 kere tetiklenece\u011fi gibisinden fakt\u00f6rler belirtilecektir.<\/p>\n<p>\u015eimdi bir g\u00f6rev olu\u015ftural\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Gorev : IJob\r\n    {\r\n        public void Execute(IJobExecutionContext context)\r\n        {\r\n            Console.WriteLine(&quot;G\u00f6revdeyiz...&quot;);\r\n        }\r\n    }\r\n<\/pre>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi bir g\u00f6revimiz mevcut.<\/p>\n<p>\u015eimdide g\u00f6rev tetikleyiciyi olu\u015ftural\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Tetikleyici\r\n    {\r\n        private IScheduler Baslat()\r\n        {\r\n            ISchedulerFactory schedFact = new StdSchedulerFactory();\r\n            IScheduler sched = schedFact.GetScheduler();\r\n            if (!sched.IsStarted)\r\n                sched.Start();\r\n\r\n            return sched;\r\n        }\r\n\r\n        public void GoreviTetikle()\r\n        {\r\n            IScheduler sched = Baslat();\r\n\r\n            IJobDetail Gorev = JobBuilder.Create&lt;Gorev&gt;().WithIdentity(&quot;Gorev&quot;, null).Build();\r\n\r\n            ISimpleTrigger TriggerGorev = (ISimpleTrigger)TriggerBuilder.Create().WithIdentity(&quot;Gorev&quot;).StartAt(DateTime.UtcNow).WithSimpleSchedule(x =&gt; x.WithIntervalInSeconds(5).RepeatForever()).Build();\r\n            sched.ScheduleJob(Gorev, TriggerGorev);\r\n        }\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funu incelerseniz e\u011fer &#8220;Baslat&#8221; metodu ile zamanlay\u0131c\u0131m\u0131z\u0131 olu\u015fturuyor, \u00e7al\u0131\u015fm\u0131yor ise \u00e7al\u0131\u015ft\u0131rarak geriye g\u00f6nderiyoruz. &#8220;GoreviTetikle&#8221; isimli metod i\u00e7erisinde ise g\u00f6revimizin tetikleyicisini olu\u015fturuyoruz. &#8220;IJobDetail&#8221; Interface&#8217;i tipinden &#8220;Gorev&#8221; referans\u0131na bir &#8220;Gorev&#8221; tipinde i\u015f kurucusu olu\u015fturuyor ve &#8220;Gorev&#8221; identity de\u011ferini vererek olu\u015fan yap\u0131y\u0131 at\u0131yoruz.<\/p>\n<p>&#8220;ISimpleTrigger&#8221; Interface&#8217;i tipinden &#8220;TriggerGorev&#8221; isimli referansa ise bir Trigger yap\u0131s\u0131 olu\u015fturuyoruz ve &#8220;Gorev&#8221; identitiy de\u011ferini veriyoruz. Bu Trigger&#8217;\u0131n s\u00fcre\u00e7te hangi fakt\u00f6rlere g\u00f6re tetiklenece\u011fini kod blo\u011funda g\u00f6rd\u00fc\u011f\u00fcn\u00fcz metodlar arac\u0131l\u0131\u011f\u0131yla veriyoruz. \u015eimdi \u00f6rnekte olan ve olmayan metodlar\u0131n \u00f6zelliklerini a\u015fa\u011f\u0131da belirtelim.<\/p>\n<ul style=\"list-style-type: disc;\">\n<li><strong>StartAt Metodu<\/strong><em><br \/>\nZamanlay\u0131c\u0131n\u0131n hangi tarihte ba\u015flayaca\u011f\u0131n\u0131 belirtiriz.<\/li>\n<li><em><strong>WithSimpleSchedule Metodu<\/strong><\/em><br \/>\nZamanlay\u0131c\u0131n\u0131n ba\u015flad\u0131ktan sonraki program\u0131n\u0131 belirtmek i\u00e7in kullan\u0131l\u0131r.<\/li>\n<li><em><strong>WithIntervalInSeconds Metodu<\/strong><em><br \/>\nZamanlay\u0131c\u0131n\u0131n ka\u00e7 saniyede bir tetiklenece\u011fini belirtiriz.<\/li>\n<li><em><strong>WithIntervalInMinutes Metodu<\/strong><em><br \/>\nZamanlay\u0131c\u0131n\u0131n ka\u00e7 dakikada bir tetiklenece\u011fini belirtiriz.<\/li>\n<li><em><strong>WithIntervalInHours Metodu<\/strong><em><br \/>\nZamanlay\u0131c\u0131n\u0131n ka\u00e7 saatte bir tetiklenece\u011fini belirtiriz.<\/li>\n<li><em><strong>WithRepeatCount Metodu<\/strong><em><br \/>\nZamanlay\u0131c\u0131n\u0131n ka\u00e7 tekrardan sonra duraca\u011f\u0131n\u0131 belirtiriz.<\/li>\n<li><em><strong>RepeatForever Metodu<\/strong><em><br \/>\nZamanlay\u0131c\u0131n\u0131n sonsuza denk \u00e7al\u0131\u015faca\u011f\u0131n\u0131 belirtiriz.<\/li>\n<\/ul>\n<p>En sonunda &#8220;ScheduleJob&#8221; metodu ile g\u00f6rev ve Trigger&#8217;\u0131 birbirine ba\u011fl\u0131yoruz.<\/p>\n<p>Yukar\u0131daki \u00f6rnekte g\u00f6revimiz 5 saniyede bir sonsuza kadar \u00e7al\u0131\u015facakt\u0131r.<\/p>\n<p>\u015eimdi g\u00f6revimizi tetikleyelim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Program\r\n    {\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            Tetikleyici tetikle = new Tetikleyici();\r\n            tetikle.GoreviTetikle();\r\n        }\r\n    }\r\n<\/pre>\n<p>Evet, art\u0131k g\u00f6revimizin belirtti\u011fimiz de\u011fer aral\u0131\u011f\u0131nda sonsuza kadar tetiklendi\u011fini a\u015fa\u011f\u0131daki videodan g\u00f6rebilirsiniz.<\/p>\n<p><iframe loading=\"lazy\" width=\"600\" height=\"338\" src=\"https:\/\/www.youtube-nocookie.com\/embed\/WbZaPG8Oe24\" frameborder=\"0\" allowfullscreen><\/iframe><\/p>\n<p>\u015eimdi s\u0131ra geldi \u00f6rnek projeyi yapmaya. Senaryomuz a\u015fa\u011f\u0131daki gibi olacakt\u0131r.<\/p>\n<blockquote><p>&#8220;Biz bir \u00f6\u011fretmeniz ve s\u0131n\u0131f\u0131m\u0131zda \u00e7ok konu\u015fan \u00f6\u011frencileri 10 dk&#8217;l\u0131\u011f\u0131na tek ayak \u00fcst\u00fcnde bekletiyoruz.&#8221;<\/p><\/blockquote>\n<p>Hadi projemize ba\u015flayal\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Ogrenci\r\n    {\r\n        public int OgrenciNo { get; set; }\r\n        public string Adi { get; set; }\r\n        public string SoyAdi { get; set; }\r\n        public bool Ceza { get; set; }\r\n    }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class DersGorev : IJob\r\n    {\r\n        public void Execute(IJobExecutionContext context)\r\n        {\r\n            JobDataMap data = context.JobDetail.JobDataMap;\r\n            Console.WriteLine($&quot;{data.GetString(&quot;Adi&quot;)} {data.GetString(&quot;SoyAdi&quot;)} tek ayakta bekliyor...&quot;);\r\n        }\r\n    }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Tetikleyici\r\n    {\r\n        private IScheduler Baslat()\r\n        {\r\n            ISchedulerFactory schedFact = new StdSchedulerFactory();\r\n            IScheduler sched = schedFact.GetScheduler();\r\n            if (!sched.IsStarted)\r\n                sched.Start();\r\n\r\n            return sched;\r\n        }\r\n\r\n        public Ogrenci Ogrenci { get; set; }\r\n\r\n        public void DersTetikle()\r\n        {\r\n            IScheduler sched = Baslat();\r\n\r\n            IJobDetail DersGorev = JobBuilder.Create&lt;DersGorev&gt;().WithIdentity(&quot;DersGorev&quot;, null).UsingJobData(&quot;Adi&quot;, Ogrenci.Adi).UsingJobData(&quot;SoyAdi&quot;, Ogrenci.SoyAdi).Build();\r\n\r\n\r\n            ISimpleTrigger TriggerDersGorev = (ISimpleTrigger)TriggerBuilder.Create().WithIdentity(&quot;DersGorev&quot;).StartAt(DateTime.UtcNow).WithSimpleSchedule(x =&gt; x.WithIntervalInSeconds(15).WithRepeatCount(1)).Build();\r\n            sched.ScheduleJob(DersGorev, TriggerDersGorev);\r\n        }\r\n    }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            List&lt;Ogrenci&gt; ogrenciler = new List&lt;Ogrenci&gt;() {\r\n                new Ogrenci { OgrenciNo = 1, Adi=&quot;Ali&quot;, SoyAdi = &quot;Y\u0131ld\u0131r\u0131m&quot;, Ceza = false},\r\n                new Ogrenci { OgrenciNo = 2, Adi=&quot;Veli&quot;, SoyAdi = &quot;G\u00f6k&quot;, Ceza = true},\r\n                new Ogrenci { OgrenciNo = 3, Adi=&quot;Mehmet&quot;, SoyAdi = &quot;Onba\u015f\u0131&quot;, Ceza = false},\r\n                new Ogrenci { OgrenciNo = 4, Adi=&quot;Ay\u015fe&quot;, SoyAdi = &quot;Candar&quot;, Ceza = false},\r\n                new Ogrenci { OgrenciNo = 5, Adi=&quot;Can&quot;, SoyAdi = &quot;K\u00f6se&quot;, Ceza = false},\r\n                new Ogrenci { OgrenciNo = 6, Adi=&quot;Turgay&quot;, SoyAdi = &quot;Arslan&quot;, Ceza = false},\r\n                new Ogrenci { OgrenciNo = 7, Adi=&quot;Faruk&quot;, SoyAdi = &quot;Mente\u015f&quot;, Ceza = false}\r\n            };\r\n\r\n            foreach (var Ogrenci in ogrenciler)\r\n            {\r\n                if (Ogrenci.Ceza)\r\n                {\r\n                    Tetikleyici tetikle = new Tetikleyici();\r\n                    tetikle.Ogrenci = Ogrenci;\r\n                    tetikle.DersTetikle();\r\n                }\r\n            }\r\n\r\n            Console.Read();\r\n        }\r\n<\/pre>\n<p>\u00d6rnek projeyi <a href=\"http:\/\/www.gencayyildiz.com\/blog\/c-quartz-net-kutuphanesi-ile-zamanlanmis-gorevler-olusturma\/c-quartz-net-kutuphanesi-ile-zamanlanmis-gorevler-olusturma-2\/\"rel=\"attachment wp-att-3923\">buradan<\/a> indirebilirsiniz.<\/p>\n<p>Sonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<\/p>\n<p>\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Masa\u00fcst\u00fc veya Web projelerinde belirli periyotluk yap\u0131lmas\u0131 yahut tetiklenmesi gereken i\u015flemlerin ihtiyac\u0131n\u0131 hissetmi\u015fsinizdir. \u0130\u015fte b\u00f6yle durumlarda prosed\u00fcrel olarak binbir t\u00fcrl\u00fc i\u015flem ger\u00e7ekle\u015ftirebilir, ihtiyac\u0131n\u0131z\u0131 giderebilirsiniz. Tabi birde Quartz.Net k\u00fct\u00fcphanesini kullanarak daha pratik bir \u015fekilde&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":3223,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12,338,720],"tags":[1026,1029,1027,1028,1030,1025,1037,1038,1031,350,1035,1034,1033,1036,1032],"class_list":["post-3911","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c-sharp-c","category-c-5-0","category-c-6-0","tag-ijob","tag-ijobdetail","tag-ischeduler","tag-ischedulerfactory","tag-isimpletrigger","tag-quartz-net","tag-repeatforever","tag-schedulejob","tag-startat","tag-trigger","tag-withintervalinhours","tag-withintervalinminutes","tag-withintervalinseconds","tag-withrepeatcount","tag-withsimpleschedule"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/3911","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=3911"}],"version-history":[{"count":0,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/3911\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/3223"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=3911"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=3911"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=3911"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}