زمان بندی با کوارتز (Quartz) در Asp .Net MVC

زمان بندی با کوارتز (Quartz) در Asp .Net MVC

در این مقاله قصد داریم زمان بندی با استفاده از پکیج Quartz را در Asp .Net MVC بررسی کنیم. زمان بندی برای انجام وظیفه (task) در بک گراند مورد استفاده قرار می گیرد. به عبارتی زمانی که می خواهیم کاری در برنامه در ساعتی مشخص انجام شود، از زمان بند (scheduler) استفاده می کنیم.

از جمله موارد کاربرد زمان بند می توان به موارد زیر اشاره کرد:

  • ارسال پیام مناسبتی
  • تعریف یادآور (reminder)
  • بک آپ گیری دوره ای

مراحل افزودن زمان بند به شرح زیر است:

ابتدا پروژه ای از نوع Asp .Net MVC ایجاد می کنیم.

سپس پکیج Quartz را به پروژه اضافه می کنیم.

برای اضافه کردن پکیج روش های متعددی وجود دارد.

یکی از این روش ها استفاده از Package Manager Console می باشد. طبق تصویر زیر:

زمان بندی با کوارتز (Quartz) در Asp .Net MVC

زمان بندی با کوارتز (Quartz) در Asp .Net MVC – های لرن

حال در پنجره مربوطه دستور مربوط به نصب پکیج Quartz را مشابه تصویر زیر وارد می کنیم و سپس با استفاده از دکمه enter دستور را اجرا می کنیم.

زمان بندی با کوارتز (Quartz) در Asp .Net MVC

زمان بندی با کوارتز (Quartz) در Asp .Net MVC – های لرن

در تصویر بالا ورژن انتخابی 3.0.7 می باشد.

روش دیگر استفاده از Manage Nuget Packages for solution می باشد. طبق تصویر زیر داریم:

زمان بندی با کوارتز (Quartz) در Asp .Net MVC

زمان بندی با کوارتز (Quartz) در Asp .Net MVC – های لرن

سپس در صفحه باز شده، طبق تصویر در قسمت browse عبارت quartz را جستجو می کنیم و پکیج مشخص شده در تصویر را انتخاب می کنیم.

زمان بندی با کوارتز (Quartz) در Asp .Net MVC

زمان بندی با کوارتز (Quartz) در Asp .Net MVC – های لرن

در سمت راست تصویر می توانیم ورژن موردنظر را انتخاب کنیم و با استفاده از دکمه install آن را نصب نماییم. درصورتی که قبلا پکیج را نصب کرده باشیم ورژن نصب شده نیز در قسمت installed نمایش داده می شود. در قسمت پایین سمت راست توضیحاتی در ارتباط با این پکیج و ورژن انتخابی وجود دارد که ما را در انتخاب ورژن کوارتز راهنمایی می کند. در ادامه توضیحات داریم:

زمان بندی با کوارتز (Quartz) در Asp .Net MVC

زمان بندی با کوارتز (Quartz) در Asp .Net MVC – های لرن

همان طور که در تصویر بالا مشخص است برای ورژن 3.2.3 پکیج کوارتز (که در زمان این آموزش آخرین ورژن می باشد) به دات نت فریم ورک 4.6.1 نیاز داریم. درصورتی که پروژه موردنظر ما ورژن پایین تری از دات نت فریم ورک را شامل می شود بنابراین بایستی ورژن قدیمی تری از پکیج کوارتز را نیز نصب نمود. برای مثال درصورتی که پروژه دات نت فریم ورک 4.6 را شامل می شود می توان از ورژن 3.0.7 کوارتز استفاده نمود.

بعد از تکمیل نصب پکیج، به سراغ پوشه Models رفته و کلاسی با نام ExecuteTaskServiceCallJob.cs در آن پوشه ایجاد می کنیم.

کد کلاس تعریف شده را به شکل زیر تغییر می دهیم.

public class ExecuteTaskServiceCallJob : IJob
    {
        public static readonly string SchedulingStatus = ConfigurationManager.AppSettings["ExecuteTaskServiceCallSchedulingStatus"];
        public Task Execute(IJobExecutionContext context)
        {
            var task = Task.Run(() =>
            {
                if (SchedulingStatus.Equals("ON"))
                {
                    try
                    {
                        //Do whatever stuff you want
                    }
                    catch (Exception ex)
                    {
                    }
                }
            });
            return task;
        }
    }

در این کلاس از پکیج های زیر استفاده می شود.

using Quartz;
using System;
using System.Configuration;
using System.Threading.Tasks;

کد های مربوط به عملیات دلخواهی که قرار است در زمان بند اجرا شوند را در قسمت مشخص شده (به صورت کامنت) قرار می دهیم.

سپس در پوشه Models کلاس دیگری با نام ExecuteTaskServiceCallScheduler.cs ایجاد می کنیم و کد های زیر را در کلاس قرار می دهیم.

public class ExecuteTaskServiceCallScheduler
    {
        private static readonly string ScheduleCronExpression = ConfigurationManager.AppSettings["ExecuteTaskScheduleCronExpression"];
        public static async System.Threading.Tasks.Task StartAsync()
        {
            try
            {
                var scheduler = await StdSchedulerFactory.GetDefaultScheduler();
                if (!scheduler.IsStarted)
                {
                    await scheduler.Start();
                }
                var job = JobBuilder.Create()
                    .WithIdentity("ExecuteTaskServiceCallJob1", "group1")
                    .Build();
                var trigger = TriggerBuilder.Create()
                    .WithIdentity("ExecuteTaskServiceCallTrigger1", "group1")
                    .WithCronSchedule(ScheduleCronExpression)
                    .Build();
                await scheduler.ScheduleJob(job, trigger);
            }
            catch (Exception ex)
            {

            }
        }
    }

در این کلاس از پکیج های زیر استفاده می شود.

using Quartz;
using Quartz.Impl;
using System;
using System.Configuration;

حال فایل Web.Config در مسیر اصلی پروژه را باز کرده و دو کلید زیر را به آن اضافه می کنیم. (در قسمت appSettings )

<add key="ExecuteTaskServiceCallSchedulingStatus" value="ON" />
<add key="ExecuteTaskScheduleCronExpression" value="0 0/1 * 1/1 * ? *" />

مقدار ( 0 0/1 * 1/1 * ? * ) که برای کلید تعریف شده بیانگر آن است که فایل ExecuteTaskServiceCallJob.cs هر یک دقیقه یک مرتبه اجرا می گردد.

و در نهایت به سراغ فایل Global.asax در آدرس اصلی پروژه رفته و کد زیر را در انتهای متد Application_Start اضافه می کنیم.

ExecuteTaskServiceCallScheduler.StartAsync().GetAwaiter().GetResult();

بنابراین متد Application_Start به صورت زیر در می آید.

protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            ExecuteTaskServiceCallScheduler.StartAsync().GetAwaiter().GetResult();
        }

حال کافی است برنامه را در حالت اجرا نگه داریم تا زمان بند هر یک دقیقه یک بار وظایف مربوطه را انجام دهد.

بنابر آنچه گفته شد می توانیم زمان بندی با کوارتز (Quartz) در Asp .Net MVC را به آسانی انجام دهیم و از این روش برای ایجاد تعیین یادآور، تنظیم پیام های مناسبتی و بسیاری موارد دیگر استفاده نماییم.

The last comment and 2 other comment(s) need to be approved.
0 پاسخ

دیدگاه خود را ثبت کنید

تمایل دارید در گفتگوها شرکت کنید؟
در گفتگو ها شرکت کنید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *