Using Quart.net for job sheduler same as cron job
می دانید که وب سایت ها فاقد ابزار زمانبندی برای اجرای تسک ها یا وظایف می باشند. مثلا فرض کنید که می خواهید یک وظیفه تعریف شده مانند ارسال ایمیل یا اس ام اس در یک بازه زمانی یا در زمانهای خاص را انجام دهید. برای این کار چه باید کرد؟
۱- استفاده از task scheduler ویندوز و برقرای ارتباط آن با وب سایت.
این روش یک ایراد دارد و آن اینست که اگر وب شما روی یک سرور هاستینگ باشد شما اجازه و یا دسترسی تعریف یک task scheduler را روی سرور نخواهید داشت.
۲- کد نویسی شخصی.
این روش نیز بسیار پیچیده است و در صورتی که کد نویسی درست انجام نشده باشد احتمال هدر دادن ریسورها از جمله ram و cpu بسیار بالاست
۳- استفاده از محصولات تولیدی
ما برای آموزش استفاده از محصولات تولیدی را توضیح می دهیم
یکی از محصولات تولیدی در این زمینه Quartz.net می باشد. در واقع quartz یک پروژه برای جاوا می باشد که برای دات نت نیز پیاده سازی شده است و شما از طریق Nuget و از داخل VS به آن دسترسی دارید. متاسفانه وب سایت Quartz.Net تقریبا ( تا این لحظه ای که این مطلب نوشته می شود) فاقد یک مثال عملی و روشن برای VS می باشد، بر همین اساس ممکن است که کسانی که تازه وارد این مقوله شده اند براحتی نتوانند با این ابزار ارتباط برقرار کنند.
مزید بر مشکل فوق بسیاری از رفرنس هائی که در جاهای مختلف اینترنت به آن میشود با آخرین ورژن آن ناسازگاری داشته و حتی تکه کدهائی که در سایت ها وجود دارد ممکن است برای شما مشکل آفرین باشد.
برای همین در زیر بطور خیلی ساده و روشن نحوه استفاده از آن بیان می شود. امید است مورد استفاده قرار گیرد.
۱- داخل پروژه خود و داخل VS از طریق ناگت Quartz.Net را سرچ کرده و نصب کنید.
۲- در Solution Explorer زیر شاخ عنوان پروژه خود یک دایرکتوری به نام Jobs ایجاد کنید ( اختیاری است)
۳- یک فایل از نوع کلاس را داخل آن ایجاد کنید مثلا SendSMS
4- کدهائی مشابه زیر را در آن واردکنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Http; using System.Web.Mvc; using System.Web.Optimization; using System.Web.Routing; using System.Data.Entity; using System.Web.Security; using WebMatrix.WebData; using suppliers.Models; using Quartz; using Quartz.Impl; using Quartz.Impl.Calendar; using PHDILib; // PHDI Co. Library namespace GreenSMSSchedule.Jobs { public class SendSMS : IJob { public void Execute(IJobExecutionContext context) { // // Do Something here // } } } |
خوب این کلاسی است که Quartz.net آنرا فراخوانی خواهد کرد، و شما می توانید داخل آن بدلخواه کدهای خودتان را بنویسید. مثلا به دیتابیس وصل شده و بر اساس دسترسی به جداول مثلا اس ام اس یا ایمیل بفرستید.
توجه داشته باشید که شما این کلاس را براحتی داخل پروژه MVC می توانید استفاده کنید. اینکه آیا می توان یک Action را نیز فراخوانی کرد هنوز تست نکرده ام. یعنی ارث بری یک کلاس کنترلر از جفت Controller و IJob
5- فایل Global.asax را باز کرده و کدهای زیر را در آن وارد کنید. این همان جائی است که دقیقا تازه وارد ها نمی دانند که باید از همینجا شروع کنند
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
|
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Http; using System.Web.Mvc; using System.Web.Optimization; using System.Web.Routing; using Quartz; using Quartz.Impl; using Quartz.Impl.Calendar; using GreenSMSSchedule.Jobs; namespace GreenSMSSchedule { // Note: For instructions on enabling IIS6 or IIS7 classic mode, // visit http://go.microsoft.com/?LinkId=9394801 public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { //WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "Username", true); AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); AuthConfig.RegisterAuth(); ConfigureQuartzJobs(); } // // Job Scheduling // public static void ConfigureQuartzJobs() { // construct a scheduler factory ISchedulerFactory schedFact = new StdSchedulerFactory(); // get a scheduler IScheduler sched = schedFact.GetScheduler(); sched.Start(); IJobDetail job = JobBuilder.Create<SendSMS>() .WithIdentity("SendJob") .Build(); var trigger = TriggerBuilder.Create() .WithIdentity("SendTrigger") .WithSimpleSchedule(x => x.WithIntervalInMinutes(1).RepeatForever()) //.StartAt(startTime) .StartNow() .Build(); sched.ScheduleJob(job, trigger); } } } |
همین.
ما یکی از پیچیده ترین زمانبندی ها را با استفاده از همین تکنولوژی راه اندازی کردیم.
موفق باشید